POST https://api.linkskipper.app/v1/resolve · Requires the resolve scope.200. Otherwise the link is queued for background
resolution and you get HTTP 202 with a job to poll (or a webhook delivery).
Request
Headers
Bearer sk_live_…. See Authentication.application/json.Optional. De-duplicates retries. Equivalent to the
idempotency_key body field — if both
are present, the body field wins. Max 128 characters. See Idempotency.Body
The shortener URL to resolve. Max 2048 characters. Must be a link from a
supported provider; anything else returns
unsupported_link (422).Optional de-duplication token, max 128 characters. A repeated request with the same key
returns the existing job’s current state instead of starting a new resolve. Takes
precedence over the
Idempotency-Key header.Optional public HTTPS callback. When the job reaches a terminal status, Link Skipper
sends a signed
POST to this URL. Max 2048 characters. Loopback, private, link-local, and
.localhost / .internal hosts are rejected at validation time. See Webhooks.Request body
Response
The endpoint returns one of two shapes depending on whether the link was already cached.200 — resolved (cached)
Returned when the link was already in cache.job_id is null because no job was created,
cached is true, and credits_charged is 0 (cached reads are free).
null for a cached, synchronous resolve."done".The URL you submitted (echoed back).
The final destination the shortener points to.
"standard" or "premium".0 for a cached resolve.true for a cached resolve.Your remaining credit balance after the call.
200 OK
202 — queued
Returned when the link must be resolved in the background. Poll thepoll_url (the
jobs endpoint) until the job is terminal, or supply a webhook_url to be notified.
The UUID of the queued job. Use it with
GET /v1/jobs/{job_id}."queued".Approximate position in the resolve queue at submission time.
Relative path to poll for the result, e.g.
/v1/jobs/{job_id}.202 Accepted
Examples
The SDK
resolve() methods submit the URL and (optionally) an idempotency key. To pass a
webhook_url, send a raw HTTP request, or use the dashboard. To resolve and wait for
the result in one call, use resolveAndWait.Synchronous vs queued
Cached → 200
The link was resolved before. The destination comes back in the same response,
cached: true, and you are not charged.New → 202
The link is queued. You get a
job_id and poll_url. Credits are only charged when the
job succeeds.status field) so your code handles both.
Idempotency
APOST /v1/resolve is not naturally idempotent: a naive retry after a dropped connection
could queue a second job and charge twice. Send an idempotency key to make retries safe.
When you supply idempotency_key (body) or Idempotency-Key (header):
- The first request with that key starts the resolve and remembers the resulting job.
- Any repeat with the same key returns that job’s current state as-is — it does not
start a new resolve and does not charge again. While the job is still running you get the
202queued shape back; once it finishes you get the resolved200shape. - Idempotency keys are scoped per API key. Use a stable, unique value per logical operation (an order id, a content id, a UUID you generate).
Safe retry
A replay of a key whose job ended in failure surfaces the same terminal error:
resolve_failed for a failed job, unsupported_link for an invalid one.Errors
| Code | Status | When |
|---|---|---|
invalid_request | 400 | Missing/unknown field, or url over 2048 chars. |
invalid_key | 401 | Missing, malformed, or revoked API key. |
out_of_credits | 402 | Balance is below the link’s cost. Includes balance. |
forbidden_scope | 403 | Key lacks the resolve scope. |
link_removed | 410 | The destination has been removed by the shortener. |
unsupported_link | 422 | The URL is not a supported shortener (or has no URL). |
rate_limited | 429 | Per-minute limit hit. Includes Retry-After. |
quota_exceeded | 429 | Daily quota reached. Includes Retry-After. |
resolve_failed | 502 | The resolver could not resolve the link. |
provider_down | 503 | The provider is temporarily unavailable. |
Retry-After behavior.