Skip to main content
This guide walks through the full loop: create a key, start a resolve, and read the final destination. Every request is made over HTTPS to https://api.linkskipper.app and authenticated with a bearer token.
1

Create an API key

Open the developer dashboard and generate a key. It looks like sk_live_… and carries the resolve scope. Copy it once and store it as a secret — the full value is shown only at creation time.
Treat the key like a password. It authorizes spending credits from your account. If a key leaks, revoke it in the dashboard and issue a new one.
2

Make sure you have credits

Resolving a link spends credits (standard links cost 1, premium links cost 2). New accounts start with a small balance; top up in the dashboard when you need more. Cached links cost 0.
3

Start a resolve

Send the shortener URL to POST /v1/resolve. If the link has been resolved before you get the destination back immediately (200, status: "done"). Otherwise it is queued for background resolution and you get a job to poll (202, status: "queued").
curl https://api.linkskipper.app/v1/resolve \
  -H "Authorization: Bearer sk_live_XXXXXXXXXXXXXXXXXXXXXXXX" \
  -H "Content-Type: application/json" \
  -d '{"url": "https://ouo.io/abc123"}'
A queued response:
{
  "job_id": "9b1d7c0e-2f3a-4b5c-8d6e-1a2b3c4d5e6f",
  "status": "queued",
  "queue_position": 3,
  "poll_url": "/v1/jobs/9b1d7c0e-2f3a-4b5c-8d6e-1a2b3c4d5e6f"
}
4

Read the result

Poll GET /v1/jobs/{job_id} until status is done (or failed / invalid). The SDKs do this for you with resolveAndWait; with raw HTTP you poll on a short interval.
curl https://api.linkskipper.app/v1/jobs/9b1d7c0e-2f3a-4b5c-8d6e-1a2b3c4d5e6f \
  -H "Authorization: Bearer sk_live_XXXXXXXXXXXXXXXXXXXXXXXX"
{
  "job_id": "9b1d7c0e-2f3a-4b5c-8d6e-1a2b3c4d5e6f",
  "status": "done",
  "target_url": "https://example.com/final",
  "provider": "ouo",
  "tier": "standard",
  "credits_charged": 1,
  "balance": 248
}

Resolve without an SDK

If you prefer raw HTTP, the resolve-then-poll loop is a few lines in any language. These examples retry on 429/5xx-style transient failures by simply polling until the job reaches a terminal status.
# 1. Start a resolve job
curl https://api.linkskipper.app/v1/resolve \
  -H "Authorization: Bearer sk_live_XXXXXXXXXXXXXXXXXXXXXXXX" \
  -H "Content-Type: application/json" \
  -d '{"url": "https://ouo.io/abc123"}'
# -> 202 { "job_id": "...", "status": "queued", "poll_url": "/v1/jobs/..." }

# 2. Poll for the result (until status: done)
curl https://api.linkskipper.app/v1/jobs/JOB_ID \
  -H "Authorization: Bearer sk_live_XXXXXXXXXXXXXXXXXXXXXXXX"
# -> { "status": "done", "target_url": "https://..." }
The official SDKs (@linkskipper/sdk and linkskipper/sdk) wrap this loop, typed errors, retries, and webhook verification. See JavaScript and PHP.

Next steps

Authentication

Keys, scopes, headers, and the webhook secret.

Resolve endpoint

The full request and response contract.

Webhooks

Get results pushed to you instead of polling.

Errors

The RFC 7807 error envelope and every code.