Credits & rate limits

Data keys are metered in credits. A search costs more than a read because it queries the whole index. Brand keys are never metered.

Credit costs

CallTypeDescription
GET /v1/creators/search10 creditsOne search query, regardless of page size (up to 100 records).
GET /v1/creators/{pk}1 creditOne profile read.

Monthly budgets

PlanTypeDescription
Starter ($49/mo)25,0002,500 searches or 25,000 reads. 60 requests/minute.
Growth ($199/mo)150,00015,000 searches or 150,000 reads. 120 requests/minute.
Scale ($499/mo)500,00050,000 searches or 500,000 reads. 300 requests/minute.

Budgets reset on the first of each calendar month (UTC). Unused credits do not roll over. Track usage on the keys page.

At the caps

Exceeding the per-minute rate limit:

429

{ "error": "Rate limit exceeded (60/min on Starter plan).", "code": "RATE_LIMITED" }

Exhausting the monthly credit budget:

402

{
  "error": "Monthly credit budget exhausted (25,000/25,000 used). Upgrade at https://api.ugcroster.com/keys or wait for the period to reset.",
  "code": "CREDITS_EXHAUSTED"
}

On 429, back off and retry after the window resets (check the X-RateLimit-Reset header). On 402, retrying is pointless until the period resets or the plan changes. Treat it as terminal for the billing period.

Check usage programmatically

GET /v1/usagereturns the calling key's plan, credit balance and rate limit. It is never metered and has its own 60/min budget, so poll it freely from dashboards or agents.

request

curl "https://api.ugcroster.com/v1/usage" \
  -H "Authorization: Bearer rsk_live_..."

response 200 (data key)

{
  "data": {
    "key_type": "data",
    "plan": "growth",
    "period": "202609",
    "credits": { "used": 41230, "limit": 150000, "remaining": 108770 },
    "requests_this_period": 5211,
    "rate_limit_per_minute": 120,
    "metered": true
  }
}

Brand keys get "metered": false with null credit fields: there is no budget to report.

Spending fewer credits

Searches are the expensive call, so make each one count: filter server-side instead of paginating broad queries (14 filters exist: use follower_min, engagement_min, state, has_email rather than fetching pages and filtering in your code), take the maximum limit=100 per page, and cache profile reads on your side: directory records do not change minute to minute.