Developers

API documentation

REST API for advertisers and publishers. Same rules as the dashboard. Bearer tokens only — access is invite-only.

Request access first. Creating tokens and calling /api/v1 requires admin approval. They get an email when you ask.

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.

AbilityEndpoints
profile:readGET /me
marketplace:readGET /marketplace, GET /marketplace/{site}
orders:readGET /orders, GET /orders/{order}
orders:writePOST /sites/{site}/orders, transitions, messages
wallet:readGET /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 pendingcancelled, and deliveredcompleted or revision.

Advertiser quick path

  1. GET /marketplace → pick a site
  2. POST /sites/{site}/orders → place the order ({site} is the listing public id)
  3. 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.

AbilityEndpoints
profile:readGET /me
sites:readGET /sites, GET /sites/{site}
sites:writePOST /sites, PUT /sites/{site}, DELETE /sites/{site}
orders:readGET /orders, GET /orders/{order}
orders:writetransitions, messages
wallet:readGET /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

Your sites only.

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

One of your sites.

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 pendingaccepted or rejected, then acceptedin_progress, then in_progress / revisiondelivered (with live_url).

Publisher quick path

  1. POST /sites → list a draft site
  2. GET /orders → incoming work
  3. 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

RoleFrom statusAllowed next
Publisherpendingaccepted, rejected
Publisheracceptedin_progress
Publisherin_progress or revisiondelivered
Advertiserpendingcancelled
Advertiserdeliveredcompleted, 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

CodeMeaning
401Missing, invalid, revoked, or expired token
403Wrong ability, wrong role, or not allowed on that resource
404Unknown or inactive resource
422Validation failed (JSON body with field errors)
429Rate limited

Stuck on an order or listing? Contact us. Process detail without the API: How it works.