Specio API
Specio speaks the OpenAI chat-completions protocol. If your code already talks to OpenAI, change two lines — the key and the base URL — and you are done.
curl https://specio.space/api/v1/chat/completions \
-H "Authorization: Bearer $SPECIO_API_KEY" \
-H "Content-Type: application/json" \
-d '{"model": "specio-pro", "messages": [{"role": "user", "content": "Hello"}]}'Authentication
Create a key in Settings → API keys. It is shown once, so store it in your secret manager. Send it as Authorization: Bearer sk-specio-… on every request.
Models
Five public names. They stay stable; the model behind each one can change as better ones come along.
| Model | Best for | RPM | TPM | Monthly cap |
|---|---|---|---|---|
specio-free | Trying the API out | 0 | 0 | 0 |
specio-hobby | Side projects and scripts | 0 | 0 | 0 |
specio-pro | Production workloads | 0 | 0 | 0 |
specio-business | High volume pipelines | 0 | 0 | 0 |
specio-enterprise | Highest quality, negotiated limits | 0 | 0 | 0 |
Streaming
Send "stream": true and you get a text/event-stream of chat.completion.chunk objects, ending with data: [DONE] — the same shape an OpenAI client already parses.
Errors
Errors come back in the shape OpenAI clients already parse, so your error handling keeps working.
{ "error": { "type": "invalid_request_error",
"message": "This key may not call specio-pro.",
"code": "tier_not_allowed" } }| Status | Code | What happened |
|---|---|---|
| 401 | invalid_api_key | The key is unknown or has been revoked |
| 401 | expired_api_key | The key passed its expiry date |
| 403 | tier_not_allowed | This key is not allowed to call that model |
| 404 | model_not_found | The model name is not one of the five |
| 429 | rate_limit_exceeded | Too many requests — see Retry-After |
| 429 | quota_exceeded | The monthly token cap is used up |
| 503 | model_not_configured | No provider model is assigned to that tier yet |
Rate limits
Every response tells you where you stand, so you never have to guess when to back off.
x-specio-ratelimit-limit-requests: 200 x-specio-ratelimit-remaining-requests: 187
A 429 carries Retry-After in seconds. Rate limits are measured over a 60-second sliding window, per key.
Usage and caps
A request consumes prompt_tokens + completion_tokens. Monthly caps reset at 00:00 UTC on the 1st. A key can carry its own cap, in which case the tighter of the two applies. Requests rejected before the model runs consume nothing.
Your account may also carry guardrails on a given model — a length limit, blocked terms, or a cap on output tokens. When one fires you get 400 blocked_by_guardrail with the message your operator configured.