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.