Authentication | Proxyify Docs
Docs Authentication

Authentication

Every request to Proxyify must be authenticated with an API key passed in the Authorization header.

API keys

API keys are created from Dashboard → Keys. Each key:

  • Is shown only once at creation — copy and store it securely
  • Is stored as a SHA-256 hash on our servers — not in plaintext
  • Is scoped to your account's credit balance

Never expose a prx- key in client-side code. Use ephemeral tokens for browser environments.

Bearer header

Pass your key in the standard HTTP Authorization header:

http
Authorization: Bearer prx-xxxxxxxxxxxxxxxx

When using the OpenAI SDK, pass the key as api_key — the SDK handles the header automatically:

Python
client = OpenAI(api_key="prx-xxxxxxxxxxxxxxxx", base_url="https://proxyify.dev/v1")

Key restrictions

Every restriction is optional. When not set, no restriction applies. Restrictions can be set at creation time or edited later from the key's Settings modal.

RestrictionDescription
expires_atKey TTL — automatically deactivates after this datetime
allowed_modelsAllowlist of model slugs (e.g. ["openai/gpt-4o"]). Empty = all models allowed
allowed_categoriesRestrict to modalities: text, image, video, stt, tts
allowed_ipsIP allowlist — supports CIDR notation (e.g. 10.0.0.0/24)
allowed_originsOrigin/Referer allowlist (e.g. myapp.com, localhost)
blocked_countriesISO country codes to block (e.g. RU, CN)
active_hoursTime window in UTC, e.g. 09:00-18:00 — requests outside are rejected
spending_limitMaximum credits this key can spend per period
spending_perioddaily / weekly / monthly
webhook_urlURL to POST when credit threshold or rate limit is exceeded

Security chain

Every incoming request passes through these checks in order. The first failure returns immediately:

#CheckError
0Account is active, not banned or suspended403
1Key exists, is active, TTL has not expired401
2Request is within active_hours window403
3Caller IP is in allowed_ips403
4Origin / Referer is in allowed_origins403
5Caller's country is not in blocked_countries403
6Requested model is in allowed_models / allowed_categories403
7No prompt injection pattern detected400
8Rate limit (RPM / RPD) not exceeded429
9Key spending limit not reached402
10Account has sufficient credits402

Rate limits

Rate limits are applied per account, not per key. RPM = requests per minute, RPD = requests per day.

PlanRPMRPD
Free20200
Starter100Unlimited
Pro300Unlimited
ScaleUnlimitedUnlimited

When a rate limit is exceeded the response is 429 with a Retry-After header indicating when the limit resets.