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 →
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 featureA post that arrives with people already in the thread.
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 getwholesaleA feature no other scheduler has, and a new revenue line.
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 expecthonestHow fast, what a result is, and what we don't promise.
How fast, what a result is, and what we don't promise.
| When it starts | Minutes after your call. Slots go out at once, or drip over up to 72 hours with spread_over_hours. |
| How long | Plan on 24–48 hours from launch. The campaign closes itself when its slots are used. |
| What a result is | A live link to a reply or quote post, with the person who posted it and its engagement. It counts the moment it is posted. |
| Platforms | Replies 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 posts | Fraud 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. |
| Disclosure | Every post is marked as a paid partnership. Required. |
| Not promised | Likes, views or reach on the original post. People choose what they pick up. Sell a boost, not an engagement count. |
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 partsFeeds trust signals that take effort. Every boost part is one of them.
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.
| Replies | A 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 posts | The post appears in a new feed, with the quoter's words on top: a new audience, not just a signal. |
| Bookmarks | People saved it to come back to. Long posts and X Articles need this signal most. |
| Watch & answer | Real 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.
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 →Set up once
Three calls, or click through the web app. Same key either way.
Whose account it isone keyOne ProductClank user (yours). Your users never sign up here.
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 keyfreeUnauthenticated. Shown exactly once.
Unauthenticated. Shown exactly once.
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" }'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 cryptoThe API returns a Stripe Checkout link; a person pays it.
The API returns a Stripe Checkout link; a person pays it.
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. VerifyfreeKey works, balance is right, live prices and your daily cap.
Key works, balance is right, live prices and your daily cap.
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.
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 eventsWhich event in your app triggers which call, and what you store.
Which event in your app triggers which call, and what you store.
| Event in your app | Runs on | ProductClank call | You persist |
|---|---|---|---|
| User picks a package in the composer | your UI | none (your price, your package) | scheduled_post: boost_package |
| User pays for it | your billing | none | boost_order: status awaiting_publish, payment_ref |
| Post goes live, you have its URL | your publish worker | POST /agents/campaigns/boost, once per part | boost_order: campaign_id per part, status launched |
| Post never published / deleted first | your publish worker | none: nothing was charged | boost_order: refund or release |
| User opens post analytics | your server, on request | GET /agents/campaigns/{id}/activity | nothing; render it |
| Launch returned 402 | your publish worker | retry the same call after top-up | boost_order: held |
| Daily | cron | GET /agents/credits/balance | nothing; 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 itemOne call per part of the package. Send the post text you already have.
One call per part of the package. Send the post text you already have.
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_textandpost_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_typeback. An action the platform does not support falls back torepliesat the replies price.quoteon a LinkedIn URL is charged as replies. - Write
campaign.idto 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 answerA quiz on the same post. Only people who watched to the end can answer.
A quiz on the same post. Only people who watched to the end can answer.
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 resultsfreeLive links as people post. Call it when the user opens the post.
Live links as people post. Call it when the user opens the post.
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.
Packages
A set of parts matched to the kind of post. Rename them, resize them, or let users build their own.
| Package | For | Parts | Credits today |
|---|---|---|---|
| Spark | Any post | 3 replies | 60 cr |
| Launch | Launch or announcement post on X | 10 replies + 3 quote posts | 260 cr |
| Article | Long post or X Article | 10 replies + 10 bookmarks | 500 cr |
| Video | TikTok, YouTube or IG Reel | 10 replies + Watch & answer, 5 answers | 200 cr + up to 500 cr |
The parts and their prices4 partsWhat each part does, where it works, and what it costs today.
What each part does, where it works, and what it costs today.
| Part | action_type | Price | Where | What happens |
|---|---|---|---|---|
| Replies | replies | 20 cr each (1–10) | All 7 platforms | AI drafts one reply per slot from the post; a person posts it from their own account. |
| Quote posts | quote | 20 cr each (1–10) | X | A repost with the person's own text — it lands in their followers' feeds. |
| Bookmarks | bookmarks | 30 cr each (1–100) | X | Proved by screenshot. Good for long posts and X Articles people come back to. |
| Watch & answer | watch_quiz | 100 cr per correct answer | TikTok · YouTube · IG Reels | A 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 calldiscountedOne charge per package, priced below the sum of its parts.
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.
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 worksdetailsDeposit, approve, close, paid. What you see at each step, and the fee.
Deposit, approve, close, paid. What you see at each step, and the fee.
- Preview. A dry run shows the pool, our fee, the total due and what each rank gets. Nothing is saved.
- Deposit. A person on your team pays the total at the funding link. We check the deposit on-chain before the bounty goes live.
- Approve. Only approved work counts. Proofs are author-matched and fraud-reviewed before they reach you.
- 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 keySpace, campaigns into the space, and a bounty on them. Three calls.
Space, campaigns into the space, and a bounty on them. Three calls.
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": "…" }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 spacecurl -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.Or do it over MCP
Your user says “boost this post when it goes live” and your assistant calls the tool.
https://mcp.productclank.com/mcpTools, and who pays4 toolsThe tools you need, and how billing differs from the API.
The tools you need, and how billing differs from the API.
| boost_post | Level 1: replies, quote posts and more on a post URL. Same prices as the API. |
| set_content_bounty | Level 2: attach a bounty to a campaign in your space. |
| check_balance | Balance and the live price of every play, to quote before launch. |
| report_issue | Something failed and the error doesn't say why. Opens a ticket with us. |
Full tool list on /mcp; every REST route on /developers.
Money and rules
How to never charge a user for nothing, and what the shared network does not allow.
Getting money right3 rulesCharge at pick, launch at publish, one launch per publish, a 402 holds.
Charge at pick, launch at publish, one launch per publish, a 402 holds.
Network rulesenforcedDisclosure, no likes or reposts, your users' posts only. One partner's shortcut costs everyone.
Disclosure, no likes or reposts, your users' posts only. One partner's shortcut costs everyone.
- Disclosure is mandatory. Put “paid partnership” in
reply_guidelineson every boost. We audit. - Never sell
likesorrepost. 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.
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.