{"openapi":"3.1.0","info":{"title":"EagleAI Model Proxy","version":"2.17.1","description":"Server-side proxy to the OpenAI Responses API.\n\n**Model.** gpt-5.6-sol. Any other model name is refused with 400 and never forwarded upstream.\n\n**Authentication.** Send the shared secret in the X-API-Key header on every request. A missing header is 401, a wrong one is 403, and the endpoint refuses all traffic if the server has no key configured.\n\n**Per-request limits.** 2100 prompt tokens (10300 characters), 4000 output tokens (max_output_tokens), 6100 tokens in total, 128 input items, 131072 bytes of request body. Requests above any of these are refused locally with 400 or 413; nothing is silently truncated.\n\n**Throughput.** 163 requests/minute and 203 concurrent upstream calls. Over the rate limit is 429 with Retry-After. Over the concurrency limit, a request waits up to 5s for a slot and is then refused with 429 rather than queued indefinitely.\n\n**Streaming.** Set stream=true for text/event-stream. Frames are relayed unbuffered, and the terminal response.completed frame carries the usage object.\n\n**Timeout.** 300s, after which the request returns 504."},"paths":{"/api/v1/responses":{"post":{"operationId":"createResponse","summary":"Create a model response","security":[{"ApiKeyAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["model","input"],"properties":{"model":{"type":"string","description":"Model to run. Only gpt-5.6-sol is available on this endpoint.","enum":["gpt-5.6-sol"]},"input":{"description":"Responses API input: a string, or a list of message objects. At most 128 message/content items, and at most 10300 characters of prompt.","oneOf":[{"type":"string"},{"type":"array","items":{"type":"object"}}]},"stream":{"type":"boolean","default":false,"description":"Stream the reply as Server-Sent Events (text/event-stream). Frames are relayed as they arrive and are not buffered."},"max_output_tokens":{"type":"integer","minimum":1,"maximum":4000,"description":"Maximum tokens to generate, up to 4000. A larger value is rejected rather than clamped, so a truncated reply is never returned as if it were complete. Omitted means the endpoint cap is applied."},"reasoning":{"type":"object","description":"Reasoning controls, passed through to the model. This model thinks before it answers, and those thinking tokens are charged against max_output_tokens without being returned to you. Omitted, this endpoint sends effort \"high\", which leaves the whole 4000-token budget for the answer. Send a higher effort for a harder question, but note that it buys thinking out of the same budget: too high for the question and the reply comes back with no answer in it, which this endpoint refuses with 400 empty_reply rather than billing you for.","properties":{"effort":{"type":"string","enum":["none","low","medium","high","xhigh","max"],"default":"high"}},"additionalProperties":true}},"additionalProperties":true}}}},"responses":{"200":{"description":"Responses API reply, verbatim. When stream=true the body is text/event-stream instead, and the terminal response.completed frame carries the usage object.","content":{"application/json":{"schema":{"type":"object"}},"text/event-stream":{"schema":{"type":"string"}}}},"400":{"description":"Unsupported model, output limit exceeded, per-request token budget exceeded, or worst-case cost above this endpoint's ceiling","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"message":{"type":"string"},"type":{"type":"string"},"code":{"type":"string","description":"Machine-readable refusal reason: model_not_allowed, model_not_available, request_too_large, too_many_input_items, max_output_tokens_too_large, token_budget_exceeded, cost_guard_exceeded, unsupported_field, empty_reply, upstream_error."}}}}}}}},"401":{"description":"Missing X-API-Key"},"403":{"description":"Invalid X-API-Key"},"413":{"description":"Request body, prompt length or input item count above the limit","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"message":{"type":"string"},"type":{"type":"string"},"code":{"type":"string","description":"Machine-readable refusal reason: model_not_allowed, model_not_available, request_too_large, too_many_input_items, max_output_tokens_too_large, token_budget_exceeded, cost_guard_exceeded, unsupported_field, empty_reply, upstream_error."}}}}}}}},"422":{"description":"Malformed request body"},"429":{"description":"Rate limit (163 requests/minute) or concurrency limit (203 in flight) reached, or the upstream throttled the request. Retry-After says when to come back; it is passed through unchanged when it comes from upstream.","headers":{"Retry-After":{"description":"Seconds to wait before retrying. Present on every 429 this proxy generates.","schema":{"type":"integer","minimum":1}}},"content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"message":{"type":"string"},"type":{"type":"string"},"code":{"type":"string","description":"Machine-readable refusal reason: model_not_allowed, model_not_available, request_too_large, too_many_input_items, max_output_tokens_too_large, token_budget_exceeded, cost_guard_exceeded, unsupported_field, empty_reply, upstream_error."}}}}}}}},"502":{"description":"Upstream failure"},"503":{"description":"Proxy disabled or not configured"},"504":{"description":"Upstream did not respond within 300s"}}}},"/api/v1/micro/responses":{"post":{"operationId":"createResponseMicro","summary":"micro tier","description":"The same model at a smaller promise: up to 150 prompt tokens and 80 of reply, at 60 requests/minute. Oversized requests are refused with 400 here rather than served at this price — send them to a larger tier.","security":[{"ApiKeyAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["model","input"],"properties":{"model":{"type":"string","description":"Model to run. Only gpt-5.6-sol is available on this endpoint.","enum":["gpt-5.6-sol"]},"input":{"description":"Responses API input: a string, or a list of message objects. At most 128 message/content items, and at most 732 characters of prompt.","oneOf":[{"type":"string"},{"type":"array","items":{"type":"object"}}]},"stream":{"type":"boolean","default":false,"description":"Stream the reply as Server-Sent Events (text/event-stream). Frames are relayed as they arrive and are not buffered."},"max_output_tokens":{"type":"integer","minimum":1,"maximum":80,"description":"Maximum tokens to generate, up to 80. A larger value is rejected rather than clamped, so a truncated reply is never returned as if it were complete. Omitted means the endpoint cap is applied."},"reasoning":{"type":"object","description":"Reasoning controls, passed through to the model. This model thinks before it answers, and those thinking tokens are charged against max_output_tokens without being returned to you. Omitted, this endpoint sends effort \"none\", which leaves the whole 80-token budget for the answer. Send a higher effort for a harder question, but note that it buys thinking out of the same budget: too high for the question and the reply comes back with no answer in it, which this endpoint refuses with 400 empty_reply rather than billing you for.","properties":{"effort":{"type":"string","enum":["none","low","medium","high","xhigh","max"],"default":"none"}},"additionalProperties":true}},"additionalProperties":true}}}},"responses":{"200":{"description":"Responses API reply, verbatim. When stream=true the body is text/event-stream instead, and the terminal response.completed frame carries the usage object.","content":{"application/json":{"schema":{"type":"object"}},"text/event-stream":{"schema":{"type":"string"}}}},"400":{"description":"Unsupported model, output limit exceeded, per-request token budget exceeded, or worst-case cost above this endpoint's ceiling","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"message":{"type":"string"},"type":{"type":"string"},"code":{"type":"string","description":"Machine-readable refusal reason: model_not_allowed, model_not_available, request_too_large, too_many_input_items, max_output_tokens_too_large, token_budget_exceeded, cost_guard_exceeded, unsupported_field, empty_reply, upstream_error."}}}}}}}},"401":{"description":"Missing X-API-Key"},"403":{"description":"Invalid X-API-Key"},"413":{"description":"Request body, prompt length or input item count above the limit","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"message":{"type":"string"},"type":{"type":"string"},"code":{"type":"string","description":"Machine-readable refusal reason: model_not_allowed, model_not_available, request_too_large, too_many_input_items, max_output_tokens_too_large, token_budget_exceeded, cost_guard_exceeded, unsupported_field, empty_reply, upstream_error."}}}}}}}},"422":{"description":"Malformed request body"},"429":{"description":"Rate limit (60 requests/minute) or concurrency limit (203 in flight) reached, or the upstream throttled the request. Retry-After says when to come back; it is passed through unchanged when it comes from upstream.","headers":{"Retry-After":{"description":"Seconds to wait before retrying. Present on every 429 this proxy generates.","schema":{"type":"integer","minimum":1}}},"content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"message":{"type":"string"},"type":{"type":"string"},"code":{"type":"string","description":"Machine-readable refusal reason: model_not_allowed, model_not_available, request_too_large, too_many_input_items, max_output_tokens_too_large, token_budget_exceeded, cost_guard_exceeded, unsupported_field, empty_reply, upstream_error."}}}}}}}},"502":{"description":"Upstream failure"},"503":{"description":"Proxy disabled or not configured"},"504":{"description":"Upstream did not respond within 300s"}}}},"/api/v1/nano/responses":{"post":{"operationId":"createResponseNano","summary":"nano tier","description":"The same model at a smaller promise: up to 500 prompt tokens and 250 of reply, at 20 requests/minute. Oversized requests are refused with 400 here rather than served at this price — send them to a larger tier.","security":[{"ApiKeyAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["model","input"],"properties":{"model":{"type":"string","description":"Model to run. Only gpt-5.6-sol is available on this endpoint.","enum":["gpt-5.6-sol"]},"input":{"description":"Responses API input: a string, or a list of message objects. At most 128 message/content items, and at most 2440 characters of prompt.","oneOf":[{"type":"string"},{"type":"array","items":{"type":"object"}}]},"stream":{"type":"boolean","default":false,"description":"Stream the reply as Server-Sent Events (text/event-stream). Frames are relayed as they arrive and are not buffered."},"max_output_tokens":{"type":"integer","minimum":1,"maximum":250,"description":"Maximum tokens to generate, up to 250. A larger value is rejected rather than clamped, so a truncated reply is never returned as if it were complete. Omitted means the endpoint cap is applied."},"reasoning":{"type":"object","description":"Reasoning controls, passed through to the model. This model thinks before it answers, and those thinking tokens are charged against max_output_tokens without being returned to you. Omitted, this endpoint sends effort \"none\", which leaves the whole 250-token budget for the answer. Send a higher effort for a harder question, but note that it buys thinking out of the same budget: too high for the question and the reply comes back with no answer in it, which this endpoint refuses with 400 empty_reply rather than billing you for.","properties":{"effort":{"type":"string","enum":["none","low","medium","high","xhigh","max"],"default":"none"}},"additionalProperties":true}},"additionalProperties":true}}}},"responses":{"200":{"description":"Responses API reply, verbatim. When stream=true the body is text/event-stream instead, and the terminal response.completed frame carries the usage object.","content":{"application/json":{"schema":{"type":"object"}},"text/event-stream":{"schema":{"type":"string"}}}},"400":{"description":"Unsupported model, output limit exceeded, per-request token budget exceeded, or worst-case cost above this endpoint's ceiling","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"message":{"type":"string"},"type":{"type":"string"},"code":{"type":"string","description":"Machine-readable refusal reason: model_not_allowed, model_not_available, request_too_large, too_many_input_items, max_output_tokens_too_large, token_budget_exceeded, cost_guard_exceeded, unsupported_field, empty_reply, upstream_error."}}}}}}}},"401":{"description":"Missing X-API-Key"},"403":{"description":"Invalid X-API-Key"},"413":{"description":"Request body, prompt length or input item count above the limit","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"message":{"type":"string"},"type":{"type":"string"},"code":{"type":"string","description":"Machine-readable refusal reason: model_not_allowed, model_not_available, request_too_large, too_many_input_items, max_output_tokens_too_large, token_budget_exceeded, cost_guard_exceeded, unsupported_field, empty_reply, upstream_error."}}}}}}}},"422":{"description":"Malformed request body"},"429":{"description":"Rate limit (20 requests/minute) or concurrency limit (203 in flight) reached, or the upstream throttled the request. Retry-After says when to come back; it is passed through unchanged when it comes from upstream.","headers":{"Retry-After":{"description":"Seconds to wait before retrying. Present on every 429 this proxy generates.","schema":{"type":"integer","minimum":1}}},"content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"message":{"type":"string"},"type":{"type":"string"},"code":{"type":"string","description":"Machine-readable refusal reason: model_not_allowed, model_not_available, request_too_large, too_many_input_items, max_output_tokens_too_large, token_budget_exceeded, cost_guard_exceeded, unsupported_field, empty_reply, upstream_error."}}}}}}}},"502":{"description":"Upstream failure"},"503":{"description":"Proxy disabled or not configured"},"504":{"description":"Upstream did not respond within 300s"}}}},"/api/v1/small/responses":{"post":{"operationId":"createResponseSmall","summary":"small tier","description":"The same model at a smaller promise: up to 1,000 prompt tokens and 500 of reply, at 10 requests/minute. Oversized requests are refused with 400 here rather than served at this price — send them to a larger tier.","security":[{"ApiKeyAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["model","input"],"properties":{"model":{"type":"string","description":"Model to run. Only gpt-5.6-sol is available on this endpoint.","enum":["gpt-5.6-sol"]},"input":{"description":"Responses API input: a string, or a list of message objects. At most 128 message/content items, and at most 4880 characters of prompt.","oneOf":[{"type":"string"},{"type":"array","items":{"type":"object"}}]},"stream":{"type":"boolean","default":false,"description":"Stream the reply as Server-Sent Events (text/event-stream). Frames are relayed as they arrive and are not buffered."},"max_output_tokens":{"type":"integer","minimum":1,"maximum":500,"description":"Maximum tokens to generate, up to 500. A larger value is rejected rather than clamped, so a truncated reply is never returned as if it were complete. Omitted means the endpoint cap is applied."},"reasoning":{"type":"object","description":"Reasoning controls, passed through to the model. This model thinks before it answers, and those thinking tokens are charged against max_output_tokens without being returned to you. Omitted, this endpoint sends effort \"none\", which leaves the whole 500-token budget for the answer. Send a higher effort for a harder question, but note that it buys thinking out of the same budget: too high for the question and the reply comes back with no answer in it, which this endpoint refuses with 400 empty_reply rather than billing you for.","properties":{"effort":{"type":"string","enum":["none","low","medium","high","xhigh","max"],"default":"none"}},"additionalProperties":true}},"additionalProperties":true}}}},"responses":{"200":{"description":"Responses API reply, verbatim. When stream=true the body is text/event-stream instead, and the terminal response.completed frame carries the usage object.","content":{"application/json":{"schema":{"type":"object"}},"text/event-stream":{"schema":{"type":"string"}}}},"400":{"description":"Unsupported model, output limit exceeded, per-request token budget exceeded, or worst-case cost above this endpoint's ceiling","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"message":{"type":"string"},"type":{"type":"string"},"code":{"type":"string","description":"Machine-readable refusal reason: model_not_allowed, model_not_available, request_too_large, too_many_input_items, max_output_tokens_too_large, token_budget_exceeded, cost_guard_exceeded, unsupported_field, empty_reply, upstream_error."}}}}}}}},"401":{"description":"Missing X-API-Key"},"403":{"description":"Invalid X-API-Key"},"413":{"description":"Request body, prompt length or input item count above the limit","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"message":{"type":"string"},"type":{"type":"string"},"code":{"type":"string","description":"Machine-readable refusal reason: model_not_allowed, model_not_available, request_too_large, too_many_input_items, max_output_tokens_too_large, token_budget_exceeded, cost_guard_exceeded, unsupported_field, empty_reply, upstream_error."}}}}}}}},"422":{"description":"Malformed request body"},"429":{"description":"Rate limit (10 requests/minute) or concurrency limit (203 in flight) reached, or the upstream throttled the request. Retry-After says when to come back; it is passed through unchanged when it comes from upstream.","headers":{"Retry-After":{"description":"Seconds to wait before retrying. Present on every 429 this proxy generates.","schema":{"type":"integer","minimum":1}}},"content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"message":{"type":"string"},"type":{"type":"string"},"code":{"type":"string","description":"Machine-readable refusal reason: model_not_allowed, model_not_available, request_too_large, too_many_input_items, max_output_tokens_too_large, token_budget_exceeded, cost_guard_exceeded, unsupported_field, empty_reply, upstream_error."}}}}}}}},"502":{"description":"Upstream failure"},"503":{"description":"Proxy disabled or not configured"},"504":{"description":"Upstream did not respond within 300s"}}}},"/api/v1/medium/responses":{"post":{"operationId":"createResponseMedium","summary":"medium tier","description":"The same model at a smaller promise: up to 2,100 prompt tokens and 1,500 of reply, at 5 requests/minute. Oversized requests are refused with 400 here rather than served at this price — send them to a larger tier.","security":[{"ApiKeyAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["model","input"],"properties":{"model":{"type":"string","description":"Model to run. Only gpt-5.6-sol is available on this endpoint.","enum":["gpt-5.6-sol"]},"input":{"description":"Responses API input: a string, or a list of message objects. At most 128 message/content items, and at most 10248 characters of prompt.","oneOf":[{"type":"string"},{"type":"array","items":{"type":"object"}}]},"stream":{"type":"boolean","default":false,"description":"Stream the reply as Server-Sent Events (text/event-stream). Frames are relayed as they arrive and are not buffered."},"max_output_tokens":{"type":"integer","minimum":1,"maximum":1500,"description":"Maximum tokens to generate, up to 1500. A larger value is rejected rather than clamped, so a truncated reply is never returned as if it were complete. Omitted means the endpoint cap is applied."},"reasoning":{"type":"object","description":"Reasoning controls, passed through to the model. This model thinks before it answers, and those thinking tokens are charged against max_output_tokens without being returned to you. Omitted, this endpoint sends effort \"none\", which leaves the whole 1500-token budget for the answer. Send a higher effort for a harder question, but note that it buys thinking out of the same budget: too high for the question and the reply comes back with no answer in it, which this endpoint refuses with 400 empty_reply rather than billing you for.","properties":{"effort":{"type":"string","enum":["none","low","medium","high","xhigh","max"],"default":"none"}},"additionalProperties":true}},"additionalProperties":true}}}},"responses":{"200":{"description":"Responses API reply, verbatim. When stream=true the body is text/event-stream instead, and the terminal response.completed frame carries the usage object.","content":{"application/json":{"schema":{"type":"object"}},"text/event-stream":{"schema":{"type":"string"}}}},"400":{"description":"Unsupported model, output limit exceeded, per-request token budget exceeded, or worst-case cost above this endpoint's ceiling","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"message":{"type":"string"},"type":{"type":"string"},"code":{"type":"string","description":"Machine-readable refusal reason: model_not_allowed, model_not_available, request_too_large, too_many_input_items, max_output_tokens_too_large, token_budget_exceeded, cost_guard_exceeded, unsupported_field, empty_reply, upstream_error."}}}}}}}},"401":{"description":"Missing X-API-Key"},"403":{"description":"Invalid X-API-Key"},"413":{"description":"Request body, prompt length or input item count above the limit","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"message":{"type":"string"},"type":{"type":"string"},"code":{"type":"string","description":"Machine-readable refusal reason: model_not_allowed, model_not_available, request_too_large, too_many_input_items, max_output_tokens_too_large, token_budget_exceeded, cost_guard_exceeded, unsupported_field, empty_reply, upstream_error."}}}}}}}},"422":{"description":"Malformed request body"},"429":{"description":"Rate limit (5 requests/minute) or concurrency limit (203 in flight) reached, or the upstream throttled the request. Retry-After says when to come back; it is passed through unchanged when it comes from upstream.","headers":{"Retry-After":{"description":"Seconds to wait before retrying. Present on every 429 this proxy generates.","schema":{"type":"integer","minimum":1}}},"content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"message":{"type":"string"},"type":{"type":"string"},"code":{"type":"string","description":"Machine-readable refusal reason: model_not_allowed, model_not_available, request_too_large, too_many_input_items, max_output_tokens_too_large, token_budget_exceeded, cost_guard_exceeded, unsupported_field, empty_reply, upstream_error."}}}}}}}},"502":{"description":"Upstream failure"},"503":{"description":"Proxy disabled or not configured"},"504":{"description":"Upstream did not respond within 300s"}}}}},"components":{"securitySchemes":{"ApiKeyAuth":{"type":"apiKey","in":"header","name":"X-API-Key"}}},"servers":[{"url":"https://eagleai.online"}]}