AI agents and LLMs
Agents can discover and call sponsor.ink programmatically. Use the OpenAPI spec or llms.txt for machine-readable entry points; authenticate with the same Bearer token as the REST API.
Typical agent workflow (advertiser)
GET /marketplace — filter by DR, price, language, country
GET /marketplace/{site} — review publisher rules and pricing
GET /wallet — confirm balance before ordering
POST /sites/{site}/orders — place the guest post order
GET /orders/{order} — track until delivered
Wallet top-ups use Stripe Checkout on the web dashboard only. If balance is too low, direct the user to Wallet before retrying.
Example prompts
- “Search sponsor.ink for English marketing blogs DR 40+ under $200.”
- “Place a written guest post on the best match for https://example.com/pricing with anchor ‘workflow automation’.”
- “List my pending orders and wallet balance on sponsor.ink.”
MCP server
Connect Cursor, Claude Desktop, or any MCP client to call sponsor.ink tools with your API token. Also listed on Smithery.
{
"mcpServers": {
"sponsor-ink": {
"url": "https://sponsor.ink/mcp",
"headers": {
"Authorization": "Bearer si_YOUR_TOKEN"
}
}
}
}
Available tools depend on your role and token abilities. Advertisers get marketplace search and ordering; publishers get site management and order fulfilment.
place_order requires confirmed: true after the user approves a price preview. Call without confirmation first to get the preview, or use get_wallet and get_marketplace_site before confirming.
Calling the API directly
curl -H "Authorization: Bearer YOUR_TOKEN" \
-H "Accept: application/json" \
"https://sponsor.ink/api/v1/marketplace?min_dr=40&max_price=200&language=en"
Authentication
Base URL: https://sponsor.ink/api/v1
After your access is approved, open Profile and create an API token. The full token is shown once. Store it like a password. Tokens use a si_ prefix and expire after 365 days unless you revoke them sooner.
Send the token on every request:
Authorization: Bearer YOUR_TOKEN
Accept: application/json
Example:
curl -H "Authorization: Bearer YOUR_TOKEN" \
-H "Accept: application/json" \
https://sponsor.ink/api/v1/me
Web session cookies alone are not enough. The API requires a personal access token. Each token carries abilities for your role; uncheck ones you do not want that token to have.
Rate limits
- 60 requests per minute per user for reads and general calls.
- 20 requests per minute for writes (create order, transitions, messages, site mutations).
Over the limit you get 429. Back off and retry.
Account
GET
/me
profile:read
Current user. No password or other secrets in the payload.
{
"data": {
"id": 3,
"name": "Jane Advertiser",
"email": "[email protected]",
"role": "advertiser",
"balance": "0.00",
"email_verified_at": null,
"created_at": "2026-08-25T09:14:32+00:00"
}
}
Advertiser
Browse the catalog, place orders, cancel while pending, complete or request revision after delivery, message on the order, and read your wallet.
| Ability | Endpoints |
profile:read | GET /me |
marketplace:read | GET /marketplace, GET /marketplace/{site} |
orders:read | GET /orders, GET /orders/{order} |
orders:write | POST /sites/{site}/orders, transitions, messages |
wallet:read | GET /wallet |
Marketplace
Active listings only.
GET
/marketplace
marketplace:read
Query params (all optional):
search — domain or name
min_dr — Ahrefs DR floor
max_price — provided-content price ceiling
category, language, country, link_type
per_page — 1–100 (default 24)
GET
/marketplace/{site}
marketplace:read
One active listing: metrics, prices, link type, turnaround, publisher rules. {site} is the listing’s public id (32-character hex), not a sequential database id. Draft or paused sites return 404.
Orders
POST
/sites/{site}/orders
orders:write
Site must be active. Price and commission lock from the listing at place time.
{
"type": "provided",
"target_url": "https://example.com/landing",
"anchor_text": "optional anchor",
"brief": "Tone and angle",
"content": "Full article when type is provided"
}
type is provided or written. Use written only if the listing has a written price. For provided, send content and/or a content_file (multipart: doc, docx, txt, md, html, pdf, max 5 MB). Returns 201.
From there use the shared order endpoints below. As advertiser you can move pending → cancelled, and delivered → completed or revision.
Advertiser quick path
GET /marketplace → pick a site
POST /sites/{site}/orders → place the order ({site} is the listing public id)
- Wait for delivery, then
POST .../transition with completed (or revision)
Publisher
List and edit your sites, handle incoming orders (accept, reject, deliver), message on the order, and read earnings.
| Ability | Endpoints |
profile:read | GET /me |
sites:read | GET /sites, GET /sites/{site} |
sites:write | POST /sites, PUT /sites/{site}, DELETE /sites/{site} |
orders:read | GET /orders, GET /orders/{order} |
orders:write | transitions, messages |
wallet:read | GET /wallet |
Sites
New listings start as draft. They go live after review on the platform. You cannot set status or another user’s publisher_id through the API.
GET
/sites
sites:read
POST
/sites
sites:write
{
"url": "https://mysite.example/",
"name": "My Site",
"description": "Optional",
"language": "en",
"country": "GB",
"categories": ["seo", "marketing"],
"ahrefs_dr": 40,
"ahrefs_rd": 1200,
"traffic_monthly": 25000,
"price_content_provided": 120,
"price_content_written": 180,
"turnaround_days": 5,
"link_type": "dofollow",
"max_links": 1,
"publisher_rules": "No gambling. No adult."
}
Required: url, language, price_content_provided, turnaround_days, link_type (dofollow | nofollow | sponsored), max_links.
GET
/sites/{site}
sites:read
PUT
/sites/{site}
sites:write
Same fields as create. You must own the site.
DELETE
/sites/{site}
sites:write
Removes the listing. Returns 204.
Orders
Use the shared order endpoints. As publisher you can move pending → accepted or rejected, then accepted → in_progress, then in_progress / revision → delivered (with live_url).
Publisher quick path
POST /sites → list a draft site
GET /orders → incoming work
- Accept → in progress → deliver with
live_url
Order endpoints (both roles)
Advertisers see orders they placed. Publishers see orders on their sites.
GET
/orders
orders:read
Paginated list for your role. Optional per_page (1–100).
GET
/orders/{order}
orders:read
Order detail, site, timeline events. Response meta.allowed_transitions lists what you can do next.
POST
/orders/{order}/transition
orders:write
{
"to_status": "delivered",
"live_url": "https://publisher-site.com/guest-post",
"note": "optional note on the timeline"
}
When moving to delivered, live_url is required if the order does not already have one. Illegal transitions return 403.
POST
/orders/{order}/messages
orders:write
Body: {"body": "Your message"}. Lands on the order timeline. Returns 201.
Status transitions
| Role | From status | Allowed next |
| Publisher | pending | accepted, rejected |
| Publisher | accepted | in_progress |
| Publisher | in_progress or revision | delivered |
| Advertiser | pending | cancelled |
| Advertiser | delivered | completed, revision |
Wallet
GET
/wallet
wallet:read
Your balance and transaction history. Advertisers top up via Stripe Checkout. Publishers request PayPal withdrawals for admin approval.
Errors
| Code | Meaning |
401 | Missing, invalid, revoked, or expired token |
403 | Wrong ability, wrong role, or not allowed on that resource |
404 | Unknown or inactive resource |
422 | Validation failed (JSON body with field errors) |
429 | Rate limited |
Stuck on an order or listing? Contact us. Process detail without the API: How it works.