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.

ModelBest forRPMTPMMonthly cap
specio-freeTrying the API out000
specio-hobbySide projects and scripts000
specio-proProduction workloads000
specio-businessHigh volume pipelines000
specio-enterpriseHighest quality, negotiated limits000

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" } }
StatusCodeWhat happened
401invalid_api_keyThe key is unknown or has been revoked
401expired_api_keyThe key passed its expiry date
403tier_not_allowedThis key is not allowed to call that model
404model_not_foundThe model name is not one of the five
429rate_limit_exceededToo many requests — see Retry-After
429quota_exceededThe monthly token cap is used up
503model_not_configuredNo 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.