Read-side API for the FortisWallet self-custody client. The service enriches
public blockchain data with balances, history, NFTs, market data, charts and
exchange quotes while keeping provider credentials on the server.
Signing, key management, transaction construction/broadcast and keyless
current-balance fallback remain client-side and are deliberately not part of
this API. No wallet seed or private key may ever be sent here.
All `/v1` operations except enrollment and media require a short-lived device
bearer token. Obtain it through the attestation challenge and device enrollment
flow. This browser documentation is read-only; use a native client or `curl` for
authenticated requests. Production enrollment requires Apple App Attest or Play
Integrity; development enrollment is private-network only.
Cache-aware responses expose `cache.hit` and `cache.timestamp`. A response may
also set `cache.partial` when only part of a requested time window was already
cached. Historical-price responses include `availability` so clients can draw
the portion that exists when an upstream source has incomplete history.
Schemas
SponsoredEvmCall
{
"type": "object",
"additionalProperties": false,
"required": [
"to",
"data"
],
"properties": {
"to": {
"type": "string",
"pattern": "^0x[0-9a-fA-F]{40}$"
},
"data": {
"type": "string",
"pattern": "^0x(?:[0-9a-fA-F]{2})*$"
},
"value": {
"type": "string",
"pattern": "^0x(?:0|[1-9a-fA-F][0-9a-fA-F]*)$"
}
}
}
DiagnosticEvmCall
{
"type": "object",
"additionalProperties": false,
"required": [
"to",
"data"
],
"properties": {
"to": {
"type": "string",
"pattern": "^0x[0-9a-fA-F]{40}$"
},
"data": {
"type": "string",
"pattern": "^0x(?:[0-9a-fA-F]{2})*$"
},
"value": {
"type": "string",
"pattern": "^0x(?:0|[1-9a-fA-F][0-9a-fA-F]*)$"
},
"gas": {
"type": "string",
"pattern": "^0x(?:0|[1-9a-fA-F][0-9a-fA-F]*)$"
},
"maxFeePerGas": {
"type": "string",
"pattern": "^0x(?:0|[1-9a-fA-F][0-9a-fA-F]*)$"
},
"maxPriorityFeePerGas": {
"type": "string",
"pattern": "^0x(?:0|[1-9a-fA-F][0-9a-fA-F]*)$"
}
}
}
RobinhoodTransactionDiagnostics
{
"type": "object",
"required": [
"available",
"network",
"chainId",
"provider",
"simulatedAt",
"wouldRevert",
"canSign",
"calls",
"balanceChanges",
"approvals",
"estimatedStockTokensReceived",
"warnings",
"traceAvailable",
"internalCalls",
"fee"
],
"properties": {
"available": {
"type": "boolean"
},
"network": {
"type": "string",
"enum": [
"robinhood"
]
},
"chainId": {
"type": "integer",
"enum": [
4663
]
},
"provider": {
"type": "string",
"enum": [
"alchemy"
]
},
"simulatedAt": {
"type": "string",
"format": "date-time"
},
"blockNumber": {
"type": [
"string",
"null"
]
},
"wouldRevert": {
"type": "boolean"
},
"canSign": {
"type": "boolean"
},
"revertReason": {
"type": [
"string",
"null"
]
},
"calls": {
"type": "array",
"items": {
"type": "object",
"additionalProperties": true
}
},
"balanceChanges": {
"type": "array",
"items": {
"type": "object",
"additionalProperties": true
}
},
"approvals": {
"type": "array",
"items": {
"type": "object",
"additionalProperties": true
}
},
"estimatedStockTokensReceived": {
"type": "array",
"items": {
"type": "object",
"additionalProperties": true
}
},
"warnings": {
"type": "array",
"items": {
"type": "object",
"additionalProperties": true
}
},
"traceAvailable": {
"type": "boolean"
},
"internalCalls": {
"type": "array",
"items": {
"type": "object",
"additionalProperties": true
}
},
"fee": {
"type": "object",
"required": [
"gasUsed",
"estimatedMaxFeeWei",
"paidBy",
"perCall"
],
"properties": {
"gasUsed": {
"type": "string",
"pattern": "^[0-9]+$"
},
"estimatedMaxFeeWei": {
"type": "string",
"pattern": "^[0-9]+$"
},
"paidBy": {
"type": "string",
"enum": [
"wallet",
"sponsor"
]
},
"perCall": {
"type": "array",
"items": {
"type": "object",
"additionalProperties": true
}
}
}
}
}
}
RobinhoodSponsoredTradeCapabilities
{
"type": "object",
"required": [
"network",
"chainId",
"enabled",
"gasless",
"sponsoredGas",
"batchedCalls",
"maxCalls",
"accountStandard"
],
"properties": {
"network": {
"type": "string",
"enum": [
"robinhood"
]
},
"chainId": {
"type": "integer",
"enum": [
4663
]
},
"enabled": {
"type": "boolean"
},
"gasless": {
"type": "boolean"
},
"sponsoredGas": {
"type": "boolean"
},
"batchedCalls": {
"type": "boolean"
},
"maxCalls": {
"type": "integer",
"enum": [
2
]
},
"accountStandard": {
"type": "string",
"enum": [
"eip-7702"
]
},
"reason": {
"type": "string"
}
}
}
RobinhoodSponsoredTradePreparation
{
"type": "object",
"required": [
"ticket",
"expiresAt",
"prepared",
"signatureRequests"
],
"properties": {
"ticket": {
"type": "string",
"pattern": "^[A-Za-z0-9_-]{32}$"
},
"expiresAt": {
"type": "string",
"format": "date-time"
},
"prepared": {
"type": "object",
"additionalProperties": true
},
"signatureRequests": {
"type": "array",
"minItems": 1,
"maxItems": 2,
"items": {
"type": "object",
"additionalProperties": true
}
}
}
}
RobinhoodStockAsset
{
"type": "object",
"required": [
"id",
"tokenSymbol",
"tokenName",
"deployments",
"currentMultiplier",
"pendingMultiplier",
"status",
"tradingCapabilities"
],
"properties": {
"id": {
"type": "string",
"pattern": "^0x[0-9a-f]{64}$"
},
"tokenSymbol": {
"type": "string"
},
"tokenName": {
"type": "string"
},
"deployments": {
"type": "array",
"items": {
"type": "object",
"required": [
"chainId",
"contractAddress"
],
"properties": {
"chainId": {
"type": "integer",
"enum": [
4663
]
},
"contractAddress": {
"type": "string",
"pattern": "^0x[0-9a-fA-F]{40}$"
}
}
}
},
"currentMultiplier": {
"type": "string"
},
"pendingMultiplier": {
"type": "string"
},
"pendingMultiplierEffectiveTime": {
"type": [
"string",
"null"
],
"format": "date-time"
},
"logoUrl": {
"type": [
"string",
"null"
],
"format": "uri"
},
"issuerLogoUrl": {
"type": [
"string",
"null"
],
"format": "uri"
},
"logoMediaKey": {
"type": [
"string",
"null"
],
"pattern": "^[0-9a-f]{32}$"
},
"status": {
"type": "string"
},
"tradingCapabilities": {
"$ref": "#/components/schemas/RobinhoodTradingCapabilities"
}
}
}
RobinhoodTradingSessionCapabilities
{
"type": "object",
"required": [
"whole",
"fractional"
],
"properties": {
"whole": {
"type": [
"string",
"null"
]
},
"fractional": {
"type": [
"string",
"null"
]
}
}
}
RobinhoodTradingCapabilities
{
"type": "object",
"required": [
"fractionalTradability",
"allDayTradability",
"extendedHoursFractionalTradability",
"market",
"extended",
"overnight"
],
"properties": {
"fractionalTradability": {
"type": [
"string",
"null"
]
},
"allDayTradability": {
"type": [
"string",
"null"
]
},
"extendedHoursFractionalTradability": {
"type": [
"boolean",
"null"
]
},
"market": {
"$ref": "#/components/schemas/RobinhoodTradingSessionCapabilities"
},
"extended": {
"$ref": "#/components/schemas/RobinhoodTradingSessionCapabilities"
},
"overnight": {
"$ref": "#/components/schemas/RobinhoodTradingSessionCapabilities"
}
}
}
RobinhoodReferenceQuote
{
"type": "object",
"required": [
"symbol",
"contractAddress",
"bidUsd",
"askUsd",
"midpointUsd",
"rawBidUsd",
"rawAskUsd",
"multiplier",
"dailyTradingVolume",
"tradingHalted",
"generatedAt",
"currency"
],
"properties": {
"symbol": {
"type": "string"
},
"contractAddress": {
"type": "string",
"pattern": "^0x[0-9a-fA-F]{40}$"
},
"bidUsd": {
"type": "number",
"exclusiveMinimum": 0
},
"askUsd": {
"type": "number",
"exclusiveMinimum": 0
},
"midpointUsd": {
"type": "number",
"exclusiveMinimum": 0
},
"rawBidUsd": {
"type": "number",
"exclusiveMinimum": 0
},
"rawAskUsd": {
"type": "number",
"exclusiveMinimum": 0
},
"multiplier": {
"type": "string"
},
"dailyTradingVolume": {
"type": [
"number",
"null"
],
"minimum": 0
},
"tradingHalted": {
"type": "boolean"
},
"generatedAt": {
"type": "string",
"format": "date-time"
},
"currency": {
"type": "string",
"enum": [
"USD"
]
}
}
}
RobinhoodCorporateAction
{
"type": "object",
"required": [
"id",
"type",
"status",
"tokenSymbol",
"contractAddress",
"processDate",
"details"
],
"properties": {
"id": {
"type": "string"
},
"type": {
"type": "string"
},
"status": {
"type": "string"
},
"tokenSymbol": {
"type": "string"
},
"contractAddress": {
"type": "string",
"pattern": "^0x[0-9a-fA-F]{40}$"
},
"processDate": {
"oneOf": [
{
"type": "object",
"required": [
"year",
"month",
"day"
],
"properties": {
"year": {
"type": "integer",
"minimum": 1900,
"maximum": 9999
},
"month": {
"type": "integer",
"minimum": 1,
"maximum": 12
},
"day": {
"type": "integer",
"minimum": 1,
"maximum": 31
}
}
},
{
"type": "null"
}
]
},
"details": {
"type": "object",
"additionalProperties": true
}
}
}
Updates
{
"type": "object",
"description": "A change delta for one device. `changes` is a discriminated union keyed on\n`type`; a client MUST ignore entries with an unknown type so new change\nkinds can ship without a new API version.\n",
"required": [
"cursor",
"hasMore",
"reset",
"asOf",
"changes"
],
"properties": {
"cursor": {
"type": "string",
"description": "Opaque. Store verbatim and send back as `since`.",
"example": "u1_01K2C8ZR4G0000000000000000"
},
"hasMore": {
"type": "boolean",
"description": "The window was capped — poll again immediately."
},
"reset": {
"type": "boolean",
"description": "The supplied cursor was unusable; do a full refresh."
},
"asOf": {
"type": "string",
"format": "date-time"
},
"changes": {
"type": "array",
"items": {
"$ref": "#/components/schemas/UpdateChange"
}
}
}
}
UpdateChange
{
"type": "object",
"description": "One account with new activity — an idempotent refresh hint.",
"required": [
"type",
"network",
"address",
"records",
"latestAt",
"tokens"
],
"properties": {
"type": {
"type": "string",
"enum": [
"transfers"
],
"description": "Discriminator. Unknown values must be ignored."
},
"network": {
"type": "string",
"example": "eth-mainnet"
},
"address": {
"type": "string"
},
"records": {
"type": "integer",
"description": "Rows new or re-statused in this window — not a running total."
},
"latestAt": {
"type": "string",
"format": "date-time",
"description": "Newest transfer time among them."
},
"tokens": {
"type": "array",
"description": "Token ids that moved (capped); empty for native-only activity.",
"items": {
"type": "string"
}
}
}
}
GemsFeed
{
"type": "object",
"description": "A page of discovery picks, each one a complete token page.",
"required": [
"items",
"asOf",
"placeholder"
],
"properties": {
"items": {
"type": "array",
"items": {
"$ref": "#/components/schemas/GemItem"
}
},
"asOf": {
"type": "string",
"format": "date-time",
"description": "When this feed was composed."
},
"placeholder": {
"type": "boolean",
"description": "True while the picks are the hand-written list rather than the output\nof the candidate job. Clients should say so rather than implying a\nranking exists.\n"
}
}
}
GemItem
{
"type": "object",
"description": "One pick — why it is in the list, and its token page.",
"required": [
"id",
"network",
"ref",
"note",
"page"
],
"properties": {
"id": {
"type": "string",
"description": "Stable id for the pick: {network}/{canonical token id}."
},
"network": {
"type": "string"
},
"ref": {
"type": "string",
"description": "The ref as requested",
"so a client can re-read the page itself.": null
},
"note": {
"type": "string",
"description": "Why this token is in the list",
"in the feed's own words.": null
},
"page": {
"$ref": "#/components/schemas/TokenPage"
}
}
}
NewsFeed
{
"type": "object",
"description": "A page of aggregated stories plus the wire's own freshness.",
"required": [
"items",
"asOf",
"stale"
],
"properties": {
"items": {
"type": "array",
"items": {
"$ref": "#/components/schemas/NewsItem"
}
},
"asOf": {
"type": "string",
"format": "date-time",
"nullable": true,
"description": "When the wire was last ingested. Null on a deployment whose\ningester has never completed a run — reported as null rather than\nas \"now\".\n"
},
"stale": {
"type": "boolean",
"description": "No ingest completed recently: what follows may be behind. Render\nthis rather than implying freshness.\n"
}
}
}
NewsItem
{
"type": "object",
"description": "One story. `id` is stable across re-fetches as later pickups join it,\nso it is safe as a client-side dedupe or read-mark key.\n",
"required": [
"id",
"headline",
"summary",
"topics",
"impact",
"tickers",
"publisher",
"url",
"imageMediaKey",
"publishedAt",
"sourceCount"
],
"properties": {
"id": {
"type": "string",
"example": "01K2C8ZR4G0000000000000000"
},
"headline": {
"type": "string"
},
"summary": {
"type": "string",
"description": "A short extractive excerpt from the publisher, with boilerplate\nremoved. Empty when the feed carried nothing usable — never\ngenerated text, and never the article body.\n"
},
"topics": {
"type": "array",
"description": "Ignore unknown values; do not drop the item.",
"items": {
"type": "string",
"enum": [
"trend",
"macro",
"chains",
"policy",
"security",
"flows",
"protocol"
]
}
},
"impact": {
"type": "string",
"enum": [
"breaking",
"watch",
"normal"
],
"description": "`breaking` is corroborated (two or more publishers) and recent;\n`watch` is a security story or a dated event to act before.\n"
},
"tickers": {
"type": "array",
"items": {
"$ref": "#/components/schemas/NewsTicker"
}
},
"publisher": {
"type": "string",
"description": "The representative member's publisher. Always display it."
},
"url": {
"type": "string",
"description": "Canonical article URL at that publisher."
},
"imageMediaKey": {
"type": "string",
"nullable": true,
"description": "Key for `GET /v1/media/{key}` — the lead image, proxied. Null when\nthe story has no usable image. Clients must not be given, and\nshould not seek, the publisher's own CDN URL: fetching it directly\nwould tell that CDN which stories the user reads.\n"
},
"publishedAt": {
"type": "string",
"format": "date-time",
"description": "When the story broke — the earliest member's stamp."
},
"sourceCount": {
"type": "integer",
"description": "How many publishers carried this story, this one included."
}
}
}
NewsItemDetail
{
"allOf": [
{
"$ref": "#/components/schemas/NewsItem"
},
{
"type": "object",
"required": [
"sources"
],
"properties": {
"sources": {
"type": "array",
"items": {
"$ref": "#/components/schemas/NewsSource"
}
}
}
}
]
}
NewsSource
{
"type": "object",
"description": "One publisher's article within a story.",
"required": [
"publisher",
"url",
"title",
"publishedAt",
"subtitle",
"abstract",
"body",
"summary",
"imageMediaKey"
],
"properties": {
"publisher": {
"type": "string"
},
"url": {
"type": "string"
},
"title": {
"type": "string"
},
"publishedAt": {
"type": "string",
"format": "date-time"
},
"subtitle": {
"type": "string",
"nullable": true,
"description": "Reserved for feeds that carry a deck. Always null today."
},
"abstract": {
"type": "string",
"nullable": true,
"description": "The publisher's own excerpt, attributed to them. Null when the feed\ncarried nothing usable — never another outlet's text.\n"
},
"body": {
"type": "string",
"nullable": true,
"description": "Always null. Article bodies are not licensed, so they are neither\nstored nor served; link out to `url` instead of rendering in-app.\n"
},
"summary": {
"type": "string",
"nullable": true,
"description": "Reserved for a generated per-article summary. Always null today —\n`abstract` is the publisher's text, this would not be.\n"
},
"imageMediaKey": {
"type": "string",
"nullable": true,
"description": "Key for `GET /v1/media/{key}`, set only when this article supplied\nthe story's lead image. Null otherwise, including when the article\nhas a picture the story did not adopt — the proxy holds one image\nper story, and pointing here at a key it does not hold would 404.\n"
}
}
}
NewsReactions
{
"type": "object",
"description": "Per-asset price observations around one story.",
"required": [
"eventId",
"publishedAt",
"asOf",
"currency",
"source",
"benchmark",
"assets"
],
"properties": {
"eventId": {
"type": "string",
"example": "01K2C8ZR4G0000000000000000"
},
"publishedAt": {
"type": "string",
"format": "date-time",
"description": "The story stamp every window is measured from."
},
"asOf": {
"type": "string",
"format": "date-time",
"description": "When the measurement ran; what makes `pending` readable."
},
"currency": {
"type": "string",
"example": "USD"
},
"source": {
"type": "string",
"example": "CoinGecko",
"description": "Who supplied the observations. Display it."
},
"benchmark": {
"type": "object",
"description": "The asset every `benchmark*` field is measured against.",
"required": [
"coinId",
"symbol"
],
"properties": {
"coinId": {
"type": "string",
"example": "bitcoin"
},
"symbol": {
"type": "string",
"example": "BTC"
}
}
},
"assets": {
"type": "array",
"items": {
"$ref": "#/components/schemas/NewsReactionAsset"
}
},
"unavailable": {
"type": "boolean",
"description": "The deployment serving this has no price source wired, so `assets`\nis empty and says nothing about the market. Absent on a server that\ncan measure.\n"
}
}
}
NewsReactionAsset
{
"type": "object",
"description": "One ticker from the story, measured over every window.",
"required": [
"coinId",
"symbol",
"points",
"windows"
],
"properties": {
"coinId": {
"type": "string",
"nullable": true,
"description": "Same id space as `/v1/prices`. Null when the ticker resolved to no\ncoin — `points` and every window are then empty or `unavailable`,\nnever zero.\n"
},
"symbol": {
"type": "string",
"description": "Uppercase display ticker."
},
"points": {
"type": "array",
"description": "The observations the windows were computed from, oldest first, so a\nclient can draw the span rather than trust the numbers blind. Spans\nthe half hour before the stamp to at most 24 hours after it.\n",
"items": {
"$ref": "#/components/schemas/PriceSample"
}
},
"windows": {
"type": "array",
"items": {
"$ref": "#/components/schemas/NewsReactionWindow"
}
}
}
}
NewsReactionWindow
{
"type": "object",
"description": "One span starting at the publish stamp. Report `status` before any\nnumber: a null `returnPct` is unknown, never flat.\n",
"required": [
"seconds",
"status",
"returnPct",
"baseline",
"endpoint",
"benchmarkReturnPct",
"benchmarkBaseline",
"benchmarkEndpoint",
"differencePp"
],
"properties": {
"seconds": {
"type": "integer",
"enum": [
300,
900,
3600,
86400
],
"description": "Window length after the publish stamp."
},
"status": {
"type": "string",
"enum": [
"measured",
"pending",
"unavailable"
],
"description": "`measured` — both endpoints observed within tolerance.\n`pending` — the window has not closed yet; ask again later.\n`unavailable` — no usable observation near an endpoint. Every\nnumber below is null unless this is `measured`.\n"
},
"returnPct": {
"type": "number",
"nullable": true,
"description": "Move from `baseline` to `endpoint`, in percent."
},
"baseline": {
"allOf": [
{
"$ref": "#/components/schemas/PriceSample"
}
],
"nullable": true,
"description": "The last observation at or before the publish stamp — the actual\none used, not the stamp itself, so the lag is auditable.\n"
},
"endpoint": {
"allOf": [
{
"$ref": "#/components/schemas/PriceSample"
}
],
"nullable": true,
"description": "The last observation at or before the window's end."
},
"benchmarkReturnPct": {
"type": "number",
"nullable": true,
"description": "The benchmark's move over the same window. Null when its endpoints\nare not within a minute of this asset's, because differencing\nspans that do not line up would invent a number. Also null when\nthe asset *is* the benchmark.\n"
},
"benchmarkBaseline": {
"allOf": [
{
"$ref": "#/components/schemas/PriceSample"
}
],
"nullable": true
},
"benchmarkEndpoint": {
"allOf": [
{
"$ref": "#/components/schemas/PriceSample"
}
],
"nullable": true
},
"differencePp": {
"type": "number",
"nullable": true,
"description": "`returnPct - benchmarkReturnPct`, in percentage points: how far the\nasset moved against the market. The nearest honest thing to a\nstory-specific signal, and still not causation.\n"
}
}
}
PriceSample
{
"type": "array",
"description": "One observation — `[epochMilliseconds, priceUsd]`.",
"minItems": 2,
"maxItems": 2,
"items": {
"type": "number"
},
"example": [
1789334074000,
64250.12
]
}
NewsTicker
{
"type": "object",
"description": "An asset a story is about.",
"required": [
"symbol",
"coinId",
"change24hPct"
],
"properties": {
"symbol": {
"type": "string",
"description": "Uppercase display ticker. Not a join key — tickers collide."
},
"coinId": {
"type": "string",
"nullable": true,
"description": "Canonical coin id, the same id space as `/v1/prices`. This is the\njoin value against a client's own assets.\n"
},
"change24hPct": {
"type": "number",
"nullable": true,
"description": "The **asset's** 24-hour move, joined on `coinId`. Deliberately not\n\"the move this headline caused\": that needs a window around the\npublish stamp, and naming a 24-hour figure that way would be false.\nNull when no quote is on hand.\n"
}
}
}
TrafficWindow
{
"type": "object",
"description": "Aggregate traffic over a sliding window (landing page stats).",
"required": [
"clients",
"requests",
"errors"
],
"properties": {
"clients": {
"type": "integer",
"description": "Distinct authenticated devices seen in the window."
},
"requests": {
"type": "integer"
},
"errors": {
"type": "integer",
"description": "Responses with status 500 or above."
}
}
}
Interval
{
"type": "string",
"enum": [
"1h",
"1d"
],
"default": "1h"
}
Ticker
{
"type": "string",
"pattern": "^[A-Za-z0-9._-]{1,20}$"
}
DecimalAmount
{
"type": "string",
"pattern": "^(?:0|[1-9]\\d*)(?:\\.\\d{1,18})?$",
"maxLength": 80,
"example": "1.25"
}
ApiError
{
"type": "object",
"required": [
"error"
],
"properties": {
"error": {
"type": "string",
"example": "BAD_REQUEST"
},
"detail": {
"description": "Safe validation detail. Upstream response bodies and secrets are never exposed.",
"nullable": true
},
"topics": {
"type": "array",
"items": {
"type": "string"
}
}
},
"additionalProperties": true
}
CacheInfo
{
"type": "object",
"required": [
"hit",
"timestamp"
],
"description": "Provenance for the returned payload, never a promise that all upstream data exists.",
"properties": {
"hit": {
"type": "boolean",
"description": "True only when the complete response was served from cached data."
},
"timestamp": {
"type": "string",
"format": "date-time",
"nullable": true,
"description": "Timestamp of the newest cached material used, or null when no cache contributed."
},
"partial": {
"type": "boolean",
"description": "True when cached and newly fetched or unavailable portions were combined."
}
}
}
AttestationChallenge
{
"type": "object",
"required": [
"challenge",
"expiresIn"
],
"properties": {
"challenge": {
"type": "string",
"minLength": 16
},
"expiresIn": {
"type": "integer",
"example": 300,
"description": "Lifetime in seconds."
}
}
}
DeviceEnrollment
{
"type": "object",
"required": [
"platform"
],
"additionalProperties": false,
"properties": {
"platform": {
"type": "string",
"enum": [
"ios",
"android",
"macos",
"windows",
"linux"
]
},
"appVersion": {
"type": "string",
"maxLength": 50
},
"attestation": {
"type": "object",
"required": [
"provider",
"challenge"
],
"additionalProperties": false,
"properties": {
"provider": {
"type": "string",
"enum": [
"development",
"apple-app-attest",
"play-integrity"
]
},
"challenge": {
"type": "string",
"minLength": 16,
"maxLength": 200
},
"token": {
"type": "string",
"maxLength": 32000,
"writeOnly": true
}
}
}
}
}
SupportAuthSession
{
"type": "object",
"additionalProperties": false,
"required": [
"accessToken",
"refreshToken",
"accessExpiresAt",
"refreshExpiresAt"
],
"properties": {
"accessToken": {
"type": "string",
"writeOnly": true
},
"refreshToken": {
"type": "string",
"writeOnly": true
},
"accessExpiresAt": {
"type": "string",
"format": "date-time"
},
"refreshExpiresAt": {
"type": "string",
"format": "date-time"
},
"walletAddress": {
"type": "string",
"pattern": "^0x[0-9a-fA-F]{40}$",
"description": "Present after signature verification; omitted during refresh."
}
}
}
OpenTicketRequest
{
"type": "object",
"additionalProperties": false,
"required": [
"subject",
"body"
],
"properties": {
"topic": {
"type": "string",
"enum": [
"transaction",
"wallet",
"account",
"security",
"other"
],
"default": "other"
},
"subject": {
"type": "string",
"minLength": 1,
"maxLength": 200
},
"body": {
"type": "string",
"minLength": 1,
"maxLength": 8000
},
"osVersion": {
"type": "string",
"maxLength": 64
},
"locale": {
"type": "string",
"maxLength": 35
},
"buildMode": {
"type": "string",
"enum": [
"debug",
"profile",
"release"
]
},
"appVersion": {
"type": "string",
"maxLength": 64,
"description": "Fallback only — the device's enrolment row is the authority for its version when it has one."
},
"context": {
"type": "object",
"additionalProperties": true,
"description": "Free-form client diagnostics. Sanitised server-side: capped, flattened to scalars, and redacted string by string (and array-wide, so a phrase split one-word-per-element is still caught)."
},
"attachments": {
"type": "array",
"maxItems": 3,
"description": "User-approved evidence. Transaction attachments retain public addresses, contract metadata, calldata and raw signed/provider data; secret-key fields are removed server-side. Images are bounded JPEGs with metadata removed at both the client and service boundary.",
"items": {
"$ref": "#/components/schemas/SupportAttachmentInput"
}
}
}
}
SupportAttachmentInput
{
"type": "object",
"additionalProperties": false,
"required": [
"kind",
"name",
"data"
],
"properties": {
"kind": {
"type": "string",
"enum": [
"transaction",
"diagnostic"
]
},
"name": {
"type": "string",
"minLength": 1,
"maxLength": 120
},
"contentType": {
"type": "string",
"enum": [
"application/json",
"image/jpeg"
]
},
"data": {
"type": "object",
"additionalProperties": true,
"description": "Structured JSON, or for image attachments an object containing encoding=base64, JPEG bytes, width and height."
}
}
}
SupportAttachment
{
"allOf": [
{
"$ref": "#/components/schemas/SupportAttachmentInput"
},
{
"type": "object",
"required": [
"id",
"contentType",
"byteSize",
"createdAt"
],
"properties": {
"id": {
"type": "string"
},
"byteSize": {
"type": "integer",
"minimum": 0
},
"createdAt": {
"type": "string",
"format": "date-time"
}
}
}
]
}
SupportTicket
{
"type": "object",
"required": [
"id",
"topic",
"subject",
"status",
"hasAttachment",
"hasUnreadReply",
"lastMessageAt",
"createdAt"
],
"properties": {
"id": {
"type": "string"
},
"topic": {
"type": "string",
"enum": [
"transaction",
"wallet",
"account",
"security",
"other"
]
},
"subject": {
"type": "string",
"description": "Post-redaction."
},
"status": {
"type": "string",
"enum": [
"open",
"pending",
"resolved",
"closed"
]
},
"hasAttachment": {
"type": "boolean"
},
"hasUnreadReply": {
"type": "boolean"
},
"lastMessageAt": {
"type": "string",
"format": "date-time"
},
"createdAt": {
"type": "string",
"format": "date-time"
}
}
}
SupportMessage
{
"type": "object",
"required": [
"id",
"author",
"body",
"createdAt"
],
"properties": {
"id": {
"type": "string"
},
"author": {
"type": "string",
"enum": [
"user",
"staff",
"system"
],
"description": "The staff member's identity is deliberately not exposed. The app renders its built-in anti-phishing warning for every thread."
},
"body": {
"type": "string",
"description": "Post-redaction."
},
"createdAt": {
"type": "string",
"format": "date-time"
}
}
}
TicketThread
{
"type": "object",
"required": [
"ticket",
"messages",
"attachments"
],
"properties": {
"ticket": {
"$ref": "#/components/schemas/SupportTicket"
},
"messages": {
"type": "array",
"items": {
"$ref": "#/components/schemas/SupportMessage"
}
},
"attachments": {
"type": "array",
"items": {
"$ref": "#/components/schemas/SupportAttachment"
}
},
"secretRemoved": {
"type": "boolean",
"description": "True when redaction fired on something the user just sent. The app owns and renders the corresponding warning text."
}
}
}
CrashReportRequest
{
"type": "object",
"additionalProperties": false,
"required": [
"platform",
"buildMode",
"source",
"fatal",
"errorType",
"message",
"stack",
"occurredAt"
],
"properties": {
"platform": {
"type": "string",
"minLength": 1,
"maxLength": 32,
"example": "ios"
},
"appVersion": {
"type": "string",
"maxLength": 64,
"example": "1.0.0"
},
"buildMode": {
"type": "string",
"enum": [
"debug",
"profile",
"release"
]
},
"source": {
"type": "string",
"enum": [
"flutter",
"platform"
]
},
"fatal": {
"type": "boolean"
},
"errorType": {
"type": "string",
"minLength": 1,
"maxLength": 160
},
"message": {
"type": "string",
"maxLength": 4000
},
"stack": {
"type": "string",
"maxLength": 24000
},
"occurredAt": {
"type": "string",
"format": "date-time"
}
}
}
NetworkOverview
{
"type": "object",
"additionalProperties": false,
"required": [
"network",
"news",
"popularTokens"
],
"properties": {
"network": {
"type": "object",
"additionalProperties": false,
"required": [
"id",
"name",
"description",
"websiteUrl"
],
"properties": {
"id": {
"type": "string",
"example": "base"
},
"name": {
"type": "string",
"example": "Base"
},
"description": {
"type": "string"
},
"websiteUrl": {
"type": "string",
"format": "uri",
"nullable": true
}
}
},
"news": {
"type": "object",
"additionalProperties": false,
"required": [
"available",
"items",
"asOf",
"stale"
],
"properties": {
"available": {
"type": "boolean"
},
"items": {
"type": "array",
"maxItems": 4,
"items": {
"$ref": "#/components/schemas/NewsItem"
}
},
"asOf": {
"type": "string",
"format": "date-time",
"nullable": true
},
"stale": {
"type": "boolean"
}
}
},
"popularTokens": {
"type": "object",
"additionalProperties": false,
"required": [
"available",
"items",
"asOf",
"stale",
"metric",
"source"
],
"properties": {
"available": {
"type": "boolean"
},
"items": {
"type": "array",
"maxItems": 5,
"items": {
"$ref": "#/components/schemas/PopularNetworkToken"
}
},
"asOf": {
"type": "string",
"format": "date-time",
"nullable": true
},
"stale": {
"type": "boolean"
},
"metric": {
"type": "string",
"enum": [
"on_chain_holders"
]
},
"source": {
"type": "string",
"enum": [
"coingecko"
],
"nullable": true
}
}
}
}
}
PopularNetworkToken
{
"type": "object",
"additionalProperties": false,
"required": [
"tokenId",
"address",
"symbol",
"name",
"decimals",
"logoMediaKey",
"logoUrl",
"coingeckoId",
"marketCapUsd",
"holderCount",
"holderCountAtLeast",
"priceUsd",
"change24hPct",
"rank",
"source"
],
"properties": {
"tokenId": {
"type": "string"
},
"address": {
"type": "string"
},
"symbol": {
"type": "string"
},
"name": {
"type": "string"
},
"decimals": {
"type": "integer",
"minimum": 0,
"maximum": 255
},
"logoMediaKey": {
"type": "string",
"nullable": true
},
"logoUrl": {
"type": "string",
"format": "uri",
"nullable": true
},
"coingeckoId": {
"type": "string",
"nullable": true
},
"marketCapUsd": {
"type": "number",
"format": "double",
"minimum": 0
},
"holderCount": {
"type": "integer",
"minimum": 0,
"nullable": true
},
"holderCountAtLeast": {
"type": "boolean"
},
"priceUsd": {
"type": "number",
"format": "double",
"nullable": true
},
"change24hPct": {
"type": "number",
"format": "double",
"nullable": true
},
"rank": {
"type": "integer",
"minimum": 1
},
"source": {
"type": "string",
"enum": [
"coingecko"
]
}
}
}
NetworkCapability
{
"type": "object",
"required": [
"id",
"family",
"capabilities"
],
"properties": {
"id": {
"type": "string",
"example": "ethereum"
},
"family": {
"type": "string",
"example": "evm"
},
"name": {
"type": "string"
},
"native": {
"type": "object",
"additionalProperties": true
},
"capabilities": {
"type": "object",
"description": "Feature states such as `ok`, `none`, `rpc` or degraded modes.",
"additionalProperties": true
}
},
"additionalProperties": true
}
SpotPriceResponse
{
"type": "object",
"required": [
"fiat",
"prices",
"missing",
"invalid"
],
"properties": {
"fiat": {
"type": "string",
"example": "usd"
},
"prices": {
"type": "object",
"additionalProperties": {
"$ref": "#/components/schemas/SpotPrice"
}
},
"missing": {
"type": "array",
"description": "Syntactically valid IDs for which no price was available.",
"items": {
"type": "string"
}
},
"invalid": {
"type": "array",
"description": "IDs rejected by the server's price-ID grammar.",
"items": {
"type": "string"
}
}
}
}
SpotPrice
{
"type": "object",
"required": [
"sourceId",
"price",
"change24hPct",
"asOf",
"stale",
"source",
"cache"
],
"properties": {
"sourceId": {
"type": "string"
},
"price": {
"type": "number",
"format": "double"
},
"change24hPct": {
"type": "number",
"format": "double",
"nullable": true
},
"asOf": {
"type": "string",
"format": "date-time"
},
"stale": {
"type": "boolean"
},
"source": {
"type": "string"
},
"cache": {
"$ref": "#/components/schemas/CacheInfo"
}
}
}
PricePoint
{
"type": "array",
"description": "Two-item tuple `[unixTimestampSeconds, value]`; used for both close price and volume series.",
"minItems": 2,
"maxItems": 2,
"items": {
"type": "number",
"format": "double"
},
"example": [
1753000000,
3012.44
]
}
PriceResolutionAvailability
{
"type": "object",
"required": [
"interval",
"from",
"to",
"days"
],
"properties": {
"interval": {
"$ref": "#/components/schemas/Interval"
},
"from": {
"type": "integer",
"format": "int64"
},
"to": {
"type": "integer",
"format": "int64"
},
"days": {
"type": "number",
"minimum": 0
}
}
}
PriceAvailability
{
"type": "object",
"required": [
"from",
"to",
"days",
"resolutions"
],
"properties": {
"from": {
"type": "integer",
"format": "int64",
"nullable": true
},
"to": {
"type": "integer",
"format": "int64",
"nullable": true
},
"days": {
"type": "number",
"minimum": 0,
"description": "Available time span expressed in days."
},
"resolutions": {
"type": "array",
"description": "Exact time coverage available for each stored resolution.",
"items": {
"$ref": "#/components/schemas/PriceResolutionAvailability"
}
}
}
}
PriceHistory
{
"type": "object",
"required": [
"id",
"interval",
"points",
"volumes",
"cache",
"coverage",
"window",
"availability"
],
"properties": {
"id": {
"type": "string"
},
"interval": {
"$ref": "#/components/schemas/Interval"
},
"points": {
"type": "array",
"items": {
"$ref": "#/components/schemas/PricePoint"
}
},
"volumes": {
"type": "array",
"description": "Parallel 24-hour rolling-volume tuples where the provider supplied volume.",
"items": {
"$ref": "#/components/schemas/PricePoint"
}
},
"coverage": {
"type": "object",
"required": [
"cachedPoints",
"fetchedPoints"
],
"properties": {
"cachedPoints": {
"type": "integer",
"minimum": 0
},
"fetchedPoints": {
"type": "integer",
"minimum": 0
}
}
},
"window": {
"type": "object",
"required": [
"from",
"to",
"days"
],
"properties": {
"from": {
"type": "integer",
"format": "int64",
"nullable": true
},
"to": {
"type": "integer",
"format": "int64",
"nullable": true
},
"days": {
"type": "number",
"minimum": 0
}
}
},
"availability": {
"$ref": "#/components/schemas/PriceAvailability"
},
"cache": {
"$ref": "#/components/schemas/CacheInfo"
}
}
}
PriceHistoryFailure
{
"type": "object",
"required": [
"error",
"availability"
],
"properties": {
"error": {
"type": "string",
"enum": [
"UNRECOGNIZED_ID",
"UPSTREAM_UNAVAILABLE"
]
},
"availability": {
"$ref": "#/components/schemas/PriceAvailability"
}
}
}
PriceHistoryBatch
{
"type": "object",
"required": [
"from",
"to",
"interval",
"series",
"cache"
],
"properties": {
"from": {
"type": "integer",
"format": "int64"
},
"to": {
"type": "integer",
"format": "int64"
},
"interval": {
"$ref": "#/components/schemas/Interval"
},
"series": {
"type": "object",
"additionalProperties": {
"oneOf": [
{
"$ref": "#/components/schemas/PriceHistory"
},
{
"$ref": "#/components/schemas/PriceHistoryFailure"
}
]
}
},
"cache": {
"$ref": "#/components/schemas/CacheInfo"
}
}
}
AccountReference
{
"type": "object",
"required": [
"network",
"address"
],
"properties": {
"network": {
"type": "string",
"minLength": 1,
"maxLength": 64
},
"address": {
"type": "string",
"minLength": 1,
"maxLength": 128
}
}
}
PortfolioSnapshotRequest
{
"type": "object",
"required": [
"accounts"
],
"properties": {
"accounts": {
"type": "array",
"minItems": 1,
"maxItems": 200,
"items": {
"allOf": [
{
"$ref": "#/components/schemas/AccountReference"
},
{
"type": "object",
"properties": {
"tokens": {
"type": "array",
"maxItems": 200,
"default": [],
"items": {
"type": "string",
"maxLength": 120
}
}
}
}
]
}
},
"fiat": {
"type": "string",
"enum": [
"usd"
],
"default": "usd"
},
"refresh": {
"type": "boolean",
"default": false,
"description": "Invalidates the requested balance envelopes before reading. Intended for an explicit foreground refresh."
}
}
}
PortfolioRangeRequest
{
"type": "object",
"required": [
"accounts"
],
"properties": {
"accounts": {
"type": "array",
"minItems": 1,
"maxItems": 200,
"items": {
"$ref": "#/components/schemas/AccountReference"
}
},
"range": {
"type": "string",
"enum": [
"7d",
"30d",
"90d",
"1y"
],
"default": "30d"
}
}
}
PortfolioSnapshot
{
"type": "object",
"required": [
"totalFiat",
"byNetwork",
"accounts",
"etag"
],
"properties": {
"totalFiat": {
"type": "number",
"format": "double"
},
"byNetwork": {
"type": "array",
"items": {
"type": "object",
"required": [
"network",
"fiat"
],
"properties": {
"network": {
"type": "string"
},
"fiat": {
"type": "number",
"format": "double"
}
}
}
},
"accounts": {
"type": "array",
"items": {
"type": "object",
"additionalProperties": true
}
},
"etag": {
"type": "string"
}
}
}
AccountBalances
{
"type": "object",
"required": [
"network",
"address",
"native",
"tokens",
"asOf",
"stale",
"cache"
],
"properties": {
"network": {
"type": "string"
},
"address": {
"type": "string"
},
"native": {
"type": "object",
"additionalProperties": true
},
"tokens": {
"type": "array",
"description": "Each token's `balanceRaw` is on-chain units. A token that scales the amount it displays (a Solana ScaledUiAmount or InterestBearing mint) also carries `displayUnits`, the amount as displayed; `price` is per displayed unit, so `fiat` is `displayUnits × price`.",
"items": {
"type": "object",
"additionalProperties": true
}
},
"asOf": {
"type": "string",
"format": "date-time"
},
"reference": {
"$ref": "#/components/schemas/BlockchainReference"
},
"finality": {
"type": "string",
"enum": [
"unknown",
"latest",
"confirmed",
"safe",
"finalized"
]
},
"stale": {
"type": "boolean"
},
"cache": {
"$ref": "#/components/schemas/CacheInfo"
}
},
"additionalProperties": true
}
BlockchainReference
{
"type": "object",
"required": [
"kind",
"value"
],
"description": "Optional chain-native position shared by all balances in the account response. Omitted unless the read was pinned to that exact state.",
"properties": {
"kind": {
"type": "string",
"enum": [
"block",
"slot",
"round",
"ledger",
"ledgerVersion",
"checkpoint",
"consensusTimestamp",
"certifiedHeight",
"sequence"
]
},
"value": {
"type": "string",
"minLength": 1,
"description": "Text rather than a JSON number so positions above 2^53 remain exact."
},
"hash": {
"type": "string"
}
}
}
AnalyticsPayload
{
"type": "object",
"description": "Shape is endpoint-specific; consult the endpoint summary and examples in the Flutter integration guide.",
"properties": {
"asOf": {
"type": "string",
"format": "date-time"
},
"stale": {
"type": "boolean"
},
"cache": {
"$ref": "#/components/schemas/CacheInfo"
}
},
"additionalProperties": true
}
AccountCoverage
{
"type": "object",
"required": [
"covered",
"excluded"
],
"properties": {
"covered": {
"type": "integer",
"minimum": 0
},
"excluded": {
"type": "integer",
"minimum": 0
},
"unknown": {
"type": "integer",
"minimum": 0
}
}
}
PortfolioValue
{
"type": "object",
"required": [
"range",
"from",
"points",
"accounts",
"cache"
],
"properties": {
"range": {
"type": "string",
"enum": [
"7d",
"30d",
"90d",
"365d"
]
},
"from": {
"type": "integer",
"format": "int64",
"nullable": true
},
"points": {
"type": "array",
"description": "Oldest-to-newest `[unixTimestampSeconds, totalUsd]` tuples.",
"items": {
"$ref": "#/components/schemas/PricePoint"
}
},
"accounts": {
"$ref": "#/components/schemas/AccountCoverage"
},
"cache": {
"$ref": "#/components/schemas/CacheInfo"
}
}
}
FlowBucket
{
"type": "object",
"required": [
"count",
"fiat",
"unpriced"
],
"properties": {
"count": {
"type": "integer",
"minimum": 0
},
"fiat": {
"type": "number",
"format": "double",
"nullable": true,
"description": "Null when no transfer in this direction could be priced; never a fabricated zero."
},
"unpriced": {
"type": "integer",
"minimum": 0
}
}
}
ActivityPoint
{
"type": "object",
"required": [
"t",
"in",
"out"
],
"properties": {
"t": {
"type": "integer",
"format": "int64",
"description": "UTC day in Unix seconds."
},
"in": {
"type": "integer",
"minimum": 0
},
"out": {
"type": "integer",
"minimum": 0
}
}
}
PortfolioFlows
{
"type": "object",
"required": [
"range",
"in",
"out",
"points",
"accounts",
"cache"
],
"properties": {
"range": {
"type": "string",
"enum": [
"7d",
"30d",
"90d",
"365d"
]
},
"in": {
"$ref": "#/components/schemas/FlowBucket"
},
"out": {
"$ref": "#/components/schemas/FlowBucket"
},
"points": {
"type": "array",
"description": "Days with no activity are omitted.",
"items": {
"$ref": "#/components/schemas/ActivityPoint"
}
},
"accounts": {
"$ref": "#/components/schemas/AccountCoverage"
},
"cache": {
"$ref": "#/components/schemas/CacheInfo"
}
}
}
TransferAmount
{
"type": "object",
"nullable": true,
"required": [
"raw",
"decimals"
],
"properties": {
"raw": {
"type": "string",
"description": "Integer base-unit amount."
},
"decimals": {
"type": "integer",
"minimum": 0
}
}
}
TransferAsset
{
"type": "object",
"nullable": true,
"required": [
"chainId",
"symbol",
"name",
"decimals",
"contractAddress"
],
"properties": {
"chainId": {
"type": "string"
},
"symbol": {
"type": "string"
},
"name": {
"type": "string"
},
"decimals": {
"type": "integer",
"minimum": 0
},
"contractAddress": {
"type": "string",
"nullable": true
}
}
}
Transfer
{
"type": "object",
"required": [
"id",
"type",
"status",
"direction",
"timestamp",
"chainId",
"family",
"confirmations",
"metadata"
],
"properties": {
"id": {
"type": "string"
},
"type": {
"type": "string",
"enum": [
"send",
"receive",
"swap",
"bridge",
"approve",
"associate",
"contractCall",
"mint",
"burn",
"stake",
"unstake",
"reward",
"fee",
"unknown"
]
},
"status": {
"type": "string",
"enum": [
"pending",
"confirmed",
"failed",
"dropped"
]
},
"direction": {
"type": "string",
"enum": [
"incoming",
"outgoing",
"selfTransfer"
]
},
"timestamp": {
"type": "string",
"format": "date-time"
},
"chainId": {
"type": "string"
},
"family": {
"type": "string"
},
"hash": {
"type": "string",
"nullable": true
},
"blockNumber": {
"type": "integer",
"format": "int64",
"nullable": true
},
"confirmations": {
"type": "integer",
"minimum": 0
},
"fromAddress": {
"type": "string",
"nullable": true
},
"toAddress": {
"type": "string",
"nullable": true
},
"asset": {
"$ref": "#/components/schemas/TransferAsset"
},
"amount": {
"$ref": "#/components/schemas/TransferAmount"
},
"toAsset": {
"$ref": "#/components/schemas/TransferAsset"
},
"toAmount": {
"$ref": "#/components/schemas/TransferAmount"
},
"destinationChainId": {
"type": "string",
"nullable": true
},
"destinationHash": {
"type": "string",
"nullable": true
},
"fee": {
"$ref": "#/components/schemas/TransferAmount"
},
"feeSymbol": {
"type": "string",
"nullable": true
},
"fiatValue": {
"type": "number",
"format": "double",
"nullable": true
},
"fiatCurrency": {
"type": "string",
"nullable": true
},
"memo": {
"type": "string",
"nullable": true
},
"error": {
"type": "string",
"nullable": true
},
"metadata": {
"type": "object",
"additionalProperties": true
}
}
}
TransfersPage
{
"type": "object",
"required": [
"network",
"address",
"items",
"operations",
"cursor",
"hasMore",
"nextBefore",
"historyComplete",
"window",
"cache"
],
"properties": {
"network": {
"type": "string"
},
"address": {
"type": "string"
},
"items": {
"type": "array",
"items": {
"$ref": "#/components/schemas/Transfer"
}
},
"operations": {
"type": "array",
"description": "Page-aligned economic read models; independent of the stable transfer items.",
"items": {
"$ref": "#/components/schemas/EconomicOperation"
}
},
"cursor": {
"type": "string",
"nullable": true,
"description": "Account high-water cursor for subsequent delta sync."
},
"hasMore": {
"type": "boolean"
},
"nextBefore": {
"type": "string",
"nullable": true,
"description": "Cursor for the next display page."
},
"historyComplete": {
"type": "boolean",
"description": "Whether upstream history backfill reached its end."
},
"window": {
"type": "object",
"required": [
"from",
"to",
"flow"
],
"properties": {
"from": {
"type": "integer",
"format": "int64",
"nullable": true
},
"to": {
"type": "integer",
"format": "int64",
"nullable": true
},
"flow": {
"type": "string",
"enum": [
"all",
"in",
"out",
"neutral"
]
}
}
},
"cache": {
"$ref": "#/components/schemas/CacheInfo"
}
}
}
EconomicOperation
{
"type": "object",
"required": [
"id",
"recordId",
"kind",
"triggeredAt",
"settledAt",
"status",
"hash",
"venue",
"confidence",
"legs"
],
"properties": {
"id": {
"type": "string"
},
"recordId": {
"type": "string"
},
"kind": {
"type": "string",
"enum": [
"buy",
"sell",
"swap",
"transfer",
"bridge",
"mint",
"burn",
"reward",
"fee",
"unknown"
]
},
"triggeredAt": {
"type": "string",
"format": "date-time"
},
"settledAt": {
"type": "string",
"format": "date-time",
"nullable": true
},
"status": {
"type": "string",
"enum": [
"pending",
"confirmed",
"failed",
"dropped"
]
},
"hash": {
"type": "string",
"nullable": true
},
"venue": {
"type": "string",
"nullable": true
},
"confidence": {
"type": "string",
"enum": [
"source",
"derived",
"estimated"
]
},
"legs": {
"type": "array",
"items": {
"$ref": "#/components/schemas/EconomicOperationLeg"
}
}
}
}
EconomicOperationLeg
{
"type": "object",
"required": [
"index",
"role",
"tokenId",
"asset",
"amount",
"direction",
"unitPriceUsd",
"totalUsd",
"valuationSource",
"valuationSourceId",
"valuationAsOf"
],
"properties": {
"index": {
"type": "integer",
"minimum": 0
},
"role": {
"type": "string",
"enum": [
"input",
"output",
"fee"
]
},
"tokenId": {
"type": "string"
},
"asset": {
"$ref": "#/components/schemas/TransferAsset"
},
"amount": {
"$ref": "#/components/schemas/TransferAmount"
},
"direction": {
"type": "string",
"enum": [
"in",
"out",
"neutral"
]
},
"unitPriceUsd": {
"type": "number",
"format": "double",
"nullable": true
},
"totalUsd": {
"type": "number",
"format": "double",
"nullable": true
},
"valuationSource": {
"type": "string",
"nullable": true,
"enum": [
"execution",
"appSnapshot",
"1h",
"1d",
"unknownEstimate",
"manual"
]
},
"valuationSourceId": {
"type": "string",
"nullable": true
},
"valuationAsOf": {
"type": "string",
"format": "date-time",
"nullable": true
}
}
}
OperationLegIdentity
{
"type": "object",
"additionalProperties": false,
"required": [
"operationId",
"legIndex"
],
"properties": {
"operationId": {
"type": "string",
"minLength": 1,
"maxLength": 600
},
"legIndex": {
"type": "integer",
"minimum": 0,
"maximum": 32
}
}
}
OperationBasisWrite
{
"allOf": [
{
"$ref": "#/components/schemas/OperationLegIdentity"
},
{
"type": "object",
"required": [
"unitPriceUsd"
],
"properties": {
"unitPriceUsd": {
"type": "number",
"format": "double",
"exclusiveMinimum": 0,
"maximum": 1000000000000000000
}
}
}
]
}
TransferSummary
{
"type": "object",
"required": [
"range",
"in",
"out",
"cache"
],
"properties": {
"range": {
"type": "string"
},
"in": {
"$ref": "#/components/schemas/FlowBucket"
},
"out": {
"$ref": "#/components/schemas/FlowBucket"
},
"cache": {
"$ref": "#/components/schemas/CacheInfo"
}
}
}
ActivityChart
{
"type": "object",
"required": [
"range",
"interval",
"points",
"cache"
],
"properties": {
"range": {
"type": "string"
},
"interval": {
"type": "string",
"enum": [
"1d"
]
},
"points": {
"type": "array",
"items": {
"$ref": "#/components/schemas/ActivityPoint"
}
},
"cache": {
"$ref": "#/components/schemas/CacheInfo"
}
}
}
ValueChart
{
"type": "object",
"required": [
"range",
"points",
"cache"
],
"properties": {
"range": {
"type": "string"
},
"points": {
"type": "array",
"items": {
"$ref": "#/components/schemas/PricePoint"
}
},
"cache": {
"$ref": "#/components/schemas/CacheInfo"
}
}
}
NftMedia
{
"type": "object",
"required": [
"image",
"imageProxy"
],
"properties": {
"image": {
"type": "string",
"nullable": true,
"description": "Original provider media URL."
},
"imageProxy": {
"type": "string",
"nullable": true,
"description": "Relative verified-media proxy path."
}
}
}
NftItem
{
"type": "object",
"required": [
"id",
"contractAddress",
"tokenId",
"standard",
"name",
"collectionName",
"media",
"flags",
"firstSeenAt"
],
"properties": {
"id": {
"type": "string"
},
"contractAddress": {
"type": "string",
"nullable": true
},
"tokenId": {
"type": "string"
},
"standard": {
"type": "string",
"nullable": true
},
"name": {
"type": "string",
"nullable": true
},
"collectionName": {
"type": "string",
"nullable": true
},
"media": {
"$ref": "#/components/schemas/NftMedia"
},
"flags": {
"type": "object",
"additionalProperties": true
},
"firstSeenAt": {
"type": "string",
"format": "date-time"
}
}
}
NftInventory
{
"type": "object",
"required": [
"network",
"address",
"items",
"stale",
"cache"
],
"properties": {
"network": {
"type": "string"
},
"address": {
"type": "string"
},
"items": {
"type": "array",
"items": {
"$ref": "#/components/schemas/NftItem"
}
},
"stale": {
"type": "boolean",
"description": "True when a failed rescan caused the durable inventory to be served."
},
"cache": {
"$ref": "#/components/schemas/CacheInfo"
}
}
}
Trustline
{
"type": "object",
"required": [
"tokenId",
"symbol",
"balanceRaw",
"decimals",
"limit"
],
"properties": {
"tokenId": {
"type": "string"
},
"symbol": {
"type": "string",
"nullable": true
},
"balanceRaw": {
"type": "string",
"nullable": true
},
"decimals": {
"type": "integer",
"nullable": true,
"minimum": 0
},
"limit": {
"type": "string",
"nullable": true
}
}
}
TrustlineInventory
{
"type": "object",
"required": [
"network",
"address",
"trustlines"
],
"properties": {
"network": {
"type": "string"
},
"address": {
"type": "string"
},
"trustlines": {
"type": "array",
"items": {
"$ref": "#/components/schemas/Trustline"
}
}
}
}
AddressInsight
{
"type": "object",
"required": [
"exists",
"kind",
"txCount",
"txCountFloor",
"asOf",
"stale",
"cache"
],
"properties": {
"exists": {
"type": "boolean"
},
"kind": {
"type": "string",
"enum": [
"eoa",
"contract",
"account",
"unknown"
]
},
"txCount": {
"type": "integer",
"nullable": true,
"minimum": 0
},
"txCountFloor": {
"type": "boolean"
},
"asOf": {
"type": "string",
"format": "date-time"
},
"stale": {
"type": "boolean"
},
"cache": {
"$ref": "#/components/schemas/CacheInfo"
}
}
}
TransactionDetail
{
"type": "object",
"required": [
"status",
"blockNumber",
"detail",
"raw",
"fetchedAt",
"cache"
],
"properties": {
"status": {
"type": "string",
"enum": [
"pending",
"confirmed",
"failed",
"unknown"
]
},
"blockNumber": {
"type": "integer",
"format": "int64",
"nullable": true
},
"detail": {
"type": "object",
"additionalProperties": true
},
"raw": {
"nullable": true
},
"fetchedAt": {
"type": "string",
"format": "date-time"
},
"cache": {
"$ref": "#/components/schemas/CacheInfo"
}
}
}
SafetySignal
{
"type": "object",
"required": [
"label",
"detail",
"sentiment"
],
"properties": {
"label": {
"type": "string"
},
"detail": {
"type": "string"
},
"sentiment": {
"type": "string",
"enum": [
"good",
"caution",
"bad",
"neutral"
]
}
}
}
TokenSafety
{
"type": "object",
"required": [
"score",
"level",
"signals"
],
"properties": {
"score": {
"type": "integer",
"minimum": 0,
"maximum": 100
},
"level": {
"type": "string",
"enum": [
"high",
"medium",
"low",
"unknown"
]
},
"signals": {
"type": "array",
"items": {
"$ref": "#/components/schemas/SafetySignal"
}
}
}
}
TokenPage
{
"type": "object",
"required": [
"network",
"ref",
"input",
"asOf",
"included",
"identity",
"quote",
"market",
"profile",
"liquidity",
"holders",
"safety",
"comparison",
"insight",
"series",
"errors",
"cache"
],
"properties": {
"network": {
"type": "string",
"nullable": true
},
"ref": {
"type": "string",
"description": "Canonical spelling of the requested ref — cache under this, and ask with it next time."
},
"input": {
"type": "string",
"description": "What the caller wrote",
"before normalization.": null
},
"asOf": {
"type": "string",
"format": "date-time",
"description": "The oldest available timestamp among included cached sections; live sections contribute response time."
},
"included": {
"type": "array",
"items": {
"type": "string",
"enum": [
"identity",
"quote",
"market",
"profile",
"liquidity",
"holders",
"safety",
"comparison",
"insight",
"series"
]
}
},
"identity": {
"$ref": "#/components/schemas/TokenIdentity"
},
"quote": {
"nullable": true,
"allOf": [
{
"$ref": "#/components/schemas/TokenQuote"
}
]
},
"market": {
"nullable": true,
"allOf": [
{
"$ref": "#/components/schemas/TokenMarketView"
}
]
},
"profile": {
"nullable": true,
"allOf": [
{
"$ref": "#/components/schemas/TokenProfileView"
}
]
},
"liquidity": {
"type": "object",
"nullable": true,
"additionalProperties": true
},
"holders": {
"type": "object",
"nullable": true,
"required": [
"count",
"atLeast",
"source"
],
"description": "Each `change*Pct` window is OMITTED rather than null when the\nobservation history has no trustworthy baseline for it — a token\nwatched for two days has a 24h figure and no 30d one, and an absent\nkey is how a client tells that from \"flat\". There is deliberately\nno 1h/6h window: counts are recorded once per UTC day.\n",
"properties": {
"count": {
"type": "integer",
"minimum": 0
},
"atLeast": {
"type": "boolean",
"description": "True when the count is a floor (the source reported \"at least N\")."
},
"source": {
"type": "string",
"description": "Which counter produced this figure (`ethplorer`, `goplus`,\n`jupiter`, …). Not cosmetic: two indexers count different\npopulations, so a change here is why a growth window can\ndisappear.\n"
},
"change24hPct": {
"type": "number"
},
"change7dPct": {
"type": "number"
},
"change30dPct": {
"type": "number"
},
"change90dPct": {
"type": "number"
},
"change365dPct": {
"type": "number"
}
}
},
"safety": {
"nullable": true,
"allOf": [
{
"$ref": "#/components/schemas/TokenSafety"
}
]
},
"comparison": {
"type": "object",
"nullable": true,
"description": "The viewed token followed by the fixed BTC and BNB benchmarks, de-duplicated when the viewed token is itself a benchmark.",
"required": [
"fiat",
"items"
],
"properties": {
"fiat": {
"type": "string",
"enum": [
"usd"
]
},
"items": {
"type": "array",
"maxItems": 3,
"items": {
"$ref": "#/components/schemas/TokenComparisonItem"
}
}
}
},
"insight": {
"type": "array",
"description": "What the token's OWN chain says about it, as titled sections ready to\nrender in order. Empty — never absent — for a family with no\nchain-native token index, since \"the chain has no such record\" and\n\"we didn't ask\" must not look the same to a client.\n",
"items": {
"$ref": "#/components/schemas/TokenInsightSection"
}
},
"series": {
"nullable": true,
"allOf": [
{
"$ref": "#/components/schemas/TokenSeries"
}
]
},
"errors": {
"type": "object",
"description": "Section name → error code, for sections that could not be read.",
"additionalProperties": {
"type": "string"
}
},
"cache": {
"type": "object",
"description": "Per-section provenance; only requested sections appear.",
"additionalProperties": {
"$ref": "#/components/schemas/CacheInfo"
}
}
}
}
TokenIdentity
{
"type": "object",
"required": [
"tokenId",
"transferTokenId",
"kind",
"network",
"address",
"issuer",
"symbol",
"name",
"decimals",
"native",
"logoMediaKey",
"coingeckoId",
"coingeckoIdSource",
"ambiguous",
"verified",
"priceId",
"input"
],
"properties": {
"tokenId": {
"type": "string"
},
"transferTokenId": {
"type": "string",
"nullable": true,
"description": "Canonical transfer-store identifier, when this ref uniquely identifies an asset."
},
"kind": {
"type": "string",
"enum": [
"native",
"erc20",
"trc10",
"trc20",
"spl",
"asa",
"cardano",
"stellar",
"hts",
"xrpl",
"symbol",
"coingecko"
]
},
"network": {
"type": "string",
"nullable": true
},
"address": {
"type": "string",
"nullable": true,
"description": "The chain's own identifier; null for a native coin or a ticker ref."
},
"issuer": {
"type": "string",
"nullable": true
},
"symbol": {
"type": "string",
"nullable": true
},
"name": {
"type": "string",
"nullable": true
},
"decimals": {
"type": "integer",
"minimum": 0,
"nullable": true
},
"native": {
"type": "boolean"
},
"logoMediaKey": {
"type": "string",
"nullable": true,
"pattern": "^[0-9a-f]{32}$"
},
"coingeckoId": {
"type": "string",
"nullable": true
},
"coingeckoIdSource": {
"type": "string",
"nullable": true,
"enum": [
"ref",
"registry",
"contract",
"search",
"hint"
],
"description": "How the coin id was found; null when the token is not listed anywhere visible."
},
"ambiguous": {
"type": "boolean",
"description": "True when a ticker matched several listed coins and the first was taken."
},
"verified": {
"type": "boolean",
"nullable": true,
"description": "The family's own verification flag",
"where it has one.": null
},
"priceId": {
"type": "string",
"nullable": true,
"description": "`GET /v1/prices?ids=` id, or null when the price plane has no grammar for this family."
},
"input": {
"type": "string"
}
}
}
TokenComparisonRequest
{
"type": "object",
"additionalProperties": false,
"required": [
"tokens"
],
"properties": {
"tokens": {
"type": "array",
"minItems": 1,
"maxItems": 20,
"items": {
"$ref": "#/components/schemas/TokenComparisonReference"
}
},
"fiat": {
"type": "string",
"enum": [
"usd"
],
"default": "usd"
}
}
}
TokenComparisonReference
{
"type": "object",
"additionalProperties": false,
"required": [
"network",
"tokenId"
],
"properties": {
"network": {
"type": "string",
"minLength": 1,
"maxLength": 64
},
"tokenId": {
"type": "string",
"minLength": 1,
"maxLength": 200
}
}
}
TokenComparisonMetric
{
"type": "object",
"required": [
"value",
"asOf",
"source",
"status"
],
"properties": {
"value": {
"type": "number",
"format": "double",
"nullable": true
},
"asOf": {
"type": "string",
"format": "date-time",
"nullable": true
},
"source": {
"type": "string",
"nullable": true
},
"status": {
"type": "string",
"enum": [
"available",
"stale",
"unavailable",
"unsupported",
"error"
]
}
}
}
TokenComparisonItem
{
"type": "object",
"required": [
"network",
"tokenId",
"identity",
"metrics",
"changes",
"liquidityQuality",
"derived",
"ranks",
"warnings"
],
"properties": {
"network": {
"type": "string"
},
"tokenId": {
"type": "string",
"description": "Canonical token identifier."
},
"identity": {
"type": "object",
"required": [
"symbol",
"name",
"logoMediaKey",
"marketId"
],
"properties": {
"symbol": {
"type": "string",
"nullable": true
},
"name": {
"type": "string",
"nullable": true
},
"logoMediaKey": {
"type": "string",
"nullable": true
},
"marketId": {
"type": "string",
"nullable": true
}
}
},
"metrics": {
"type": "object",
"required": [
"priceUsd",
"marketCapUsd",
"volume24hUsd",
"liquidityUsd"
],
"properties": {
"priceUsd": {
"$ref": "#/components/schemas/TokenComparisonMetric"
},
"marketCapUsd": {
"$ref": "#/components/schemas/TokenComparisonMetric"
},
"volume24hUsd": {
"$ref": "#/components/schemas/TokenComparisonMetric"
},
"liquidityUsd": {
"$ref": "#/components/schemas/TokenComparisonMetric"
}
}
},
"changes": {
"type": "object",
"required": [
"price1hPct",
"price24hPct",
"price7dPct",
"price30dPct"
],
"properties": {
"price1hPct": {
"type": "number",
"nullable": true
},
"price24hPct": {
"type": "number",
"nullable": true
},
"price7dPct": {
"type": "number",
"nullable": true
},
"price30dPct": {
"type": "number",
"nullable": true
}
}
},
"liquidityQuality": {
"type": "object",
"required": [
"spreadPct",
"topPoolShare",
"poolCount"
],
"properties": {
"spreadPct": {
"type": "number",
"nullable": true
},
"topPoolShare": {
"type": "number",
"nullable": true
},
"poolCount": {
"type": "integer",
"nullable": true
}
}
},
"derived": {
"type": "object",
"required": [
"turnoverPct",
"liquidityToMarketCapPct",
"volumeToLiquidityRatio"
],
"properties": {
"turnoverPct": {
"type": "number",
"nullable": true
},
"liquidityToMarketCapPct": {
"type": "number",
"nullable": true
},
"volumeToLiquidityRatio": {
"type": "number",
"nullable": true
}
}
},
"ranks": {
"type": "object",
"required": [
"marketCap",
"volume24h",
"liquidity"
],
"properties": {
"marketCap": {
"type": "integer",
"nullable": true,
"minimum": 1
},
"volume24h": {
"type": "integer",
"nullable": true,
"minimum": 1
},
"liquidity": {
"type": "integer",
"nullable": true,
"minimum": 1
}
}
},
"warnings": {
"type": "array",
"items": {
"type": "string"
}
}
}
}
TokenComparisonError
{
"type": "object",
"required": [
"inputIndex",
"network",
"tokenId",
"code"
],
"properties": {
"inputIndex": {
"type": "integer",
"minimum": 0
},
"network": {
"type": "string"
},
"tokenId": {
"type": "string"
},
"code": {
"type": "string",
"enum": [
"INVALID_TOKEN",
"DUPLICATE_TOKEN"
]
}
}
}
TokenComparisonResponse
{
"type": "object",
"required": [
"fiat",
"computedAt",
"items",
"errors"
],
"properties": {
"fiat": {
"type": "string",
"enum": [
"usd"
]
},
"computedAt": {
"type": "string",
"format": "date-time"
},
"items": {
"type": "array",
"maxItems": 20,
"items": {
"$ref": "#/components/schemas/TokenComparisonItem"
}
},
"errors": {
"type": "array",
"items": {
"$ref": "#/components/schemas/TokenComparisonError"
}
}
}
}
TokenQuote
{
"type": "object",
"required": [
"priceUsd",
"change24hPct",
"source",
"asOf"
],
"description": "The one price a header should show, with the source that won.",
"properties": {
"priceUsd": {
"type": "number"
},
"change24hPct": {
"type": "number",
"nullable": true
},
"source": {
"type": "string",
"enum": [
"market",
"spot",
"dex"
]
},
"asOf": {
"type": "string",
"format": "date-time",
"nullable": true
}
}
}
TokenMarketView
{
"type": "object",
"description": "Market figures in the app's vocabulary. Every field is nullable; null means unknown, never zero.",
"required": [
"symbol",
"name",
"priceUsd",
"change1hPct",
"change24hPct",
"change7dPct",
"change14dPct",
"change30dPct",
"change200dPct",
"change1yPct",
"marketCapUsd",
"marketCapRank",
"fdvUsd",
"volume24hUsd",
"high24hUsd",
"low24hUsd",
"circulatingSupply",
"totalSupply",
"maxSupply",
"athUsd",
"athAt",
"athChangePct",
"atlUsd",
"atlAt",
"atlChangePct",
"sparkline7d"
],
"properties": {
"symbol": {
"type": "string",
"nullable": true
},
"name": {
"type": "string",
"nullable": true
},
"priceUsd": {
"type": "number",
"nullable": true
},
"change1hPct": {
"type": "number",
"nullable": true
},
"change24hPct": {
"type": "number",
"nullable": true
},
"change7dPct": {
"type": "number",
"nullable": true
},
"change14dPct": {
"type": "number",
"nullable": true
},
"change30dPct": {
"type": "number",
"nullable": true
},
"change200dPct": {
"type": "number",
"nullable": true
},
"change1yPct": {
"type": "number",
"nullable": true
},
"marketCapUsd": {
"type": "number",
"nullable": true
},
"marketCapRank": {
"type": "integer",
"nullable": true
},
"fdvUsd": {
"type": "number",
"nullable": true
},
"volume24hUsd": {
"type": "number",
"nullable": true
},
"high24hUsd": {
"type": "number",
"nullable": true
},
"low24hUsd": {
"type": "number",
"nullable": true
},
"circulatingSupply": {
"type": "number",
"nullable": true
},
"totalSupply": {
"type": "number",
"nullable": true
},
"maxSupply": {
"type": "number",
"nullable": true
},
"athUsd": {
"type": "number",
"nullable": true
},
"athAt": {
"type": "string",
"format": "date-time",
"nullable": true
},
"athChangePct": {
"type": "number",
"nullable": true
},
"atlUsd": {
"type": "number",
"nullable": true
},
"atlAt": {
"type": "string",
"format": "date-time",
"nullable": true
},
"atlChangePct": {
"type": "number",
"nullable": true
},
"sparkline7d": {
"type": "array",
"description": "Oldest → newest closes over the last 7 days; empty when unknown. Capped at 400 points.",
"items": {
"type": "number"
}
}
}
}
TokenProfileView
{
"type": "object",
"required": [
"description",
"categories",
"links",
"marketsCount",
"sentimentUpPct",
"logoMediaKey"
],
"properties": {
"description": {
"type": "string",
"nullable": true
},
"categories": {
"type": "array",
"items": {
"type": "string"
}
},
"links": {
"type": "array",
"description": "Labelled pairs, so a new link kind needs no client change to render.",
"items": {
"type": "object",
"required": [
"label",
"url"
],
"properties": {
"label": {
"type": "string"
},
"url": {
"type": "string"
}
}
}
},
"marketsCount": {
"type": "integer",
"nullable": true
},
"sentimentUpPct": {
"type": "number",
"nullable": true
},
"logoMediaKey": {
"type": "string",
"nullable": true,
"pattern": "^[0-9a-f]{32}$"
}
}
}
TokenInsightSection
{
"type": "object",
"description": "One chain-native panel. Deliberately presentational — label/value rows\nrather than typed fields — because each family knows different things\n(Stellar issuer flags, Solana list verification), and forcing them into a\ncommon shape would mean dropping whatever didn't fit.\n",
"required": [
"title",
"summary",
"ok",
"rows"
],
"properties": {
"title": {
"type": "string",
"example": "Issuer controls"
},
"summary": {
"type": "string",
"description": "One line for the collapsed state.",
"example": "clawback enabled · can be frozen · approval required"
},
"ok": {
"type": "boolean",
"description": "False when the chain was read but had no record of this token."
},
"rows": {
"type": "array",
"items": {
"type": "object",
"required": [
"label",
"value"
],
"properties": {
"label": {
"type": "string",
"example": "Can claw back"
},
"value": {
"type": "string",
"example": "Yes"
},
"sentiment": {
"type": "string",
"enum": [
"good",
"caution",
"bad"
],
"description": "How to colour the value. Absent means neutral — a fact with no verdict."
}
}
}
}
}
}
TokenSeries
{
"type": "object",
"required": [
"interval",
"points",
"volumes",
"window"
],
"properties": {
"interval": {
"type": "string",
"enum": [
"1h",
"1d"
]
},
"points": {
"type": "array",
"description": "`[epochSeconds, close]`, oldest → newest.",
"items": {
"type": "array",
"items": {
"type": "number"
},
"minItems": 2,
"maxItems": 2
}
},
"volumes": {
"type": "array",
"description": "Parallel `[epochSeconds, volume]`; empty means unknown, not zero.",
"items": {
"type": "array",
"items": {
"type": "number"
},
"minItems": 2,
"maxItems": 2
}
},
"window": {
"type": "object",
"required": [
"from",
"to",
"days"
],
"properties": {
"from": {
"type": "integer",
"nullable": true
},
"to": {
"type": "integer",
"nullable": true
},
"days": {
"type": "integer"
}
}
}
}
}
Token360
{
"type": "object",
"required": [
"network",
"tokenId",
"meta",
"market",
"profile",
"liquidity",
"holders",
"safety",
"errors",
"cache"
],
"properties": {
"network": {
"type": "string"
},
"tokenId": {
"type": "string"
},
"meta": {
"type": "object",
"nullable": true,
"additionalProperties": true
},
"market": {
"type": "object",
"nullable": true,
"additionalProperties": true
},
"profile": {
"type": "object",
"nullable": true,
"additionalProperties": true
},
"liquidity": {
"type": "object",
"nullable": true,
"additionalProperties": true
},
"holders": {
"type": "object",
"nullable": true,
"required": [
"count",
"floor"
],
"properties": {
"count": {
"type": "integer",
"minimum": 0
},
"floor": {
"type": "boolean"
}
}
},
"safety": {
"$ref": "#/components/schemas/TokenSafety"
},
"errors": {
"type": "object",
"additionalProperties": {
"type": "string"
}
},
"cache": {
"type": "object",
"required": [
"market",
"profile",
"liquidity",
"holders"
],
"properties": {
"market": {
"$ref": "#/components/schemas/CacheInfo"
},
"profile": {
"$ref": "#/components/schemas/CacheInfo"
},
"liquidity": {
"$ref": "#/components/schemas/CacheInfo"
},
"holders": {
"$ref": "#/components/schemas/CacheInfo"
}
}
}
}
}
TokenSearchItem
{
"type": "object",
"required": [
"network",
"tokenId",
"address",
"symbol",
"name",
"decimals",
"verified",
"holderCount",
"logoMediaKey"
],
"properties": {
"network": {
"type": "string"
},
"tokenId": {
"type": "string"
},
"address": {
"type": "string"
},
"symbol": {
"type": "string"
},
"name": {
"type": "string"
},
"decimals": {
"type": "integer",
"minimum": 0
},
"verified": {
"type": "boolean"
},
"holderCount": {
"type": "integer",
"minimum": 0,
"nullable": true
},
"logoMediaKey": {
"type": "string",
"nullable": true,
"pattern": "^[0-9a-f]{32}$"
}
}
}
TokenSearchResponse
{
"type": "object",
"required": [
"items",
"cache"
],
"properties": {
"items": {
"type": "array",
"maxItems": 20,
"items": {
"$ref": "#/components/schemas/TokenSearchItem"
}
},
"cache": {
"$ref": "#/components/schemas/CacheInfo"
}
}
}
IntelligenceMessage
{
"type": "object",
"required": [
"id",
"role",
"body",
"createdAt"
],
"properties": {
"id": {
"type": "string"
},
"role": {
"type": "string",
"description": "Author of the message, e.g. `user`."
},
"body": {
"type": "string"
},
"createdAt": {
"type": "string",
"format": "date-time"
}
}
}
TokenMarketsResponse
{
"type": "object",
"required": [
"markets",
"pending",
"cache"
],
"properties": {
"pending": {
"type": "array",
"description": "Requested ids with no cached row whose fetch failed this time. Not \"unlisted\" — retry later.",
"items": {
"type": "string"
}
},
"markets": {
"type": "array",
"items": {
"allOf": [
{
"$ref": "#/components/schemas/TokenMarketView"
},
{
"type": "object",
"description": "Provider-independent market row enriched with a Fortis media-proxy key.",
"required": [
"id",
"logoMediaKey"
],
"properties": {
"id": {
"type": "string"
},
"logoMediaKey": {
"type": "string",
"nullable": true,
"pattern": "^[0-9a-f]{32}$"
}
}
}
]
}
},
"cache": {
"$ref": "#/components/schemas/CacheInfo"
}
}
}
OhlcPoint
{
"type": "array",
"description": "`[unixTimestampMilliseconds, open, high, low, close]`.",
"minItems": 5,
"maxItems": 5,
"items": {
"type": "number",
"format": "double"
}
}
OhlcResponse
{
"type": "object",
"required": [
"points",
"cache"
],
"properties": {
"points": {
"type": "array",
"items": {
"$ref": "#/components/schemas/OhlcPoint"
}
},
"cache": {
"$ref": "#/components/schemas/CacheInfo"
}
}
}
ProviderEnvelope
{
"type": "object",
"required": [
"payload",
"cache"
],
"properties": {
"payload": {
"description": "Provider-compatible JSON constrained and sanitized by the server adapter.",
"nullable": true
},
"cache": {
"$ref": "#/components/schemas/CacheInfo"
}
}
}
CrossChainProvider
{
"type": "object",
"required": [
"id",
"name",
"websiteUrl",
"configured",
"custody",
"capabilities"
],
"additionalProperties": false,
"properties": {
"id": {
"type": "string",
"pattern": "^[a-z][a-z0-9-]{0,31}$"
},
"name": {
"type": "string"
},
"websiteUrl": {
"type": "string",
"format": "uri"
},
"configured": {
"type": "boolean"
},
"custody": {
"type": "string",
"enum": [
"non-custodial",
"custodial",
"mixed",
"unknown"
]
},
"capabilities": {
"type": "object",
"required": [
"quote",
"execution",
"status"
],
"additionalProperties": false,
"properties": {
"quote": {
"type": "boolean"
},
"execution": {
"type": "boolean"
},
"status": {
"type": "boolean"
}
}
}
}
}
CrossChainEndpoint
{
"type": "object",
"required": [
"chainId",
"token",
"decimals",
"address"
],
"additionalProperties": false,
"properties": {
"chainId": {
"type": "string",
"pattern": "^[A-Za-z0-9][A-Za-z0-9._:-]{0,63}$",
"description": "Fortis routing key; decimal EIP-155 id on EVM networks. Provider adapters translate non-EVM keys."
},
"token": {
"type": "string",
"minLength": 1,
"maxLength": 256
},
"decimals": {
"type": "integer",
"minimum": 0,
"maximum": 36
},
"address": {
"type": "string",
"minLength": 1,
"maxLength": 256
}
}
}
CrossChainQuoteRequest
{
"type": "object",
"required": [
"from",
"to",
"amountIn"
],
"additionalProperties": false,
"properties": {
"from": {
"$ref": "#/components/schemas/CrossChainEndpoint"
},
"to": {
"$ref": "#/components/schemas/CrossChainEndpoint"
},
"amountIn": {
"type": "string",
"pattern": "^[1-9]\\d{0,79}$",
"description": "Exact source amount in the token's smallest unit."
},
"slippageBps": {
"type": "integer",
"minimum": 0,
"maximum": 5000,
"default": 50
},
"providers": {
"type": "array",
"minItems": 1,
"maxItems": 10,
"uniqueItems": true,
"items": {
"type": "string",
"pattern": "^[a-z][a-z0-9-]{0,31}$"
}
}
}
}
CrossChainStep
{
"type": "object",
"required": [
"kind",
"tool",
"fromChainId",
"toChainId",
"fromToken",
"toToken"
],
"additionalProperties": false,
"properties": {
"kind": {
"type": "string",
"enum": [
"swap",
"bridge",
"fee",
"protocol",
"other"
]
},
"tool": {
"type": "string"
},
"fromChainId": {
"type": "string",
"nullable": true
},
"toChainId": {
"type": "string",
"nullable": true
},
"fromToken": {
"type": "string",
"nullable": true
},
"toToken": {
"type": "string",
"nullable": true
}
}
}
CrossChainExecution
{
"type": "object",
"required": [
"kind",
"to",
"data",
"value",
"gasLimit",
"approvalAddress"
],
"additionalProperties": false,
"properties": {
"kind": {
"type": "string",
"enum": [
"evm-calldata",
"utxo-psbt",
"serialized-transaction",
"deposit",
"unknown"
]
},
"to": {
"type": "string",
"nullable": true
},
"data": {
"type": "string",
"nullable": true
},
"value": {
"type": "string",
"nullable": true
},
"gasLimit": {
"type": "string",
"nullable": true
},
"approvalAddress": {
"type": "string",
"nullable": true
}
}
}
CrossChainRoute
{
"type": "object",
"required": [
"id",
"rank",
"providerId",
"providerName",
"providerUrl",
"providerQuoteId",
"bridgeId",
"bridge",
"bridgeUrl",
"riskKey",
"custody",
"amountIn",
"amountOut",
"amountOutMin",
"decimalsIn",
"decimalsOut",
"feeUsd",
"sourceNetworkFee",
"etaSeconds",
"quotedAt",
"expiresAt",
"steps",
"execution"
],
"additionalProperties": false,
"properties": {
"id": {
"type": "string"
},
"rank": {
"type": "integer",
"minimum": 1
},
"providerId": {
"type": "string"
},
"providerName": {
"type": "string"
},
"providerUrl": {
"type": "string",
"format": "uri"
},
"providerQuoteId": {
"type": "string",
"nullable": true
},
"bridgeId": {
"type": "string",
"nullable": true,
"description": "Exact provider bridge/tool identifier used for status lookup; distinct from the display name."
},
"bridge": {
"type": "string"
},
"bridgeUrl": {
"type": "string",
"format": "uri",
"nullable": true,
"description": "Trusted official bridge website from the Fortis bridge directory; null when not verified."
},
"riskKey": {
"type": "string",
"description": "Settlement dependency key; equal values are not independent routes."
},
"custody": {
"type": "string",
"enum": [
"non-custodial",
"custodial",
"mixed",
"unknown"
]
},
"amountIn": {
"type": "string",
"pattern": "^\\d+$"
},
"amountOut": {
"type": "string",
"pattern": "^\\d+$"
},
"amountOutMin": {
"type": "string",
"pattern": "^\\d+$"
},
"decimalsIn": {
"type": "integer",
"minimum": 0,
"maximum": 36
},
"decimalsOut": {
"type": "integer",
"minimum": 0,
"maximum": 36
},
"feeUsd": {
"type": "number",
"format": "double",
"nullable": true
},
"sourceNetworkFee": {
"type": "string",
"pattern": "^\\d+$",
"nullable": true
},
"etaSeconds": {
"type": "integer",
"minimum": 0,
"nullable": true
},
"quotedAt": {
"type": "string",
"format": "date-time"
},
"expiresAt": {
"type": "string",
"format": "date-time"
},
"steps": {
"type": "array",
"items": {
"$ref": "#/components/schemas/CrossChainStep"
}
},
"execution": {
"$ref": "#/components/schemas/CrossChainExecution"
}
}
}
CrossChainProviderAttempt
{
"type": "object",
"required": [
"providerId",
"status",
"routeCount"
],
"additionalProperties": false,
"properties": {
"providerId": {
"type": "string"
},
"status": {
"type": "string",
"enum": [
"quoted",
"no-route",
"not-configured",
"failed"
]
},
"routeCount": {
"type": "integer",
"minimum": 0
}
}
}
CrossChainQuoteResponse
{
"type": "object",
"required": [
"routes",
"bestRouteId",
"attempts",
"cache"
],
"additionalProperties": false,
"properties": {
"routes": {
"type": "array",
"maxItems": 5,
"items": {
"$ref": "#/components/schemas/CrossChainRoute"
}
},
"bestRouteId": {
"type": "string",
"nullable": true
},
"attempts": {
"type": "array",
"items": {
"$ref": "#/components/schemas/CrossChainProviderAttempt"
}
},
"cache": {
"$ref": "#/components/schemas/CacheInfo"
}
}
}
CrossChainStatusRequest
{
"type": "object",
"required": [
"providerId",
"txHash",
"fromChainId",
"toChainId"
],
"additionalProperties": false,
"properties": {
"providerId": {
"type": "string",
"pattern": "^[a-z][a-z0-9-]{0,31}$"
},
"txHash": {
"type": "string",
"minLength": 1,
"maxLength": 256
},
"fromChainId": {
"type": "string",
"pattern": "^[A-Za-z0-9][A-Za-z0-9._:-]{0,63}$"
},
"toChainId": {
"type": "string",
"pattern": "^[A-Za-z0-9][A-Za-z0-9._:-]{0,63}$"
},
"providerQuoteId": {
"type": "string",
"minLength": 1,
"maxLength": 256
},
"bridgeId": {
"type": "string",
"minLength": 1,
"maxLength": 256,
"description": "Exact bridge/tool identifier returned with the selected route."
},
"bridge": {
"type": "string",
"minLength": 1,
"maxLength": 256,
"deprecated": true,
"description": "Legacy display-name field; accepted and ignored for compatibility."
}
}
}
CrossChainStatus
{
"type": "object",
"required": [
"providerId",
"state",
"substatus",
"message",
"sourceHash",
"destinationHash",
"providerExplorerUrl",
"bridgeExplorerUrl",
"elapsedSeconds",
"actualReceived",
"progress",
"recovery",
"providerData"
],
"additionalProperties": false,
"properties": {
"providerId": {
"type": "string"
},
"state": {
"type": "string",
"enum": [
"not-found",
"pending",
"completed",
"partial",
"refunded",
"failed",
"needs-action"
]
},
"substatus": {
"type": "string",
"nullable": true
},
"message": {
"type": "string",
"nullable": true
},
"sourceHash": {
"type": "string"
},
"destinationHash": {
"type": "string",
"nullable": true
},
"providerExplorerUrl": {
"type": "string",
"format": "uri",
"nullable": true
},
"bridgeExplorerUrl": {
"type": "string",
"format": "uri",
"nullable": true
},
"elapsedSeconds": {
"type": "integer",
"minimum": 0,
"nullable": true
},
"actualReceived": {
"nullable": true,
"allOf": [
{
"$ref": "#/components/schemas/CrossChainReceivedAsset"
}
]
},
"progress": {
"type": "array",
"maxItems": 32,
"items": {
"$ref": "#/components/schemas/CrossChainProgressStep"
}
},
"recovery": {
"nullable": true,
"allOf": [
{
"$ref": "#/components/schemas/CrossChainRecovery"
}
]
},
"providerData": {
"type": "object",
"description": "Bounded latest upstream status response retained for support diagnostics.",
"additionalProperties": true
}
}
}
CrossChainReceivedAsset
{
"type": "object",
"required": [
"chainId",
"amount",
"tokenAddress",
"symbol",
"decimals"
],
"additionalProperties": false,
"properties": {
"chainId": {
"type": "string",
"nullable": true
},
"amount": {
"type": "string",
"pattern": "^\\d+$"
},
"tokenAddress": {
"type": "string",
"nullable": true
},
"symbol": {
"type": "string",
"nullable": true
},
"decimals": {
"type": "integer",
"minimum": 0,
"maximum": 36,
"nullable": true
}
}
}
CrossChainProgressStep
{
"type": "object",
"required": [
"id",
"kind",
"label",
"state",
"chainId",
"txHash",
"explorerUrl",
"startedAt",
"completedAt",
"durationSeconds",
"timingSource",
"detail",
"errorCode",
"errorMessage"
],
"additionalProperties": false,
"properties": {
"id": {
"type": "string"
},
"kind": {
"type": "string",
"enum": [
"source",
"bridge",
"destination",
"refund"
]
},
"label": {
"type": "string"
},
"state": {
"type": "string",
"enum": [
"not-started",
"pending",
"finalizing",
"completed",
"failed",
"refunded",
"needs-action"
]
},
"chainId": {
"type": "string",
"nullable": true
},
"txHash": {
"type": "string",
"nullable": true
},
"explorerUrl": {
"type": "string",
"format": "uri",
"nullable": true
},
"startedAt": {
"type": "string",
"format": "date-time",
"nullable": true
},
"completedAt": {
"type": "string",
"format": "date-time",
"nullable": true
},
"durationSeconds": {
"type": "integer",
"minimum": 0,
"nullable": true
},
"timingSource": {
"type": "string",
"enum": [
"provider",
"inferred",
"wallet-observed"
],
"nullable": true
},
"detail": {
"type": "string",
"nullable": true
},
"errorCode": {
"type": "string",
"nullable": true
},
"errorMessage": {
"type": "string",
"nullable": true
}
}
}
CrossChainRecovery
{
"type": "object",
"required": [
"kind",
"title",
"description",
"actionLabel",
"actionUrl"
],
"additionalProperties": false,
"properties": {
"kind": {
"type": "string",
"enum": [
"wait",
"add-gas",
"track-refund",
"swap-received-asset",
"contact-support"
]
},
"title": {
"type": "string"
},
"description": {
"type": "string"
},
"actionLabel": {
"type": "string",
"nullable": true
},
"actionUrl": {
"type": "string",
"format": "uri",
"nullable": true
}
}
}
ResourceRange
{
"type": "object",
"description": "Min, average and max of the samples taken within one minute.",
"required": [
"min",
"avg",
"max",
"samples"
],
"properties": {
"min": {
"type": "number"
},
"avg": {
"type": "number"
},
"max": {
"type": "number"
},
"samples": {
"type": "integer"
}
}
}