API reference
Foxy Pro answers questions about digital-asset markets in plain language. For each request it decides what it needs to look at, analyses live market structure, derivatives, institutional and on-chain flows, news, the macro calendar and the Foxy signal that powers the BottomUP app, and returns one clear answer or a full research note.
Base URL: https://foxy-pro-api-production.up.railway.app. JSON in, JSON out. Information only: Foxy Pro does not execute orders or give investment advice.
Authentication
Create keys in the workspace under API. Send the key in the x-api-key header (or as a Bearer token). Keys belong to your organisation and draw on its token balance; keep them server side.
curl https://foxy-pro-api-production.up.railway.app/v1/models -H "x-api-key: fp_live_..."
Models
| foxy-pro-1-fast | tier | Lowest latency. Quotes, single-metric questions, summaries. Up to 2 data rounds. |
| foxy-pro-1 | default | Multi-factor analysis of assets and the market. Up to 5 analysis rounds. |
| foxy-pro-1-deep | tier | Extended reasoning for complex questions and research notes. Up to 8 analysis rounds. |
GET /v1/models returns each tier with its current price in Foxy tokens per million input and output tokens, the fee per data call, and the hold placed while a request runs. Holds are released when the request finishes; you pay only what it used, and failed requests are free. Balances and prices are in Foxy tokens, the billing unit; in API responses these fields keep the name credits so they are not confused with model token counts such as input_tokens.
Messages
POST /v1/messages. Stateless: send the conversation so far, ending with a user turn.
| model | string | One of the model ids. Default foxy-pro-1. |
| messages | array | Up to 40 turns of {role: "user" | "assistant", content: string}. The last must be from the user. |
| max_tokens | integer | Cap on the written answer. Defaults per tier. |
| stream | boolean | Stream server-sent events (see below). |
| language | string | Force the response language, for example "Spanish". Default: the language of the question. |
| instructions | string | Your house preferences (focus, tone, format). They cannot override Foxy Pro policy. |
curl https://foxy-pro-api-production.up.railway.app/v1/messages \
-H "x-api-key: $FOXY_PRO_API_KEY" -H "content-type: application/json" \
-d '{
"model": "foxy-pro-1",
"messages": [{"role": "user", "content": "Is BTC positioning crowded? Where are the squeeze levels?"}],
"instructions": "Write for a bank risk committee. Keep it under 300 words."
}'{
"id": "msg_9xQ...",
"type": "message",
"role": "assistant",
"model": "foxy-pro-1",
"content": [{ "type": "text", "text": "Positioning is moderately crowded on the long side. Aggregate open interest rose 4.1% in 24h while funding sits above its 7-day average on most venues ..." }],
"data_as_of": "2026-10-08T12:00:03Z",
"usage": { "input_tokens": 18234, "output_tokens": 612, "cache_read_input_tokens": 9120, "tool_calls": 5, "credits": 2.41 },
"prompt_version": "foxy-pro-prompt-2026-10-08",
"policy_version": "foxy-pro-policy-1",
"disclaimer": "Digital-asset market information only. Not investment advice, no order execution."
}Streaming
With "stream": true the response is text/event-stream. Events, in order:
| status | {stage} | gathering or writing. |
| step | {id, name, asset, state} | What Foxy Pro is analysing, for example derivatives for BTC; state is running, done or failed. |
| text_delta | {text} | A piece of the answer as it is written. |
| message | object | The complete message, identical to the non-streamed response. Last event. |
| error | {type, message} | The request failed after the stream opened. No tokens are charged for failed requests. |
Reports
Long-form research notes run in the background. POST /v1/reports with prompt, depth (standard or deep) and optional language and instructions returns 202 with the report id. Poll GET /v1/reports/:id until status is succeeded or failed; GET /v1/reports lists them. A report carries a markdown content, its title, the time of the data it used and usage. Standard notes take one to three minutes, deep notes up to six.
curl https://foxy-pro-api-production.up.railway.app/v1/reports -H "x-api-key: $FOXY_PRO_API_KEY" -H "content-type: application/json" \
-d '{"prompt": "Two-week outlook for ETH with scenarios and the levels that matter", "depth": "deep"}'
# => {"id": "rpt_...", "status": "running", ...}Data freshness
Every answer and report carries data_as_of, the time of the most recent market data behind it. Foxy Pro works only from data it retrieves at request time, never from memory, and says plainly in the answer when part of the picture is unavailable.
Account and usage
| GET /v1/organization | Organisation, token balance and partner. | |
| GET /v1/usage?days=30 | Daily totals, usage by model and by key, and recent requests. | |
| GET /status | Service status: operational, degraded or unavailable. No key needed. |
Errors and limits
{ "type": "error", "error": { "type": "insufficient_credits_error", "message": "...", "required_credits": 25, "balance_credits": 3 }, "request_id": "..." }| 400 | invalid_request_error | The body is malformed or out of range. |
| 401 | authentication_error | Missing, invalid, revoked or expired key. |
| 402 | insufficient_credits_error | Balance is below the hold for this request. |
| 403 | permission_error | The organisation is suspended. |
| 429 | rate_limit_error | 120 requests per minute per key, 4 concurrent requests per organisation. |
| 502 | upstream_error | The request could not be completed. Nothing was charged. |
Coverage
Foxy Pro covers the whole market and individual assets: price and market structure (trend, momentum, volatility, support and resistance), derivatives positioning (open interest, funding, liquidations, long/short), large-holder and on-chain activity, US institutional demand, news with sentiment, the macro and crypto calendar, and the Foxy signal. Coverage expands over time without changes to the API.
Questions or volume pricing: [email protected].