1. Get an API keyLink to this section
The API authenticates with an organization key that starts with sk-sx-. You mint and revoke keys in the console; the key is shown once.
- Create an account, then open the console and mint a key for your organization.
- Every key belongs to one organization. A key cannot read another organization’s stored responses, files, or usage.
- Store it in the environment, never in client-side code. The console can revoke any key immediately; revoked keys stop authenticating.
- Platforms that provision keys for tenants use a separate machine path — see platform keys.
export SYLPHX_API_KEY="sk-sx-…" # paste the key from the console
2. Send your first requestLink to this section
The official OpenAI SDKs work unchanged: point them at our base URL and name a catalog model. The first sample model below is a real, currently listed model.
curl https://api.models.sylphx.ai/v1/responses \
-H "Authorization: Bearer $SYLPHX_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"model": "openai/gpt-5.5",
"input": "Explain streaming in two sentences."
}'
Only two things are Sylphx-specific: the base URL and the model id. Swap model for any id in the catalog and the rest of your request is unchanged.
3. Read the answerLink to this section
You get back an official Responses object. The four fields you read first are the id, the output, the model echo, and the usage.
{
"id": "resp_9f2c41d0a8",
"object": "response",
"model": "openai/gpt-5.5",
"output": [
{
"type": "message",
"role": "assistant",
"content": [
{
"type": "output_text",
"text": "Streaming sends each token as the model writes it…",
"annotations": []
}
]
}
],
"usage": {
"input_tokens": 18,
"output_tokens": 96,
"total_tokens": 114
}
}
ididentifies this response. While it is stored you can retrieve it withGET /responses/{id}, list its input items, or delete it.modelis exactly the model id you sent — never an internal alias. That is what makes the price and the transcript reproducible.outputcarries the assistant message, and any function calls or hosted tool items the turn produced.usagereports the tokens this request was metered for. Multiply by the catalog’s per-million prices to reproduce the cost.
previous_response_id can continue a conversation. Send store: false to skip persistence; a later previous_response_id that refers to an unpersisted response is rejected. Details on the Responses page.4. Stream the same callLink to this section
Add stream: true and the response arrives as server-sent events. The event names are the official OpenAI Responses names, and the stream ends exactly once with a typed terminal.
curl -N https://api.models.sylphx.ai/v1/responses \
-H "Authorization: Bearer $SYLPHX_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"model": "openai/gpt-5.5",
"input": "Count to five.",
"stream": true
}'
event: response.created
data: {"type":"response.created","response":{…}}
event: response.output_text.delta
data: {"type":"response.output_text.delta","delta":"One"}
event: response.completed
data: {"type":"response.completed","response":{…},"usage":{…}}
Streaming rules — one terminal, ordered events, and tool calls that do not end the stream — are on the Responses page.
5. Make retries safeLink to this section
A network retry should never create a second response. Send a UUID with every retryable create and the retry — and only that retry — is deduplicated.
curl https://api.models.sylphx.ai/v1/responses \
-H "Authorization: Bearer $SYLPHX_API_KEY" \
-H "Content-Type: application/json" \
-H "Idempotency-Key: 8f8d57c8-8868-4d90-90cb-55e892cb80a5" \
-d '{
"model": "openai/gpt-5.5",
"input": "Summarise this incident in three bullets."
}'
- Identical retry after completion →
200with the original response and headeridempotency-replayed: true. - Same key, different body →
422 idempotency_key_reuse. Use a new key for a new request. - Same key while the first attempt is still running →
409 idempotency_in_progress. Wait, then retry the same bytes.
Full retry contract, including which errors are retryable: errors and retries.
Troubleshooting the first callLink to this section
The three failures that stop a first request, and what each one actually means.
401 invalid_api_key— the bearer is missing, malformed, or revoked. Check that the value starts withsk-sx-and has no quotes or whitespace.404 model_not_found— that model id is not in the catalog. Copy an id from the catalog rather than typing one.429 rate_limit_exceeded— the key’s request envelope is spent. Readretry_after_seconds(and theRetry-Afterheader) before retrying.
Every error shares one envelope, and each code names the next action. See errors and retries.