{
  "schema_version": "eagleai/agents.json/2026-08-20",
  "name": "EagleAI Model API",
  "description": "Two frontier language models sold two ways from one domain. Ten flat-price endpoints where the price is per request and does not vary with response length, differing only in how large a request each accepts; and one uncapped per-token surface where the same two deployments are billed by the token over OpenAI Chat Completions. The fields at this level describe the flat-price endpoints; per_token_surface describes the other one.",
  "documentation_url": "https://eagleai.online/llms.txt",
  "privacy_policy_url": "https://eagleai.online/privacy.html",
  "terms_of_service_url": "https://eagleai.online/terms.html",
  "upstream_disclosure": "EagleAI resells access to these models. We do not build, own or train them, and the platform hosting our deployments is not named in this document - that is a commercial arrangement, not a fact about your data. We will name it in writing to any customer who asks, and to anyone who needs it for a data-protection assessment. What the arrangement means for request content is in data_handling and in the privacy notice, in full, and none of it changes with the name.",
  "provider": {
    "name": "EagleAI",
    "url": "https://eagleai.online",
    "contact": "mailto:sales@eagleai.online"
  },
  "base_url": "https://eagleai.online",
  "authentication": {
    "type": "api_key",
    "in": "header",
    "header": "X-API-Key",
    "status_when_header_missing": 401,
    "status_when_key_invalid": 403
  },
  "pricing": {
    "unit": "request",
    "currency": "USD",
    "model": "flat_per_request",
    "notes": "One price per endpoint, charged per accepted request regardless of how many tokens the answer uses. A request refused for exceeding the endpoint's limits (400 or 413) is not billed."
  },
  "purchase_channels": {
    "apihub": {
      "type": "marketplace",
      "settlement": "prepaid USDC on Base",
      "account_required_with_provider": false,
      "services": {
        "gpt-5.6-sol": "https://apihub.io/marketplace/eagleai-gpt56-sol",
        "claude-opus-5": "https://apihub.io/marketplace/eagleai-opus5"
      }
    },
    "direct": {
      "type": "contact",
      "contact": "mailto:sales@eagleai.online",
      "notes": "Direct keys cover every endpoint, including the eight sizes not yet listed on the marketplace."
    }
  },
  "error_codes": {
    "400": "unknown model name, or malformed body",
    "401": "no X-API-Key header",
    "403": "X-API-Key not recognised",
    "413": "request body or prompt above this endpoint's limit",
    "429": "over the per-minute request rate or token budget; Retry-After is sent in seconds"
  },
  "models": [
    {
      "id": "claude-opus-5",
      "vendor": "EagleAI",
      "wire_format": "messages",
      "openapi": "https://eagleai.online/api/v1/opus5/openapi.json",
      "request_body": {
        "required": [
          "model",
          "messages",
          "max_tokens"
        ],
        "optional": [
          "stream"
        ],
        "model_enum": [
          "claude-opus-5"
        ]
      },
      "endpoints": [
        {
          "tier": "micro",
          "method": "POST",
          "path": "/api/v1/opus5/micro/messages",
          "url": "https://eagleai.online/api/v1/opus5/micro/messages",
          "price_usd": 0.0001,
          "max_input_tokens": 1000,
          "max_output_tokens": 1400,
          "reasoning_effort": "low",
          "requests_per_minute": 5,
          "purchase": "apihub",
          "below_cost": true,
          "min_output_tokens": 1200
        },
        {
          "tier": "nano",
          "method": "POST",
          "path": "/api/v1/opus5/nano/messages",
          "url": "https://eagleai.online/api/v1/opus5/nano/messages",
          "price_usd": 0.0009,
          "max_input_tokens": 2000,
          "max_output_tokens": 2000,
          "reasoning_effort": "low",
          "requests_per_minute": 3,
          "purchase": "apihub",
          "below_cost": true,
          "min_output_tokens": 1200
        },
        {
          "tier": "small",
          "method": "POST",
          "path": "/api/v1/opus5/small/messages",
          "url": "https://eagleai.online/api/v1/opus5/small/messages",
          "price_usd": 0.0849,
          "max_input_tokens": 3000,
          "max_output_tokens": 2400,
          "reasoning_effort": "low",
          "requests_per_minute": 2,
          "purchase": "direct",
          "below_cost": false,
          "min_output_tokens": 1200
        },
        {
          "tier": "medium",
          "method": "POST",
          "path": "/api/v1/opus5/medium/messages",
          "url": "https://eagleai.online/api/v1/opus5/medium/messages",
          "price_usd": 0.1009,
          "max_input_tokens": 4000,
          "max_output_tokens": 2800,
          "reasoning_effort": "low",
          "requests_per_minute": 2,
          "purchase": "direct",
          "below_cost": false,
          "min_output_tokens": 1200
        },
        {
          "tier": "large",
          "method": "POST",
          "path": "/api/v1/opus5/messages",
          "url": "https://eagleai.online/api/v1/opus5/messages",
          "price_usd": 0.111,
          "max_input_tokens": 4000,
          "max_output_tokens": 3000,
          "reasoning_effort": "medium",
          "requests_per_minute": 5,
          "purchase": "apihub",
          "below_cost": false,
          "min_output_tokens": 1200
        }
      ]
    },
    {
      "id": "gpt-5.6-sol",
      "vendor": "EagleAI",
      "wire_format": "openai.responses",
      "openapi": "https://eagleai.online/api/v1/openapi.json",
      "request_body": {
        "required": [
          "model",
          "input"
        ],
        "optional": [
          "stream",
          "max_output_tokens"
        ],
        "model_enum": [
          "gpt-5.6-sol"
        ]
      },
      "endpoints": [
        {
          "tier": "micro",
          "method": "POST",
          "path": "/api/v1/micro/responses",
          "url": "https://eagleai.online/api/v1/micro/responses",
          "price_usd": 0.0001,
          "max_input_tokens": 150,
          "max_output_tokens": 80,
          "reasoning_effort": "none",
          "requests_per_minute": 60,
          "purchase": "apihub",
          "below_cost": true
        },
        {
          "tier": "nano",
          "method": "POST",
          "path": "/api/v1/nano/responses",
          "url": "https://eagleai.online/api/v1/nano/responses",
          "price_usd": 0.0009,
          "max_input_tokens": 500,
          "max_output_tokens": 250,
          "reasoning_effort": "none",
          "requests_per_minute": 20,
          "purchase": "apihub",
          "below_cost": true
        },
        {
          "tier": "small",
          "method": "POST",
          "path": "/api/v1/small/responses",
          "url": "https://eagleai.online/api/v1/small/responses",
          "price_usd": 0.0229,
          "max_input_tokens": 1000,
          "max_output_tokens": 500,
          "reasoning_effort": "none",
          "requests_per_minute": 10,
          "purchase": "apihub",
          "below_cost": false
        },
        {
          "tier": "medium",
          "method": "POST",
          "path": "/api/v1/medium/responses",
          "url": "https://eagleai.online/api/v1/medium/responses",
          "price_usd": 0.0629,
          "max_input_tokens": 2100,
          "max_output_tokens": 1500,
          "reasoning_effort": "none",
          "requests_per_minute": 5,
          "purchase": "apihub",
          "below_cost": false
        },
        {
          "tier": "large",
          "method": "POST",
          "path": "/api/v1/responses",
          "url": "https://eagleai.online/api/v1/responses",
          "price_usd": 0.1469,
          "max_input_tokens": 2100,
          "max_output_tokens": 4000,
          "reasoning_effort": "high",
          "requests_per_minute": 163,
          "purchase": "apihub",
          "below_cost": false
        }
      ]
    }
  ],
  "per_token_surface": {
    "name": "EagleAI Model API — per-token",
    "description": "The same two deployments, billed by the token rather than by the request, on a second base URL. None of the flat-price size caps apply: a caller may fill the whole context window and ask for the whole output ceiling, because on a per-token meter a large request is revenue rather than a fixed-price loss. Built to be resold by a router that invoices per token after the fact.",
    "documentation_url": "https://eagleai.online/llms.txt",
    "privacy_policy_url": "https://eagleai.online/privacy.html",
    "terms_of_service_url": "https://eagleai.online/terms.html",
    "base_url": "https://eagleai.online/api/openrouter/v1",
    "catalog_url": "https://eagleai.online/api/openrouter/v1/models",
    "wire_format": "openai.chat_completions",
    "wire_format_notes": "OpenAI Chat Completions in and out on both models. claude-opus-5 is translated to a messages-style API in front of the model and back again, so a client only ever speaks the one protocol.",
    "authentication": {
      "type": "api_key",
      "in": "header",
      "header": "Authorization",
      "scheme": "Bearer",
      "alternate_header": "X-API-Key",
      "status_when_header_missing": 401,
      "status_when_key_invalid": 401,
      "status_when_key_expired": 401
    },
    "pricing": {
      "unit": "token",
      "currency": "USD",
      "model": "per_token",
      "rates_url": "https://eagleai.online/api/openrouter/v1/models",
      "notes": "Billed per input token and per output token. The rates are deliberately not restated here: they are rendered from the same table the invoice is computed from and published, without a key, at rates_url. A discounted cached-input rate appears there for eagleai/gpt-5.6-sol and only for it, because that upstream caches prompts on its route automatically while nothing on the Opus route ever sends a cache flag - a cached rate there could never be earned."
    },
    "purchase_channels": {
      "openrouter": {
        "type": "marketplace",
        "settlement": "per token, invoiced after the fact",
        "account_required_with_provider": false,
        "notes": "Listed as a provider on OpenRouter. A key carrying a prepaid credit allowance is refused on this surface rather than metered: with no per-request size cap there is no worst case to reserve against, so the allowance could never be spent down."
      },
      "direct": {
        "type": "contact",
        "contact": "mailto:sales@eagleai.online",
        "notes": "A direct key authenticates here as well, with the same two headers."
      }
    },
    "error_codes": {
      "400": "unknown model name, invalid JSON, or a parameter this surface will not silently drop",
      "401": "missing, unrecognised or expired key",
      "403": "key not authorised for that model, or carrying a prepaid credit allowance",
      "413": "request body too large",
      "422": "body failed validation; the offending field is in error.param",
      "429": "over the per-minute request, token or concurrency limit; Retry-After is sent in seconds",
      "502": "upstream connection error or malformed upstream reply",
      "503": "the surface is switched off or not configured on this server",
      "504": "the upstream request timed out"
    },
    "error_body_shape": "openai.error_object",
    "models": [
      {
        "id": "eagleai/claude-opus-5",
        "vendor": "EagleAI",
        "wire_format": "openai.chat_completions",
        "upstream_wire_format": "messages",
        "request_body": {
          "required": [
            "model",
            "messages"
          ],
          "optional": [
            "stream",
            "max_tokens",
            "max_completion_tokens",
            "temperature",
            "stop",
            "tools",
            "tool_choice",
            "parallel_tool_calls"
          ],
          "model_enum": [
            "eagleai/claude-opus-5"
          ]
        },
        "input_modalities": [
          "text"
        ],
        "supports_streaming": true,
        "supports_tools": true,
        "supports_reasoning": true,
        "reasoning_control": "off_switch_only",
        "reasoning_control_notes": "The model reasons by default and those tokens are billed as output tokens, so supports_reasoning is true. Depth cannot be raised: reasoning_effort and an explicit thinking budget are both refused upstream. It can be turned off, with reasoning false or {enabled: false} or {exclude: true}. Neither name is declared in supported_parameters, because the one shape that works is the one nobody routes traffic for, and declaring it would attract the shapes that 400. Read supports_reasoning as 'it reasons, and you may stop it', not as 'you can ask it to reason harder'.",
        "supports_structured_outputs": false,
        "unsupported_parameters_are_refused": true,
        "notes": "Structured outputs are not offered: the upstream refuses response_format on its messages route, so asking for one is a 400 from here naming the parameter rather than a 400 from an upstream the caller cannot see. Anything else this route cannot honour is refused the same way rather than dropped quietly - n other than 1, logprobs, top_logprobs, a non-empty logit_bias, a non-zero frequency_penalty or presence_penalty, seed, and unrecognised message content parts - with the offending field named in error.param. Sending any of them as null is accepted, since that is how an OpenAI client spells not set, as are frequency_penalty 0 and presence_penalty 0, which ask for what the upstream already does. parallel_tool_calls false is genuinely honoured, and user is accepted and forwarded as the upstream's metadata.user_id. This is a reasoning model and its sampling knobs are fixed: temperature is accepted only at its default of 1 and any other value is refused upstream, while top_p and top_k are refused at every value. stop is honoured, but a stop sequence consisting only of whitespace is refused. It reasons by default and those tokens are billed as output tokens. That can be switched off - reasoning false, reasoning {enabled: false} and reasoning {exclude: true} all reach the upstream as a disabled thinking block and all return 200 - but it cannot be turned up: reasoning_effort, reasoning {effort} and reasoning {max_tokens} are each refused upstream, so how hard it thinks when it does think is the deployment's own setting. Measured 2026-08-20, one prompt, three runs each: 197/182/184 output tokens with thinking left on against 137/141/141 with it off, so the switch is real and it moves the bill.",
        "endpoints": [
          {
            "method": "POST",
            "path": "/api/openrouter/v1/chat/completions",
            "url": "https://eagleai.online/api/openrouter/v1/chat/completions",
            "max_input_tokens": 200000,
            "max_output_tokens": 64000,
            "requests_per_minute": 40,
            "concurrent_requests": 4,
            "tokens_per_minute": 40000,
            "purchase": "openrouter",
            "notes": "The two token figures are the model's own context window and output ceiling, not a cap this surface imposes - nothing here refuses a request for its token count, and a max_tokens above the ceiling is clamped to it rather than rejected. The three limits after them are the deployment's own provisioned quota rather than a number we chose, and all three are enforced before the upstream is contacted. The token budget is a ceiling on the deployment rather than an allowance handed to each key, so every caller of this model draws on the same minute: a request is refused once that minute is already spent, and never for being large. What a request spends against the minute is its measured prompt at admission, corrected to the real prompt-plus-completion total as soon as the upstream reports one, so the window trails only by what is in flight. Where the deployment declares a separate output allowance, completions are metered against that as well. Over any of the three is an immediate 429 with Retry-After. Nothing queues."
          }
        ]
      },
      {
        "id": "eagleai/gpt-5.6-sol",
        "vendor": "EagleAI",
        "wire_format": "openai.chat_completions",
        "upstream_wire_format": "openai.chat_completions",
        "request_body": {
          "required": [
            "model",
            "messages"
          ],
          "optional": [
            "stream",
            "max_tokens",
            "max_completion_tokens",
            "temperature",
            "top_p",
            "seed",
            "tools",
            "tool_choice",
            "response_format"
          ],
          "model_enum": [
            "eagleai/gpt-5.6-sol"
          ]
        },
        "input_modalities": [
          "text"
        ],
        "supports_streaming": true,
        "supports_tools": true,
        "supports_reasoning": true,
        "reasoning_control": "reasoning_effort",
        "reasoning_control_notes": "Depth is selectable per request with reasoning_effort, which this wire takes and forwards at none, low, medium, high or xhigh; minimal is refused by this deployment. The reasoning parameter is refused upstream as an unknown field, so it is not declared in supported_parameters; send reasoning_effort rather than reasoning.",
        "supports_structured_outputs": true,
        "unsupported_parameters_are_refused": false,
        "notes": "Forwarded to the upstream deployment as sent, so a field added to the Chat Completions API after this document was written works without a change here. max_tokens is normalised to max_completion_tokens before it goes upstream, because the deployment is a reasoning model and its v1 chat/completions surface takes the latter; either name may be sent. The model field in every reply, streamed or not, is the published id above rather than the internal deployment name. Being a reasoning model, its sampling knobs are fixed: temperature and top_p are accepted only at their default of 1 and any other value is refused upstream, and stop is refused at every value. Reasoning depth is set with reasoning_effort, which this wire takes and forwards unaltered at none, low, medium, high or xhigh; minimal is the one value this deployment refuses, with a 400 naming it. The reasoning parameter is refused upstream as an unknown field, so send reasoning_effort rather than reasoning.",
        "endpoints": [
          {
            "method": "POST",
            "path": "/api/openrouter/v1/chat/completions",
            "url": "https://eagleai.online/api/openrouter/v1/chat/completions",
            "max_input_tokens": 272000,
            "max_output_tokens": 128000,
            "requests_per_minute": 1000,
            "concurrent_requests": 203,
            "tokens_per_minute": 1000000,
            "purchase": "openrouter",
            "notes": "The two token figures are the model's own context window and output ceiling, not a cap this surface imposes - nothing here refuses a request for its token count, and a max_tokens above the ceiling is clamped to it rather than rejected. The three limits after them are the deployment's own provisioned quota rather than a number we chose, and all three are enforced before the upstream is contacted. The token budget is a ceiling on the deployment rather than an allowance handed to each key, so every caller of this model draws on the same minute: a request is refused once that minute is already spent, and never for being large. What a request spends against the minute is its measured prompt at admission, corrected to the real prompt-plus-completion total as soon as the upstream reports one, so the window trails only by what is in flight. Where the deployment declares a separate output allowance, completions are metered against that as well. Over any of the three is an immediate 429 with Retry-After. Nothing queues."
          }
        ]
      }
    ]
  },
  "data_handling": {
    "prompts_stored": false,
    "completions_stored": false,
    "prompts_logged": false,
    "used_for_training": false,
    "metering_record_retention_days": 365,
    "metering_record_max_fields": 33,
    "metering_record_contains_content": false,
    "metering_record_caller_identifier": "the first sixteen hex characters of the SHA-256 of the API key presented - stable and one-way, so pseudonymous rather than anonymous",
    "prepaid_credit_ledger": {
      "applies_to": "keys issued with a prepaid credit allowance, on the flat-price endpoints only",
      "purpose": "so that a fixed grant cannot be overspent by requests still in flight",
      "fields": [
        "request_id",
        "customer",
        "reserved",
        "settled",
        "state",
        "opened_at",
        "closed_at"
      ],
      "contains_content": false,
      "retention_days": null,
      "notes": "Amounts and states only - no tokens, no model, no prompt, no completion. There is no retention window and we do not claim one: the only deletion in the code is an operator clearing the table by hand. A key with no allowance never opens this ledger, and the per-token surface refuses allowance-carrying keys outright rather than metering them."
    },
    "upstream_processor": "A third-party cloud AI platform, not named here. See upstream_disclosure: we name it in writing to any customer who asks. It is a processor for the inference itself and nothing else - it is not given our metering records, our billing data, or the list of who holds a key.",
    "upstream_abuse_monitoring_retention_days": 30,
    "zero_data_retention": false,
    "notes": "Prompt and completion content is held in memory only for the duration of the request, on both surfaces. One metering record per request - identifiers, token counts, timings and money, 33 fields, no content - is kept for 365 days and then deleted by the server. The sweep runs on write and again whenever the per-token model catalogue is polled, so retention does not depend on new inference arriving to trigger it. Modified abuse monitoring (zero data retention) is not enabled on these deployments; see the privacy policy."
  }
}
