Skip to content

New AI assistant answers: ChatGPT, Gemini, Copilot and AI Mode by API

SerpKite
Get API key
Docs menu / Resolve

Resolve

Destinations of links a batch job or monitor run returned with link_resolved: false, which Google held back past the request. Free.

POST https://api.serpkite.com/v1/resolve Credits: Free
View as Markdown

Google links every result through a google.com/goto redirect, and for a few results per page it holds the destination back for seconds, sometimes longer than a request lasts. SerpKite keeps such a result in its position with link_resolved: false. Its link is then still Google's redirect and its domain is the host Google displayed. meta.unresolved_links counts them.

For batch jobs and monitor runs SerpKite goes on following those redirects after Google's delay, for up to 2 minutes, and they wait for them, so their results rarely carry any. Send such links here to get their destinations; a pending link comes with retry_after seconds to wait. Links held back from a live request are not followed after the response and come back failed: repeat the search, or run it as a batch job, to get them.

Request body

ParameterTypeDefaultDescription
links requiredstring[]1 to 100 link values of results with link_resolved: false, as returned (https://www.google.com/goto?url=…).

Example request

Authenticate with Authorization: Bearer $SERPKITE_API_KEY (GET requests may pass ?api_key= instead). The official SDKs read SERPKITE_API_KEY for you. See Authentication.

curl https://api.serpkite.com/v1/resolve \
  -H "Authorization: Bearer $SERPKITE_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"links":["https://www.google.com/goto?url=CAESgwEB6zsw"]}'

Response fields

FieldTypeDescription
results[]arrayOne per link, in order: link, status (resolved, pending, failed: Google never released it, unknown: not a link SerpKite returned in the last 24 hours), and destination and domain when resolved.
retry_afterintegerSeconds to wait before asking again for the pending links (also sent as Retry-After). Absent when none is pending.
metaobjectrequest_id and credits_used (always 0).

Every billed response also carries credit and latency headers (X-Credits-Used, X-Credits-Remaining, X-Request-Id…).

Example response

200 OK · illustrative
{
  "results": [
    {
      "link": "https://www.google.com/goto?url=CAESgwEB6zsw",
      "status": "resolved",
      "destination": "https://www.example.com/espresso-guide",
      "domain": "example.com"
    }
  ],
  "meta": {
    "request_id": "01JC8S9V5Q4ZB3H6M2N7P0R1T4",
    "credits_used": 0
  }
}

Errors

Errors use one shape: {"error":{"code","message","request_id"}}. Errors are never billed. Full list in Errors.

StatusCodeMeaning
400invalid_requestA parameter is missing or invalid.
401unauthorizedThe API key is missing, invalid or revoked.
402insufficient_creditsYour balance is too low. Buy a pack or wait for the monthly free grant.
429rate_limitedToo many requests per second for your plan. Retry after the Retry-After header.
503upstream_errorGoogle could not be fetched or parsed. Not billed; retry after Retry-After.

Notes

  • Not billed; counts toward the key's rate limit.
  • It never follows arbitrary redirects: only links SerpKite returned unresolved are known.