Agent API v1 · for scheduling tools

Every scheduler publishes the post. Yours can make sure people engage with it.

Add a boost to the schedule. When the post goes live, real people reply, quote it and watch it, in the first hours when the feed decides who sees it. One API call or one MCP tool.

Selling to brands, not building a scheduler? That's the reseller guide →

The gap

Why schedulers need this

Every scheduler stops at publish. None can promise that anyone sees the post, and that is what your users pay for.

What your users getthe feature

A post that arrives with people already in the thread.

  • Boost on publish. They pick a package in your composer when they schedule. Nothing more to do on launch day.
  • Real people, not bots. Each reply and quote post is drafted from the post and then posted by a person from their own account. We check every one: the author must match, and the reply must be in the thread.
  • Links, not dashboards. Every result is a live link to a post a named person published. You show them in your post analytics.
  • No audience needed. A user with 300 followers gets the same people in the thread as a user with 30,000.
What you getwholesale

A feature no other scheduler has, and a new revenue line.

  • A reason to choose you. Calendars are a commodity. A scheduler that delivers attention is not.
  • You keep the spread. You buy credits at partner prices and sell packages at your own price, as an add-on or inside a plan.
  • Nothing to run. Drafting, recruiting the people, proof checks, fraud review and payouts are all on our side of the API.
  • Your brand. Your users never need a ProductClank account. (MCP is the exception: see MCP.)
What to expecthonest

How fast, what a result is, and what we don't promise.

When it startsMinutes after your call. Slots go out at once, or drip over up to 72 hours with spread_over_hours.
How longPlan on 24–48 hours from launch. The campaign closes itself when its slots are used.
What a result isA live link to a reply or quote post, with the person who posted it and its engagement. It counts the moment it is posted.
PlatformsReplies on X, Instagram, TikTok, LinkedIn, Reddit, Farcaster and YouTube. Quote posts and bookmarks on X. Watch & answer on TikTok, YouTube and IG Reels.
After it postsFraud review runs in the background. A flagged reply shows review_status: rejected; one the platform removes shows survival_status. Both are rare and both are visible to you.
DisclosureEvery post is marked as a paid partnership. Required.
Not promisedLikes, views or reach on the original post. People choose what they pick up. Sell a boost, not an engagement count.
How the feed decides

The first hours decide who sees the post

Feeds test a new post on a few people first. Early engagement earns it a wider audience, so a boost starts at publish.

1 · Test

The post goes to a small slice of the author's followers and of people who like similar posts.

2 · Signal

The feed reads how people react: who replies, who quotes it, who saves it, who watches to the end.

3 · Spread or stop

Posts with strong early signal go out to more people, again and again. Posts without it stop at the test.

Not all engagement counts the samewhy these parts

Feeds trust signals that take effort. Every boost part is one of them.

A like takes one tap, so feeds trust it least. When X published its ranking code in 2023, a reply weighed far more than a like. Video feeds work the same way with watch time.

RepliesA conversation under the post: the strongest signal a text post can get. Each reply also shows the post to the replier's own followers.
Quote postsThe post appears in a new feed, with the quoter's words on top: a new audience, not just a signal.
BookmarksPeople saved it to come back to. Long posts and X Articles need this signal most.
Watch & answerReal people watch the video to the end to answer the quiz. Completed views tell a video feed the video holds attention.

No likes or reposts. They are the cheapest signals to fake, so feeds discount them, and bought ones can get the accounts of the people doing the work penalised.

Timing. Send the slots at once, or over a few hours with spread_over_hours. A long drip looks natural, but most of it lands after the feed has decided.

Platforms don't publish their current weights and change them often. A boost puts real engagement where it counts most. It does not guarantee reach.

Two levels

Borrow our network, or put yours to work

Start with level 1 the day you get a key. Add level 2 when you want your own community in the thread.

Level 1 · live

The ProductClank network

Real people who reply, quote and watch. Self-serve: get a key, fund it, call one route when a post goes live.

Integrate level 1 →

Level 2 · partner access

Your own network

Run your power users and creators as a private space. You deposit a bounty; they help your customers' posts get seen and earn it. We run the proof checks, review, payouts and wallets.

How level 2 works →
Once, ~10 minutes

Set up once

Three calls, or click through the web app. Same key either way.

Whose account it isone key

One ProductClank user (yours). Your users never sign up here.

Every boost is owned by your key, so the post → campaign id mapping lives in your database. Ignore caller_user_id and trusted: they are for first-party bots, and a normal key that sends them gets 403. Prefer clicking? Sign up → /credits → Profile → Developer.

1. Get a keyfree

Unauthenticated. Shown exactly once.

Register
curl -X POST https://api.productclank.com/api/v1/agents/register \
  -H "Content-Type: application/json" \
  -d '{ "name": "Acme Scheduler", "description": "Boost on publish for Acme users" }'
The key starts pck_live_ and cannot be read back. Keep it on your server only, never in a browser bundle or a public repo. Leaked? POST /agents/rotate-key.
2. Fund itcard or crypto

The API returns a Stripe Checkout link; a person pays it.

Get a checkout link
curl -X POST https://api.productclank.com/api/v1/agents/credits/topup \
  -H "Authorization: Bearer $PC_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{ "bundle": "large", "payment_method": "card" }'

# → { "status": "awaiting_payment", "checkout_url": "https://checkout.stripe.com/…", "credits": 2600 }

Credits land within seconds of payment. Partners get a quoted plan instead of the public tiers: see Pilot. Keep a few days of boosts on the balance: a post that goes live on an empty account is a paying user who gets nothing.

3. Verifyfree

Key works, balance is right, live prices and your daily cap.

Who am I, and what does it cost
curl https://api.productclank.com/api/v1/agents/me -H "Authorization: Bearer $PC_API_KEY"
curl https://api.productclank.com/api/v1/agents/credits/balance -H "Authorization: Bearer $PC_API_KEY"

# → balance + pricing (every play at test / standard / scale, straight from the live price table)

rate_limit_daily starts at 10 boosts per key per day, which a scheduler will pass on its first busy morning. Send us your agent id and we raise it for the pilot. Read prices from credits/balance instead of hardcoding them.

Level 1 · live today

Boost on publish

The user picks a package when they schedule. When the post is live, you call the boost route once per part. Results come back as links.

Where each call lives7 events

Which event in your app triggers which call, and what you store.

Event in your appRuns onProductClank callYou persist
User picks a package in the composeryour UInone (your price, your package)scheduled_post: boost_package
User pays for ityour billingnoneboost_order: status awaiting_publish, payment_ref
Post goes live, you have its URLyour publish workerPOST /agents/campaigns/boost, once per partboost_order: campaign_id per part, status launched
Post never published / deleted firstyour publish workernone: nothing was chargedboost_order: refund or release
User opens post analyticsyour server, on requestGET /agents/campaigns/{id}/activitynothing; render it
Launch returned 402your publish workerretry the same call after top-upboost_order: held
DailycronGET /agents/credits/balancenothing; alert if low

Launch at publish, not at schedule. A post that is rescheduled, edited or deleted before it goes live costs nothing, and the boost always lands on the real URL.

Launch a part20–30 cr per item

One call per part of the package. Send the post text you already have.

10 replies, paced over 6 hours
curl -X POST https://api.productclank.com/api/v1/agents/campaigns/boost \
  -H "Authorization: Bearer $PC_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "post_url": "https://x.com/acmeuser/status/1234567890",
    "action_type": "replies",
    "count": 10,
    "spread_over_hours": 6,
    "post_text": "We just shipped offline mode…",
    "post_author": "acmeuser",
    "reply_guidelines": "Genuine reactions only. Mark every reply as a paid partnership."
  }'

# → { "campaign": { "id": "CAMPAIGN_ID", "action_type": "replies", … }, "delivery": { … } }
  • Send post_text and post_author. You wrote the post, so you have them. It skips our fetch, which is the step most likely to fail on a post that is seconds old.
  • Read campaign.action_type back. An action the platform does not support falls back to replies at the replies price. quote on a LinkedIn URL is charged as replies.
  • Write campaign.id to the order at once. It is returned exactly once.
  • A TikTok seconds old may not have its caption yet. The call waits up to 8 minutes for it and bills only once it drafts. No caption means the campaign closes and nothing is charged.
Add Watch & answer to a video100 cr / correct answer

A quiz on the same post. Only people who watched to the end can answer.

Replies + quiz in one call
curl -X POST https://api.productclank.com/api/v1/agents/campaigns/boost \
  -H "Authorization: Bearer $PC_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "post_url": "https://www.tiktok.com/@acmeuser/video/7400000000000000000",
    "action_type": "replies",
    "count": 10,
    "watch_quiz": {
      "questions": [{ "question": "How many steps does the demo take?", "answer": 3 }],
      "max_answers": 5
    }
  }'

Your user writes the question: they made the video, and only they know the answer. The quiz runs 24 hours. It bills 100 credits per correct answer, up to max_answers, and wrong answers are free. That charge is not in credits_used, so price the worst case. If the quiz fails, the paid boost stays and the response carries watch_quiz.error.

Show resultsfree

Live links as people post. Call it when the user opens the post.

Activity
curl "https://api.productclank.com/api/v1/agents/campaigns/CAMPAIGN_ID/activity" \
  -H "Authorization: Bearer $PC_API_KEY"

# → { "claimed_replies": [ { "posted_url": "https://x.com/someone/status/…", "reply_text": "…",
#       "claimed_at": "…", "review_status": null, "survival_status": "alive",
#       "engagement": { "likes": 4, "replies": 1 } } ] }

Each posted_url is a result the moment it appears; posted_url: null means a person claimed the slot and has not posted yet. It is free and read-only, so call it when the user opens their post, not on a timer. Do not use /posts for results: it returns drafts without the published URL.

What you sell

Packages

A set of parts matched to the kind of post. Rename them, resize them, or let users build their own.

PackageForPartsCredits today
SparkAny post3 replies60 cr
LaunchLaunch or announcement post on X10 replies + 3 quote posts260 cr
ArticleLong post or X Article10 replies + 10 bookmarks500 cr
VideoTikTok, YouTube or IG Reel10 replies + Watch & answer, 5 answers200 cr + up to 500 cr
The parts and their prices4 parts

What each part does, where it works, and what it costs today.

Partaction_typePriceWhereWhat happens
Repliesreplies20 cr each (1–10)All 7 platformsAI drafts one reply per slot from the post; a person posts it from their own account.
Quote postsquote20 cr each (1–10)XA repost with the person's own text — it lands in their followers' feeds.
Bookmarksbookmarks30 cr each (1–100)XProved by screenshot. Good for long posts and X Articles people come back to.
Watch & answerwatch_quiz100 cr per correct answerTikTok · YouTube · IG ReelsA 24h quiz on the video. Only someone who watched to the end can answer, and wrong answers are free.

Every part takes a count, so “5 replies” is 100 credits.

Coming: packages as one calldiscounted

One charge per package, priced below the sum of its parts.

Preset packages land in our own content scheduler first, then in the API. A launch becomes one call instead of one per part. Until then, the per-part price is the honest one.

Level 2 · partner access

Have your own network? Put it to work

Your best users earn by helping your other customers get seen. You bring the people and the bounty. We run the checks, the review and the money.

1 · Space

We open a private space for your network. Optional: seed it with proven people.

2 · Invite

Your power users and creators join with a link.

3 · Bounty

You deposit USDC or another token. It pays only for approved work.

4 · Boost

Your customers' posts go to your network, and results show in your app.

Everything you don't have to build

Asking people to post is easy. Checking the work, keeping it fair and paying everyone is the part that takes a team. In a space, it is already running.

The work

Proof checks

Every submission is matched to the person's own account. A post by someone else, or a link already used, is refused.

Review queue

Submissions arrive in one queue with the proof inline. An AI pre-review scores each one first (3 credits each).

Fair limits

Caps per person per campaign, and one X account per person, so a few accounts can't take the whole bounty.

Fraud review

Rejected work is tracked per person, and we ban accounts caught faking or sharing proof.

The money

Payouts

One deposit from you. We pay each person their share, in USDC on Base, and cover the network fees.

Wallets

People without a wallet get one when they sign up, with no seed phrase. Everyone else picks where to be paid.

Custody

The bounty sits with ProductClank until payout. You never hold or send money to individuals.

Records

Every payout is logged with the person, rank, amount and on-chain transaction. One deposit in, a full list out.

Plus a leaderboard and points for everyone who takes part, so people who don't place still get credit.

How a payout worksdetails

Deposit, approve, close, paid. What you see at each step, and the fee.

  1. Preview. A dry run shows the pool, our fee, the total due and what each rank gets. Nothing is saved.
  2. Deposit. A person on your team pays the total at the funding link. We check the deposit on-chain before the bounty goes live.
  3. Approve. Only approved work counts. Proofs are author-matched and fraud-reviewed before they reach you.
  4. Close and pay. When the campaign closes, we pay the ranked winners from the bounty. Each payout is a record you can check on Base.

A funded bounty cannot be repriced. Points and leaderboard rewards keep running on top of it, so people who don't place still get credit for their work.

What is in the API todaypartner key

Space, campaigns into the space, and a bounty on them. Three calls.

1. Create the space (partner keys only)
curl -X POST https://api.productclank.com/api/v1/agents/spaces \
  -H "Authorization: Bearer $PC_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{ "name": "Acme Creators", "description": "Acme power users who help each other launch", "seed_size": 25 }'

# → { "space_id": "SPACE_ID", "invite_code": "…", "seeded_count": 25, "space_url": "…" }
2. Run a campaign inside it
curl -X POST https://api.productclank.com/api/v1/agents/campaigns/content \
  -H "Authorization: Bearer $PC_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{ "product_id": "PRODUCT_ID", "campaign_message": "Share how you use Acme this week",
        "space_id": "SPACE_ID", "dry_run": false }'

# → { "campaign": { "reach": "community", "space_id": "SPACE_ID", … } }   ← assert this; "public" means it left your space
3. Attach the bounty (preview first)
curl -X POST https://api.productclank.com/api/v1/agents/campaigns/content/CAMPAIGN_ID/bounty \
  -H "Authorization: Bearer $PC_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{ "pool_amount": 500, "token": "USDC", "dry_run": true }'

# → pool, fee, total_due and the amount per rank. Send again without dry_run,
#   then a person deposits at the returned fund_url. Agents never move money.
What is not in the API yet. Boosting a single post into your space (level 1's boost, aimed at your network) works in the ProductClank web app today; the API call comes during the pilot. Approving submissions is also web-only for now. And the space owner's own account cannot earn from its own campaigns, so if you want to take part, use a second account.
If your scheduler has an assistant

Or do it over MCP

Your user says “boost this post when it goes live” and your assistant calls the tool.

Connector URL
https://mcp.productclank.com/mcp
Tools, and who pays4 tools

The tools you need, and how billing differs from the API.

boost_postLevel 1: replies, quote posts and more on a post URL. Same prices as the API.
set_content_bountyLevel 2: attach a bounty to a campaign in your space.
check_balanceBalance and the live price of every play, to quote before launch.
report_issueSomething failed and the error doesn't say why. Opens a ticket with us.
API or MCP: who pays. With the API, every boost runs on your key and your balance, under your brand. With MCP, each user connects their own ProductClank account, approves the connector, sets a daily spend cap, and pays from their own credits. Pick the API to sell boosts as your feature. Pick MCP to add it to your assistant without handling billing at all.

Full tool list on /mcp; every REST route on /developers.

Read before launch

Money and rules

How to never charge a user for nothing, and what the shared network does not allow.

Getting money right3 rules

Charge at pick, launch at publish, one launch per publish, a 402 holds.

Charge for the package, launch at publish. Take the user's payment when they pick the package, then call the API when the post goes live. If the post never publishes, release or refund it: you spent nothing.
One publish, one launch, enforced by you. The API creates two boosts if you call it twice. Key each launch on the published post id plus the part, and make awaiting → launching a conditional update that only one worker can win. Publish workers retry; boosts must not.
A 402 holds; it never fails. The user has paid. Park the part as “held: top up”, alert yourself, and retry the same call when the balance is back. A boost that lands an hour late is still worth it; one that never lands is a refund from your margin.
Network rulesenforced

Disclosure, no likes or reposts, your users' posts only. One partner's shortcut costs everyone.

  • Disclosure is mandatory. Put “paid partnership” in reply_guidelines on every boost. We audit.
  • Never sell likes or repost. The API accepts them; a partner may not offer them. Bought engagement gets the accounts of the people doing the work penalised, not your user's.
  • Boost what your users wrote. Only posts a user scheduled through you, on their own accounts. Not other people's posts.
  • No misrepresenting the network. The people who answer are not your staff or your bots. Don't invent follower counts or promise engagement numbers.
  • One key, one product. Violations end the account and forfeit remaining credits.
A few schedulers first

Pilot with us

We raise your daily cap, quote partner prices, open level 2 when you want it, and answer within the day.

Your first test costs about a dollar. There is no sandbox. Schedule a post of your own, boost it with 3 replies (60 credits), and watch /activity. You have now used every call level 1 needs. Do it before you wire payments, so the first thing you debug is the API and not your billing.

Full API reference