Developer documentation
Every marketplace, measured, behind one key.
613,446 placements from 10 suppliers, deduplicated by domain and checked against a third-party search index. An agent searches, plans at a price we hold, buys inside caps you set, and keeps watching after delivery. One prepaid balance, one invoice.
Two requests to a live link.
Quote a plan
A brief in, a costed basket out. Cheapest verified seller for each domain, spread across domains, with a reason on every line, held at that price for 4 hours.
Order the lines
Redeem the quote and pay what you were quoted. Spend caps and the idempotency key are checked in the same statement as the charge. Cancel free until the morning batch.
export PLACEMENT_KEY="pk_live_…"
# 1. ten finance links, DR50+, cheapest verified seller for each,
# one per domain. Price held 4 hours.
curl -X POST https://api.placementapi.com/v1/quote \
-H "Authorization: Bearer $PLACEMENT_KEY" \
-H "Content-Type: application/json" \
-d '{"links":10,"topic": "finance","dr_min":50,
"strategy": "cheapest","budget_credits":500000}'
# 2. buy a line at the price you were quoted
curl -X POST https://api.placementapi.com/v1/orders \
-H "Authorization: Bearer $PLACEMENT_KEY" \
-H "Idempotency-Key: $(uuidgen)" \
-d '{"quote_id": "qt_9f2c…",
"offer_id": "s1a2b3c4:example-publisher.com:guest_post",
"target_url": "https://acme.com/pricing"}'Permission to read. Permission to spend.
Authenticate with a bearer token. Use a read-scoped key for searching and planning; ordering requires the order scope. A read key searches and plans; only an order key can spend, and auto placement is switched on from the dashboard, never from a key.
what a row carries
Our measurements sit next to the seller’s claims.
Verification, five tests
Traffic against rating, the queries it ranks for, who links to it, whether it is a subdomain trading on its parent, and the shape of its outbound links. A domain that fails is marked suspect and left out of plans unless asked for. How the tests work.
Placement score and market reference
A 0 to 100 composite with its components exposed, and for every listing the median price the same placement sells for elsewhere, so a cheap line and an expensive line are both explained.
Content profile and price confidence
A sample of the publisher's recent pages: posting velocity, links per page, sponsored share. And every price says when it was observed and whether it is fresh or aged, so nothing is priced without saying how old that price is.
Reference
The whole surface, by what an agent is trying to do.
Search and verify
Every supplier's inventory in one schema, deduplicated by domain, with our own measurements beside the seller's claims.
/v1/offersSearch placements by DR, price, topic, geo, language, turnaround, traffic and verification. Fakes excluded unless asked for.
/v1/sites/{domain}One publisher, assembled: every way to buy it cheapest first, verification, placement score, link history, cross-buyer outcomes.
/v1/marketThe price distribution for a slice of the catalogue: what a DR 50 finance guest post costs across sellers.
/v1/market/tasteWhat buyers, ranking winners and the web graph say a niche's links look like.
/v1/keywords/winnersWho ranks for a keyword, who links to them, and which of those referrers we sell.
Plan
A brief goes in; a costed, held basket comes out, with a reason for every line.
/v1/quoteA brief in, a costed basket out: cheapest seller per domain, spread across domains, held for 4 hours.
/v1/quotes/{quote_id}Read a held quote back by token, so a plan can be approved by someone other than the agent that made it.
/v1/targets/profileThe backlink profile of the page you are buying for, and how much of it we sell.
/v1/targets/gapDomains your competitors have that you do not, priced and held.
/v1/targets/scenarioWhat closing a keyword's gap could be worth, with measured, published and assumed figures kept apart.
/v1/campaignsWhat this account already bought for a page: domains, spend, anchor mix. Nothing gets bought twice.
Buy
Pay-first, like every link marketplace, with the guardrails enforced in the same statement as the charge.
/v1/ordersPlace an order at the held price. Spend caps and idempotency are checked atomically with the debit.
/v1/ordersEvery order with its delivery state: in progress, awaiting content, overdue, or past due and past the grace period.
/v1/orders/{id}/cancelFull refund until the order reaches a supplier in the morning batch.
/v1/orders/{id}/contentSend the article. It is checked against the publisher's spec before anyone sees it.
/v1/orders/{id}/content/papiHave the article drafted for you and stored on the order for approval.
/v1/checkout/basketBuy a whole basket by card, with or without an account. Paying creates the account.
/v1/checkout/basket/{id}How that checkout went, line by line.
Measure what happened
A link is bought to move something. We keep watching after delivery, and say observed, never caused.
/v1/orders/{id}/outcomeEverything observed since one placement: the link still standing, rank movement on the page's keywords, confidence.
/v1/observations/purchasesReport placements bought anywhere else, so outcomes cover your whole footprint, not only ours.
/v1/connections/google/startConnect Google Search Console, read-only. Your rows stay yours: never pooled, never published, deleted on disconnect.
/v1/gsc/opportunitiesYour own pages at positions 5 to 20 with the queries behind them and their momentum: where a link has something to move.
Automate
For accounts that want links to keep arriving without a human in the loop, behind a dashboard-only switch.
/v1/standing_ordersSo many links a month for this page, within this budget. Quoted, approved or auto-placed, on a cadence.
/v1/standing_orders/{id}Pause, resume or edit a standing order; DELETE removes it.
/v1/customers/me/briefA weekly email per target: what landed, what is due, what moved, and a held quote for the next tranche.
/v1/customers/me/autoEnable auto placement. Dashboard session only: a key cannot switch on spending it did not ask for.
Account
One prepaid balance in US cents, keys with scopes, and a schema an agent configures itself from.
/v1/creditsBalance, spend limits, cleared cash, allowance and the ledger behind them.
/v1/credits/checkoutStart a card top-up. Auto-reload lives in /v1/credits/settings.
/v1/keysIssue, list and revoke keys. A read scope searches and plans; an order scope can spend.
/v1/schemaField semantics for agents: what every value means and how to reason about it.
/v1/healthCatalogue coverage and freshness, machine-readable.
Full request and response schemas: GET /v1/schema for field semantics and /openapi.json for the contract. Reads are metered: 1,000 requests and 20,000 rows per hour, plus a monthly allowance that grows with credits purchased.
the handbrake
Guardrails an agent cannot argue past.
Caps in the same statement as the charge
Per-order and per-day limits are checked atomically with the debit. They are not in a prompt, so no amount of reasoning gets around them.
A retry never charges twice
Every order carries an idempotency key. A replayed request returns the original order instead of a second one.
billing
Credits, pegged to something real.
1 credit = 1 US cent. No invented unit, no conversion table, no rate card to decode at reconciliation time.
Credits leave the account when an order is placed, because link buying is pay-first everywhere. What we add is the accounting on the other side:
- Past its promised turnaround: flagged, and logged against that supplier's on-time rate
- Undelivered past the grace period: flagged in your dashboard, and never refunded on the calendar alone
- A supplier recovery you ask us to pursue: email hello@placementapi.com; credits return once we have recovered from that supplier and their refund window plus your account grace period have run
- Delivered late: counted, so you can stop buying from whoever keeps doing it
A refund for an order that has already reached a supplier is not automatic: your credits return once we have recovered from that supplier and their refund window plus your account grace period have run, unless we refund earlier as a goodwill decision. The date alone returns nothing, and we cannot promise that a supplier will reimburse us. Unspent credits are refundable for 90 days, and never expire. Terms.
{
"balance_credits": 76600,
"balance_usd": "766.00",
"funding": {
"cash_on_hand_credits": 51200,
"pending_credits": 25400
},
"limits": {
"per_order_max_credits": 50000,
"daily_max_credits": 100000,
"remaining_today_credits": 76600
},
"refund_grace_days": 21
}pooled buying
Volume credits.
Suppliers discount on volume
No single agency places enough with any one supplier to reach the tiers that matter. Pooled across every buyer here, we do.
Most of it comes back
Returned as ordinary credits, weighted by what you bought. Not a loyalty scheme: it is your share of a rate you helped earn.
After delivery, not before
A discount on an order that never ran is not a discount, so credits follow delivery and are issued against what a supplier actually invoiced.
Or skip the REST surface entirely.
The same product is a hosted MCP server. Paste one URL into Claude, ChatGPT or Cursor and your agent can search, plan, compare, buy and track: 20 tools, nothing to install. The 5 that spend money only appear on a key with the order scope, so a key left in a chat window can look but cannot buy.