Most problems have a small set of common causes. Work through the relevant section below before reaching out to support — you'll likely find the answer faster.
401 UnauthorizedThe most common cause is a missing or malformed Authorization header. Check that:
Authorization: Bearer YOUR_API_KEYsk_test_...) do not work in production and live keys (sk_live_...) do not work against the sandbox403 ForbiddenYour key is valid but lacks the permissions needed for this operation. API keys can be scoped to specific permissions. Check Settings → API → [your key] and verify the key has the required scope.
422 Unprocessable EntityThe request body failed validation. The response body will tell you exactly what's wrong:
{
"error": {
"code": "validation_error",
"message": "The 'name' field is required.",
"param":
Check the param field to identify which field caused the error, then refer to the API Reference for the correct type and constraints.
localhost URLs will not work. Use ngrok or a similar tool during local development.2xx response. If your endpoint returns a non-2xx status, we'll retry delivery up to five times with exponential backoff. Check your server logs for errors.X-Signature header as a hex-encoded HMAC-SHA256.429 Too Many RequestsYou've exceeded your plan's rate limit. The response includes a Retry-After header with the number of seconds to wait before retrying.
To avoid hitting limits:
async function withRetry<T>(fn: () => Promise<T>, maxAttempts = 3): Promise<T> {
for (let attempt = 0; attempt < maxAttempts; attempt++) {
try {
return await fn()
} catch (err) {
if (err.status !== 429 || attempt === maxAttempts - 1) throw err
await new Promise((resolve) =>
setTimeout(resolve, Math.pow(2, attempt) * 1000)
)
}
}
throw new Error("Max retries exceeded")
}If you're consistently hitting limits, consider upgrading your plan or contacting support about higher limits.
MissingApiKeyError on initializationThe SDK cannot find your API key. Make sure:
YOUR_PRODUCT_API_KEY is set in your environment (.env.local for local development)Breaking changes are documented in the Changelog. After upgrading, check the changelog entry for the new version and follow any migration instructions.
List endpoints return results in reverse chronological order by default. If your resource was created recently, it should appear at the top. If it doesn't:
POST request returned 201 Created (not an error)status filter is active — archived resources are excluded by defaultWebhooks are delivered at least once but may occasionally arrive out of order or more than once. Make sure your handler is:
200 quickly — if your handler times out, we'll retry delivery, which may cause double-processingIf none of the above resolves your issue:
X-Request-Id)