Skip to main content
GET https://api.linkskipper.app/v1/jobs/{job_id} · Any valid API key.
When POST /v1/resolve returns 202, it gives you a job_id. Poll this endpoint to track the resolve until it finishes. The job belongs to the API key that created it — fetching another key’s job returns not_found (404).

Request

Path parameters

job_id
string
required
The job UUID returned by POST /v1/resolve. Must be a valid UUID; a malformed id returns not_found (404).

Headers

Authorization
string
required
Bearer sk_live_…. See Authentication.

Response

job_id
string
The job UUID.
status
string
One of queued, running, done, failed, invalid. See Lifecycle.
target_url
string
Present only when status is done. The resolved destination URL.
provider
string
Present only when status is done. The provider that owned the link (e.g. ouo).
tier
string
Present only when status is done. "standard" or "premium".
error
string
Present only when status is failed or invalid. resolve_failed for a failed job, unsupported_link for an invalid one.
credits_charged
number
Credits spent on this job. The successful cost when done; 0 when failed / invalid.
balance
number | null
Your current credit balance.

Examples

curl https://api.linkskipper.app/v1/jobs/9b1d7c0e-2f3a-4b5c-8d6e-1a2b3c4d5e6f \
  -H "Authorization: Bearer sk_live_XXXXXXXXXXXXXXXXXXXXXXXX"

Responses by status

{
  "job_id": "9b1d7c0e-2f3a-4b5c-8d6e-1a2b3c4d5e6f",
  "status": "done",
  "target_url": "https://example.com/final",
  "provider": "ouo",
  "tier": "standard",
  "credits_charged": 1,
  "balance": 248
}

Job lifecycle

A job moves through these states. queued, running are non-terminal — keep polling. done, failed, invalid are terminal — stop polling.
StatusTerminalMeaning
queuednoAccepted and waiting for a worker.
runningnoA worker is resolving the link right now.
doneyesResolved. target_url, provider, tier, credits_charged set.
failedyesThe resolver couldn’t resolve it. error is resolve_failed.
invalidyesThe link wasn’t a supported/resolvable target. error is unsupported_link.

Polling guidance

  • Poll on a short, fixed interval — 1.5–2 seconds is a good default. Standard links typically resolve in seconds; premium (exe.io) links are best-effort and slower.
  • Stop as soon as status is done, failed, or invalid.
  • Set an overall deadline (e.g. 60–120s) so a stuck job doesn’t poll forever.
  • Reads count against your per-minute rate limit like any request — don’t poll tighter than ~1s.
  • Prefer webhooks for high volume so you don’t poll at all.
The SDKs implement this loop for you. resolveAndWait (JS / PHP) submits the resolve, polls until terminal, and returns the resolved link — throwing JobFailedError / JobFailedException on failed / invalid and TimeoutError / TimeoutException if the deadline passes. See JavaScript and PHP.