{"openapi":"3.1.0","info":{"title":"Hub-Equity API","description":"**Hub-Equity** turns raw regulatory filings into one standardized financial\ndataset. Every figure is extracted from official **XBRL / iXBRL** filings —\n**SEC EDGAR** (US) and **ESEF** (Europe) — normalized onto a common concept\ncatalog, and served with provenance back to the source filing.\n\nThis is the public REST API. It is API-first: the same endpoints power the\nHub-Equity web app.\n\n## Base URL\n\n```\nhttps://api.hub-equity.com\n```\n\nAll paths below are relative to this host, and every response is JSON.\n\n## Authentication\n\nSend a bearer token in the `Authorization` header:\n\n```\nAuthorization: Bearer hubq_live_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx\n```\n\nTwo modes are accepted:\n\n| Mode | Header | Who |\n|---|---|---|\n| **API key** | `Bearer hubq_live_…` or `hubq_test_…` | Programmatic clients |\n| **Session (JWT)** | `Bearer <session JWT>` | The Hub-Equity web app |\n\n**A key is required.** A call without one answers `401 AUTH_REQUIRED`. A Free\nkey opens the read endpoints; a handful of premium endpoints (see *Premium\nendpoints* below) require a key carrying the `facts.premium` scope.\n\nCreate and manage keys at\n[hub-equity.com/settings/api-keys](https://hub-equity.com/settings/api-keys)\nor via the **API Keys** endpoints. A key's full value (`hubq_…`) is shown\n**once**, at creation — store it in a secret manager; it can only be revoked,\nnever re-read.\n\n## Rate limits\n\nRequests are bucketed per API key or per user (JWT):\n\n| Caller | Per minute |\n|---|---|\n| Signed-in user (browser session) | 120 |\n| Free API key (`hubq_…`) | 120 |\n| Builder API key | 300 |\n| Team API key | 600 |\n| Enterprise API key | 1 000 |\n\nThe bucket is per API key, and only an API key is tiered by plan. A **browser\nsession gets 120/minute on every plan**. An unrecognised plan resolves to\n120/minute, never lower.\n\nA few endpoints carry their own, tighter ceiling that applies to every caller\nincluding authenticated ones: the deliverables endpoints sit at 20 to 30/minute,\nthe export and webhook endpoints at 5 to 60/minute, and the chat endpoints at 3\nto 10/minute plus a separate daily quota returned in their own response body.\n\nExceeding a bucket returns `429 RATE_LIMIT_EXCEEDED`. Volume allowances are\ncounted per workspace on API keys (Free 200 calls a day and 5 000 a month,\nBuilder 50 000 a month, Team 500 000 a month, Enterprise unlimited) and refuse\nwith `429 DAILY_QUOTA_EXCEEDED` or `MONTHLY_QUOTA_EXCEEDED`, `X-Quota-*`\nheaders included.\n\n## Response envelope\n\nSuccessful responses share one shape:\n\n```json\n{\n  \"success\": true,\n  \"data\": { },\n  \"meta\": {\n    \"timestamp\": \"2026-07-03T12:34:56Z\",\n    \"request_id\": \"abc123def456\",\n    \"page\": 1, \"per_page\": 50, \"total\": 4428\n  },\n  \"links\": {\n    \"self\": \"/api/v1/entities?page=1\",\n    \"next\": \"/api/v1/entities?page=2\",\n    \"prev\": null\n  }\n}\n```\n\n`meta.page` / `per_page` / `total` and the `links.*` cursors are present on\ncollection endpoints and absent on single-resource endpoints.\n`meta.request_id` echoes the `X-Request-ID` request header for log correlation.\n\n## Pagination\n\nCollection endpoints accept `?page=1&per_page=50` (1-based; `per_page` capped at\n200). The response `links.next` / `links.prev` carry ready-to-follow URLs — walk\nthem until `next` is `null`. The legacy `?offset=&limit=` form still works; when\nboth are supplied, `page` / `per_page` win.\n\n## Errors\n\nEvery error uses the same envelope, with a **stable, machine-readable**\n`error.code`:\n\n```json\n{\n  \"success\": false,\n  \"error\": {\n    \"code\": \"ENTITY_NOT_FOUND\",\n    \"message\": \"No entity found for identifier 'XYZ'\",\n    \"details\": null\n  },\n  \"meta\": { \"request_id\": \"abc123def456\" }\n}\n```\n\n`error.code` is stable across releases — safe to branch on. `error.message` is\nhuman-readable and may change for clarity, so don't string-match it.\n\n| Code | HTTP | Meaning |\n|---|---|---|\n| `AUTH_REQUIRED` | 401 | No key sent, or the endpoint requires a paid key |\n| `SCOPE_MISSING` | 403 | Key lacks the required scope (e.g. `facts.premium`); `details` carries `required_scope` + `your_scopes` |\n| `ENTITY_NOT_FOUND` | 404 | Unknown entity UUID / ticker |\n| `ENTITY_AMBIGUOUS` | 409 | Ticker maps to several issuers — disambiguate with a `.MIC` suffix |\n| `FILING_NOT_FOUND` | 404 | Unknown filing id |\n| `CONCEPT_NOT_FOUND` | 404 | Unknown hub concept code |\n| `VALIDATION_ERROR` | 422 | Bad query/body — `details.errors` lists the offending fields |\n| `RATE_LIMIT_EXCEEDED` | 429 | Rate-limit bucket exhausted |\n| `INTERNAL_ERROR` | 500 | Unexpected server error |\n\n## Premium endpoints\n\nTwelve endpoints require the `facts.premium` scope (Builder, Team,\nEnterprise): **`POST /compare`**, **`GET /filings/{id}/calculation-tree`**,\n**`GET /filings/{id}/viewer-rows`**, **`GET /entities/{id}/dimensions`**,\n**`GET /entities/{id}/financials/intersections`**,\n**`GET /entities/{id}/restatements/diff`**,\nthe point-in-time **`GET /entities/{id}/financials/as-of`**,\n**`POST /entities/{id}/concept-time-series`**,\n**`GET /entities/{id}/validation-results`**,\n**`GET /filings/{id}/validation-results`**, **`GET /entities/{id}/extension-concepts`**\nand **`GET /entities/{id}/compare-filings`**. Free keys\nreceive `403 SCOPE_MISSING` with an upgrade hint; a web-app session (JWT)\nfollows its workspace's plan.\n\n## Conventions\n\n- **Entity identifiers** accept either the internal UUID or a ticker (`AAPL`),\n  optionally suffixed with the market MIC (`AAPL.XNAS`) to disambiguate.\n- **Concept codes** are Hub concept codes (e.g. `REVENUE`, `NET_INCOME`) —\n  browse them under **Concepts**.\n- **Dates** are ISO 8601 (`YYYY-MM-DD`); timestamps are UTC (suffixed `Z`).\n- **Currencies** are ISO 4217 (`USD`, `EUR`, …).\n\n## Interactive docs\n\n- Swagger UI — [`/docs`](/docs)\n- ReDoc — [`/redoc`](/redoc)\n- OpenAPI spec — [`/openapi.json`](/openapi.json)\n\nBy using the API you agree to the\n[API Terms of Service](https://hub-equity.com/legal/api-terms).","termsOfService":"https://hub-equity.com/legal/api-terms","contact":{"name":"Hub-Equity","url":"https://hub-equity.com/"},"license":{"name":"API Terms of Service","url":"https://hub-equity.com/legal/api-terms"},"version":"1.0"},"servers":[{"url":"https://api.hub-equity.com","description":"Production"}],"paths":{"/health/live":{"get":{"tags":["Health"],"summary":"Health Check Live","description":"Liveness probe — always 200 while the process can serve traffic.","operationId":"health_check_live_health_live_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"x-codeSamples":[{"lang":"curl","label":"curl","source":"curl \"https://api.hub-equity.com/health/live\" \\\n  -H \"Authorization: Bearer $HUBEQ_API_KEY\""},{"lang":"Python","label":"Python","source":"import httpx\n\nheaders = {\"Authorization\": \"Bearer $HUBEQ_API_KEY\"}\nresp = httpx.get(\n    \"https://api.hub-equity.com/health/live\",\n    headers=headers,\n)\nresp.raise_for_status()\ndata = resp.json()[\"data\"]  # every response is wrapped in an envelope"}],"x-code-samples":[{"lang":"curl","label":"curl","source":"curl \"https://api.hub-equity.com/health/live\" \\\n  -H \"Authorization: Bearer $HUBEQ_API_KEY\""},{"lang":"Python","label":"Python","source":"import httpx\n\nheaders = {\"Authorization\": \"Bearer $HUBEQ_API_KEY\"}\nresp = httpx.get(\n    \"https://api.hub-equity.com/health/live\",\n    headers=headers,\n)\nresp.raise_for_status()\ndata = resp.json()[\"data\"]  # every response is wrapped in an envelope"}]}},"/health":{"get":{"tags":["Health"],"summary":"Health Check Live","description":"Liveness probe — always 200 while the process can serve traffic.","operationId":"health_check_live_health_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"x-codeSamples":[{"lang":"curl","label":"curl","source":"curl \"https://api.hub-equity.com/health\" \\\n  -H \"Authorization: Bearer $HUBEQ_API_KEY\""},{"lang":"Python","label":"Python","source":"import httpx\n\nheaders = {\"Authorization\": \"Bearer $HUBEQ_API_KEY\"}\nresp = httpx.get(\n    \"https://api.hub-equity.com/health\",\n    headers=headers,\n)\nresp.raise_for_status()\ndata = resp.json()[\"data\"]  # every response is wrapped in an envelope"}],"x-code-samples":[{"lang":"curl","label":"curl","source":"curl \"https://api.hub-equity.com/health\" \\\n  -H \"Authorization: Bearer $HUBEQ_API_KEY\""},{"lang":"Python","label":"Python","source":"import httpx\n\nheaders = {\"Authorization\": \"Bearer $HUBEQ_API_KEY\"}\nresp = httpx.get(\n    \"https://api.hub-equity.com/health\",\n    headers=headers,\n)\nresp.raise_for_status()\ndata = resp.json()[\"data\"]  # every response is wrapped in an envelope"}]}},"/health/ready":{"get":{"tags":["Health"],"summary":"Health Check Ready","description":"Readiness probe: verifies that the database and the cache (when\nconfigured) are reachable. Returns 503 with per-dependency status when\nnot.","operationId":"health_check_ready_health_ready_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"x-codeSamples":[{"lang":"curl","label":"curl","source":"curl \"https://api.hub-equity.com/health/ready\" \\\n  -H \"Authorization: Bearer $HUBEQ_API_KEY\""},{"lang":"Python","label":"Python","source":"import httpx\n\nheaders = {\"Authorization\": \"Bearer $HUBEQ_API_KEY\"}\nresp = httpx.get(\n    \"https://api.hub-equity.com/health/ready\",\n    headers=headers,\n)\nresp.raise_for_status()\ndata = resp.json()[\"data\"]  # every response is wrapped in an envelope"}],"x-code-samples":[{"lang":"curl","label":"curl","source":"curl \"https://api.hub-equity.com/health/ready\" \\\n  -H \"Authorization: Bearer $HUBEQ_API_KEY\""},{"lang":"Python","label":"Python","source":"import httpx\n\nheaders = {\"Authorization\": \"Bearer $HUBEQ_API_KEY\"}\nresp = httpx.get(\n    \"https://api.hub-equity.com/health/ready\",\n    headers=headers,\n)\nresp.raise_for_status()\ndata = resp.json()[\"data\"]  # every response is wrapped in an envelope"}]}},"/":{"get":{"tags":["Info"],"summary":"Root","description":"API information.","operationId":"root__get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"x-codeSamples":[{"lang":"curl","label":"curl","source":"curl \"https://api.hub-equity.com/\" \\\n  -H \"Authorization: Bearer $HUBEQ_API_KEY\""},{"lang":"Python","label":"Python","source":"import httpx\n\nheaders = {\"Authorization\": \"Bearer $HUBEQ_API_KEY\"}\nresp = httpx.get(\n    \"https://api.hub-equity.com/\",\n    headers=headers,\n)\nresp.raise_for_status()\ndata = resp.json()[\"data\"]  # every response is wrapped in an envelope"}],"x-code-samples":[{"lang":"curl","label":"curl","source":"curl \"https://api.hub-equity.com/\" \\\n  -H \"Authorization: Bearer $HUBEQ_API_KEY\""},{"lang":"Python","label":"Python","source":"import httpx\n\nheaders = {\"Authorization\": \"Bearer $HUBEQ_API_KEY\"}\nresp = httpx.get(\n    \"https://api.hub-equity.com/\",\n    headers=headers,\n)\nresp.raise_for_status()\ndata = resp.json()[\"data\"]  # every response is wrapped in an envelope"}]}},"/api/v1/dashboard/stats":{"get":{"tags":["Dashboard"],"summary":"Get dashboard statistics","description":"Retrieve KPIs and system activities for the dashboard.","operationId":"get_dashboard_stats_api_v1_dashboard_stats_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse_DashboardStats_"}}}}},"security":[{"HTTPBearer":[]}],"x-codeSamples":[{"lang":"curl","label":"curl","source":"curl \"https://api.hub-equity.com/api/v1/dashboard/stats\" \\\n  -H \"Authorization: Bearer $HUBEQ_API_KEY\""},{"lang":"Python","label":"Python","source":"import httpx\n\nheaders = {\"Authorization\": \"Bearer $HUBEQ_API_KEY\"}\nresp = httpx.get(\n    \"https://api.hub-equity.com/api/v1/dashboard/stats\",\n    headers=headers,\n)\nresp.raise_for_status()\ndata = resp.json()[\"data\"]  # every response is wrapped in an envelope"}],"x-code-samples":[{"lang":"curl","label":"curl","source":"curl \"https://api.hub-equity.com/api/v1/dashboard/stats\" \\\n  -H \"Authorization: Bearer $HUBEQ_API_KEY\""},{"lang":"Python","label":"Python","source":"import httpx\n\nheaders = {\"Authorization\": \"Bearer $HUBEQ_API_KEY\"}\nresp = httpx.get(\n    \"https://api.hub-equity.com/api/v1/dashboard/stats\",\n    headers=headers,\n)\nresp.raise_for_status()\ndata = resp.json()[\"data\"]  # every response is wrapped in an envelope"}]}},"/api/v1/dashboard/coverage":{"get":{"tags":["Dashboard"],"summary":"Aggregate dataset coverage snapshot","description":"Aggregate snapshot of the served corpus: entity / filing totals, filings by source, supported taxonomies, fiscal-year range, and entity counts for the countries covered in full. Useful to calibrate questions (e.g. don't expect FY2010 data if coverage starts in 2018).\n\nAggregate counts only. A Free key is enough; cached server-side (~1h).","operationId":"get_dataset_coverage_api_v1_dashboard_coverage_get","responses":{"200":{"description":"Dataset coverage snapshot.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse_DatasetCoverage_"}}}}},"security":[{"HTTPBearer":[]}],"x-codeSamples":[{"lang":"curl","label":"curl","source":"curl \"https://api.hub-equity.com/api/v1/dashboard/coverage\" \\\n  -H \"Authorization: Bearer $HUBEQ_API_KEY\""},{"lang":"Python","label":"Python","source":"import httpx\n\nheaders = {\"Authorization\": \"Bearer $HUBEQ_API_KEY\"}\nresp = httpx.get(\n    \"https://api.hub-equity.com/api/v1/dashboard/coverage\",\n    headers=headers,\n)\nresp.raise_for_status()\ndata = resp.json()[\"data\"]  # every response is wrapped in an envelope"}],"x-code-samples":[{"lang":"curl","label":"curl","source":"curl \"https://api.hub-equity.com/api/v1/dashboard/coverage\" \\\n  -H \"Authorization: Bearer $HUBEQ_API_KEY\""},{"lang":"Python","label":"Python","source":"import httpx\n\nheaders = {\"Authorization\": \"Bearer $HUBEQ_API_KEY\"}\nresp = httpx.get(\n    \"https://api.hub-equity.com/api/v1/dashboard/coverage\",\n    headers=headers,\n)\nresp.raise_for_status()\ndata = resp.json()[\"data\"]  # every response is wrapped in an envelope"}]}},"/api/v1/search":{"get":{"tags":["Search"],"summary":"Search entities","description":"Search for entities by name or ticker.","operationId":"search_entities_api_v1_search_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"q","in":"query","required":false,"schema":{"type":"string","description":"Search query (empty = list all)","default":"","title":"Q"},"description":"Search query (empty = list all)"},{"name":"page","in":"query","required":false,"schema":{"anyOf":[{"type":"integer","minimum":1},{"type":"null"}],"description":"Page number (1-based). Public pagination idiom; overrides offset.","title":"Page"},"description":"Page number (1-based). Public pagination idiom; overrides offset."},{"name":"per_page","in":"query","required":false,"schema":{"anyOf":[{"type":"integer","maximum":200,"minimum":1},{"type":"null"}],"description":"Results per page (1-200). Overrides limit.","title":"Per Page"},"description":"Results per page (1-200). Overrides limit."},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":200,"minimum":1,"description":"Legacy — maximum results per page","default":50,"title":"Limit"},"description":"Legacy — maximum results per page"},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","minimum":0,"description":"Legacy — number of results to skip","default":0,"title":"Offset"},"description":"Legacy — number of results to skip"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse_SearchResponse_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"x-codeSamples":[{"lang":"curl","label":"curl","source":"curl \"https://api.hub-equity.com/api/v1/search\" \\\n  -H \"Authorization: Bearer $HUBEQ_API_KEY\""},{"lang":"Python","label":"Python","source":"from hub_equity import HubEquity\n\nclient = HubEquity()  # reads HUBEQUITY_API_KEY\n# Auto-follows links.next across every page:\nfor entity in client.iter_entities(q=\"apple\"):\n    print(entity.name, entity.ticker)"}],"x-code-samples":[{"lang":"curl","label":"curl","source":"curl \"https://api.hub-equity.com/api/v1/search\" \\\n  -H \"Authorization: Bearer $HUBEQ_API_KEY\""},{"lang":"Python","label":"Python","source":"from hub_equity import HubEquity\n\nclient = HubEquity()  # reads HUBEQUITY_API_KEY\n# Auto-follows links.next across every page:\nfor entity in client.iter_entities(q=\"apple\"):\n    print(entity.name, entity.ticker)"}]}},"/api/v1/entities/changes":{"get":{"tags":["Entities"],"summary":"What moved for a set of entities since a timestamp (filings ingested, material restatements)","description":"For the given entities (a portfolio), the filings ingested since `since` and the material restatements (medium or high materiality) whose restating filing was ingested since `since`. Every event is dated by a filing. Entities not visible to the caller are dropped silently, like `/compare`.","operationId":"entity_changes_endpoint_api_v1_entities_changes_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"ids","in":"query","required":true,"schema":{"type":"string","description":"Comma-separated entity UUIDs (at most 100).","title":"Ids"},"description":"Comma-separated entity UUIDs (at most 100)."},{"name":"since","in":"query","required":true,"schema":{"type":"string","format":"date-time","description":"ISO timestamp of the last visit.","title":"Since"},"description":"ISO timestamp of the last visit."}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse_PortfolioChangesResponse_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"x-codeSamples":[{"lang":"curl","label":"curl","source":"curl \"https://api.hub-equity.com/api/v1/entities/changes\" \\\n  -H \"Authorization: Bearer $HUBEQ_API_KEY\""},{"lang":"Python","label":"Python","source":"import httpx\n\nheaders = {\"Authorization\": \"Bearer $HUBEQ_API_KEY\"}\nresp = httpx.get(\n    \"https://api.hub-equity.com/api/v1/entities/changes\",\n    headers=headers,\n)\nresp.raise_for_status()\ndata = resp.json()[\"data\"]  # every response is wrapped in an envelope"}],"x-code-samples":[{"lang":"curl","label":"curl","source":"curl \"https://api.hub-equity.com/api/v1/entities/changes\" \\\n  -H \"Authorization: Bearer $HUBEQ_API_KEY\""},{"lang":"Python","label":"Python","source":"import httpx\n\nheaders = {\"Authorization\": \"Bearer $HUBEQ_API_KEY\"}\nresp = httpx.get(\n    \"https://api.hub-equity.com/api/v1/entities/changes\",\n    headers=headers,\n)\nresp.raise_for_status()\ndata = resp.json()[\"data\"]  # every response is wrapped in an envelope"}]}},"/api/v1/entities/find":{"get":{"tags":["Entities"],"summary":"Resolve a query to ranked entity matches (name/ticker/CIK/ticker.MIC)","description":"Entity resolution: maps a free-text `query` (ticker, name substring, CIK, or `TICKER.MIC`) to up to 5 ranked matches (exact ticker.MIC > exact ticker > exact CIK > name-or-ticker substring, alphabetical by name). Each match carries `mic` so cross-exchange ticker collisions (e.g. `MC.XPAR`=LVMH vs `MC.XNYS`=Moelis) can be disambiguated.\n\nRicher than `/search` (which has no ticker/CIK/MIC resolution or rank). Rate limit: the plan of the calling key (Free 120, Builder 300, Team 600, Enterprise 1,000 per minute).","operationId":"find_entity_endpoint_api_v1_entities_find_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"query","in":"query","required":false,"schema":{"type":"string","description":"Ticker, name, CIK, or TICKER.MIC.","default":"","title":"Query"},"description":"Ticker, name, CIK, or TICKER.MIC."}],"responses":{"200":{"description":"Ranked entity matches (possibly empty).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse_FindEntityResult_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"x-codeSamples":[{"lang":"curl","label":"curl","source":"curl \"https://api.hub-equity.com/api/v1/entities/find\" \\\n  -H \"Authorization: Bearer $HUBEQ_API_KEY\""},{"lang":"Python","label":"Python","source":"import httpx\n\nheaders = {\"Authorization\": \"Bearer $HUBEQ_API_KEY\"}\nresp = httpx.get(\n    \"https://api.hub-equity.com/api/v1/entities/find\",\n    headers=headers,\n)\nresp.raise_for_status()\ndata = resp.json()[\"data\"]  # every response is wrapped in an envelope"}],"x-code-samples":[{"lang":"curl","label":"curl","source":"curl \"https://api.hub-equity.com/api/v1/entities/find\" \\\n  -H \"Authorization: Bearer $HUBEQ_API_KEY\""},{"lang":"Python","label":"Python","source":"import httpx\n\nheaders = {\"Authorization\": \"Bearer $HUBEQ_API_KEY\"}\nresp = httpx.get(\n    \"https://api.hub-equity.com/api/v1/entities/find\",\n    headers=headers,\n)\nresp.raise_for_status()\ndata = resp.json()[\"data\"]  # every response is wrapped in an envelope"}]}},"/api/v1/entities/{entity_id}":{"get":{"tags":["Entities"],"summary":"Get entity details","description":"Retrieve detailed information about a specific entity. Accepts UUID or ticker.","operationId":"get_entity_api_v1_entities__entity_id__get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"entity_id","in":"path","required":true,"schema":{"type":"string","title":"Entity Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse_Entity_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"x-codeSamples":[{"lang":"curl","label":"curl","source":"curl \"https://api.hub-equity.com/api/v1/entities/{entity_id}\" \\\n  -H \"Authorization: Bearer $HUBEQ_API_KEY\""},{"lang":"Python","label":"Python","source":"import httpx\n\nheaders = {\"Authorization\": \"Bearer $HUBEQ_API_KEY\"}\nresp = httpx.get(\n    \"https://api.hub-equity.com/api/v1/entities/{entity_id}\",\n    headers=headers,\n)\nresp.raise_for_status()\ndata = resp.json()[\"data\"]  # every response is wrapped in an envelope"}],"x-code-samples":[{"lang":"curl","label":"curl","source":"curl \"https://api.hub-equity.com/api/v1/entities/{entity_id}\" \\\n  -H \"Authorization: Bearer $HUBEQ_API_KEY\""},{"lang":"Python","label":"Python","source":"import httpx\n\nheaders = {\"Authorization\": \"Bearer $HUBEQ_API_KEY\"}\nresp = httpx.get(\n    \"https://api.hub-equity.com/api/v1/entities/{entity_id}\",\n    headers=headers,\n)\nresp.raise_for_status()\ndata = resp.json()[\"data\"]  # every response is wrapped in an envelope"}]}},"/api/v1/entities/{entity_id}/amendments":{"get":{"tags":["Entities"],"summary":"List 10-K/A amendments for an entity","description":"Returns every 10-K/A filed for this entity along with the per-concept diff against the base 10-K (added vs modified).","operationId":"get_entity_amendments_api_v1_entities__entity_id__amendments_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"entity_id","in":"path","required":true,"schema":{"type":"string","title":"Entity Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse_AmendmentsResponse_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"x-codeSamples":[{"lang":"curl","label":"curl","source":"curl \"https://api.hub-equity.com/api/v1/entities/{entity_id}/amendments\" \\\n  -H \"Authorization: Bearer $HUBEQ_API_KEY\""},{"lang":"Python","label":"Python","source":"import httpx\n\nheaders = {\"Authorization\": \"Bearer $HUBEQ_API_KEY\"}\nresp = httpx.get(\n    \"https://api.hub-equity.com/api/v1/entities/{entity_id}/amendments\",\n    headers=headers,\n)\nresp.raise_for_status()\ndata = resp.json()[\"data\"]  # every response is wrapped in an envelope"}],"x-code-samples":[{"lang":"curl","label":"curl","source":"curl \"https://api.hub-equity.com/api/v1/entities/{entity_id}/amendments\" \\\n  -H \"Authorization: Bearer $HUBEQ_API_KEY\""},{"lang":"Python","label":"Python","source":"import httpx\n\nheaders = {\"Authorization\": \"Bearer $HUBEQ_API_KEY\"}\nresp = httpx.get(\n    \"https://api.hub-equity.com/api/v1/entities/{entity_id}/amendments\",\n    headers=headers,\n)\nresp.raise_for_status()\ndata = resp.json()[\"data\"]  # every response is wrapped in an envelope"}]}},"/api/v1/entities/{entity_id}/amendments/inspector":{"get":{"tags":["Entities"],"summary":"Inspector payload for one restatement","description":"Single-call payload for one amended value. Returns the enriched change, filing context with SEC EDGAR URLs, companion changes (other concepts amended in the same 10-K/A), and the concept time-series sparkline data.","operationId":"get_entity_amendment_inspector_api_v1_entities__entity_id__amendments_inspector_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"entity_id","in":"path","required":true,"schema":{"type":"string","title":"Entity Id"}},{"name":"concept","in":"query","required":true,"schema":{"type":"string","description":"Hub concept code (e.g. REVENUE)","title":"Concept"},"description":"Hub concept code (e.g. REVENUE)"},{"name":"fy","in":"query","required":true,"schema":{"type":"integer","description":"Fiscal year of the amendment","title":"Fy"},"description":"Fiscal year of the amendment"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse_InspectorPayload_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"x-codeSamples":[{"lang":"curl","label":"curl","source":"curl \"https://api.hub-equity.com/api/v1/entities/{entity_id}/amendments/inspector\" \\\n  -H \"Authorization: Bearer $HUBEQ_API_KEY\""},{"lang":"Python","label":"Python","source":"import httpx\n\nheaders = {\"Authorization\": \"Bearer $HUBEQ_API_KEY\"}\nresp = httpx.get(\n    \"https://api.hub-equity.com/api/v1/entities/{entity_id}/amendments/inspector\",\n    headers=headers,\n)\nresp.raise_for_status()\ndata = resp.json()[\"data\"]  # every response is wrapped in an envelope"}],"x-code-samples":[{"lang":"curl","label":"curl","source":"curl \"https://api.hub-equity.com/api/v1/entities/{entity_id}/amendments/inspector\" \\\n  -H \"Authorization: Bearer $HUBEQ_API_KEY\""},{"lang":"Python","label":"Python","source":"import httpx\n\nheaders = {\"Authorization\": \"Bearer $HUBEQ_API_KEY\"}\nresp = httpx.get(\n    \"https://api.hub-equity.com/api/v1/entities/{entity_id}/amendments/inspector\",\n    headers=headers,\n)\nresp.raise_for_status()\ndata = resp.json()[\"data\"]  # every response is wrapped in an envelope"}]}},"/api/v1/entities/{entity_id}/restatements/comparatives":{"get":{"tags":["Entities"],"summary":"List comparative-based restatements","description":"Retroactive restatements detected via the comparative columns of later filings (vs `/restatements/diff` which only covers explicit 10-K/A amendments).\n\nEach row reports a (hub_concept × fiscal_year) tuple where the value originally stored from an earlier filing differs materially from the value reported in a later filing's comparative column (N-1, N-2). Flagship example : Cisco FY2023 CapEx 477M → 849M revealed by the FY2025 10-K with no 10-K/A ever filed.\n\nMateriality (`none`/`low`/`medium`/`high`) is computed at read time with the same rule as the rest of the platform. Filters:\n- `fiscal_year` — restrict to one FY\n- `hub_concept_code` — single concept (e.g. CF_CAPEX)\n- `min_classification` — `revised` (default, ≥1%) or `restated` (>5% only)\n\nThe list and `fiscal_year` are open on every plan; the `hub_concept_code` filter and `min_classification=restated` need the `facts.premium` scope (403 below it), like the flat, filtered view `/restatements/diff?source=comparatives`.","operationId":"get_entity_comparative_restatements_api_v1_entities__entity_id__restatements_comparatives_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"entity_id","in":"path","required":true,"schema":{"type":"string","title":"Entity Id"}},{"name":"fiscal_year","in":"query","required":false,"schema":{"anyOf":[{"type":"integer","maximum":2100,"minimum":1990},{"type":"null"}],"description":"Restrict to one fiscal year.","title":"Fiscal Year"},"description":"Restrict to one fiscal year."},{"name":"hub_concept_code","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Filter to a single Hub concept (e.g. CF_CAPEX, REVENUE).","title":"Hub Concept Code"},"description":"Filter to a single Hub concept (e.g. CF_CAPEX, REVENUE)."},{"name":"min_classification","in":"query","required":false,"schema":{"type":"string","pattern":"^(revised|restated)$","description":"'revised' (default, ≥1% delta) or 'restated' (>5% only). Rounding noise (<1%) is always excluded.","default":"revised","title":"Min Classification"},"description":"'revised' (default, ≥1% delta) or 'restated' (>5% only). Rounding noise (<1%) is always excluded."}],"responses":{"200":{"description":"Comparative-based restatement entries.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse_ComparativeRestatementsResponse_"}}}},"404":{"description":"Entity not found."},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"x-codeSamples":[{"lang":"curl","label":"curl","source":"curl \"https://api.hub-equity.com/api/v1/entities/{entity_id}/restatements/comparatives\" \\\n  -H \"Authorization: Bearer $HUBEQ_API_KEY\""},{"lang":"Python","label":"Python","source":"import httpx\n\nheaders = {\"Authorization\": \"Bearer $HUBEQ_API_KEY\"}\nresp = httpx.get(\n    \"https://api.hub-equity.com/api/v1/entities/{entity_id}/restatements/comparatives\",\n    headers=headers,\n)\nresp.raise_for_status()\ndata = resp.json()[\"data\"]  # every response is wrapped in an envelope"}],"x-code-samples":[{"lang":"curl","label":"curl","source":"curl \"https://api.hub-equity.com/api/v1/entities/{entity_id}/restatements/comparatives\" \\\n  -H \"Authorization: Bearer $HUBEQ_API_KEY\""},{"lang":"Python","label":"Python","source":"import httpx\n\nheaders = {\"Authorization\": \"Bearer $HUBEQ_API_KEY\"}\nresp = httpx.get(\n    \"https://api.hub-equity.com/api/v1/entities/{entity_id}/restatements/comparatives\",\n    headers=headers,\n)\nresp.raise_for_status()\ndata = resp.json()[\"data\"]  # every response is wrapped in an envelope"}]}},"/api/v1/entities/{entity_id}/dei":{"get":{"tags":["Entities"],"summary":"Get DEI attributes for an entity","description":"Returns DEI (Document and Entity Information) attributes extracted from the entity's latest SEC filing — employees, incorporation date, legal form, regulatory flags, public float, auditor, etc.","operationId":"get_entity_dei_api_v1_entities__entity_id__dei_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"entity_id","in":"path","required":true,"schema":{"type":"string","title":"Entity Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse_EntityDei_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"x-codeSamples":[{"lang":"curl","label":"curl","source":"curl \"https://api.hub-equity.com/api/v1/entities/{entity_id}/dei\" \\\n  -H \"Authorization: Bearer $HUBEQ_API_KEY\""},{"lang":"Python","label":"Python","source":"import httpx\n\nheaders = {\"Authorization\": \"Bearer $HUBEQ_API_KEY\"}\nresp = httpx.get(\n    \"https://api.hub-equity.com/api/v1/entities/{entity_id}/dei\",\n    headers=headers,\n)\nresp.raise_for_status()\ndata = resp.json()[\"data\"]  # every response is wrapped in an envelope"}],"x-code-samples":[{"lang":"curl","label":"curl","source":"curl \"https://api.hub-equity.com/api/v1/entities/{entity_id}/dei\" \\\n  -H \"Authorization: Bearer $HUBEQ_API_KEY\""},{"lang":"Python","label":"Python","source":"import httpx\n\nheaders = {\"Authorization\": \"Bearer $HUBEQ_API_KEY\"}\nresp = httpx.get(\n    \"https://api.hub-equity.com/api/v1/entities/{entity_id}/dei\",\n    headers=headers,\n)\nresp.raise_for_status()\ndata = resp.json()[\"data\"]  # every response is wrapped in an envelope"}]}},"/api/v1/entities/{entity_id}/restatements/diff":{"get":{"tags":["Entities"],"summary":"Flat per-concept restatement deltas with materiality filter (premium)","description":"Returns a flat sorted list of (concept × period) deltas, with optional filters. `source=amendments` (default): the 10-K/A filings of the entity. `source=comparatives`: the silent restatements, figures a later filing reprinted differently in its comparative columns with no amendment filed (`kind` is `modified`, or `added` for a newly disclosed figure, with `old_value` null).\n\n- `fiscal_year` — restrict to one FY's amendment\n- `hub_concept_code` — only deltas on this hub concept (e.g. `REVENUE`)\n- `min_diff_pct` — drop deltas with `|new-old|/old < threshold` (0.01 = 1%, default). Set 0 to include all deltas including unchanged.\n- `kind` — `added` (concept absent from base 10-K), `modified` (value changed), `unchanged` (re-asserted with same value).\n\nDiffers from `/amendments` which returns the per-amendment summary structure with companion changes ; this endpoint flattens across amendments so callers can answer 'all REVENUE restatements for X' or 'all FY24 deltas > 5%' in one round-trip.","operationId":"get_restatement_diff_api_v1_entities__entity_id__restatements_diff_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"entity_id","in":"path","required":true,"schema":{"type":"string","title":"Entity Id"}},{"name":"fiscal_year","in":"query","required":false,"schema":{"anyOf":[{"type":"integer","maximum":2100,"minimum":1990},{"type":"null"}],"description":"Restrict to one fiscal year's amendment. Omit for all.","title":"Fiscal Year"},"description":"Restrict to one fiscal year's amendment. Omit for all."},{"name":"hub_concept_code","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Filter to a single hub concept (e.g. REVENUE).","title":"Hub Concept Code"},"description":"Filter to a single hub concept (e.g. REVENUE)."},{"name":"min_diff_pct","in":"query","required":false,"schema":{"type":"number","maximum":1.0,"minimum":0.0,"description":"Materiality threshold as a fraction (0.01 = 1%, default). 0 to include all deltas.","default":0.01,"title":"Min Diff Pct"},"description":"Materiality threshold as a fraction (0.01 = 1%, default). 0 to include all deltas."},{"name":"kind","in":"query","required":false,"schema":{"anyOf":[{"type":"string","pattern":"^(added|modified|unchanged)$"},{"type":"null"}],"description":"Filter by change kind: 'added', 'modified', 'unchanged'.","title":"Kind"},"description":"Filter by change kind: 'added', 'modified', 'unchanged'."},{"name":"source","in":"query","required":false,"schema":{"type":"string","pattern":"^(amendments|comparatives)$","description":"'amendments' (10-K/A, default) or 'comparatives' (silent restatements).","default":"amendments","title":"Source"},"description":"'amendments' (10-K/A, default) or 'comparatives' (silent restatements)."}],"responses":{"200":{"description":"Per-concept restatement deltas.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse_AmendmentDiffResult_"}}}},"404":{"description":"Entity not found."},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"x-codeSamples":[{"lang":"curl","label":"curl","source":"curl \"https://api.hub-equity.com/api/v1/entities/{entity_id}/restatements/diff\" \\\n  -H \"Authorization: Bearer $HUBEQ_API_KEY\""},{"lang":"Python","label":"Python","source":"from hub_equity import HubEquity\n\nclient = HubEquity(api_key=\"hubq_live_...\")  # premium\ndiff = client.get_restatement_diff(\"AAPL\", min_diff_pct=0.05)\nprint(diff)"}],"x-code-samples":[{"lang":"curl","label":"curl","source":"curl \"https://api.hub-equity.com/api/v1/entities/{entity_id}/restatements/diff\" \\\n  -H \"Authorization: Bearer $HUBEQ_API_KEY\""},{"lang":"Python","label":"Python","source":"from hub_equity import HubEquity\n\nclient = HubEquity(api_key=\"hubq_live_...\")  # premium\ndiff = client.get_restatement_diff(\"AAPL\", min_diff_pct=0.05)\nprint(diff)"}]}},"/api/v1/entities/{entity_id}/metrics/{hub_concept_code}/history":{"get":{"tags":["Entities"],"summary":"Time-series history for a single metric","description":"Returns up to `years` of values for one Hub concept on one entity, ordered oldest first, with YoY growth per point and a CAGR over the window.\n\nConsolidated rows only (segment dimensional rows are excluded so the trail is comparable across years).\n\nQuery params :\n- `years` — lookback window (1-30, default 5). Capped at 30 years.\n- `period_type`: `FY` (annual, the only period type served).\n\nDifferentiator vs `/v1/entities/{id}/financials` (which returns multiple metrics × few years in a category-shaped envelope) : this endpoint focuses on **one** metric × **many** years, the canonical time-series shape for charts and CAGR.","operationId":"get_entity_metric_history_api_v1_entities__entity_id__metrics__hub_concept_code__history_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"entity_id","in":"path","required":true,"schema":{"type":"string","title":"Entity Id"}},{"name":"hub_concept_code","in":"path","required":true,"schema":{"type":"string","title":"Hub Concept Code"}},{"name":"years","in":"query","required":false,"schema":{"type":"integer","maximum":30,"minimum":1,"description":"Number of years to retrieve (1-30, default 5). Capped at 30: older data is rarely available.","default":5,"title":"Years"},"description":"Number of years to retrieve (1-30, default 5). Capped at 30: older data is rarely available."},{"name":"period_type","in":"query","required":false,"schema":{"type":"string","pattern":"^FY$","description":"Fiscal period type. Only `FY` (annual) is served.","default":"FY","title":"Period Type"},"description":"Fiscal period type. Only `FY` (annual) is served."}],"responses":{"200":{"description":"Time-series for the metric.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse_MetricHistory_"}}}},"404":{"description":"Entity not found."},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"x-codeSamples":[{"lang":"curl","label":"curl","source":"curl \"https://api.hub-equity.com/api/v1/entities/{entity_id}/metrics/{hub_concept_code}/history\" \\\n  -H \"Authorization: Bearer $HUBEQ_API_KEY\""},{"lang":"Python","label":"Python","source":"from hub_equity import HubEquity\n\nclient = HubEquity()\nhist = client.get_metric_history(\"AAPL\", \"REVENUE\", years=5)\nfor point in hist.points:\n    print(point.fiscal_year, point.value, point.yoy_growth_pct)"}],"x-code-samples":[{"lang":"curl","label":"curl","source":"curl \"https://api.hub-equity.com/api/v1/entities/{entity_id}/metrics/{hub_concept_code}/history\" \\\n  -H \"Authorization: Bearer $HUBEQ_API_KEY\""},{"lang":"Python","label":"Python","source":"from hub_equity import HubEquity\n\nclient = HubEquity()\nhist = client.get_metric_history(\"AAPL\", \"REVENUE\", years=5)\nfor point in hist.points:\n    print(point.fiscal_year, point.value, point.yoy_growth_pct)"}]}},"/api/v1/entities/{entity_id}/profile":{"get":{"tags":["Entities"],"summary":"Full company profile snapshot (identifiers + DEI + filings summary)","description":"Comprehensive company snapshot in one round-trip: identifiers (ticker, CIK, ISIN, LEI), sector/industry, fiscal year end, reporting currency, DEI enrichment (legal form, incorporation, employees, public float, filer category, auditor), and a filings summary (count by form_type + the 3 latest filings).\n\nConsolidates `/entities/{id}` + `/entities/{id}/dei` + filings into a single payload.","operationId":"get_entity_profile_endpoint_api_v1_entities__entity_id__profile_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"entity_id","in":"path","required":true,"schema":{"type":"string","title":"Entity Id"}}],"responses":{"200":{"description":"Entity profile.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse_EntityProfile_"}}}},"404":{"description":"Entity not found."},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"x-codeSamples":[{"lang":"curl","label":"curl","source":"curl \"https://api.hub-equity.com/api/v1/entities/{entity_id}/profile\" \\\n  -H \"Authorization: Bearer $HUBEQ_API_KEY\""},{"lang":"Python","label":"Python","source":"import httpx\n\nheaders = {\"Authorization\": \"Bearer $HUBEQ_API_KEY\"}\nresp = httpx.get(\n    \"https://api.hub-equity.com/api/v1/entities/{entity_id}/profile\",\n    headers=headers,\n)\nresp.raise_for_status()\ndata = resp.json()[\"data\"]  # every response is wrapped in an envelope"}],"x-code-samples":[{"lang":"curl","label":"curl","source":"curl \"https://api.hub-equity.com/api/v1/entities/{entity_id}/profile\" \\\n  -H \"Authorization: Bearer $HUBEQ_API_KEY\""},{"lang":"Python","label":"Python","source":"import httpx\n\nheaders = {\"Authorization\": \"Bearer $HUBEQ_API_KEY\"}\nresp = httpx.get(\n    \"https://api.hub-equity.com/api/v1/entities/{entity_id}/profile\",\n    headers=headers,\n)\nresp.raise_for_status()\ndata = resp.json()[\"data\"]  # every response is wrapped in an envelope"}]}},"/api/v1/entities/{entity_id}/quality":{"get":{"tags":["Entities"],"summary":"Entity data-quality grade (A+/A/B/C/D) — confidence transparency","description":"Confidence transparency snapshot for an entity.\n\nThe grade answers: *for the latest reported fiscal year, how much of this company's essential financial statements is actually readable at Hub-Equity?* It is the **worse of two gates**, both measured on that single year:\n\n* **Gate 1 — mandatory core** (`core_universal_covered` / `_total`): the 18 core concepts every listed issuer must publish whatever its sector and capital structure (17 for an IFRS filer). A+ requires 100 %.\n* **Gate 2 — reported concepts** (`core_applicable_covered` / `_total`): the core concepts this company actually reports, so a company with no inventories is not graded on inventories. A+ requires 95 %.\n\nStated limit: gate 2 is built on our own extractions, so it cannot see a concept we have never managed to extract for a given company — which is why the absolute counts are returned next to the letter.\n\nServed from a snapshot refreshed daily. `grade` is **null** when no fiscal year is served for the entity, and in the on-the-fly fallback mode (`is_fallback=true`), which cannot compute the two gates. A null grade is an absence of measurement, not a bad grade: do not render it as D, and filter it out before ranking.\n\nEntity-level grade (A+/A/B/C/D) — distinct from the per-filing A-F grade at `/filings/{id}/quality-grade`. Open to every plan: the screener serves the same grade on each row.","operationId":"get_entity_quality_api_v1_entities__entity_id__quality_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"entity_id","in":"path","required":true,"schema":{"type":"string","title":"Entity Id"}}],"responses":{"200":{"description":"Entity quality grade.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse_DataQualityResult_"}}}},"404":{"description":"Entity not found."},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"x-codeSamples":[{"lang":"curl","label":"curl","source":"curl \"https://api.hub-equity.com/api/v1/entities/{entity_id}/quality\" \\\n  -H \"Authorization: Bearer $HUBEQ_API_KEY\""},{"lang":"Python","label":"Python","source":"import httpx\n\nheaders = {\"Authorization\": \"Bearer $HUBEQ_API_KEY\"}\nresp = httpx.get(\n    \"https://api.hub-equity.com/api/v1/entities/{entity_id}/quality\",\n    headers=headers,\n)\nresp.raise_for_status()\ndata = resp.json()[\"data\"]  # every response is wrapped in an envelope"}],"x-code-samples":[{"lang":"curl","label":"curl","source":"curl \"https://api.hub-equity.com/api/v1/entities/{entity_id}/quality\" \\\n  -H \"Authorization: Bearer $HUBEQ_API_KEY\""},{"lang":"Python","label":"Python","source":"import httpx\n\nheaders = {\"Authorization\": \"Bearer $HUBEQ_API_KEY\"}\nresp = httpx.get(\n    \"https://api.hub-equity.com/api/v1/entities/{entity_id}/quality\",\n    headers=headers,\n)\nresp.raise_for_status()\ndata = resp.json()[\"data\"]  # every response is wrapped in an envelope"}]}},"/api/v1/entities/{entity_id}/validation-results":{"get":{"tags":["Entities"],"summary":"XBRL accounting / calculation linkbase checks across an entity's filings","description":"Entity-scoped variant of `/filings/{id}/validation-results`: surfaces the accounting and calculation checks run on the entity's filings (optionally one fiscal year). `accounting_equation` / `calculation` / `hub_calculation` checks.\n\nDefault `status_filter` = `['warning','error']`. Sorted by severity then |relative_difference|, capped at 100 rows.","operationId":"get_entity_validation_results_api_v1_entities__entity_id__validation_results_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"entity_id","in":"path","required":true,"schema":{"type":"string","title":"Entity Id"}},{"name":"fiscal_year","in":"query","required":false,"schema":{"anyOf":[{"type":"integer","maximum":2100,"minimum":1990},{"type":"null"}],"description":"Restrict to one fiscal year.","title":"Fiscal Year"},"description":"Restrict to one fiscal year."},{"name":"status_filter","in":"query","required":false,"schema":{"anyOf":[{"type":"array","items":{"type":"string"}},{"type":"null"}],"description":"Statuses to include. Default ['warning','error']. Repeat the param for multiple (e.g. ?status_filter=valid&status_filter=skipped).","title":"Status Filter"},"description":"Statuses to include. Default ['warning','error']. Repeat the param for multiple (e.g. ?status_filter=valid&status_filter=skipped)."}],"responses":{"200":{"description":"Validation checks for the entity.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse_ValidationResult_"}}}},"404":{"description":"Entity not found."},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"x-codeSamples":[{"lang":"curl","label":"curl","source":"curl \"https://api.hub-equity.com/api/v1/entities/{entity_id}/validation-results\" \\\n  -H \"Authorization: Bearer $HUBEQ_API_KEY\""},{"lang":"Python","label":"Python","source":"import httpx\n\nheaders = {\"Authorization\": \"Bearer $HUBEQ_API_KEY\"}\nresp = httpx.get(\n    \"https://api.hub-equity.com/api/v1/entities/{entity_id}/validation-results\",\n    headers=headers,\n)\nresp.raise_for_status()\ndata = resp.json()[\"data\"]  # every response is wrapped in an envelope"}],"x-code-samples":[{"lang":"curl","label":"curl","source":"curl \"https://api.hub-equity.com/api/v1/entities/{entity_id}/validation-results\" \\\n  -H \"Authorization: Bearer $HUBEQ_API_KEY\""},{"lang":"Python","label":"Python","source":"import httpx\n\nheaders = {\"Authorization\": \"Bearer $HUBEQ_API_KEY\"}\nresp = httpx.get(\n    \"https://api.hub-equity.com/api/v1/entities/{entity_id}/validation-results\",\n    headers=headers,\n)\nresp.raise_for_status()\ndata = resp.json()[\"data\"]  # every response is wrapped in an envelope"}]}},"/api/v1/entities/{entity_id}/extension-concepts":{"get":{"tags":["Entities"],"summary":"Issuer-specific extension concepts (qnames outside standard taxonomies)","description":"Concepts a filer declared outside the standard us-gaap / ifrs-full taxonomies, with item-type / period-type / balance, usage count, mapping status, and an optional single ML `suggested_hub_code` + confidence.\n\nSorted by usage_count desc, `limit` clamped to [1, 100]. `status_filter` ∈ all | mapped | unmappable | pending | processing | review.","operationId":"get_entity_extension_concepts_api_v1_entities__entity_id__extension_concepts_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"entity_id","in":"path","required":true,"schema":{"type":"string","title":"Entity Id"}},{"name":"status_filter","in":"query","required":false,"schema":{"type":"string","description":"all (default) | mapped (tied to a Hub-Equity concept).","default":"all","title":"Status Filter"},"description":"all (default) | mapped (tied to a Hub-Equity concept)."},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","minimum":1,"description":"Max rows (clamped to 100). Default 30.","default":30,"title":"Limit"},"description":"Max rows (clamped to 100). Default 30."}],"responses":{"200":{"description":"Extension concepts for the entity.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse_ExtensionConceptsResult_"}}}},"404":{"description":"Entity not found."},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"x-codeSamples":[{"lang":"curl","label":"curl","source":"curl \"https://api.hub-equity.com/api/v1/entities/{entity_id}/extension-concepts\" \\\n  -H \"Authorization: Bearer $HUBEQ_API_KEY\""},{"lang":"Python","label":"Python","source":"import httpx\n\nheaders = {\"Authorization\": \"Bearer $HUBEQ_API_KEY\"}\nresp = httpx.get(\n    \"https://api.hub-equity.com/api/v1/entities/{entity_id}/extension-concepts\",\n    headers=headers,\n)\nresp.raise_for_status()\ndata = resp.json()[\"data\"]  # every response is wrapped in an envelope"}],"x-code-samples":[{"lang":"curl","label":"curl","source":"curl \"https://api.hub-equity.com/api/v1/entities/{entity_id}/extension-concepts\" \\\n  -H \"Authorization: Bearer $HUBEQ_API_KEY\""},{"lang":"Python","label":"Python","source":"import httpx\n\nheaders = {\"Authorization\": \"Bearer $HUBEQ_API_KEY\"}\nresp = httpx.get(\n    \"https://api.hub-equity.com/api/v1/entities/{entity_id}/extension-concepts\",\n    headers=headers,\n)\nresp.raise_for_status()\ndata = resp.json()[\"data\"]  # every response is wrapped in an envelope"}]}},"/api/v1/entities/{entity_id}/facts/{hub_concept_code}":{"get":{"tags":["Entities"],"summary":"One normalized fact for an entity at a given period (with source)","description":"Returns the single normalized value for (entity × hub concept × fiscal year × period type), with its source filing (form type, filing date, viewer URL) so the value can be cited.\n\n`404 FACT_NOT_FOUND` when no fact exists for that combination. For a time-series use `/entities/{id}/metrics/{code}/history` ; for the full matrix use `/entities/{id}/financials`.","operationId":"get_entity_fact_api_v1_entities__entity_id__facts__hub_concept_code__get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"entity_id","in":"path","required":true,"schema":{"type":"string","title":"Entity Id"}},{"name":"hub_concept_code","in":"path","required":true,"schema":{"type":"string","title":"Hub Concept Code"}},{"name":"fiscal_year","in":"query","required":true,"schema":{"type":"integer","maximum":2100,"minimum":1990,"description":"Fiscal year (e.g. 2024).","title":"Fiscal Year"},"description":"Fiscal year (e.g. 2024)."},{"name":"fiscal_period_type","in":"query","required":false,"schema":{"type":"string","pattern":"^(FY|H[12]|Q[1-4])$","description":"FY (default, annual), Q1-Q4, or H1/H2.","default":"FY","title":"Fiscal Period Type"},"description":"FY (default, annual), Q1-Q4, or H1/H2."}],"responses":{"200":{"description":"The normalized fact + source.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse_Fact_"}}}},"404":{"description":"No fact for that entity/concept/period."},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"x-codeSamples":[{"lang":"curl","label":"curl","source":"curl \"https://api.hub-equity.com/api/v1/entities/{entity_id}/facts/{hub_concept_code}\" \\\n  -H \"Authorization: Bearer $HUBEQ_API_KEY\""},{"lang":"Python","label":"Python","source":"import httpx\n\nheaders = {\"Authorization\": \"Bearer $HUBEQ_API_KEY\"}\nresp = httpx.get(\n    \"https://api.hub-equity.com/api/v1/entities/{entity_id}/facts/{hub_concept_code}\",\n    headers=headers,\n)\nresp.raise_for_status()\ndata = resp.json()[\"data\"]  # every response is wrapped in an envelope"}],"x-code-samples":[{"lang":"curl","label":"curl","source":"curl \"https://api.hub-equity.com/api/v1/entities/{entity_id}/facts/{hub_concept_code}\" \\\n  -H \"Authorization: Bearer $HUBEQ_API_KEY\""},{"lang":"Python","label":"Python","source":"import httpx\n\nheaders = {\"Authorization\": \"Bearer $HUBEQ_API_KEY\"}\nresp = httpx.get(\n    \"https://api.hub-equity.com/api/v1/entities/{entity_id}/facts/{hub_concept_code}\",\n    headers=headers,\n)\nresp.raise_for_status()\ndata = resp.json()[\"data\"]  # every response is wrapped in an envelope"}]}},"/api/v1/entities/{entity_id}/decomposition":{"get":{"tags":["Entities"],"summary":"Decompose a fact into rollup + linkbase + dimensional layers","description":"Combines three layers of granularity for one fact in a single round-trip :\n- the **parent** fact (same shape as `/facts/{code}`),\n- the **XBRL calculation linkbase** children for the source filing (tree walked up to `depth`, per-filing forward provenance),\n- the **dimensional breakdown** (axis/member) of the same XBRL fact.\n\nProvide EITHER `hub_concept_code` (Hub-Equity standardized) OR `qname` (raw XBRL, e.g. `us-gaap:DeferredRevenueNoncurrent`) — both are query params. `depth` 1-3 (default 1) walks the calc tree ; `depth=2` is recommended so the breakdown lands in one call.\n\n**Premium layer**: the signed components Hub-Equity uses for this figure (`rollup_children`) are returned only with the `facts.premium` scope (as for `/filings/{id}/calculation-tree`), and so are the dimensional members; other callers get the parent and the linkbase layer, with `rollup_children` and `dimensional_breakdown` empty + a note.","operationId":"get_entity_decomposition_api_v1_entities__entity_id__decomposition_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"entity_id","in":"path","required":true,"schema":{"type":"string","title":"Entity Id"}},{"name":"fiscal_year","in":"query","required":true,"schema":{"type":"integer","maximum":2100,"minimum":1990,"description":"Fiscal year (e.g. 2024).","title":"Fiscal Year"},"description":"Fiscal year (e.g. 2024)."},{"name":"hub_concept_code","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Hub concept code (e.g. REVENUE). Provide this OR `qname`.","title":"Hub Concept Code"},"description":"Hub concept code (e.g. REVENUE). Provide this OR `qname`."},{"name":"qname","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Raw XBRL qname (e.g. us-gaap:DeferredRevenueNoncurrent) for concepts without a hub mapping. Provide this OR `hub_concept_code`.","title":"Qname"},"description":"Raw XBRL qname (e.g. us-gaap:DeferredRevenueNoncurrent) for concepts without a hub mapping. Provide this OR `hub_concept_code`."},{"name":"fiscal_period_type","in":"query","required":false,"schema":{"type":"string","pattern":"^(FY|H[12]|Q[1-4])$","description":"FY (default, annual), Q1-Q4, or H1/H2.","default":"FY","title":"Fiscal Period Type"},"description":"FY (default, annual), Q1-Q4, or H1/H2."},{"name":"depth","in":"query","required":false,"schema":{"type":"integer","maximum":3,"minimum":1,"description":"Calc-linkbase tree depth (1-3, default 1). 2 is recommended for typical decomposition questions.","default":1,"title":"Depth"},"description":"Calc-linkbase tree depth (1-3, default 1). 2 is recommended for typical decomposition questions."}],"responses":{"200":{"description":"The decomposition (parent + 3 layers).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse_Decomposition_"}}}},"404":{"description":"No fact for that entity/concept/period."},"422":{"description":"Neither hub_concept_code nor qname was provided."}},"x-codeSamples":[{"lang":"curl","label":"curl","source":"curl \"https://api.hub-equity.com/api/v1/entities/{entity_id}/decomposition\" \\\n  -H \"Authorization: Bearer $HUBEQ_API_KEY\""},{"lang":"Python","label":"Python","source":"import httpx\n\nheaders = {\"Authorization\": \"Bearer $HUBEQ_API_KEY\"}\nresp = httpx.get(\n    \"https://api.hub-equity.com/api/v1/entities/{entity_id}/decomposition\",\n    headers=headers,\n)\nresp.raise_for_status()\ndata = resp.json()[\"data\"]  # every response is wrapped in an envelope"}],"x-code-samples":[{"lang":"curl","label":"curl","source":"curl \"https://api.hub-equity.com/api/v1/entities/{entity_id}/decomposition\" \\\n  -H \"Authorization: Bearer $HUBEQ_API_KEY\""},{"lang":"Python","label":"Python","source":"import httpx\n\nheaders = {\"Authorization\": \"Bearer $HUBEQ_API_KEY\"}\nresp = httpx.get(\n    \"https://api.hub-equity.com/api/v1/entities/{entity_id}/decomposition\",\n    headers=headers,\n)\nresp.raise_for_status()\ndata = resp.json()[\"data\"]  # every response is wrapped in an envelope"}]}},"/api/v1/entities/{entity_id}/segments/{hub_concept_code}":{"get":{"tags":["Entities"],"summary":"Dimensional breakdown (axis/member) of a metric for one period","description":"Returns the segment cuts an issuer reported for one metric at one period : revenue/profit by geography, business segment, product line, etc. Each axis carries its members with the reported value, sorted by magnitude.\n\nReads the dimensional values the issuer reported. `axes=[]` when the entity exists but the issuer did not tag the metric dimensionally for that period ; `404` when the entity does not exist.\n\nDIFFERENT from `/entities/{id}/decomposition` (XBRL calc linkbase children).","operationId":"get_entity_segments_api_v1_entities__entity_id__segments__hub_concept_code__get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"entity_id","in":"path","required":true,"schema":{"type":"string","title":"Entity Id"}},{"name":"hub_concept_code","in":"path","required":true,"schema":{"type":"string","title":"Hub Concept Code"}},{"name":"fiscal_year","in":"query","required":true,"schema":{"type":"integer","maximum":2100,"minimum":1990,"description":"Fiscal year (e.g. 2024).","title":"Fiscal Year"},"description":"Fiscal year (e.g. 2024)."},{"name":"fiscal_period_type","in":"query","required":false,"schema":{"type":"string","pattern":"^(FY|H[12]|Q[1-4])$","description":"FY (default, annual), Q1-Q4, or H1/H2.","default":"FY","title":"Fiscal Period Type"},"description":"FY (default, annual), Q1-Q4, or H1/H2."}],"responses":{"200":{"description":"The dimensional breakdown for the metric.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse_SegmentBreakdown_"}}}},"404":{"description":"Entity not found."},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"x-codeSamples":[{"lang":"curl","label":"curl","source":"curl \"https://api.hub-equity.com/api/v1/entities/{entity_id}/segments/{hub_concept_code}\" \\\n  -H \"Authorization: Bearer $HUBEQ_API_KEY\""},{"lang":"Python","label":"Python","source":"import httpx\n\nheaders = {\"Authorization\": \"Bearer $HUBEQ_API_KEY\"}\nresp = httpx.get(\n    \"https://api.hub-equity.com/api/v1/entities/{entity_id}/segments/{hub_concept_code}\",\n    headers=headers,\n)\nresp.raise_for_status()\ndata = resp.json()[\"data\"]  # every response is wrapped in an envelope"}],"x-code-samples":[{"lang":"curl","label":"curl","source":"curl \"https://api.hub-equity.com/api/v1/entities/{entity_id}/segments/{hub_concept_code}\" \\\n  -H \"Authorization: Bearer $HUBEQ_API_KEY\""},{"lang":"Python","label":"Python","source":"import httpx\n\nheaders = {\"Authorization\": \"Bearer $HUBEQ_API_KEY\"}\nresp = httpx.get(\n    \"https://api.hub-equity.com/api/v1/entities/{entity_id}/segments/{hub_concept_code}\",\n    headers=headers,\n)\nresp.raise_for_status()\ndata = resp.json()[\"data\"]  # every response is wrapped in an envelope"}]}},"/api/v1/entities/{entity_id}/amendments-summary":{"get":{"tags":["Entities"],"summary":"Amendment (10-K/A) summary for an entity — counts + per-concept diff","description":"Lists an entity's amendments (base 10-K → amendment pairs) with per-amendment concept counts (added / modified / unchanged) and, when the diff is materialized, the per-concept changes. Falls back to listing 10-K/A filings (with a note) when the structured diff is not yet materialized.\n\nDISTINCT from `/entities/{id}/amendments` (a different model/shape) — use this one for the summary view ; for flattened per-concept restatement deltas use `/entities/{id}/restatements/diff`.","operationId":"get_entity_amendments_summary_api_v1_entities__entity_id__amendments_summary_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"entity_id","in":"path","required":true,"schema":{"type":"string","title":"Entity Id"}},{"name":"fiscal_year","in":"query","required":false,"schema":{"anyOf":[{"type":"integer","maximum":2100,"minimum":1990},{"type":"null"}],"description":"Restrict to one fiscal year's amendment. Omit for all.","title":"Fiscal Year"},"description":"Restrict to one fiscal year's amendment. Omit for all."}],"responses":{"200":{"description":"Amendment summary for the entity.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse_AmendmentsResult_"}}}},"404":{"description":"Entity not found."},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"x-codeSamples":[{"lang":"curl","label":"curl","source":"curl \"https://api.hub-equity.com/api/v1/entities/{entity_id}/amendments-summary\" \\\n  -H \"Authorization: Bearer $HUBEQ_API_KEY\""},{"lang":"Python","label":"Python","source":"import httpx\n\nheaders = {\"Authorization\": \"Bearer $HUBEQ_API_KEY\"}\nresp = httpx.get(\n    \"https://api.hub-equity.com/api/v1/entities/{entity_id}/amendments-summary\",\n    headers=headers,\n)\nresp.raise_for_status()\ndata = resp.json()[\"data\"]  # every response is wrapped in an envelope"}],"x-code-samples":[{"lang":"curl","label":"curl","source":"curl \"https://api.hub-equity.com/api/v1/entities/{entity_id}/amendments-summary\" \\\n  -H \"Authorization: Bearer $HUBEQ_API_KEY\""},{"lang":"Python","label":"Python","source":"import httpx\n\nheaders = {\"Authorization\": \"Bearer $HUBEQ_API_KEY\"}\nresp = httpx.get(\n    \"https://api.hub-equity.com/api/v1/entities/{entity_id}/amendments-summary\",\n    headers=headers,\n)\nresp.raise_for_status()\ndata = resp.json()[\"data\"]  # every response is wrapped in an envelope"}]}},"/api/v1/entities/{entity_id}/compare-filings":{"get":{"tags":["Entities"],"summary":"Cross-period side-by-side of two fiscal years for the same entity","description":"Compares two FISCAL YEARS of the SAME entity side-by-side (\"what changed at Apple between FY23 and FY24?\"). Returns a per-concept matrix with deltas and the semantic-change flags `is_new_in_b` / `is_removed_in_b` / `is_sign_flip` / `has_restatement_warning`.\n\nIt compares two **years as served**, not two filings as filed: each cell is the value served for that year, whichever filing published it. The `filing_a` / `filing_b` references identify the year, they do not restrict the figures to those documents.\n\nQuery params :\n- `fiscal_year_a` / `fiscal_year_b` (required) — auto-swapped so `a` is the older year.\n- `hub_concept_codes` (repeatable) — restrict the matrix to these hubs (up to 50). Omit for the 25 curated primary hubs.\n- `form_type` (default: the most recent original annual filing) and `fiscal_period_type` (default `FY`).\n\nDIFFERENT from `POST /compare` (cross-entity, one year) and `/restatements/diff` (10-K vs 10-K/A).","operationId":"get_entity_compare_filings_api_v1_entities__entity_id__compare_filings_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"entity_id","in":"path","required":true,"schema":{"type":"string","title":"Entity Id"}},{"name":"fiscal_year_a","in":"query","required":true,"schema":{"type":"integer","maximum":2100,"minimum":1990,"description":"First fiscal year (older).","title":"Fiscal Year A"},"description":"First fiscal year (older)."},{"name":"fiscal_year_b","in":"query","required":true,"schema":{"type":"integer","maximum":2100,"minimum":1990,"description":"Second fiscal year (newer).","title":"Fiscal Year B"},"description":"Second fiscal year (newer)."},{"name":"hub_concept_codes","in":"query","required":false,"schema":{"anyOf":[{"type":"array","items":{"type":"string"}},{"type":"null"}],"description":"Repeatable. Restrict to these hub concept codes (up to 50). Omit for the 25 curated primary hubs.","title":"Hub Concept Codes"},"description":"Repeatable. Restrict to these hub concept codes (up to 50). Omit for the 25 curated primary hubs."},{"name":"form_type","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Form of the reference filing of each year (10-K, 20-F, 40-F, annual_report for ESEF, or an amendment such as 10-K/A). Omit for the most recent original annual filing of each year.","title":"Form Type"},"description":"Form of the reference filing of each year (10-K, 20-F, 40-F, annual_report for ESEF, or an amendment such as 10-K/A). Omit for the most recent original annual filing of each year."},{"name":"fiscal_period_type","in":"query","required":false,"schema":{"type":"string","pattern":"^(FY|H[12]|Q[1-4])$","description":"FY (default, annual), Q1-Q4, or H1/H2.","default":"FY","title":"Fiscal Period Type"},"description":"FY (default, annual), Q1-Q4, or H1/H2."}],"responses":{"200":{"description":"The cross-period comparison matrix.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse_CompareFilingsResult_"}}}},"404":{"description":"Entity not found."},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"x-codeSamples":[{"lang":"curl","label":"curl","source":"curl \"https://api.hub-equity.com/api/v1/entities/{entity_id}/compare-filings\" \\\n  -H \"Authorization: Bearer $HUBEQ_API_KEY\""},{"lang":"Python","label":"Python","source":"import httpx\n\nheaders = {\"Authorization\": \"Bearer $HUBEQ_API_KEY\"}\nresp = httpx.get(\n    \"https://api.hub-equity.com/api/v1/entities/{entity_id}/compare-filings\",\n    headers=headers,\n)\nresp.raise_for_status()\ndata = resp.json()[\"data\"]  # every response is wrapped in an envelope"}],"x-code-samples":[{"lang":"curl","label":"curl","source":"curl \"https://api.hub-equity.com/api/v1/entities/{entity_id}/compare-filings\" \\\n  -H \"Authorization: Bearer $HUBEQ_API_KEY\""},{"lang":"Python","label":"Python","source":"import httpx\n\nheaders = {\"Authorization\": \"Bearer $HUBEQ_API_KEY\"}\nresp = httpx.get(\n    \"https://api.hub-equity.com/api/v1/entities/{entity_id}/compare-filings\",\n    headers=headers,\n)\nresp.raise_for_status()\ndata = resp.json()[\"data\"]  # every response is wrapped in an envelope"}]}},"/api/v1/entities/{entity_id}/roll-up/{hub_concept_code}":{"get":{"tags":["Entities"],"summary":"Compute a hub value via roll-up (sum of components) for one period","description":"Computes a figure for one period from the components the issuer reported, when the figure itself is not tagged. Returns the computed value with its source filing.\n\nAlways returns 200 with a result (value may be null when no leaf is materialized for the period).\n\n**Premium layer**: the breakdown (`algorithm` + signed `contributions`) is returned only with the `facts.premium` scope. Other callers get the computed value + source with `algorithm=unknown`, `contributions=[]`, and a note.","operationId":"get_entity_roll_up_api_v1_entities__entity_id__roll_up__hub_concept_code__get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"entity_id","in":"path","required":true,"schema":{"type":"string","title":"Entity Id"}},{"name":"hub_concept_code","in":"path","required":true,"schema":{"type":"string","title":"Hub Concept Code"}},{"name":"fiscal_year","in":"query","required":true,"schema":{"type":"integer","maximum":2100,"minimum":1990,"description":"Fiscal year (e.g. 2024).","title":"Fiscal Year"},"description":"Fiscal year (e.g. 2024)."},{"name":"fiscal_period_type","in":"query","required":false,"schema":{"type":"string","pattern":"^(FY|H[12]|Q[1-4])$","description":"FY (default, annual), Q1-Q4, or H1/H2.","default":"FY","title":"Fiscal Period Type"},"description":"FY (default, annual), Q1-Q4, or H1/H2."}],"responses":{"200":{"description":"The rolled-up value + (premium) rule breakdown.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse_RollUpResult_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"x-codeSamples":[{"lang":"curl","label":"curl","source":"curl \"https://api.hub-equity.com/api/v1/entities/{entity_id}/roll-up/{hub_concept_code}\" \\\n  -H \"Authorization: Bearer $HUBEQ_API_KEY\""},{"lang":"Python","label":"Python","source":"import httpx\n\nheaders = {\"Authorization\": \"Bearer $HUBEQ_API_KEY\"}\nresp = httpx.get(\n    \"https://api.hub-equity.com/api/v1/entities/{entity_id}/roll-up/{hub_concept_code}\",\n    headers=headers,\n)\nresp.raise_for_status()\ndata = resp.json()[\"data\"]  # every response is wrapped in an envelope"}],"x-code-samples":[{"lang":"curl","label":"curl","source":"curl \"https://api.hub-equity.com/api/v1/entities/{entity_id}/roll-up/{hub_concept_code}\" \\\n  -H \"Authorization: Bearer $HUBEQ_API_KEY\""},{"lang":"Python","label":"Python","source":"import httpx\n\nheaders = {\"Authorization\": \"Bearer $HUBEQ_API_KEY\"}\nresp = httpx.get(\n    \"https://api.hub-equity.com/api/v1/entities/{entity_id}/roll-up/{hub_concept_code}\",\n    headers=headers,\n)\nresp.raise_for_status()\ndata = resp.json()[\"data\"]  # every response is wrapped in an envelope"}]}},"/api/v1/entities/{entity_id}/financials/as-of":{"get":{"tags":["Entities"],"summary":"Point-in-time financial query, as of date Y (premium)","description":"Returns the time-series of a Hub concept as it was *known on a historical date*. Filters out filings that did not exist yet at `as_of` ; per-fiscal-year the value is taken from the most recent filing whose `filing_date ≤ as_of`.\n\nAnswers *\"what did Apple's FY2023 revenue look like in March 2024 before the FY2024 amendment landed?\"* without manual filing archeology.\n\nUse cases :\n- **Backtest hygiene** — quant strategies must not peek at facts that didn't exist on the strategy date (survivorship/lookahead bias).\n- **Restatement audit** — confirm whether a fact was already known on a regulatory deadline or arrived later via 10-K/A.\n- **Time-machine BI** — replay an analyst's view to debug a decision retrospectively.\n\nQuery params :\n- `as_of` (YYYY-MM-DD, required) — point-in-time cutoff.\n- `hub_concept_code` (required) — Hub concept (e.g. REVENUE).\n- `years` 1-30, default 5.\n- `period_type` FY (default) or Q.\n\nCurrent limitations:\n- Currency is reported in native currency only — no historical FX translation (would require a point-in-time ECB feed).\n- Only values read directly from filings; values Hub-Equity computes from several tags are not included yet.\n- Restatements carried by the comparative columns of later filings are not taken into account yet.","operationId":"get_entity_financials_as_of_api_v1_entities__entity_id__financials_as_of_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"entity_id","in":"path","required":true,"schema":{"type":"string","title":"Entity Id"}},{"name":"as_of","in":"query","required":true,"schema":{"type":"string","format":"date","description":"Historical cutoff date (ISO YYYY-MM-DD). Only filings with `filing_date ≤ as_of` are considered.","title":"As Of"},"description":"Historical cutoff date (ISO YYYY-MM-DD). Only filings with `filing_date ≤ as_of` are considered."},{"name":"hub_concept_code","in":"query","required":true,"schema":{"type":"string","minLength":1,"maxLength":100,"description":"Hub concept code (e.g. REVENUE, NET_INCOME).","title":"Hub Concept Code"},"description":"Hub concept code (e.g. REVENUE, NET_INCOME)."},{"name":"years","in":"query","required":false,"schema":{"type":"integer","maximum":30,"minimum":1,"description":"Lookback window (1-30, default 5).","default":5,"title":"Years"},"description":"Lookback window (1-30, default 5)."},{"name":"period_type","in":"query","required":false,"schema":{"type":"string","pattern":"^(FY|Q)$","description":"`FY` for annual (default) or `Q` for quarterly.","default":"FY","title":"Period Type"},"description":"`FY` for annual (default) or `Q` for quarterly."}],"responses":{"200":{"description":"Point-in-time time-series.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse_AsOfResponse_"}}}},"404":{"description":"Entity not found."},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"x-codeSamples":[{"lang":"curl","label":"curl","source":"curl \"https://api.hub-equity.com/api/v1/entities/{entity_id}/financials/as-of\" \\\n  -H \"Authorization: Bearer $HUBEQ_API_KEY\""},{"lang":"Python","label":"Python","source":"from hub_equity import HubEquity\n\nclient = HubEquity(api_key=\"hubq_live_...\")  # premium\nseries = client.get_metric_as_of(\"AAPL\", \"REVENUE\", as_of=\"2023-06-30\")\nprint(series)"}],"x-code-samples":[{"lang":"curl","label":"curl","source":"curl \"https://api.hub-equity.com/api/v1/entities/{entity_id}/financials/as-of\" \\\n  -H \"Authorization: Bearer $HUBEQ_API_KEY\""},{"lang":"Python","label":"Python","source":"from hub_equity import HubEquity\n\nclient = HubEquity(api_key=\"hubq_live_...\")  # premium\nseries = client.get_metric_as_of(\"AAPL\", \"REVENUE\", as_of=\"2023-06-30\")\nprint(series)"}]}},"/api/v1/entities/{entity_id}/dimensions":{"get":{"tags":["Entities"],"summary":"List XBRL axes + members reported by the entity (premium)","description":"**Discovery endpoint** — returns the dimensional structure an entity reports : which XBRL axes are used, which members per axis, and which Hub metrics carry which axis. Each axis is tagged with its `axis_kind` (geography, segment, product, equity_rollforward, debt, fv_hierarchy, concentration, ppe, awards, generic) so callers can dispatch to the right downstream call without parsing qnames themselves.\n\nUse this BEFORE calling `/v1/entities/{id}/financials/breakdown?metric=…` to discover what metrics support what drill-downs. `metrics_using_axis` per axis tells you which `metric` values are valid for the breakdown call on that axis.","operationId":"get_dimensions_api_v1_entities__entity_id__dimensions_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"entity_id","in":"path","required":true,"schema":{"type":"string","title":"Entity Id"}}],"responses":{"200":{"description":"Dimensions overview.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse_EntityDimensionsResponse_"}}}},"404":{"description":"Entity not found."},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"x-codeSamples":[{"lang":"curl","label":"curl","source":"curl \"https://api.hub-equity.com/api/v1/entities/{entity_id}/dimensions\" \\\n  -H \"Authorization: Bearer $HUBEQ_API_KEY\""},{"lang":"Python","label":"Python","source":"from hub_equity import HubEquity\n\nclient = HubEquity(api_key=\"hubq_live_...\")  # premium\ndims = client.get_entity_dimensions(\"AAPL\")\nprint(dims.axes)"}],"x-code-samples":[{"lang":"curl","label":"curl","source":"curl \"https://api.hub-equity.com/api/v1/entities/{entity_id}/dimensions\" \\\n  -H \"Authorization: Bearer $HUBEQ_API_KEY\""},{"lang":"Python","label":"Python","source":"from hub_equity import HubEquity\n\nclient = HubEquity(api_key=\"hubq_live_...\")  # premium\ndims = client.get_entity_dimensions(\"AAPL\")\nprint(dims.axes)"}]}},"/api/v1/filings/{filing_id}/disclosure-url":{"get":{"tags":["Filings"],"summary":"Resolve a filing's per-disclosure HTML URL","description":"Returns the absolute URL of the SEC-rendered ``R{n}.htm`` page that displays the requested ``link_role`` (XBRL extended link role). Use it to link to the exact disclosure table; the mapping is read from the filing's ``FilingSummary.xml``. Falls back to the filing's iXBRL viewer when the summary is unreachable or the role is not exposed (ESEF filings, ancient filings, custom roles).","operationId":"get_disclosure_url_api_v1_filings__filing_id__disclosure_url_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"filing_id","in":"path","required":true,"schema":{"type":"string","title":"Filing Id"}},{"name":"link_role","in":"query","required":true,"schema":{"type":"string","description":"XBRL link_role URI to resolve","title":"Link Role"},"description":"XBRL link_role URI to resolve"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse_DisclosureUrlPayload_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"x-codeSamples":[{"lang":"curl","label":"curl","source":"curl \"https://api.hub-equity.com/api/v1/filings/{filing_id}/disclosure-url\" \\\n  -H \"Authorization: Bearer $HUBEQ_API_KEY\""},{"lang":"Python","label":"Python","source":"import httpx\n\nheaders = {\"Authorization\": \"Bearer $HUBEQ_API_KEY\"}\nresp = httpx.get(\n    \"https://api.hub-equity.com/api/v1/filings/{filing_id}/disclosure-url\",\n    headers=headers,\n)\nresp.raise_for_status()\ndata = resp.json()[\"data\"]  # every response is wrapped in an envelope"}],"x-code-samples":[{"lang":"curl","label":"curl","source":"curl \"https://api.hub-equity.com/api/v1/filings/{filing_id}/disclosure-url\" \\\n  -H \"Authorization: Bearer $HUBEQ_API_KEY\""},{"lang":"Python","label":"Python","source":"import httpx\n\nheaders = {\"Authorization\": \"Bearer $HUBEQ_API_KEY\"}\nresp = httpx.get(\n    \"https://api.hub-equity.com/api/v1/filings/{filing_id}/disclosure-url\",\n    headers=headers,\n)\nresp.raise_for_status()\ndata = resp.json()[\"data\"]  # every response is wrapped in an envelope"}]}},"/api/v1/filings/{filing_id}/disclosure-html":{"get":{"tags":["Filings"],"summary":"Fetch the per-disclosure HTML table of a filing, styled","description":"Returns the SEC ``R{n}.htm`` for the requested ``link_role``, with our CSS injected so the table renders consistently with the rest of the platform (system font, design tokens, hidden dictionary noise rows, alternating member backgrounds), suitable for an ``<iframe srcdoc>``. ``html`` is null when the source fetch fails or the link_role is not exposed; use ``viewer_url`` in that case.","operationId":"get_disclosure_html_api_v1_filings__filing_id__disclosure_html_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"filing_id","in":"path","required":true,"schema":{"type":"string","title":"Filing Id"}},{"name":"link_role","in":"query","required":true,"schema":{"type":"string","description":"XBRL link_role URI to resolve","title":"Link Role"},"description":"XBRL link_role URI to resolve"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse_DisclosureHtmlPayload_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"x-codeSamples":[{"lang":"curl","label":"curl","source":"curl \"https://api.hub-equity.com/api/v1/filings/{filing_id}/disclosure-html\" \\\n  -H \"Authorization: Bearer $HUBEQ_API_KEY\""},{"lang":"Python","label":"Python","source":"import httpx\n\nheaders = {\"Authorization\": \"Bearer $HUBEQ_API_KEY\"}\nresp = httpx.get(\n    \"https://api.hub-equity.com/api/v1/filings/{filing_id}/disclosure-html\",\n    headers=headers,\n)\nresp.raise_for_status()\ndata = resp.json()[\"data\"]  # every response is wrapped in an envelope"}],"x-code-samples":[{"lang":"curl","label":"curl","source":"curl \"https://api.hub-equity.com/api/v1/filings/{filing_id}/disclosure-html\" \\\n  -H \"Authorization: Bearer $HUBEQ_API_KEY\""},{"lang":"Python","label":"Python","source":"import httpx\n\nheaders = {\"Authorization\": \"Bearer $HUBEQ_API_KEY\"}\nresp = httpx.get(\n    \"https://api.hub-equity.com/api/v1/filings/{filing_id}/disclosure-html\",\n    headers=headers,\n)\nresp.raise_for_status()\ndata = resp.json()[\"data\"]  # every response is wrapped in an envelope"}]}},"/api/v1/filings/{filing_id}/document":{"get":{"tags":["Filings"],"summary":"The filing's document as filed, for the in-app reader (Story 60.4)","description":"Fetched from the regulator's archive at the first request (SEC EDGAR, filings.xbrl.org, or the national package already cached for the note view), never stored in the database. Same fetch-on-demand contract as ``/disclosure-html``; this one returns the whole document instead of one note.","operationId":"get_filing_document_api_v1_filings__filing_id__document_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"filing_id","in":"path","required":true,"schema":{"type":"string","title":"Filing Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse_FilingDocumentPayload_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"x-codeSamples":[{"lang":"curl","label":"curl","source":"curl \"https://api.hub-equity.com/api/v1/filings/{filing_id}/document\" \\\n  -H \"Authorization: Bearer $HUBEQ_API_KEY\""},{"lang":"Python","label":"Python","source":"import httpx\n\nheaders = {\"Authorization\": \"Bearer $HUBEQ_API_KEY\"}\nresp = httpx.get(\n    \"https://api.hub-equity.com/api/v1/filings/{filing_id}/document\",\n    headers=headers,\n)\nresp.raise_for_status()\ndata = resp.json()[\"data\"]  # every response is wrapped in an envelope"}],"x-code-samples":[{"lang":"curl","label":"curl","source":"curl \"https://api.hub-equity.com/api/v1/filings/{filing_id}/document\" \\\n  -H \"Authorization: Bearer $HUBEQ_API_KEY\""},{"lang":"Python","label":"Python","source":"import httpx\n\nheaders = {\"Authorization\": \"Bearer $HUBEQ_API_KEY\"}\nresp = httpx.get(\n    \"https://api.hub-equity.com/api/v1/filings/{filing_id}/document\",\n    headers=headers,\n)\nresp.raise_for_status()\ndata = resp.json()[\"data\"]  # every response is wrapped in an envelope"}]}},"/api/v1/filings/{filing_id}/calculation-tree":{"get":{"tags":["Filings"],"summary":"XBRL calculation linkbase with filer and verifier weights (premium)","description":"Returns the **calculation arcs** declared by the filer in the XBRL calculation linkbase, augmented with Hub-Equity's verifier output. Each arc carries both `weight` (filer-declared ±1) and `corrected_weight` (verifier output when the filer's sign drifts from the actual filed values). `is_corrected=true` flags an individual sign drift. `corrected_count` on the tree gives the aggregate.\n\n**Two modes**:\n- Omit `link_role` → returns the list of calc sections (`{link_role, section_name, edge_count}[]`). Pick one and re-query with `link_role=…`.\n- Pass `link_role` → returns the full tree of edges for that section.","operationId":"get_calculation_tree_endpoint_api_v1_filings__filing_id__calculation_tree_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"filing_id","in":"path","required":true,"schema":{"type":"string","title":"Filing Id"}},{"name":"link_role","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"XBRL extended link role URI. Omit to list available sections, pass to fetch the tree for one section.","title":"Link Role"},"description":"XBRL extended link role URI. Omit to list available sections, pass to fetch the tree for one section."}],"responses":{"200":{"description":"Calculation sections list OR one section's tree.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse_Union_CalculationTree__CalculationSectionsResponse__"}}}},"404":{"description":"Filing not found."},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"x-codeSamples":[{"lang":"curl","label":"curl","source":"curl \"https://api.hub-equity.com/api/v1/filings/{filing_id}/calculation-tree\" \\\n  -H \"Authorization: Bearer $HUBEQ_API_KEY\""},{"lang":"Python","label":"Python","source":"from hub_equity import HubEquity\n\nclient = HubEquity(api_key=\"hubq_live_...\")  # premium\nsections = client.get_calculation_sections(\"<filing-uuid>\")\nprint(sections)"}],"x-code-samples":[{"lang":"curl","label":"curl","source":"curl \"https://api.hub-equity.com/api/v1/filings/{filing_id}/calculation-tree\" \\\n  -H \"Authorization: Bearer $HUBEQ_API_KEY\""},{"lang":"Python","label":"Python","source":"from hub_equity import HubEquity\n\nclient = HubEquity(api_key=\"hubq_live_...\")  # premium\nsections = client.get_calculation_sections(\"<filing-uuid>\")\nprint(sections)"}]}},"/api/v1/filings/{filing_id}/presentation-tree":{"get":{"tags":["Filings"],"summary":"XBRL presentation linkbase tree of a filing","description":"Returns the **presentation** linkbase of a filing as a nested tree (display ordering of concepts), each node carrying the Hub-Equity concept it feeds (`hub_concept_code`), when it feeds one. Use for forensic / power-user walks: 'show the full tree of the Apple FY24 10-K', 'walk the Cisco income statement nodes'.\n\nQuery params :\n- `link_role` — XBRL extended link role URI filter (passed as-is).\n- `statement` — shortcut : `income_statement` / `balance_sheet` / `cash_flow` / `equity` (core-statement arbitration on the section role, disclosures excluded).\n\nCapped at 200 nodes (deepest dropped first, with a note). DIFFERENT from `/calculation-tree` (the calc linkbase value-path weights, premium).","operationId":"get_filing_presentation_tree_api_v1_filings__filing_id__presentation_tree_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"filing_id","in":"path","required":true,"schema":{"type":"string","title":"Filing Id"}},{"name":"link_role","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"XBRL extended link role URI filter. Omit for the full tree.","title":"Link Role"},"description":"XBRL extended link role URI filter. Omit for the full tree."},{"name":"statement","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Statement shortcut: income_statement / balance_sheet / cash_flow / equity. Core-statement arbitration on the section role; disclosures (Parenthetical, Details, Tables...) are excluded.","title":"Statement"},"description":"Statement shortcut: income_statement / balance_sheet / cash_flow / equity. Core-statement arbitration on the section role; disclosures (Parenthetical, Details, Tables...) are excluded."}],"responses":{"200":{"description":"The presentation tree (or empty + note).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse_FilingCalcTreeResult_"}}}},"404":{"description":"Filing not found."},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"x-codeSamples":[{"lang":"curl","label":"curl","source":"curl \"https://api.hub-equity.com/api/v1/filings/{filing_id}/presentation-tree\" \\\n  -H \"Authorization: Bearer $HUBEQ_API_KEY\""},{"lang":"Python","label":"Python","source":"import httpx\n\nheaders = {\"Authorization\": \"Bearer $HUBEQ_API_KEY\"}\nresp = httpx.get(\n    \"https://api.hub-equity.com/api/v1/filings/{filing_id}/presentation-tree\",\n    headers=headers,\n)\nresp.raise_for_status()\ndata = resp.json()[\"data\"]  # every response is wrapped in an envelope"}],"x-code-samples":[{"lang":"curl","label":"curl","source":"curl \"https://api.hub-equity.com/api/v1/filings/{filing_id}/presentation-tree\" \\\n  -H \"Authorization: Bearer $HUBEQ_API_KEY\""},{"lang":"Python","label":"Python","source":"import httpx\n\nheaders = {\"Authorization\": \"Bearer $HUBEQ_API_KEY\"}\nresp = httpx.get(\n    \"https://api.hub-equity.com/api/v1/filings/{filing_id}/presentation-tree\",\n    headers=headers,\n)\nresp.raise_for_status()\ndata = resp.json()[\"data\"]  # every response is wrapped in an envelope"}]}},"/api/v1/filings/{filing_id}/facts":{"get":{"tags":["Filings"],"summary":"Paginated raw XBRL facts for a filing","description":"Paginated list of the facts declared in one filing, as filed (before normalization). The lowest-level primitive of the API.\n\nFilters :\n- `section` — restrict to one presentation link role (exact match). Use the `link_role` URIs returned by `GET /entities/{id}/disclosures` or `GET /filings/{id}/calculation-tree`.\n- `concept`: case-insensitive substring match on `concept_qname` (e.g. `Revenue`, `us-gaap:Stockholders`).\n- `is_extension` — true/false filter on filer-defined extensions.\n- `limit` 1-1000 (default 200), `offset` for pagination.\n\nEach fact carries its qname, unit, decimals, period, dimensions and presentation place on every plan. The filed values (`value_numeric`, `value_text`, `value_boolean`) need the `facts.premium` scope: below it they are null and a note says so, as the site's Raw Data screen blurs them. The filing itself stays readable on every plan (`/filings/{id}/document`): what a paid plan adds here is the paged, filtered table of values.","operationId":"get_filing_raw_facts_api_v1_filings__filing_id__facts_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"filing_id","in":"path","required":true,"schema":{"type":"string","title":"Filing Id"}},{"name":"section","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"XBRL presentation link role URI (exact match). Omit to scan all sections.","title":"Section"},"description":"XBRL presentation link role URI (exact match). Omit to scan all sections."},{"name":"concept","in":"query","required":false,"schema":{"anyOf":[{"type":"string","minLength":2,"maxLength":200},{"type":"null"}],"description":"Case-insensitive substring match on `concept_qname` (e.g. `Revenue`, `us-gaap:Stock`).","title":"Concept"},"description":"Case-insensitive substring match on `concept_qname` (e.g. `Revenue`, `us-gaap:Stock`)."},{"name":"is_extension","in":"query","required":false,"schema":{"anyOf":[{"type":"boolean"},{"type":"null"}],"description":"Filter to filer-defined extensions only when true.","title":"Is Extension"},"description":"Filter to filer-defined extensions only when true."},{"name":"page","in":"query","required":false,"schema":{"anyOf":[{"type":"integer","minimum":1},{"type":"null"}],"description":"Page number (1-based). Public idiom; overrides offset.","title":"Page"},"description":"Page number (1-based). Public idiom; overrides offset."},{"name":"per_page","in":"query","required":false,"schema":{"anyOf":[{"type":"integer","maximum":200,"minimum":1},{"type":"null"}],"description":"Rows per page (1-200). Overrides limit. Quants needing bigger pages can still use the legacy `limit` (up to 1000).","title":"Per Page"},"description":"Rows per page (1-200). Overrides limit. Quants needing bigger pages can still use the legacy `limit` (up to 1000)."},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":1000,"minimum":1,"default":200,"title":"Limit"}},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","minimum":0,"default":0,"title":"Offset"}}],"responses":{"200":{"description":"Paginated raw facts.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse_RawFactsResponse_"}}}},"404":{"description":"Filing not found."},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"x-codeSamples":[{"lang":"curl","label":"curl","source":"curl \"https://api.hub-equity.com/api/v1/filings/{filing_id}/facts\" \\\n  -H \"Authorization: Bearer $HUBEQ_API_KEY\""},{"lang":"Python","label":"Python","source":"from hub_equity import HubEquity\n\nclient = HubEquity()\n# Stream every raw fact, page by page (follows links.next):\nfor fact in client.iter_filing_facts(\"<filing-uuid>\"):\n    print(fact.concept_qname, fact.value_numeric, fact.unit)"}],"x-code-samples":[{"lang":"curl","label":"curl","source":"curl \"https://api.hub-equity.com/api/v1/filings/{filing_id}/facts\" \\\n  -H \"Authorization: Bearer $HUBEQ_API_KEY\""},{"lang":"Python","label":"Python","source":"from hub_equity import HubEquity\n\nclient = HubEquity()\n# Stream every raw fact, page by page (follows links.next):\nfor fact in client.iter_filing_facts(\"<filing-uuid>\"):\n    print(fact.concept_qname, fact.value_numeric, fact.unit)"}]}},"/api/v1/filings/{filing_id}/quality-grade":{"get":{"tags":["Filings"],"summary":"A-F quality grade for one filing","description":"Returns a deterministic A-F quality grade for the filing along with the 4 underlying signals (coverage, consistency, validation, extension restraint) so callers can compute their own weighting if needed.\n\nUse cases :\n- **Pre-screen** before deep analysis — analysts can filter out F-grade filings up front.\n- **Audit risk flag**: banking and insurance filers with heavy extension usage can score lower: thresholds are uniform across sectors.\n- **Coverage gap analytics** — `drivers[].details.populated_concepts` carries the raw count for cross-filing benchmarking.\n\nA Free key is enough. Filing must have ``status='complete'`` ; 422 otherwise.","operationId":"get_filing_quality_grade_api_v1_filings__filing_id__quality_grade_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"filing_id","in":"path","required":true,"schema":{"type":"string","title":"Filing Id"}}],"responses":{"200":{"description":"Quality grade with per-driver breakdown.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse_QualityGradeResponse_"}}}},"404":{"description":"Filing not found."},"422":{"description":"Filing not yet processed (status != 'complete')."}},"x-codeSamples":[{"lang":"curl","label":"curl","source":"curl \"https://api.hub-equity.com/api/v1/filings/{filing_id}/quality-grade\" \\\n  -H \"Authorization: Bearer $HUBEQ_API_KEY\""},{"lang":"Python","label":"Python","source":"from hub_equity import HubEquity\n\nclient = HubEquity()\ngrade = client.get_filing_quality_grade(\"<filing-uuid>\")\nprint(grade)"}],"x-code-samples":[{"lang":"curl","label":"curl","source":"curl \"https://api.hub-equity.com/api/v1/filings/{filing_id}/quality-grade\" \\\n  -H \"Authorization: Bearer $HUBEQ_API_KEY\""},{"lang":"Python","label":"Python","source":"from hub_equity import HubEquity\n\nclient = HubEquity()\ngrade = client.get_filing_quality_grade(\"<filing-uuid>\")\nprint(grade)"}]}},"/api/v1/filings/{filing_id}/validation-results":{"get":{"tags":["Filings"],"summary":"XBRL accounting / calculation linkbase checks for a filing","description":"Surfaces the accounting and calculation checks run on a filing: `accounting_equation` (A = L + E), `calculation` (calc linkbase parent ≈ Σ children × weight), and `hub_calculation` (rollup consistency).\n\nDefault `status_filter` = `['warning','error']` (the rows analysts care about) ; pass `['valid','skipped']` to see silent successes. Sorted by severity then |relative_difference|, capped at 100 rows.\n\nDistinct from `/filings/{id}/quality-grade` (the A-F aggregate) — this returns the per-check audit trail.","operationId":"get_filing_validation_results_api_v1_filings__filing_id__validation_results_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"filing_id","in":"path","required":true,"schema":{"type":"string","title":"Filing Id"}},{"name":"fiscal_year","in":"query","required":false,"schema":{"anyOf":[{"type":"integer","maximum":2100,"minimum":1990},{"type":"null"}],"description":"Restrict to one fiscal year.","title":"Fiscal Year"},"description":"Restrict to one fiscal year."},{"name":"status_filter","in":"query","required":false,"schema":{"anyOf":[{"type":"array","items":{"type":"string"}},{"type":"null"}],"description":"Statuses to include. Default ['warning','error']. Repeat the param for multiple (e.g. ?status_filter=valid&status_filter=skipped).","title":"Status Filter"},"description":"Statuses to include. Default ['warning','error']. Repeat the param for multiple (e.g. ?status_filter=valid&status_filter=skipped)."}],"responses":{"200":{"description":"Validation checks for the filing.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse_ValidationResult_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"x-codeSamples":[{"lang":"curl","label":"curl","source":"curl \"https://api.hub-equity.com/api/v1/filings/{filing_id}/validation-results\" \\\n  -H \"Authorization: Bearer $HUBEQ_API_KEY\""},{"lang":"Python","label":"Python","source":"import httpx\n\nheaders = {\"Authorization\": \"Bearer $HUBEQ_API_KEY\"}\nresp = httpx.get(\n    \"https://api.hub-equity.com/api/v1/filings/{filing_id}/validation-results\",\n    headers=headers,\n)\nresp.raise_for_status()\ndata = resp.json()[\"data\"]  # every response is wrapped in an envelope"}],"x-code-samples":[{"lang":"curl","label":"curl","source":"curl \"https://api.hub-equity.com/api/v1/filings/{filing_id}/validation-results\" \\\n  -H \"Authorization: Bearer $HUBEQ_API_KEY\""},{"lang":"Python","label":"Python","source":"import httpx\n\nheaders = {\"Authorization\": \"Bearer $HUBEQ_API_KEY\"}\nresp = httpx.get(\n    \"https://api.hub-equity.com/api/v1/filings/{filing_id}/validation-results\",\n    headers=headers,\n)\nresp.raise_for_status()\ndata = resp.json()[\"data\"]  # every response is wrapped in an envelope"}]}},"/api/v1/entities/{entity_id}/financials":{"get":{"tags":["Financials"],"summary":"Get entity financials","description":"Retrieve normalized financial data for an entity. Accepts UUID or ticker.","operationId":"get_financials_api_v1_entities__entity_id__financials_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"entity_id","in":"path","required":true,"schema":{"type":"string","title":"Entity Id"}},{"name":"years","in":"query","required":false,"schema":{"type":"integer","maximum":99,"minimum":1,"description":"Number of years. `99` = all years available.","default":3,"title":"Years"},"description":"Number of years. `99` = all years available."},{"name":"category","in":"query","required":false,"schema":{"type":"string","description":"Category filter","default":"all","title":"Category"},"description":"Category filter"},{"name":"currency","in":"query","required":false,"schema":{"anyOf":[{"type":"string","minLength":3,"maxLength":3},{"type":"null"}],"description":"Display currency (ISO 4217, e.g. USD, EUR). Defaults to entity's native currency.","title":"Currency"},"description":"Display currency (ISO 4217, e.g. USD, EUR). Defaults to entity's native currency."},{"name":"rate_method","in":"query","required":false,"schema":{"type":"string","description":"FX conversion method: 'ias21' (IAS 21 dual-rate, default), 'spot' (single closing rate), 'native' (no conversion).","default":"ias21","title":"Rate Method"},"description":"FX conversion method: 'ias21' (IAS 21 dual-rate, default), 'spot' (single closing rate), 'native' (no conversion)."},{"name":"constant_currency_base_year","in":"query","required":false,"schema":{"anyOf":[{"type":"integer","maximum":2100,"minimum":1900},{"type":"null"}],"description":"Translate all years using the base year's FX rate to isolate organic growth from currency moves. Each MetricValue returns reported_value + fx_impact alongside the constant-currency value.","title":"Constant Currency Base Year"},"description":"Translate all years using the base year's FX rate to isolate organic growth from currency moves. Each MetricValue returns reported_value + fx_impact alongside the constant-currency value."},{"name":"end_year","in":"query","required":false,"schema":{"anyOf":[{"type":"integer","maximum":2100,"minimum":1900},{"type":"null"}],"description":"Anchor the rolling window at this fiscal year (inclusive). When set, the response returns up to `years` periods ending at `end_year` instead of the latest N.","title":"End Year"},"description":"Anchor the rolling window at this fiscal year (inclusive). When set, the response returns up to `years` periods ending at `end_year` instead of the latest N."},{"name":"tiers","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Comparability tier filter (comma-separated subset of `core,extended,detail`). Omit ⇒ serve every tier (each metric still carries its own `tier` in the envelope). A cross-entity consumer (compare / screener / SDK) passes `tiers=core` (or `core,extended`) to guarantee comparability. Fail-open: a metric whose tier is unknown is treated as `core` and never silently hidden.","title":"Tiers"},"description":"Comparability tier filter (comma-separated subset of `core,extended,detail`). Omit ⇒ serve every tier (each metric still carries its own `tier` in the envelope). A cross-entity consumer (compare / screener / SDK) passes `tiers=core` (or `core,extended`) to guarantee comparability. Fail-open: a metric whose tier is unknown is treated as `core` and never silently hidden."},{"name":"view","in":"query","required":false,"schema":{"type":"string","description":"Payload shape. `full` (default) returns every field (audit / quality / provenance / per-cell FX metadata). `compare` returns only the comparison essentials (headline value + formatting + restatement flags + column-header metadata), dropping the audit metadata and every null field. ~8x smaller decoded — use it for cross-entity fan-out where full depth is reached on a follow-up single-entity call.","default":"full","title":"View"},"description":"Payload shape. `full` (default) returns every field (audit / quality / provenance / per-cell FX metadata). `compare` returns only the comparison essentials (headline value + formatting + restatement flags + column-header metadata), dropping the audit metadata and every null field. ~8x smaller decoded — use it for cross-entity fan-out where full depth is reached on a follow-up single-entity call."}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse_FinancialsResponse_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"x-codeSamples":[{"lang":"curl","label":"curl","source":"curl \"https://api.hub-equity.com/api/v1/entities/{entity_id}/financials\" \\\n  -H \"Authorization: Bearer $HUBEQ_API_KEY\""},{"lang":"Python","label":"Python","source":"import httpx\n\nheaders = {\"Authorization\": \"Bearer $HUBEQ_API_KEY\"}\nresp = httpx.get(\n    \"https://api.hub-equity.com/api/v1/entities/{entity_id}/financials\",\n    headers=headers,\n)\nresp.raise_for_status()\ndata = resp.json()[\"data\"]  # every response is wrapped in an envelope"}],"x-code-samples":[{"lang":"curl","label":"curl","source":"curl \"https://api.hub-equity.com/api/v1/entities/{entity_id}/financials\" \\\n  -H \"Authorization: Bearer $HUBEQ_API_KEY\""},{"lang":"Python","label":"Python","source":"import httpx\n\nheaders = {\"Authorization\": \"Bearer $HUBEQ_API_KEY\"}\nresp = httpx.get(\n    \"https://api.hub-equity.com/api/v1/entities/{entity_id}/financials\",\n    headers=headers,\n)\nresp.raise_for_status()\ndata = resp.json()[\"data\"]  # every response is wrapped in an envelope"}]}},"/api/v1/entities/{entity_id}/financials/has-segments":{"get":{"tags":["Financials"],"summary":"Check if entity has segment data","description":"Check if entity has any dimensional/segment data.","operationId":"check_has_segments_api_v1_entities__entity_id__financials_has_segments_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"entity_id","in":"path","required":true,"schema":{"type":"string","title":"Entity Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse_dict_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"x-codeSamples":[{"lang":"curl","label":"curl","source":"curl \"https://api.hub-equity.com/api/v1/entities/{entity_id}/financials/has-segments\" \\\n  -H \"Authorization: Bearer $HUBEQ_API_KEY\""},{"lang":"Python","label":"Python","source":"import httpx\n\nheaders = {\"Authorization\": \"Bearer $HUBEQ_API_KEY\"}\nresp = httpx.get(\n    \"https://api.hub-equity.com/api/v1/entities/{entity_id}/financials/has-segments\",\n    headers=headers,\n)\nresp.raise_for_status()\ndata = resp.json()[\"data\"]  # every response is wrapped in an envelope"}],"x-code-samples":[{"lang":"curl","label":"curl","source":"curl \"https://api.hub-equity.com/api/v1/entities/{entity_id}/financials/has-segments\" \\\n  -H \"Authorization: Bearer $HUBEQ_API_KEY\""},{"lang":"Python","label":"Python","source":"import httpx\n\nheaders = {\"Authorization\": \"Bearer $HUBEQ_API_KEY\"}\nresp = httpx.get(\n    \"https://api.hub-equity.com/api/v1/entities/{entity_id}/financials/has-segments\",\n    headers=headers,\n)\nresp.raise_for_status()\ndata = resp.json()[\"data\"]  # every response is wrapped in an envelope"}]}},"/api/v1/entities/{entity_id}/financials/breakdown":{"get":{"tags":["Financials"],"summary":"Get axis-grouped dimensional breakdown for an entity","description":"Returns the dimensional decomposition of a metric grouped by XBRL axis. Includes reconciliation (sum_to_consolidated) and is_additive flag. Without the `facts.premium` scope, the axes are listed with their consolidated totals but `members` is empty.\n\n`metric` is OPTIONAL. Omit it to let the service elect one it can actually render (`metric_selection=auto_selected`). Supply it and it is **never** replaced by another: an entity that does not tag that metric dimensionally yields the same metric with `axes: []` and `metric_selection=requested_not_dimensional`, and `available_metrics` lists what it does tag. Read `metric_selection`, not just `metric`.","operationId":"get_breakdown_api_v1_entities__entity_id__financials_breakdown_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"entity_id","in":"path","required":true,"schema":{"type":"string","title":"Entity Id"}},{"name":"metric","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Hub concept code. Omit to let the service elect a renderable one. A supplied code is served or reported as non-dimensional, never swapped for another.","title":"Metric"},"description":"Hub concept code. Omit to let the service elect a renderable one. A supplied code is served or reported as non-dimensional, never swapped for another."},{"name":"years","in":"query","required":false,"schema":{"type":"integer","maximum":10,"minimum":1,"description":"Lookback period","default":5,"title":"Years"},"description":"Lookback period"},{"name":"fiscal_year","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"description":"Optional single fiscal year","title":"Fiscal Year"},"description":"Optional single fiscal year"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse_BreakdownResponse_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"x-codeSamples":[{"lang":"curl","label":"curl","source":"curl \"https://api.hub-equity.com/api/v1/entities/{entity_id}/financials/breakdown\" \\\n  -H \"Authorization: Bearer $HUBEQ_API_KEY\""},{"lang":"Python","label":"Python","source":"import httpx\n\nheaders = {\"Authorization\": \"Bearer $HUBEQ_API_KEY\"}\nresp = httpx.get(\n    \"https://api.hub-equity.com/api/v1/entities/{entity_id}/financials/breakdown\",\n    headers=headers,\n)\nresp.raise_for_status()\ndata = resp.json()[\"data\"]  # every response is wrapped in an envelope"}],"x-code-samples":[{"lang":"curl","label":"curl","source":"curl \"https://api.hub-equity.com/api/v1/entities/{entity_id}/financials/breakdown\" \\\n  -H \"Authorization: Bearer $HUBEQ_API_KEY\""},{"lang":"Python","label":"Python","source":"import httpx\n\nheaders = {\"Authorization\": \"Bearer $HUBEQ_API_KEY\"}\nresp = httpx.get(\n    \"https://api.hub-equity.com/api/v1/entities/{entity_id}/financials/breakdown\",\n    headers=headers,\n)\nresp.raise_for_status()\ndata = resp.json()[\"data\"]  # every response is wrapped in an envelope"}]}},"/api/v1/entities/{entity_id}/financials/has-dimensions":{"get":{"tags":["Financials"],"summary":"Batch check dimensional availability per metric","description":"Returns a {metric: [fiscal years]} map listing, for the requested hub concept codes, the fiscal years that carry dimensional data.","operationId":"has_dimensions_api_v1_entities__entity_id__financials_has_dimensions_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"entity_id","in":"path","required":true,"schema":{"type":"string","title":"Entity Id"}},{"name":"metrics","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Comma-separated hub concept codes (e.g. REVENUE,NET_INCOME). Omitted: every dimensional hub concept of the entity.","title":"Metrics"},"description":"Comma-separated hub concept codes (e.g. REVENUE,NET_INCOME). Omitted: every dimensional hub concept of the entity."}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse_HasDimensionsResponse_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"x-codeSamples":[{"lang":"curl","label":"curl","source":"curl \"https://api.hub-equity.com/api/v1/entities/{entity_id}/financials/has-dimensions\" \\\n  -H \"Authorization: Bearer $HUBEQ_API_KEY\""},{"lang":"Python","label":"Python","source":"import httpx\n\nheaders = {\"Authorization\": \"Bearer $HUBEQ_API_KEY\"}\nresp = httpx.get(\n    \"https://api.hub-equity.com/api/v1/entities/{entity_id}/financials/has-dimensions\",\n    headers=headers,\n)\nresp.raise_for_status()\ndata = resp.json()[\"data\"]  # every response is wrapped in an envelope"}],"x-code-samples":[{"lang":"curl","label":"curl","source":"curl \"https://api.hub-equity.com/api/v1/entities/{entity_id}/financials/has-dimensions\" \\\n  -H \"Authorization: Bearer $HUBEQ_API_KEY\""},{"lang":"Python","label":"Python","source":"import httpx\n\nheaders = {\"Authorization\": \"Bearer $HUBEQ_API_KEY\"}\nresp = httpx.get(\n    \"https://api.hub-equity.com/api/v1/entities/{entity_id}/financials/has-dimensions\",\n    headers=headers,\n)\nresp.raise_for_status()\ndata = resp.json()[\"data\"]  # every response is wrapped in an envelope"}]}},"/api/v1/entities/{entity_id}/financials/group":{"get":{"tags":["Financials"],"summary":"Legal-entity group view: parent + filing subsidiaries","description":"For a combined filer (FERC-style regulated utilities, holdcos), returns the parent plus each filing subsidiary's STANDALONE financials carried on dei:LegalEntityAxis. SCOPE view, NOT a decomposition: members are parallel registrants and do NOT sum to the consolidated parent. `is_group=false` when the entity is not an eligible combined-filing group.","operationId":"get_legal_entity_group_api_v1_entities__entity_id__financials_group_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"entity_id","in":"path","required":true,"schema":{"type":"string","title":"Entity Id"}},{"name":"fiscal_year","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"description":"Optional snapshot year (default: latest year with member data)","title":"Fiscal Year"},"description":"Optional snapshot year (default: latest year with member data)"},{"name":"size_metric","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Hub concept code driving node size (default TOTAL_ASSETS)","title":"Size Metric"},"description":"Hub concept code driving node size (default TOTAL_ASSETS)"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse_LegalEntityGroupResponse_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"x-codeSamples":[{"lang":"curl","label":"curl","source":"curl \"https://api.hub-equity.com/api/v1/entities/{entity_id}/financials/group\" \\\n  -H \"Authorization: Bearer $HUBEQ_API_KEY\""},{"lang":"Python","label":"Python","source":"import httpx\n\nheaders = {\"Authorization\": \"Bearer $HUBEQ_API_KEY\"}\nresp = httpx.get(\n    \"https://api.hub-equity.com/api/v1/entities/{entity_id}/financials/group\",\n    headers=headers,\n)\nresp.raise_for_status()\ndata = resp.json()[\"data\"]  # every response is wrapped in an envelope"}],"x-code-samples":[{"lang":"curl","label":"curl","source":"curl \"https://api.hub-equity.com/api/v1/entities/{entity_id}/financials/group\" \\\n  -H \"Authorization: Bearer $HUBEQ_API_KEY\""},{"lang":"Python","label":"Python","source":"import httpx\n\nheaders = {\"Authorization\": \"Bearer $HUBEQ_API_KEY\"}\nresp = httpx.get(\n    \"https://api.hub-equity.com/api/v1/entities/{entity_id}/financials/group\",\n    headers=headers,\n)\nresp.raise_for_status()\ndata = resp.json()[\"data\"]  # every response is wrapped in an envelope"}]}},"/api/v1/entities/{entity_id}/financials/has-group":{"get":{"tags":["Financials"],"summary":"Is this entity an eligible legal-entity group?","description":"Lightweight boolean gate that returns `{ \"is_group\": true }` when the entity files combined statements that break out standalone subsidiaries on a `dei:LegalEntityAxis` (typically FERC utilities). Use it to decide whether to offer the **Group** view / the `/financials/group` endpoint before making the heavier call.","operationId":"has_group_api_v1_entities__entity_id__financials_has_group_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"entity_id","in":"path","required":true,"schema":{"type":"string","title":"Entity Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse_dict_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"x-codeSamples":[{"lang":"curl","label":"curl","source":"curl \"https://api.hub-equity.com/api/v1/entities/{entity_id}/financials/has-group\" \\\n  -H \"Authorization: Bearer $HUBEQ_API_KEY\""},{"lang":"Python","label":"Python","source":"import httpx\n\nheaders = {\"Authorization\": \"Bearer $HUBEQ_API_KEY\"}\nresp = httpx.get(\n    \"https://api.hub-equity.com/api/v1/entities/{entity_id}/financials/has-group\",\n    headers=headers,\n)\nresp.raise_for_status()\ndata = resp.json()[\"data\"]  # every response is wrapped in an envelope"}],"x-code-samples":[{"lang":"curl","label":"curl","source":"curl \"https://api.hub-equity.com/api/v1/entities/{entity_id}/financials/has-group\" \\\n  -H \"Authorization: Bearer $HUBEQ_API_KEY\""},{"lang":"Python","label":"Python","source":"import httpx\n\nheaders = {\"Authorization\": \"Bearer $HUBEQ_API_KEY\"}\nresp = httpx.get(\n    \"https://api.hub-equity.com/api/v1/entities/{entity_id}/financials/has-group\",\n    headers=headers,\n)\nresp.raise_for_status()\ndata = resp.json()[\"data\"]  # every response is wrapped in an envelope"}]}},"/api/v1/entities/{entity_id}/financials/group/member":{"get":{"tags":["Financials"],"summary":"One filing subsidiary's standalone statements","description":"Drill-down for the Group view: the standalone financials of a single filing subsidiary (dei:LegalEntityAxis member), grouped into statement sections, as filed in the parent's combined report.","operationId":"get_group_member_api_v1_entities__entity_id__financials_group_member_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"entity_id","in":"path","required":true,"schema":{"type":"string","title":"Entity Id"}},{"name":"member","in":"query","required":true,"schema":{"type":"string","description":"dei:LegalEntityAxis member qname","title":"Member"},"description":"dei:LegalEntityAxis member qname"},{"name":"years","in":"query","required":false,"schema":{"type":"integer","maximum":20,"minimum":1,"description":"Number of fiscal years","default":5,"title":"Years"},"description":"Number of fiscal years"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse_LegalEntityMemberResponse_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"x-codeSamples":[{"lang":"curl","label":"curl","source":"curl \"https://api.hub-equity.com/api/v1/entities/{entity_id}/financials/group/member\" \\\n  -H \"Authorization: Bearer $HUBEQ_API_KEY\""},{"lang":"Python","label":"Python","source":"import httpx\n\nheaders = {\"Authorization\": \"Bearer $HUBEQ_API_KEY\"}\nresp = httpx.get(\n    \"https://api.hub-equity.com/api/v1/entities/{entity_id}/financials/group/member\",\n    headers=headers,\n)\nresp.raise_for_status()\ndata = resp.json()[\"data\"]  # every response is wrapped in an envelope"}],"x-code-samples":[{"lang":"curl","label":"curl","source":"curl \"https://api.hub-equity.com/api/v1/entities/{entity_id}/financials/group/member\" \\\n  -H \"Authorization: Bearer $HUBEQ_API_KEY\""},{"lang":"Python","label":"Python","source":"import httpx\n\nheaders = {\"Authorization\": \"Bearer $HUBEQ_API_KEY\"}\nresp = httpx.get(\n    \"https://api.hub-equity.com/api/v1/entities/{entity_id}/financials/group/member\",\n    headers=headers,\n)\nresp.raise_for_status()\ndata = resp.json()[\"data\"]  # every response is wrapped in an envelope"}]}},"/api/v1/entities/{entity_id}/financials/intersections":{"get":{"tags":["Financials"],"summary":"Get 2-axis intersection cube for an entity × metric × fiscal_year","description":"Returns a pivot of values at the crossroads of two XBRL axes (e.g. Geography × Segment). Complements `/financials/breakdown`, which returns single-axis members only. Picks the largest available pair automatically, or accepts explicit row_axis_qname / col_axis_qname. Requires the `facts.premium` scope (401 anonymous, 403 Free key).","operationId":"get_intersections_api_v1_entities__entity_id__financials_intersections_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"entity_id","in":"path","required":true,"schema":{"type":"string","title":"Entity Id"}},{"name":"metric","in":"query","required":false,"schema":{"type":"string","description":"Hub concept code","default":"REVENUE","title":"Metric"},"description":"Hub concept code"},{"name":"fiscal_year","in":"query","required":true,"schema":{"type":"integer","description":"Fiscal year","title":"Fiscal Year"},"description":"Fiscal year"},{"name":"row_axis_qname","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Optional explicit row axis qname","title":"Row Axis Qname"},"description":"Optional explicit row axis qname"},{"name":"col_axis_qname","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Optional explicit col axis qname","title":"Col Axis Qname"},"description":"Optional explicit col axis qname"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse_IntersectionCube_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"x-codeSamples":[{"lang":"curl","label":"curl","source":"curl \"https://api.hub-equity.com/api/v1/entities/{entity_id}/financials/intersections\" \\\n  -H \"Authorization: Bearer $HUBEQ_API_KEY\""},{"lang":"Python","label":"Python","source":"import httpx\n\nheaders = {\"Authorization\": \"Bearer $HUBEQ_API_KEY\"}\nresp = httpx.get(\n    \"https://api.hub-equity.com/api/v1/entities/{entity_id}/financials/intersections\",\n    headers=headers,\n)\nresp.raise_for_status()\ndata = resp.json()[\"data\"]  # every response is wrapped in an envelope"}],"x-code-samples":[{"lang":"curl","label":"curl","source":"curl \"https://api.hub-equity.com/api/v1/entities/{entity_id}/financials/intersections\" \\\n  -H \"Authorization: Bearer $HUBEQ_API_KEY\""},{"lang":"Python","label":"Python","source":"import httpx\n\nheaders = {\"Authorization\": \"Bearer $HUBEQ_API_KEY\"}\nresp = httpx.get(\n    \"https://api.hub-equity.com/api/v1/entities/{entity_id}/financials/intersections\",\n    headers=headers,\n)\nresp.raise_for_status()\ndata = resp.json()[\"data\"]  # every response is wrapped in an envelope"}]}},"/api/v1/entities/{entity_id}/financials/flow":{"get":{"tags":["Financials"],"summary":"Get income statement flow data for Sankey diagram","description":"Get Sankey flow data for income statement visualization.","operationId":"get_flow_api_v1_entities__entity_id__financials_flow_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"entity_id","in":"path","required":true,"schema":{"type":"string","title":"Entity Id"}},{"name":"year","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"description":"Fiscal year (defaults to latest)","title":"Year"},"description":"Fiscal year (defaults to latest)"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse_FlowResponse_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"x-codeSamples":[{"lang":"curl","label":"curl","source":"curl \"https://api.hub-equity.com/api/v1/entities/{entity_id}/financials/flow\" \\\n  -H \"Authorization: Bearer $HUBEQ_API_KEY\""},{"lang":"Python","label":"Python","source":"import httpx\n\nheaders = {\"Authorization\": \"Bearer $HUBEQ_API_KEY\"}\nresp = httpx.get(\n    \"https://api.hub-equity.com/api/v1/entities/{entity_id}/financials/flow\",\n    headers=headers,\n)\nresp.raise_for_status()\ndata = resp.json()[\"data\"]  # every response is wrapped in an envelope"}],"x-code-samples":[{"lang":"curl","label":"curl","source":"curl \"https://api.hub-equity.com/api/v1/entities/{entity_id}/financials/flow\" \\\n  -H \"Authorization: Bearer $HUBEQ_API_KEY\""},{"lang":"Python","label":"Python","source":"import httpx\n\nheaders = {\"Authorization\": \"Bearer $HUBEQ_API_KEY\"}\nresp = httpx.get(\n    \"https://api.hub-equity.com/api/v1/entities/{entity_id}/financials/flow\",\n    headers=headers,\n)\nresp.raise_for_status()\ndata = resp.json()[\"data\"]  # every response is wrapped in an envelope"}]}},"/api/v1/entities/{entity_id}/financials/snowflake":{"get":{"tags":["Financials"],"summary":"Get snowflake radar scores","description":"Deprecated. Five-axis radar scores for an entity. Will be removed.","operationId":"get_snowflake_api_v1_entities__entity_id__financials_snowflake_get","deprecated":true,"security":[{"HTTPBearer":[]}],"parameters":[{"name":"entity_id","in":"path","required":true,"schema":{"type":"string","title":"Entity Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse_SnowflakeResponse_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"x-codeSamples":[{"lang":"curl","label":"curl","source":"curl \"https://api.hub-equity.com/api/v1/entities/{entity_id}/financials/snowflake\" \\\n  -H \"Authorization: Bearer $HUBEQ_API_KEY\""},{"lang":"Python","label":"Python","source":"import httpx\n\nheaders = {\"Authorization\": \"Bearer $HUBEQ_API_KEY\"}\nresp = httpx.get(\n    \"https://api.hub-equity.com/api/v1/entities/{entity_id}/financials/snowflake\",\n    headers=headers,\n)\nresp.raise_for_status()\ndata = resp.json()[\"data\"]  # every response is wrapped in an envelope"}],"x-code-samples":[{"lang":"curl","label":"curl","source":"curl \"https://api.hub-equity.com/api/v1/entities/{entity_id}/financials/snowflake\" \\\n  -H \"Authorization: Bearer $HUBEQ_API_KEY\""},{"lang":"Python","label":"Python","source":"import httpx\n\nheaders = {\"Authorization\": \"Bearer $HUBEQ_API_KEY\"}\nresp = httpx.get(\n    \"https://api.hub-equity.com/api/v1/entities/{entity_id}/financials/snowflake\",\n    headers=headers,\n)\nresp.raise_for_status()\ndata = resp.json()[\"data\"]  # every response is wrapped in an envelope"}]}},"/api/v1/entities/{entity_id}/disclosures":{"get":{"tags":["Disclosures"],"summary":"Get the disclosures catalog for an entity","description":"Returns the catalog of disclosure sections (Lease Maturity, Debt Maturity, Tax Rate Reconciliation, Goodwill Rollforward, etc.) available on the entity's latest annual filing. Each entry lists the link_role, a beautified label, the count of numeric concepts, and `has_native_html`, true when the SEC filing publishes the section as a native HTML table (fetch it with `GET /filings/{id}/disclosure-html`). Sections with <3 numeric concepts are dropped (header skeletons). Primary statements (Balance Sheet, Income Statement, Cash Flow, Comprehensive Income, Equity) and regulator metadata (Pay-vs-Perf, Insider Trading, Cover Page, Auditor) are excluded. ESEF filings and older SEC filings degrade gracefully to an empty list.","operationId":"get_disclosures_api_v1_entities__entity_id__disclosures_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"entity_id","in":"path","required":true,"schema":{"type":"string","title":"Entity Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse_DisclosuresResponse_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"x-codeSamples":[{"lang":"curl","label":"curl","source":"curl \"https://api.hub-equity.com/api/v1/entities/{entity_id}/disclosures\" \\\n  -H \"Authorization: Bearer $HUBEQ_API_KEY\""},{"lang":"Python","label":"Python","source":"import httpx\n\nheaders = {\"Authorization\": \"Bearer $HUBEQ_API_KEY\"}\nresp = httpx.get(\n    \"https://api.hub-equity.com/api/v1/entities/{entity_id}/disclosures\",\n    headers=headers,\n)\nresp.raise_for_status()\ndata = resp.json()[\"data\"]  # every response is wrapped in an envelope"}],"x-code-samples":[{"lang":"curl","label":"curl","source":"curl \"https://api.hub-equity.com/api/v1/entities/{entity_id}/disclosures\" \\\n  -H \"Authorization: Bearer $HUBEQ_API_KEY\""},{"lang":"Python","label":"Python","source":"import httpx\n\nheaders = {\"Authorization\": \"Bearer $HUBEQ_API_KEY\"}\nresp = httpx.get(\n    \"https://api.hub-equity.com/api/v1/entities/{entity_id}/disclosures\",\n    headers=headers,\n)\nresp.raise_for_status()\ndata = resp.json()[\"data\"]  # every response is wrapped in an envelope"}]}},"/api/v1/fx/rates":{"get":{"tags":["FX"],"summary":"Get IAS 21 dual-rate FX quotes for a set of period_ends","description":"Returns one rate per (period_end × typical_period) tuple, to convert MetricValue arrays client-side without re-fetching the /financials payload.","operationId":"get_fx_rates_api_v1_fx_rates_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"source","in":"query","required":true,"schema":{"type":"string","minLength":3,"maxLength":3,"description":"ISO 4217 source","title":"Source"},"description":"ISO 4217 source"},{"name":"target","in":"query","required":true,"schema":{"type":"string","minLength":3,"maxLength":3,"description":"ISO 4217 target","title":"Target"},"description":"ISO 4217 target"},{"name":"period_ends","in":"query","required":true,"schema":{"type":"string","description":"Comma-separated ISO dates (YYYY-MM-DD) — one per fiscal year window.","title":"Period Ends"},"description":"Comma-separated ISO dates (YYYY-MM-DD) — one per fiscal year window."}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse_FXRatesResponse_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"x-codeSamples":[{"lang":"curl","label":"curl","source":"curl \"https://api.hub-equity.com/api/v1/fx/rates\" \\\n  -H \"Authorization: Bearer $HUBEQ_API_KEY\""},{"lang":"Python","label":"Python","source":"import httpx\n\nheaders = {\"Authorization\": \"Bearer $HUBEQ_API_KEY\"}\nresp = httpx.get(\n    \"https://api.hub-equity.com/api/v1/fx/rates\",\n    headers=headers,\n)\nresp.raise_for_status()\ndata = resp.json()[\"data\"]  # every response is wrapped in an envelope"}],"x-code-samples":[{"lang":"curl","label":"curl","source":"curl \"https://api.hub-equity.com/api/v1/fx/rates\" \\\n  -H \"Authorization: Bearer $HUBEQ_API_KEY\""},{"lang":"Python","label":"Python","source":"import httpx\n\nheaders = {\"Authorization\": \"Bearer $HUBEQ_API_KEY\"}\nresp = httpx.get(\n    \"https://api.hub-equity.com/api/v1/fx/rates\",\n    headers=headers,\n)\nresp.raise_for_status()\ndata = resp.json()[\"data\"]  # every response is wrapped in an envelope"}]}},"/api/v1/fx/convert":{"get":{"tags":["FX"],"summary":"Convert a single amount between two ISO 4217 currencies (ECB rates)","description":"Single-amount FX conversion using ECB reference rates. `rate_type` ∈ {closing (spot — BS items), average_ytd (P&L / CF), average_prior_year}. Cross rates (e.g. USD→JPY) resolve via the EUR pivot.\n\nReturns `success=false` (with `converted_amount=0.0`) when no ECB fix is available — do NOT cite the amount in that case. `404` for a malformed request (bad ISO code, unsupported pair, bad date/rate_type).\n\nDiffers from `/fx/rates` (raw spot+avg rates for client-side math on a metric series) — this does the `amount × rate` arithmetic.","operationId":"convert_currency_endpoint_api_v1_fx_convert_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"amount","in":"query","required":true,"schema":{"type":"number","description":"Source amount (positive or negative).","title":"Amount"},"description":"Source amount (positive or negative)."},{"name":"from_currency","in":"query","required":true,"schema":{"type":"string","description":"ISO 4217 source code (e.g. USD).","title":"From Currency"},"description":"ISO 4217 source code (e.g. USD)."},{"name":"to_currency","in":"query","required":true,"schema":{"type":"string","description":"ISO 4217 target code (e.g. EUR).","title":"To Currency"},"description":"ISO 4217 target code (e.g. EUR)."},{"name":"date","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"ISO date (YYYY-MM-DD) for the spot / end-of-window. Defaults to today.","title":"Date"},"description":"ISO date (YYYY-MM-DD) for the spot / end-of-window. Defaults to today."},{"name":"rate_type","in":"query","required":false,"schema":{"type":"string","description":"closing (default) | average_ytd | average_prior_year.","default":"closing","title":"Rate Type"},"description":"closing (default) | average_ytd | average_prior_year."}],"responses":{"200":{"description":"Conversion result (check the `success` field).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse_ConvertCurrencyResult_"}}}},"404":{"description":"Malformed request — unsupported pair / bad date."},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"x-codeSamples":[{"lang":"curl","label":"curl","source":"curl \"https://api.hub-equity.com/api/v1/fx/convert\" \\\n  -H \"Authorization: Bearer $HUBEQ_API_KEY\""},{"lang":"Python","label":"Python","source":"import httpx\n\nheaders = {\"Authorization\": \"Bearer $HUBEQ_API_KEY\"}\nresp = httpx.get(\n    \"https://api.hub-equity.com/api/v1/fx/convert\",\n    headers=headers,\n)\nresp.raise_for_status()\ndata = resp.json()[\"data\"]  # every response is wrapped in an envelope"}],"x-code-samples":[{"lang":"curl","label":"curl","source":"curl \"https://api.hub-equity.com/api/v1/fx/convert\" \\\n  -H \"Authorization: Bearer $HUBEQ_API_KEY\""},{"lang":"Python","label":"Python","source":"import httpx\n\nheaders = {\"Authorization\": \"Bearer $HUBEQ_API_KEY\"}\nresp = httpx.get(\n    \"https://api.hub-equity.com/api/v1/fx/convert\",\n    headers=headers,\n)\nresp.raise_for_status()\ndata = resp.json()[\"data\"]  # every response is wrapped in an envelope"}]}},"/api/v1/entities/{entity_id}/export":{"get":{"tags":["Export"],"summary":"Export entity financials","description":"Generate and download XLSX file with financial data. Accepts UUID or ticker. Requires a signed-in session on a paid plan (scope `export.write`): 401 anonymous, 403 on the Free plan.","operationId":"export_financials_api_v1_entities__entity_id__export_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"entity_id","in":"path","required":true,"schema":{"type":"string","title":"Entity Id"}},{"name":"years","in":"query","required":false,"schema":{"type":"integer","maximum":99,"minimum":1,"description":"Number of fiscal years to include. Pass 99 (or any value ≥99) to request every available year — the response is capped by the data we actually hold for the entity.","default":3,"title":"Years"},"description":"Number of fiscal years to include. Pass 99 (or any value ≥99) to request every available year — the response is capped by the data we actually hold for the entity."},{"name":"category","in":"query","required":false,"schema":{"type":"string","description":"Category filter","default":"all","title":"Category"},"description":"Category filter"},{"name":"xbrl","in":"query","required":false,"schema":{"type":"string","description":"XBRL linkbase granularity to embed. `none` (default) embeds no linkbase. `core` adds the primary statements calculation tree (~70 arcs per filing). `calculation` adds every calculation arc (~200 per filing). `full` adds calculation + presentation (~800-1400 per filing). Adds one `Calc FY{y}` (and `Pres FY{y}` for `full`) sheet per exported filing, plus an Info `XBRL structure` section and a `_XBRL` filename token.","default":"none","title":"Xbrl"},"description":"XBRL linkbase granularity to embed. `none` (default) embeds no linkbase. `core` adds the primary statements calculation tree (~70 arcs per filing). `calculation` adds every calculation arc (~200 per filing). `full` adds calculation + presentation (~800-1400 per filing). Adds one `Calc FY{y}` (and `Pres FY{y}` for `full`) sheet per exported filing, plus an Info `XBRL structure` section and a `_XBRL` filename token."}],"responses":{"200":{"description":"XLSX file","content":{"application/json":{"schema":{}},"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet":{}}},"403":{"description":"The workspace's plan does not include the export"},"404":{"description":"Entity not found or no data"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"x-codeSamples":[{"lang":"curl","label":"curl","source":"curl \"https://api.hub-equity.com/api/v1/entities/{entity_id}/export\" \\\n  -H \"Authorization: Bearer $HUBEQ_API_KEY\""},{"lang":"Python","label":"Python","source":"import httpx\n\nheaders = {\"Authorization\": \"Bearer $HUBEQ_API_KEY\"}\nresp = httpx.get(\n    \"https://api.hub-equity.com/api/v1/entities/{entity_id}/export\",\n    headers=headers,\n)\nresp.raise_for_status()\ndata = resp.json()[\"data\"]  # every response is wrapped in an envelope"}],"x-code-samples":[{"lang":"curl","label":"curl","source":"curl \"https://api.hub-equity.com/api/v1/entities/{entity_id}/export\" \\\n  -H \"Authorization: Bearer $HUBEQ_API_KEY\""},{"lang":"Python","label":"Python","source":"import httpx\n\nheaders = {\"Authorization\": \"Bearer $HUBEQ_API_KEY\"}\nresp = httpx.get(\n    \"https://api.hub-equity.com/api/v1/entities/{entity_id}/export\",\n    headers=headers,\n)\nresp.raise_for_status()\ndata = resp.json()[\"data\"]  # every response is wrapped in an envelope"}]}},"/api/v1/exports":{"post":{"tags":["Export"],"summary":"Submit a background export of several companies","description":"Builds ONE zip archive holding one XLSX workbook per company (the same workbook `GET /entities/{id}/export` streams) plus a README naming any company that could not be exported. Up to 100 companies per job, 3 jobs in progress and 20 archives or 2 GB held per workspace (409 `EXPORT_QUOTA` beyond). The archive lands in the workspace's deliverables zone and expires after 7 days. Requires the `export.bulk` scope, which the Team and Enterprise plans open (401 anonymous, 403 `SCOPE_MISSING` on any other plan). Poll `GET /exports/{id}` until `status` is `ready`, then call `GET /exports/{id}/download`: it redirects (307) to a signed URL valid 10 minutes. API clients must follow the redirect.","operationId":"create_export_api_v1_exports_post","security":[{"HTTPBearer":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateExportRequest"}}}},"responses":{"202":{"description":"Job accepted; `data.status` is `pending`","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse_ExportJobResponse_"}}}},"403":{"description":"The workspace's plan does not include background exports"},"404":{"description":"A company is unknown (or not visible to this workspace)"},"409":{"description":"Ambiguous ticker, or the workspace already has 3 jobs in progress"},"503":{"description":"The export zone cannot be written; try again later"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"x-codeSamples":[{"lang":"curl","label":"curl","source":"curl -X POST \"https://api.hub-equity.com/api/v1/exports\" \\\n  -H \"Authorization: Bearer $HUBEQ_API_KEY\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{}'"},{"lang":"Python","label":"Python","source":"import httpx\n\nheaders = {\"Authorization\": \"Bearer $HUBEQ_API_KEY\"}\nresp = httpx.post(\n    \"https://api.hub-equity.com/api/v1/exports\",\n    headers=headers,\n    json={},\n)\nresp.raise_for_status()\ndata = resp.json()[\"data\"]  # every response is wrapped in an envelope"}],"x-code-samples":[{"lang":"curl","label":"curl","source":"curl -X POST \"https://api.hub-equity.com/api/v1/exports\" \\\n  -H \"Authorization: Bearer $HUBEQ_API_KEY\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{}'"},{"lang":"Python","label":"Python","source":"import httpx\n\nheaders = {\"Authorization\": \"Bearer $HUBEQ_API_KEY\"}\nresp = httpx.post(\n    \"https://api.hub-equity.com/api/v1/exports\",\n    headers=headers,\n    json={},\n)\nresp.raise_for_status()\ndata = resp.json()[\"data\"]  # every response is wrapped in an envelope"}]},"get":{"tags":["Export"],"summary":"List the workspace's background exports","description":"Newest first; an archive expires 7 days after its creation and leaves the list (the file is removed at the next export anyone submits, or by the monthly retention job). Requires the `export.bulk` scope, which the Team and Enterprise plans open (401 anonymous, 403 `SCOPE_MISSING` on any other plan).","operationId":"list_exports_api_v1_exports_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"description":"Jobs to return","default":20,"title":"Limit"},"description":"Jobs to return"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse_list_ExportJobResponse__"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"x-codeSamples":[{"lang":"curl","label":"curl","source":"curl \"https://api.hub-equity.com/api/v1/exports\" \\\n  -H \"Authorization: Bearer $HUBEQ_API_KEY\""},{"lang":"Python","label":"Python","source":"import httpx\n\nheaders = {\"Authorization\": \"Bearer $HUBEQ_API_KEY\"}\nresp = httpx.get(\n    \"https://api.hub-equity.com/api/v1/exports\",\n    headers=headers,\n)\nresp.raise_for_status()\ndata = resp.json()[\"data\"]  # every response is wrapped in an envelope"}],"x-code-samples":[{"lang":"curl","label":"curl","source":"curl \"https://api.hub-equity.com/api/v1/exports\" \\\n  -H \"Authorization: Bearer $HUBEQ_API_KEY\""},{"lang":"Python","label":"Python","source":"import httpx\n\nheaders = {\"Authorization\": \"Bearer $HUBEQ_API_KEY\"}\nresp = httpx.get(\n    \"https://api.hub-equity.com/api/v1/exports\",\n    headers=headers,\n)\nresp.raise_for_status()\ndata = resp.json()[\"data\"]  # every response is wrapped in an envelope"}]}},"/api/v1/exports/{job_id}":{"get":{"tags":["Export"],"summary":"Get a background export","description":"`status` goes `pending`, `running`, then `ready` or `failed` (`error` says why). Poll `GET /exports/{id}` until `status` is `ready`, then call `GET /exports/{id}/download`: it redirects (307) to a signed URL valid 10 minutes. API clients must follow the redirect. Requires the `export.bulk` scope, which the Team and Enterprise plans open (401 anonymous, 403 `SCOPE_MISSING` on any other plan).","operationId":"get_export_api_v1_exports__job_id__get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"job_id","in":"path","required":true,"schema":{"type":"string","title":"Job Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse_ExportJobResponse_"}}}},"404":{"description":"No such export in this workspace"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"x-codeSamples":[{"lang":"curl","label":"curl","source":"curl \"https://api.hub-equity.com/api/v1/exports/{job_id}\" \\\n  -H \"Authorization: Bearer $HUBEQ_API_KEY\""},{"lang":"Python","label":"Python","source":"import httpx\n\nheaders = {\"Authorization\": \"Bearer $HUBEQ_API_KEY\"}\nresp = httpx.get(\n    \"https://api.hub-equity.com/api/v1/exports/{job_id}\",\n    headers=headers,\n)\nresp.raise_for_status()\ndata = resp.json()[\"data\"]  # every response is wrapped in an envelope"}],"x-code-samples":[{"lang":"curl","label":"curl","source":"curl \"https://api.hub-equity.com/api/v1/exports/{job_id}\" \\\n  -H \"Authorization: Bearer $HUBEQ_API_KEY\""},{"lang":"Python","label":"Python","source":"import httpx\n\nheaders = {\"Authorization\": \"Bearer $HUBEQ_API_KEY\"}\nresp = httpx.get(\n    \"https://api.hub-equity.com/api/v1/exports/{job_id}\",\n    headers=headers,\n)\nresp.raise_for_status()\ndata = resp.json()[\"data\"]  # every response is wrapped in an envelope"}]}},"/api/v1/exports/{job_id}/download":{"get":{"tags":["Export"],"summary":"Download a background export","description":"Redirects (307) to a signed URL valid 10 minutes that streams the zip; API clients must follow the redirect. Requires the `export.bulk` scope, which the Team and Enterprise plans open (401 anonymous, 403 `SCOPE_MISSING` on any other plan).","operationId":"download_export_api_v1_exports__job_id__download_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"job_id","in":"path","required":true,"schema":{"type":"string","title":"Job Id"}}],"responses":{"307":{"description":"Redirect to the signed download URL","content":{"application/json":{"schema":{}}}},"404":{"description":"No such export in this workspace"},"409":{"description":"The export is not ready (pending, running or failed)"},"410":{"description":"The export has expired"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"x-codeSamples":[{"lang":"curl","label":"curl","source":"curl \"https://api.hub-equity.com/api/v1/exports/{job_id}/download\" \\\n  -H \"Authorization: Bearer $HUBEQ_API_KEY\""},{"lang":"Python","label":"Python","source":"import httpx\n\nheaders = {\"Authorization\": \"Bearer $HUBEQ_API_KEY\"}\nresp = httpx.get(\n    \"https://api.hub-equity.com/api/v1/exports/{job_id}/download\",\n    headers=headers,\n)\nresp.raise_for_status()\ndata = resp.json()[\"data\"]  # every response is wrapped in an envelope"}],"x-code-samples":[{"lang":"curl","label":"curl","source":"curl \"https://api.hub-equity.com/api/v1/exports/{job_id}/download\" \\\n  -H \"Authorization: Bearer $HUBEQ_API_KEY\""},{"lang":"Python","label":"Python","source":"import httpx\n\nheaders = {\"Authorization\": \"Bearer $HUBEQ_API_KEY\"}\nresp = httpx.get(\n    \"https://api.hub-equity.com/api/v1/exports/{job_id}/download\",\n    headers=headers,\n)\nresp.raise_for_status()\ndata = resp.json()[\"data\"]  # every response is wrapped in an envelope"}]}},"/api/v1/webhooks":{"get":{"tags":["Webhooks"],"summary":"List the workspace's webhook subscriptions","description":"Newest first. The signing secret is never returned here.","operationId":"list_webhooks_api_v1_webhooks_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse_list_WebhookResponse__"}}}}},"security":[{"HTTPBearer":[]}],"x-codeSamples":[{"lang":"curl","label":"curl","source":"curl \"https://api.hub-equity.com/api/v1/webhooks\" \\\n  -H \"Authorization: Bearer $HUBEQ_API_KEY\""},{"lang":"Python","label":"Python","source":"import httpx\n\nheaders = {\"Authorization\": \"Bearer $HUBEQ_API_KEY\"}\nresp = httpx.get(\n    \"https://api.hub-equity.com/api/v1/webhooks\",\n    headers=headers,\n)\nresp.raise_for_status()\ndata = resp.json()[\"data\"]  # every response is wrapped in an envelope"}],"x-code-samples":[{"lang":"curl","label":"curl","source":"curl \"https://api.hub-equity.com/api/v1/webhooks\" \\\n  -H \"Authorization: Bearer $HUBEQ_API_KEY\""},{"lang":"Python","label":"Python","source":"import httpx\n\nheaders = {\"Authorization\": \"Bearer $HUBEQ_API_KEY\"}\nresp = httpx.get(\n    \"https://api.hub-equity.com/api/v1/webhooks\",\n    headers=headers,\n)\nresp.raise_for_status()\ndata = resp.json()[\"data\"]  # every response is wrapped in an envelope"}]},"post":{"tags":["Webhooks"],"summary":"Create a webhook subscription (one-time reveal of the signing secret)","description":"Subscribe an https endpoint to `filing.ingested` (a filing whose values are served, filed within the last 45 days) and `restatement.material` (that filing restates an earlier value beyond the materiality wall: medium or high). Optionally scoped to a list of entities; otherwise every entity your workspace can see. Enterprise plan (scope `webhooks.manage`): 401 anonymous, 403 otherwise. At most 10 active subscriptions per workspace (409). Every delivery is a `POST` from 178.104.6.216 of a compact JSON body with sorted keys (`{\"id\", \"event\", \"created_at\", \"data\"}`) and four headers: `X-Hub-Equity-Event`, `X-Hub-Equity-Delivery` (uuid), `X-Hub-Equity-Timestamp` (unix seconds) and `X-Hub-Equity-Signature: v1=<hex>` where hex is HMAC-SHA256(secret, `<timestamp>.<raw body>`); for 24 hours after a secret rotation the header carries two signatures, `v1=<new>,v1=<old>`, and any match verifies. Verify on the raw bytes with a constant-time comparison and reject a timestamp more than 5 minutes from your clock. Delivery is at-least-once and unordered: deduplicate on `X-Hub-Equity-Delivery`. Answer 2xx within 10 seconds; anything else is retried after 1 min, 5 min, 30 min, 6 h and 24 h, except a 4xx (other than 408 and 429), which is final. Twenty consecutive failed attempts pause the subscription; resume it with `PATCH {\"is_active\": true}`. Events cover filings ingested after the subscription with a filing date under 45 days; to catch up after an outage, read `GET /entities/changes?since=`.\n\n`filing.ingested` data: `{entity_id, entity_name, filing_id, form_type, fiscal_year, period_end, filing_date, ingested_at, viewer_url}`. `restatement.material` data: the same plus `restatements: [{hub_concept_code, hub_label, fiscal_year, original_value, restated_value, delta_pct, materiality}]` (materiality `medium` or `high`).","operationId":"create_webhook_api_v1_webhooks_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/WebhookCreateRequest"}}},"required":true},"responses":{"201":{"description":"Subscription created; `secret` is shown only here","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse_WebhookCreatedResponse_"}}}},"403":{"description":"The workspace's plan does not include webhooks"},"409":{"description":"The workspace already has 10 active subscriptions"},"422":{"description":"URL not https or not on a public host, unknown event"}},"security":[{"HTTPBearer":[]}],"x-codeSamples":[{"lang":"curl","label":"curl","source":"curl -X POST \"https://api.hub-equity.com/api/v1/webhooks\" \\\n  -H \"Authorization: Bearer $HUBEQ_API_KEY\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{}'"},{"lang":"Python","label":"Python","source":"import httpx\n\nheaders = {\"Authorization\": \"Bearer $HUBEQ_API_KEY\"}\nresp = httpx.post(\n    \"https://api.hub-equity.com/api/v1/webhooks\",\n    headers=headers,\n    json={},\n)\nresp.raise_for_status()\ndata = resp.json()[\"data\"]  # every response is wrapped in an envelope"}],"x-code-samples":[{"lang":"curl","label":"curl","source":"curl -X POST \"https://api.hub-equity.com/api/v1/webhooks\" \\\n  -H \"Authorization: Bearer $HUBEQ_API_KEY\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{}'"},{"lang":"Python","label":"Python","source":"import httpx\n\nheaders = {\"Authorization\": \"Bearer $HUBEQ_API_KEY\"}\nresp = httpx.post(\n    \"https://api.hub-equity.com/api/v1/webhooks\",\n    headers=headers,\n    json={},\n)\nresp.raise_for_status()\ndata = resp.json()[\"data\"]  # every response is wrapped in an envelope"}]}},"/api/v1/webhooks/{subscription_id}":{"get":{"tags":["Webhooks"],"summary":"Webhook subscription detail","description":"The subscription's configuration and delivery counters; the secret is never returned.","operationId":"get_webhook_api_v1_webhooks__subscription_id__get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"subscription_id","in":"path","required":true,"schema":{"type":"string","title":"Subscription Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse_WebhookResponse_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"x-codeSamples":[{"lang":"curl","label":"curl","source":"curl \"https://api.hub-equity.com/api/v1/webhooks/{subscription_id}\" \\\n  -H \"Authorization: Bearer $HUBEQ_API_KEY\""},{"lang":"Python","label":"Python","source":"import httpx\n\nheaders = {\"Authorization\": \"Bearer $HUBEQ_API_KEY\"}\nresp = httpx.get(\n    \"https://api.hub-equity.com/api/v1/webhooks/{subscription_id}\",\n    headers=headers,\n)\nresp.raise_for_status()\ndata = resp.json()[\"data\"]  # every response is wrapped in an envelope"}],"x-code-samples":[{"lang":"curl","label":"curl","source":"curl \"https://api.hub-equity.com/api/v1/webhooks/{subscription_id}\" \\\n  -H \"Authorization: Bearer $HUBEQ_API_KEY\""},{"lang":"Python","label":"Python","source":"import httpx\n\nheaders = {\"Authorization\": \"Bearer $HUBEQ_API_KEY\"}\nresp = httpx.get(\n    \"https://api.hub-equity.com/api/v1/webhooks/{subscription_id}\",\n    headers=headers,\n)\nresp.raise_for_status()\ndata = resp.json()[\"data\"]  # every response is wrapped in an envelope"}]},"patch":{"tags":["Webhooks"],"summary":"Update a webhook subscription (rename, re-point, re-scope, pause, resume)","description":"Resuming (`is_active: true`) resets the failure counter and schedules the next poll immediately. `entity_ids: []` widens the scope back to every visible entity.","operationId":"update_webhook_api_v1_webhooks__subscription_id__patch","security":[{"HTTPBearer":[]}],"parameters":[{"name":"subscription_id","in":"path","required":true,"schema":{"type":"string","title":"Subscription Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/WebhookUpdateRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse_WebhookResponse_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"x-codeSamples":[{"lang":"curl","label":"curl","source":"curl -X PATCH \"https://api.hub-equity.com/api/v1/webhooks/{subscription_id}\" \\\n  -H \"Authorization: Bearer $HUBEQ_API_KEY\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{}'"},{"lang":"Python","label":"Python","source":"import httpx\n\nheaders = {\"Authorization\": \"Bearer $HUBEQ_API_KEY\"}\nresp = httpx.patch(\n    \"https://api.hub-equity.com/api/v1/webhooks/{subscription_id}\",\n    headers=headers,\n    json={},\n)\nresp.raise_for_status()\ndata = resp.json()[\"data\"]  # every response is wrapped in an envelope"}],"x-code-samples":[{"lang":"curl","label":"curl","source":"curl -X PATCH \"https://api.hub-equity.com/api/v1/webhooks/{subscription_id}\" \\\n  -H \"Authorization: Bearer $HUBEQ_API_KEY\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{}'"},{"lang":"Python","label":"Python","source":"import httpx\n\nheaders = {\"Authorization\": \"Bearer $HUBEQ_API_KEY\"}\nresp = httpx.patch(\n    \"https://api.hub-equity.com/api/v1/webhooks/{subscription_id}\",\n    headers=headers,\n    json={},\n)\nresp.raise_for_status()\ndata = resp.json()[\"data\"]  # every response is wrapped in an envelope"}]},"delete":{"tags":["Webhooks"],"summary":"Delete a webhook subscription and its delivery log","description":"Stops every delivery at once, pending retries included.","operationId":"delete_webhook_api_v1_webhooks__subscription_id__delete","security":[{"HTTPBearer":[]}],"parameters":[{"name":"subscription_id","in":"path","required":true,"schema":{"type":"string","title":"Subscription Id"}}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"x-codeSamples":[{"lang":"curl","label":"curl","source":"curl -X DELETE \"https://api.hub-equity.com/api/v1/webhooks/{subscription_id}\" \\\n  -H \"Authorization: Bearer $HUBEQ_API_KEY\""},{"lang":"Python","label":"Python","source":"import httpx\n\nheaders = {\"Authorization\": \"Bearer $HUBEQ_API_KEY\"}\nresp = httpx.delete(\n    \"https://api.hub-equity.com/api/v1/webhooks/{subscription_id}\",\n    headers=headers,\n)\nresp.raise_for_status()\ndata = resp.json()[\"data\"]  # every response is wrapped in an envelope"}],"x-code-samples":[{"lang":"curl","label":"curl","source":"curl -X DELETE \"https://api.hub-equity.com/api/v1/webhooks/{subscription_id}\" \\\n  -H \"Authorization: Bearer $HUBEQ_API_KEY\""},{"lang":"Python","label":"Python","source":"import httpx\n\nheaders = {\"Authorization\": \"Bearer $HUBEQ_API_KEY\"}\nresp = httpx.delete(\n    \"https://api.hub-equity.com/api/v1/webhooks/{subscription_id}\",\n    headers=headers,\n)\nresp.raise_for_status()\ndata = resp.json()[\"data\"]  # every response is wrapped in an envelope"}]}},"/api/v1/webhooks/{subscription_id}/deliveries":{"get":{"tags":["Webhooks"],"summary":"Delivery log of a subscription, newest first","description":"`pending` waits for `next_attempt_at`; `delivered` got a 2xx; `failed` exhausted its attempts or got a final 4xx; `skipped` is a filing evaluated for `restatement.material` with nothing material. Kept 30 days.","operationId":"list_deliveries_api_v1_webhooks__subscription_id__deliveries_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"subscription_id","in":"path","required":true,"schema":{"type":"string","title":"Subscription Id"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":50,"title":"Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse_list_WebhookDeliveryResponse__"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"x-codeSamples":[{"lang":"curl","label":"curl","source":"curl \"https://api.hub-equity.com/api/v1/webhooks/{subscription_id}/deliveries\" \\\n  -H \"Authorization: Bearer $HUBEQ_API_KEY\""},{"lang":"Python","label":"Python","source":"import httpx\n\nheaders = {\"Authorization\": \"Bearer $HUBEQ_API_KEY\"}\nresp = httpx.get(\n    \"https://api.hub-equity.com/api/v1/webhooks/{subscription_id}/deliveries\",\n    headers=headers,\n)\nresp.raise_for_status()\ndata = resp.json()[\"data\"]  # every response is wrapped in an envelope"}],"x-code-samples":[{"lang":"curl","label":"curl","source":"curl \"https://api.hub-equity.com/api/v1/webhooks/{subscription_id}/deliveries\" \\\n  -H \"Authorization: Bearer $HUBEQ_API_KEY\""},{"lang":"Python","label":"Python","source":"import httpx\n\nheaders = {\"Authorization\": \"Bearer $HUBEQ_API_KEY\"}\nresp = httpx.get(\n    \"https://api.hub-equity.com/api/v1/webhooks/{subscription_id}/deliveries\",\n    headers=headers,\n)\nresp.raise_for_status()\ndata = resp.json()[\"data\"]  # every response is wrapped in an envelope"}]}},"/api/v1/webhooks/{subscription_id}/test":{"post":{"tags":["Webhooks"],"summary":"Send a signed `ping` event to the endpoint now","description":"Delivers a `ping` event synchronously (10 s timeout) and answers with the HTTP status the endpoint returned. The attempt is written to the delivery log and counts toward the failure counter like any delivery.","operationId":"test_webhook_api_v1_webhooks__subscription_id__test_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"subscription_id","in":"path","required":true,"schema":{"type":"string","title":"Subscription Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse_WebhookTestResponse_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"x-codeSamples":[{"lang":"curl","label":"curl","source":"curl -X POST \"https://api.hub-equity.com/api/v1/webhooks/{subscription_id}/test\" \\\n  -H \"Authorization: Bearer $HUBEQ_API_KEY\""},{"lang":"Python","label":"Python","source":"import httpx\n\nheaders = {\"Authorization\": \"Bearer $HUBEQ_API_KEY\"}\nresp = httpx.post(\n    \"https://api.hub-equity.com/api/v1/webhooks/{subscription_id}/test\",\n    headers=headers,\n)\nresp.raise_for_status()\ndata = resp.json()[\"data\"]  # every response is wrapped in an envelope"}],"x-code-samples":[{"lang":"curl","label":"curl","source":"curl -X POST \"https://api.hub-equity.com/api/v1/webhooks/{subscription_id}/test\" \\\n  -H \"Authorization: Bearer $HUBEQ_API_KEY\""},{"lang":"Python","label":"Python","source":"import httpx\n\nheaders = {\"Authorization\": \"Bearer $HUBEQ_API_KEY\"}\nresp = httpx.post(\n    \"https://api.hub-equity.com/api/v1/webhooks/{subscription_id}/test\",\n    headers=headers,\n)\nresp.raise_for_status()\ndata = resp.json()[\"data\"]  # every response is wrapped in an envelope"}]}},"/api/v1/webhooks/{subscription_id}/deliveries/{delivery_id}/redeliver":{"post":{"tags":["Webhooks"],"summary":"Send a logged delivery again, now","description":"Re-sends the delivery's payload synchronously (10 s timeout), signed with the current secret and a new timestamp, and answers with the endpoint's HTTP status. The row keeps its id (`X-Hub-Equity-Delivery` is unchanged: a receiver that deduplicates on it will see a repeat) and gains one attempt. One shot: a failure is final until you redeliver again, and it counts toward the failure counter like `/test`. A `pending` row belongs to the emitter, which will send it at `next_attempt_at` (409); a `skipped` row carries nothing to send (409).","operationId":"redeliver_api_v1_webhooks__subscription_id__deliveries__delivery_id__redeliver_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"subscription_id","in":"path","required":true,"schema":{"type":"string","title":"Subscription Id"}},{"name":"delivery_id","in":"path","required":true,"schema":{"type":"string","title":"Delivery Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse_WebhookTestResponse_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"x-codeSamples":[{"lang":"curl","label":"curl","source":"curl -X POST \"https://api.hub-equity.com/api/v1/webhooks/{subscription_id}/deliveries/{delivery_id}/redeliver\" \\\n  -H \"Authorization: Bearer $HUBEQ_API_KEY\""},{"lang":"Python","label":"Python","source":"import httpx\n\nheaders = {\"Authorization\": \"Bearer $HUBEQ_API_KEY\"}\nresp = httpx.post(\n    \"https://api.hub-equity.com/api/v1/webhooks/{subscription_id}/deliveries/{delivery_id}/redeliver\",\n    headers=headers,\n)\nresp.raise_for_status()\ndata = resp.json()[\"data\"]  # every response is wrapped in an envelope"}],"x-code-samples":[{"lang":"curl","label":"curl","source":"curl -X POST \"https://api.hub-equity.com/api/v1/webhooks/{subscription_id}/deliveries/{delivery_id}/redeliver\" \\\n  -H \"Authorization: Bearer $HUBEQ_API_KEY\""},{"lang":"Python","label":"Python","source":"import httpx\n\nheaders = {\"Authorization\": \"Bearer $HUBEQ_API_KEY\"}\nresp = httpx.post(\n    \"https://api.hub-equity.com/api/v1/webhooks/{subscription_id}/deliveries/{delivery_id}/redeliver\",\n    headers=headers,\n)\nresp.raise_for_status()\ndata = resp.json()[\"data\"]  # every response is wrapped in an envelope"}]}},"/api/v1/webhooks/{subscription_id}/rotate-secret":{"post":{"tags":["Webhooks"],"summary":"Replace the signing secret (shown once); the previous one signs for 24 more hours","description":"Answers the new `whsec_...` secret, shown only here. Until 24 hours from now every delivery carries two signatures, `v1=<new>,v1=<old>`, and a receiver that accepts any match (the published recipe) keeps verifying with either secret while you switch. A receiver that compares the whole header fails during the window: make it split on the comma before rotating. The previous secret stays valid for those 24 hours; if it leaked, rotate a second time right away, that ends it at once.","operationId":"rotate_secret_api_v1_webhooks__subscription_id__rotate_secret_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"subscription_id","in":"path","required":true,"schema":{"type":"string","title":"Subscription Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse_WebhookCreatedResponse_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"x-codeSamples":[{"lang":"curl","label":"curl","source":"curl -X POST \"https://api.hub-equity.com/api/v1/webhooks/{subscription_id}/rotate-secret\" \\\n  -H \"Authorization: Bearer $HUBEQ_API_KEY\""},{"lang":"Python","label":"Python","source":"import httpx\n\nheaders = {\"Authorization\": \"Bearer $HUBEQ_API_KEY\"}\nresp = httpx.post(\n    \"https://api.hub-equity.com/api/v1/webhooks/{subscription_id}/rotate-secret\",\n    headers=headers,\n)\nresp.raise_for_status()\ndata = resp.json()[\"data\"]  # every response is wrapped in an envelope"}],"x-code-samples":[{"lang":"curl","label":"curl","source":"curl -X POST \"https://api.hub-equity.com/api/v1/webhooks/{subscription_id}/rotate-secret\" \\\n  -H \"Authorization: Bearer $HUBEQ_API_KEY\""},{"lang":"Python","label":"Python","source":"import httpx\n\nheaders = {\"Authorization\": \"Bearer $HUBEQ_API_KEY\"}\nresp = httpx.post(\n    \"https://api.hub-equity.com/api/v1/webhooks/{subscription_id}/rotate-secret\",\n    headers=headers,\n)\nresp.raise_for_status()\ndata = resp.json()[\"data\"]  # every response is wrapped in an envelope"}]}},"/api/v1/api-keys":{"post":{"tags":["API Keys"],"summary":"Create a new API key (one-time reveal)","description":"Generates a new `hubq_{live|test}_…` key for the authenticated user. The `full_key` field in the response is the ONLY time you can read the token — store it immediately. Active keys are bounded per workspace by the plan (Free 1, Builder 2, Team 5, Enterprise 10, live and test together).","operationId":"create_api_key_api_v1_api_keys_post","security":[{"HTTPBearer":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateApiKeyRequest"}}}},"responses":{"201":{"description":"API key created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse_ApiKeyCreatedResponse_"}}}},"400":{"description":"User has no tenant"},"409":{"description":"The workspace already has as many active keys as its plan allows"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"x-codeSamples":[{"lang":"curl","label":"curl","source":"curl -X POST \"https://api.hub-equity.com/api/v1/api-keys\" \\\n  -H \"Authorization: Bearer $HUBEQ_API_KEY\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{}'"},{"lang":"Python","label":"Python","source":"import httpx\n\nheaders = {\"Authorization\": \"Bearer $HUBEQ_API_KEY\"}\nresp = httpx.post(\n    \"https://api.hub-equity.com/api/v1/api-keys\",\n    headers=headers,\n    json={},\n)\nresp.raise_for_status()\ndata = resp.json()[\"data\"]  # every response is wrapped in an envelope"}],"x-code-samples":[{"lang":"curl","label":"curl","source":"curl -X POST \"https://api.hub-equity.com/api/v1/api-keys\" \\\n  -H \"Authorization: Bearer $HUBEQ_API_KEY\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{}'"},{"lang":"Python","label":"Python","source":"import httpx\n\nheaders = {\"Authorization\": \"Bearer $HUBEQ_API_KEY\"}\nresp = httpx.post(\n    \"https://api.hub-equity.com/api/v1/api-keys\",\n    headers=headers,\n    json={},\n)\nresp.raise_for_status()\ndata = resp.json()[\"data\"]  # every response is wrapped in an envelope"}]},"get":{"tags":["API Keys"],"summary":"List own API keys (masked, no full_key)","description":"Lists the API keys owned by the authenticated user, most recent first. Secrets are never returned — only the visible prefix (`hubq_live_abc123de`) and metadata. Pass `include_revoked=true` to also see revoked keys for audit.","operationId":"list_api_keys_api_v1_api_keys_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"include_revoked","in":"query","required":false,"schema":{"type":"boolean","description":"Include revoked keys in the response (audit trail).","default":false,"title":"Include Revoked"},"description":"Include revoked keys in the response (audit trail)."}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse_list_ApiKeyResponse__"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"x-codeSamples":[{"lang":"curl","label":"curl","source":"curl \"https://api.hub-equity.com/api/v1/api-keys\" \\\n  -H \"Authorization: Bearer $HUBEQ_API_KEY\""},{"lang":"Python","label":"Python","source":"import httpx\n\nheaders = {\"Authorization\": \"Bearer $HUBEQ_API_KEY\"}\nresp = httpx.get(\n    \"https://api.hub-equity.com/api/v1/api-keys\",\n    headers=headers,\n)\nresp.raise_for_status()\ndata = resp.json()[\"data\"]  # every response is wrapped in an envelope"}],"x-code-samples":[{"lang":"curl","label":"curl","source":"curl \"https://api.hub-equity.com/api/v1/api-keys\" \\\n  -H \"Authorization: Bearer $HUBEQ_API_KEY\""},{"lang":"Python","label":"Python","source":"import httpx\n\nheaders = {\"Authorization\": \"Bearer $HUBEQ_API_KEY\"}\nresp = httpx.get(\n    \"https://api.hub-equity.com/api/v1/api-keys\",\n    headers=headers,\n)\nresp.raise_for_status()\ndata = resp.json()[\"data\"]  # every response is wrapped in an envelope"}]}},"/api/v1/api-keys/{key_id}":{"get":{"tags":["API Keys"],"summary":"Get detail of one own API key (masked)","description":"Returns the metadata for one of your own API keys (prefix, scopes, plan override, environment, last-used, revocation status). The secret is never returned. Responds `404` if the key doesn't exist or isn't yours.","operationId":"get_api_key_api_v1_api_keys__key_id__get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"key_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Key Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse_ApiKeyResponse_"}}}},"404":{"description":"API key not found or not owned by current user"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"x-codeSamples":[{"lang":"curl","label":"curl","source":"curl \"https://api.hub-equity.com/api/v1/api-keys/{key_id}\" \\\n  -H \"Authorization: Bearer $HUBEQ_API_KEY\""},{"lang":"Python","label":"Python","source":"import httpx\n\nheaders = {\"Authorization\": \"Bearer $HUBEQ_API_KEY\"}\nresp = httpx.get(\n    \"https://api.hub-equity.com/api/v1/api-keys/{key_id}\",\n    headers=headers,\n)\nresp.raise_for_status()\ndata = resp.json()[\"data\"]  # every response is wrapped in an envelope"}],"x-code-samples":[{"lang":"curl","label":"curl","source":"curl \"https://api.hub-equity.com/api/v1/api-keys/{key_id}\" \\\n  -H \"Authorization: Bearer $HUBEQ_API_KEY\""},{"lang":"Python","label":"Python","source":"import httpx\n\nheaders = {\"Authorization\": \"Bearer $HUBEQ_API_KEY\"}\nresp = httpx.get(\n    \"https://api.hub-equity.com/api/v1/api-keys/{key_id}\",\n    headers=headers,\n)\nresp.raise_for_status()\ndata = resp.json()[\"data\"]  # every response is wrapped in an envelope"}]},"patch":{"tags":["API Keys"],"summary":"Update name / scopes of an own API key","description":"Updates mutable fields of one of your own API keys: `name` and/or `scopes`. Only the fields you send are changed; sending an empty body returns `400`. The secret and environment are immutable — rotate by creating a new key and revoking the old one.","operationId":"update_api_key_api_v1_api_keys__key_id__patch","security":[{"HTTPBearer":[]}],"parameters":[{"name":"key_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Key Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateApiKeyRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse_ApiKeyResponse_"}}}},"400":{"description":"No fields to update"},"404":{"description":"API key not found or not owned by current user"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"x-codeSamples":[{"lang":"curl","label":"curl","source":"curl -X PATCH \"https://api.hub-equity.com/api/v1/api-keys/{key_id}\" \\\n  -H \"Authorization: Bearer $HUBEQ_API_KEY\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{}'"},{"lang":"Python","label":"Python","source":"import httpx\n\nheaders = {\"Authorization\": \"Bearer $HUBEQ_API_KEY\"}\nresp = httpx.patch(\n    \"https://api.hub-equity.com/api/v1/api-keys/{key_id}\",\n    headers=headers,\n    json={},\n)\nresp.raise_for_status()\ndata = resp.json()[\"data\"]  # every response is wrapped in an envelope"}],"x-code-samples":[{"lang":"curl","label":"curl","source":"curl -X PATCH \"https://api.hub-equity.com/api/v1/api-keys/{key_id}\" \\\n  -H \"Authorization: Bearer $HUBEQ_API_KEY\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{}'"},{"lang":"Python","label":"Python","source":"import httpx\n\nheaders = {\"Authorization\": \"Bearer $HUBEQ_API_KEY\"}\nresp = httpx.patch(\n    \"https://api.hub-equity.com/api/v1/api-keys/{key_id}\",\n    headers=headers,\n    json={},\n)\nresp.raise_for_status()\ndata = resp.json()[\"data\"]  # every response is wrapped in an envelope"}]},"delete":{"tags":["API Keys"],"summary":"Revoke (soft-delete) an own API key","description":"Revokes one of your own API keys. Revocation is a soft-delete (`revoked_at` is set) and takes effect immediately — the key stops authenticating on the next request. Revoked keys remain visible via `include_revoked=true` for audit. Returns `409` if already revoked.","operationId":"revoke_own_api_key_api_v1_api_keys__key_id__delete","security":[{"HTTPBearer":[]}],"parameters":[{"name":"key_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Key Id"}}],"responses":{"204":{"description":"API key revoked"},"404":{"description":"API key not found or not owned by current user"},"409":{"description":"API key already revoked"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"x-codeSamples":[{"lang":"curl","label":"curl","source":"curl -X DELETE \"https://api.hub-equity.com/api/v1/api-keys/{key_id}\" \\\n  -H \"Authorization: Bearer $HUBEQ_API_KEY\""},{"lang":"Python","label":"Python","source":"import httpx\n\nheaders = {\"Authorization\": \"Bearer $HUBEQ_API_KEY\"}\nresp = httpx.delete(\n    \"https://api.hub-equity.com/api/v1/api-keys/{key_id}\",\n    headers=headers,\n)\nresp.raise_for_status()\ndata = resp.json()[\"data\"]  # every response is wrapped in an envelope"}],"x-code-samples":[{"lang":"curl","label":"curl","source":"curl -X DELETE \"https://api.hub-equity.com/api/v1/api-keys/{key_id}\" \\\n  -H \"Authorization: Bearer $HUBEQ_API_KEY\""},{"lang":"Python","label":"Python","source":"import httpx\n\nheaders = {\"Authorization\": \"Bearer $HUBEQ_API_KEY\"}\nresp = httpx.delete(\n    \"https://api.hub-equity.com/api/v1/api-keys/{key_id}\",\n    headers=headers,\n)\nresp.raise_for_status()\ndata = resp.json()[\"data\"]  # every response is wrapped in an envelope"}]}},"/api/v1/billing/status":{"get":{"tags":["Billing"],"summary":"Subscription state of the caller's workspace","description":"Plan, end of the paid period, whether it renews or stops there, and whether a Stripe subscription backs it. `manageable` is false for a plan provisioned by hand, which has no Customer Portal to open.","operationId":"get_billing_status_api_v1_billing_status_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse_BillingStatusResponse_"}}}}},"security":[{"HTTPBearer":[]}],"x-codeSamples":[{"lang":"curl","label":"curl","source":"curl \"https://api.hub-equity.com/api/v1/billing/status\" \\\n  -H \"Authorization: Bearer $HUBEQ_API_KEY\""},{"lang":"Python","label":"Python","source":"import httpx\n\nheaders = {\"Authorization\": \"Bearer $HUBEQ_API_KEY\"}\nresp = httpx.get(\n    \"https://api.hub-equity.com/api/v1/billing/status\",\n    headers=headers,\n)\nresp.raise_for_status()\ndata = resp.json()[\"data\"]  # every response is wrapped in an envelope"}],"x-code-samples":[{"lang":"curl","label":"curl","source":"curl \"https://api.hub-equity.com/api/v1/billing/status\" \\\n  -H \"Authorization: Bearer $HUBEQ_API_KEY\""},{"lang":"Python","label":"Python","source":"import httpx\n\nheaders = {\"Authorization\": \"Bearer $HUBEQ_API_KEY\"}\nresp = httpx.get(\n    \"https://api.hub-equity.com/api/v1/billing/status\",\n    headers=headers,\n)\nresp.raise_for_status()\ndata = resp.json()[\"data\"]  # every response is wrapped in an envelope"}]}},"/api/v1/billing/checkout":{"post":{"tags":["Billing"],"summary":"Open a Stripe Checkout Session for the Builder or Team plan","description":"Creates (or reuses) the workspace's Stripe customer and returns the URL of a hosted Checkout page. Builder prices include VAT, Team prices exclude it; Stripe Tax computes the amount and collects the buyer's VAT number for the EU B2B reverse charge. Returns 409 when the workspace already has a subscription: plan changes go through the portal.","operationId":"create_checkout_session_api_v1_billing_checkout_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CheckoutRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse_BillingSessionResponse_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}],"x-codeSamples":[{"lang":"curl","label":"curl","source":"curl -X POST \"https://api.hub-equity.com/api/v1/billing/checkout\" \\\n  -H \"Authorization: Bearer $HUBEQ_API_KEY\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{}'"},{"lang":"Python","label":"Python","source":"import httpx\n\nheaders = {\"Authorization\": \"Bearer $HUBEQ_API_KEY\"}\nresp = httpx.post(\n    \"https://api.hub-equity.com/api/v1/billing/checkout\",\n    headers=headers,\n    json={},\n)\nresp.raise_for_status()\ndata = resp.json()[\"data\"]  # every response is wrapped in an envelope"}],"x-code-samples":[{"lang":"curl","label":"curl","source":"curl -X POST \"https://api.hub-equity.com/api/v1/billing/checkout\" \\\n  -H \"Authorization: Bearer $HUBEQ_API_KEY\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{}'"},{"lang":"Python","label":"Python","source":"import httpx\n\nheaders = {\"Authorization\": \"Bearer $HUBEQ_API_KEY\"}\nresp = httpx.post(\n    \"https://api.hub-equity.com/api/v1/billing/checkout\",\n    headers=headers,\n    json={},\n)\nresp.raise_for_status()\ndata = resp.json()[\"data\"]  # every response is wrapped in an envelope"}]}},"/api/v1/billing/portal":{"post":{"tags":["Billing"],"summary":"Open the Stripe Customer Portal for the caller's workspace","description":"Returns the URL of Stripe's hosted portal, where the customer changes payment method, reads invoices or cancels. Returns 409 when the workspace has no Stripe customer.","operationId":"create_portal_session_api_v1_billing_portal_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse_BillingSessionResponse_"}}}}},"security":[{"HTTPBearer":[]}],"x-codeSamples":[{"lang":"curl","label":"curl","source":"curl -X POST \"https://api.hub-equity.com/api/v1/billing/portal\" \\\n  -H \"Authorization: Bearer $HUBEQ_API_KEY\""},{"lang":"Python","label":"Python","source":"import httpx\n\nheaders = {\"Authorization\": \"Bearer $HUBEQ_API_KEY\"}\nresp = httpx.post(\n    \"https://api.hub-equity.com/api/v1/billing/portal\",\n    headers=headers,\n)\nresp.raise_for_status()\ndata = resp.json()[\"data\"]  # every response is wrapped in an envelope"}],"x-code-samples":[{"lang":"curl","label":"curl","source":"curl -X POST \"https://api.hub-equity.com/api/v1/billing/portal\" \\\n  -H \"Authorization: Bearer $HUBEQ_API_KEY\""},{"lang":"Python","label":"Python","source":"import httpx\n\nheaders = {\"Authorization\": \"Bearer $HUBEQ_API_KEY\"}\nresp = httpx.post(\n    \"https://api.hub-equity.com/api/v1/billing/portal\",\n    headers=headers,\n)\nresp.raise_for_status()\ndata = resp.json()[\"data\"]  # every response is wrapped in an envelope"}]}},"/api/v1/billing/withdraw":{"post":{"tags":["Billing"],"summary":"Declare a consumer's withdrawal from the subscription (L221-21, D221-5)","description":"The online withdrawal function: records the declaration on the Stripe subscription and emails a timestamped acknowledgment of receipt. The refund, pro rata of the service supplied, is made from the Stripe Dashboard. 409 when no withdrawal is open; idempotent once declared.","operationId":"declare_withdrawal_api_v1_billing_withdraw_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/WithdrawalRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse_WithdrawalResponse_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}],"x-codeSamples":[{"lang":"curl","label":"curl","source":"curl -X POST \"https://api.hub-equity.com/api/v1/billing/withdraw\" \\\n  -H \"Authorization: Bearer $HUBEQ_API_KEY\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{}'"},{"lang":"Python","label":"Python","source":"import httpx\n\nheaders = {\"Authorization\": \"Bearer $HUBEQ_API_KEY\"}\nresp = httpx.post(\n    \"https://api.hub-equity.com/api/v1/billing/withdraw\",\n    headers=headers,\n    json={},\n)\nresp.raise_for_status()\ndata = resp.json()[\"data\"]  # every response is wrapped in an envelope"}],"x-code-samples":[{"lang":"curl","label":"curl","source":"curl -X POST \"https://api.hub-equity.com/api/v1/billing/withdraw\" \\\n  -H \"Authorization: Bearer $HUBEQ_API_KEY\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{}'"},{"lang":"Python","label":"Python","source":"import httpx\n\nheaders = {\"Authorization\": \"Bearer $HUBEQ_API_KEY\"}\nresp = httpx.post(\n    \"https://api.hub-equity.com/api/v1/billing/withdraw\",\n    headers=headers,\n    json={},\n)\nresp.raise_for_status()\ndata = resp.json()[\"data\"]  # every response is wrapped in an envelope"}]}},"/api/v1/me":{"get":{"tags":["Me"],"summary":"Return the caller profile + tenant + scopes","description":"Returns the caller's user_id, workspace (tenant_id), plan, role (admin/member) and effective scopes. Session (JWT) callers only.","operationId":"get_me_api_v1_me_get","responses":{"200":{"description":"Caller profile","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse_MeResponse_"}}}},"401":{"description":"Unauthenticated"}},"security":[{"HTTPBearer":[]}],"x-codeSamples":[{"lang":"curl","label":"curl","source":"curl \"https://api.hub-equity.com/api/v1/me\" \\\n  -H \"Authorization: Bearer $HUBEQ_API_KEY\""},{"lang":"Python","label":"Python","source":"import httpx\n\nheaders = {\"Authorization\": \"Bearer $HUBEQ_API_KEY\"}\nresp = httpx.get(\n    \"https://api.hub-equity.com/api/v1/me\",\n    headers=headers,\n)\nresp.raise_for_status()\ndata = resp.json()[\"data\"]  # every response is wrapped in an envelope"}],"x-code-samples":[{"lang":"curl","label":"curl","source":"curl \"https://api.hub-equity.com/api/v1/me\" \\\n  -H \"Authorization: Bearer $HUBEQ_API_KEY\""},{"lang":"Python","label":"Python","source":"import httpx\n\nheaders = {\"Authorization\": \"Bearer $HUBEQ_API_KEY\"}\nresp = httpx.get(\n    \"https://api.hub-equity.com/api/v1/me\",\n    headers=headers,\n)\nresp.raise_for_status()\ndata = resp.json()[\"data\"]  # every response is wrapped in an envelope"}]}},"/api/v1/me/plan":{"get":{"tags":["Me"],"summary":"Return the caller's resolved commercial plan","description":"Lightweight endpoint resolving {free, pro, enterprise} for the caller. Accepts JWT or API key. It does not itself gate anything.","operationId":"get_me_plan_api_v1_me_plan_get","responses":{"200":{"description":"Resolved plan","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse_MePlanResponse_"}}}},"401":{"description":"Unauthenticated"}},"security":[{"HTTPBearer":[]}],"x-codeSamples":[{"lang":"curl","label":"curl","source":"curl \"https://api.hub-equity.com/api/v1/me/plan\" \\\n  -H \"Authorization: Bearer $HUBEQ_API_KEY\""},{"lang":"Python","label":"Python","source":"import httpx\n\nheaders = {\"Authorization\": \"Bearer $HUBEQ_API_KEY\"}\nresp = httpx.get(\n    \"https://api.hub-equity.com/api/v1/me/plan\",\n    headers=headers,\n)\nresp.raise_for_status()\ndata = resp.json()[\"data\"]  # every response is wrapped in an envelope"}],"x-code-samples":[{"lang":"curl","label":"curl","source":"curl \"https://api.hub-equity.com/api/v1/me/plan\" \\\n  -H \"Authorization: Bearer $HUBEQ_API_KEY\""},{"lang":"Python","label":"Python","source":"import httpx\n\nheaders = {\"Authorization\": \"Bearer $HUBEQ_API_KEY\"}\nresp = httpx.get(\n    \"https://api.hub-equity.com/api/v1/me/plan\",\n    headers=headers,\n)\nresp.raise_for_status()\ndata = resp.json()[\"data\"]  # every response is wrapped in an envelope"}]}},"/api/v1/version":{"get":{"tags":["Me"],"summary":"Return API build/version metadata","description":"Answers without a key so that client SDKs can check version compatibility before calling the API. `git_commit` helps support diagnose build-specific behaviour. An admin caller also receives `config`, the behaviour configuration resolved by this process.","operationId":"get_version_api_v1_version_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse_VersionResponse_"}}}}},"security":[{"HTTPBearer":[]}],"x-codeSamples":[{"lang":"curl","label":"curl","source":"curl \"https://api.hub-equity.com/api/v1/version\" \\\n  -H \"Authorization: Bearer $HUBEQ_API_KEY\""},{"lang":"Python","label":"Python","source":"import httpx\n\nheaders = {\"Authorization\": \"Bearer $HUBEQ_API_KEY\"}\nresp = httpx.get(\n    \"https://api.hub-equity.com/api/v1/version\",\n    headers=headers,\n)\nresp.raise_for_status()\ndata = resp.json()[\"data\"]  # every response is wrapped in an envelope"}],"x-code-samples":[{"lang":"curl","label":"curl","source":"curl \"https://api.hub-equity.com/api/v1/version\" \\\n  -H \"Authorization: Bearer $HUBEQ_API_KEY\""},{"lang":"Python","label":"Python","source":"import httpx\n\nheaders = {\"Authorization\": \"Bearer $HUBEQ_API_KEY\"}\nresp = httpx.get(\n    \"https://api.hub-equity.com/api/v1/version\",\n    headers=headers,\n)\nresp.raise_for_status()\ndata = resp.json()[\"data\"]  # every response is wrapped in an envelope"}]}},"/api/v1/usage/me":{"get":{"tags":["Usage"],"summary":"Aggregate usage stats for the authenticated user","description":"Read api_request_log rows for this user across `period` (day/week/month/all). Returns counts grouped by status_code, path, day, and api_key_id. JWT only — API keys cannot self-introspect their parent user's usage.","operationId":"get_usage_me_api_v1_usage_me_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"period","in":"query","required":false,"schema":{"enum":["day","week","month","all"],"type":"string","description":"Time window","default":"week","title":"Period"},"description":"Time window"},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100000,"minimum":1,"description":"Max rows to aggregate","default":10000,"title":"Limit"},"description":"Max rows to aggregate"}],"responses":{"200":{"description":"Usage stats","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse_UsageMeResponse_"}}}},"401":{"description":"Unauthenticated"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"x-codeSamples":[{"lang":"curl","label":"curl","source":"curl \"https://api.hub-equity.com/api/v1/usage/me\" \\\n  -H \"Authorization: Bearer $HUBEQ_API_KEY\""},{"lang":"Python","label":"Python","source":"import httpx\n\nheaders = {\"Authorization\": \"Bearer $HUBEQ_API_KEY\"}\nresp = httpx.get(\n    \"https://api.hub-equity.com/api/v1/usage/me\",\n    headers=headers,\n)\nresp.raise_for_status()\ndata = resp.json()[\"data\"]  # every response is wrapped in an envelope"}],"x-code-samples":[{"lang":"curl","label":"curl","source":"curl \"https://api.hub-equity.com/api/v1/usage/me\" \\\n  -H \"Authorization: Bearer $HUBEQ_API_KEY\""},{"lang":"Python","label":"Python","source":"import httpx\n\nheaders = {\"Authorization\": \"Bearer $HUBEQ_API_KEY\"}\nresp = httpx.get(\n    \"https://api.hub-equity.com/api/v1/usage/me\",\n    headers=headers,\n)\nresp.raise_for_status()\ndata = resp.json()[\"data\"]  # every response is wrapped in an envelope"}]}},"/api/v1/compare":{"post":{"tags":["Compare"],"summary":"Compare N entities × M metrics at one fiscal period — premium","description":"Single round-trip comparison matrix with calendar-year fiscal alignment. Returns one row per entity with metadata (sector, country, auditor) + a `cells` map keyed by `hub_concept_code` → CompareCell {value, currency, period_start, period_end, fiscal_year, source filing}.\n\nPeriods are matched on the CALENDAR year of `period_end` (`period_alignment = calendar_year`), not on each issuer's fiscal year: for an issuer that does not close in December the value can differ from `/api/v1/entities/{id}/financials` for the same year, and `fiscal_year` on each cell says which fiscal year was served. A missing key means no consolidated value with a `period_end` in that calendar year: the issuer did not report it, or (52/53-week issuers closing in early January) its fiscal year closed in the next calendar year.\n\nCaps 10×10. Consolidated values only (segment rows excluded), one value per (entity, concept).","operationId":"compare_api_v1_compare_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CompareRequest"}}},"required":true},"responses":{"200":{"description":"Comparison matrix","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse_CompareEntitiesResult_"}}}},"401":{"description":"AUTH_REQUIRED — anon or no Authorization header"},"403":{"description":"SCOPE_MISSING — Free key, requires Pro/Enterprise"},"422":{"description":"Pydantic validation error (cap exceeded, empty arrays, etc.)"}},"security":[{"HTTPBearer":[]}],"x-codeSamples":[{"lang":"curl","label":"curl","source":"curl -X POST \"https://api.hub-equity.com/api/v1/compare\" \\\n  -H \"Authorization: Bearer $HUBEQ_API_KEY\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{}'"},{"lang":"Python","label":"Python","source":"from hub_equity import HubEquity\n\nclient = HubEquity(api_key=\"hubq_live_...\")  # premium\nresult = client.compare(\n    entity_ids=[\"<uuid-a>\", \"<uuid-b>\"],\n    hub_concept_codes=[\"REVENUE\", \"NET_INCOME\"],\n    fiscal_year=2023,\n)\nprint(result.rows)"}],"x-code-samples":[{"lang":"curl","label":"curl","source":"curl -X POST \"https://api.hub-equity.com/api/v1/compare\" \\\n  -H \"Authorization: Bearer $HUBEQ_API_KEY\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{}'"},{"lang":"Python","label":"Python","source":"from hub_equity import HubEquity\n\nclient = HubEquity(api_key=\"hubq_live_...\")  # premium\nresult = client.compare(\n    entity_ids=[\"<uuid-a>\", \"<uuid-b>\"],\n    hub_concept_codes=[\"REVENUE\", \"NET_INCOME\"],\n    fiscal_year=2023,\n)\nprint(result.rows)"}]}},"/api/v1/concepts/search":{"get":{"tags":["Concepts"],"summary":"Search the Hub-Equity concept catalog","description":"Search the Hub-Equity concept catalog (canonical hubs across income statement, balance sheet, cash flow, ratio, metadata). Searches hub codes, labels and descriptions only.\n\nSearch is a case-insensitive substring match over `name_en`, `description` and `code`. Filters:\n- `q` — search string (optional ; when omitted, returns the catalog ordered by category × code).\n- `category` — restrict to one Hub category (`income_statement`, `balance_sheet`, `cash_flow`, `ratio`, `metadata`, `equity_info`).\n- `limit` 1-200, default 50 ; `offset` for pagination.\n\nA Free key is enough.","operationId":"search_concepts_api_v1_concepts_search_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"q","in":"query","required":false,"schema":{"anyOf":[{"type":"string","minLength":1,"maxLength":200},{"type":"null"}],"description":"Search string (case-insensitive substring match).","title":"Q"},"description":"Search string (case-insensitive substring match)."},{"name":"taxonomy","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Taxonomy filter. Only `hub` (the default) is accepted; any other value returns 422.","title":"Taxonomy"},"description":"Taxonomy filter. Only `hub` (the default) is accepted; any other value returns 422."},{"name":"category","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Hub category restriction.","title":"Category"},"description":"Hub category restriction."},{"name":"page","in":"query","required":false,"schema":{"anyOf":[{"type":"integer","minimum":1},{"type":"null"}],"description":"Page number (1-based). Public idiom; overrides offset. Ignored when cursor is set.","title":"Page"},"description":"Page number (1-based). Public idiom; overrides offset. Ignored when cursor is set."},{"name":"per_page","in":"query","required":false,"schema":{"anyOf":[{"type":"integer","maximum":200,"minimum":1},{"type":"null"}],"description":"Results per page (1-200). Overrides limit.","title":"Per Page"},"description":"Results per page (1-200). Overrides limit."},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":200,"minimum":1,"default":50,"title":"Limit"}},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","minimum":0,"default":0,"title":"Offset"}},{"name":"cursor","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Opaque cursor returned in `next_cursor` of the previous page. Mutually exclusive with `offset`/`page` — when provided, `offset`/`page` are ignored. Preferred over page/offset past page 200 (index-seek vs row-scan ; recommended for any client iterating the full catalog).","title":"Cursor"},"description":"Opaque cursor returned in `next_cursor` of the previous page. Mutually exclusive with `offset`/`page` — when provided, `offset`/`page` are ignored. Preferred over page/offset past page 200 (index-seek vs row-scan ; recommended for any client iterating the full catalog)."}],"responses":{"200":{"description":"Concept search results.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse_ConceptSearchResponse_"}}}},"422":{"description":"Validation error (invalid taxonomy/category)."}},"x-codeSamples":[{"lang":"curl","label":"curl","source":"curl \"https://api.hub-equity.com/api/v1/concepts/search\" \\\n  -H \"Authorization: Bearer $HUBEQ_API_KEY\""},{"lang":"Python","label":"Python","source":"from hub_equity import HubEquity\n\nclient = HubEquity()\npage = client.search_concepts(q=\"revenue\", per_page=50)\nfor concept in page.results:\n    print(concept.code, concept.name_en)"}],"x-code-samples":[{"lang":"curl","label":"curl","source":"curl \"https://api.hub-equity.com/api/v1/concepts/search\" \\\n  -H \"Authorization: Bearer $HUBEQ_API_KEY\""},{"lang":"Python","label":"Python","source":"from hub_equity import HubEquity\n\nclient = HubEquity()\npage = client.search_concepts(q=\"revenue\", per_page=50)\nfor concept in page.results:\n    print(concept.code, concept.name_en)"}]}},"/api/v1/concepts/match":{"get":{"tags":["Concepts"],"summary":"Resolve a free-text query to ranked Hub concepts","description":"Maps a free-text `query` (a code fragment or an English label fragment) to up to 5–10 ranked Hub concept matches (exact code > code prefix > code substring > label substring), primary hubs first. Matches hub codes and labels only, not XBRL qnames.\n\nReturns `SearchConceptResult{matches}`, a different shape from `/concepts/search` (`ConceptSearchResponse`).\n\nA Free key is enough.","operationId":"match_concepts_api_v1_concepts_match_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"query","in":"query","required":true,"schema":{"type":"string","minLength":1,"maxLength":200,"description":"Free-text code or label fragment to resolve to Hub concepts.","title":"Query"},"description":"Free-text code or label fragment to resolve to Hub concepts."}],"responses":{"200":{"description":"Ranked Hub concept matches.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse_SearchConceptResult_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"x-codeSamples":[{"lang":"curl","label":"curl","source":"curl \"https://api.hub-equity.com/api/v1/concepts/match\" \\\n  -H \"Authorization: Bearer $HUBEQ_API_KEY\""},{"lang":"Python","label":"Python","source":"import httpx\n\nheaders = {\"Authorization\": \"Bearer $HUBEQ_API_KEY\"}\nresp = httpx.get(\n    \"https://api.hub-equity.com/api/v1/concepts/match\",\n    headers=headers,\n)\nresp.raise_for_status()\ndata = resp.json()[\"data\"]  # every response is wrapped in an envelope"}],"x-code-samples":[{"lang":"curl","label":"curl","source":"curl \"https://api.hub-equity.com/api/v1/concepts/match\" \\\n  -H \"Authorization: Bearer $HUBEQ_API_KEY\""},{"lang":"Python","label":"Python","source":"import httpx\n\nheaders = {\"Authorization\": \"Bearer $HUBEQ_API_KEY\"}\nresp = httpx.get(\n    \"https://api.hub-equity.com/api/v1/concepts/match\",\n    headers=headers,\n)\nresp.raise_for_status()\ndata = resp.json()[\"data\"]  # every response is wrapped in an envelope"}]}},"/api/v1/concepts/hubs":{"get":{"tags":["Concepts"],"summary":"List the standardized Hub catalog","description":"Enumerate the Hub-Equity standardized hub catalog (the data dictionary).\n\nEach item carries `code`, `label`, `category`, `subcategory`, `is_derived`. Filters:\n- `category` — one of income_statement, balance_sheet, cash_flow, ratio, equity_info, metadata (an unknown category → empty result).\n- `include_non_primary` — include derived/secondary hubs (default false : primary hubs only).\n- `limit` — 1+, default 80 ; clamped server-side to 200.\n\nA Free key is enough.","operationId":"list_concept_hubs_api_v1_concepts_hubs_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"category","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Restrict to one Hub category (income_statement, balance_sheet, cash_flow, ratio, equity_info, metadata). Unknown → empty result.","title":"Category"},"description":"Restrict to one Hub category (income_statement, balance_sheet, cash_flow, ratio, equity_info, metadata). Unknown → empty result."},{"name":"include_non_primary","in":"query","required":false,"schema":{"type":"boolean","description":"Include derived/secondary hubs (default: primary only).","default":false,"title":"Include Non Primary"},"description":"Include derived/secondary hubs (default: primary only)."},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","minimum":1,"description":"Max rows (clamped server-side to 200).","default":80,"title":"Limit"},"description":"Max rows (clamped server-side to 200)."}],"responses":{"200":{"description":"Hub catalog list.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse_ListHubsResult_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"x-codeSamples":[{"lang":"curl","label":"curl","source":"curl \"https://api.hub-equity.com/api/v1/concepts/hubs\" \\\n  -H \"Authorization: Bearer $HUBEQ_API_KEY\""},{"lang":"Python","label":"Python","source":"import httpx\n\nheaders = {\"Authorization\": \"Bearer $HUBEQ_API_KEY\"}\nresp = httpx.get(\n    \"https://api.hub-equity.com/api/v1/concepts/hubs\",\n    headers=headers,\n)\nresp.raise_for_status()\ndata = resp.json()[\"data\"]  # every response is wrapped in an envelope"}],"x-code-samples":[{"lang":"curl","label":"curl","source":"curl \"https://api.hub-equity.com/api/v1/concepts/hubs\" \\\n  -H \"Authorization: Bearer $HUBEQ_API_KEY\""},{"lang":"Python","label":"Python","source":"import httpx\n\nheaders = {\"Authorization\": \"Bearer $HUBEQ_API_KEY\"}\nresp = httpx.get(\n    \"https://api.hub-equity.com/api/v1/concepts/hubs\",\n    headers=headers,\n)\nresp.raise_for_status()\ndata = resp.json()[\"data\"]  # every response is wrapped in an envelope"}]}},"/api/v1/concepts/{hub_concept_code}":{"get":{"tags":["Concepts"],"summary":"Get one hub concept's catalog entry","description":"Returns a single Hub concept by its canonical code (e.g. `REVENUE`, `NET_INCOME`, `TOTAL_ASSETS`): the data-dictionary entry (label, description, category, data type, taxonomy scope).\n\nPer-entity provenance (which XBRL concept a specific filer used) is available on the entity-scoped endpoints.\n\nA Free key is enough.","operationId":"get_concept_api_v1_concepts__hub_concept_code__get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"hub_concept_code","in":"path","required":true,"schema":{"type":"string","title":"Hub Concept Code"}}],"responses":{"200":{"description":"Hub concept forward catalog detail.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse_ConceptDetail_"}}}},"404":{"description":"Unknown concept code."},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"x-codeSamples":[{"lang":"curl","label":"curl","source":"curl \"https://api.hub-equity.com/api/v1/concepts/{hub_concept_code}\" \\\n  -H \"Authorization: Bearer $HUBEQ_API_KEY\""},{"lang":"Python","label":"Python","source":"from hub_equity import HubEquity\n\nclient = HubEquity()\nconcept = client.get_concept(\"REVENUE\")\nprint(concept.name_en, concept.category)"}],"x-code-samples":[{"lang":"curl","label":"curl","source":"curl \"https://api.hub-equity.com/api/v1/concepts/{hub_concept_code}\" \\\n  -H \"Authorization: Bearer $HUBEQ_API_KEY\""},{"lang":"Python","label":"Python","source":"from hub_equity import HubEquity\n\nclient = HubEquity()\nconcept = client.get_concept(\"REVENUE\")\nprint(concept.name_en, concept.category)"}]}},"/api/v1/dictionary/versions":{"get":{"tags":["Data Dictionary"],"summary":"List published data dictionary versions","description":"List the published versions of the Hub-Equity data dictionary (semver), each with its publication date, format version, SHA-256 checksum of the data payload and a one-line change summary. A Free key is enough.","operationId":"list_dictionary_versions_api_v1_dictionary_versions_get","responses":{"200":{"description":"Published dictionary versions.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse_dict_"}}}}},"security":[{"HTTPBearer":[]}],"x-codeSamples":[{"lang":"curl","label":"curl","source":"curl \"https://api.hub-equity.com/api/v1/dictionary/versions\" \\\n  -H \"Authorization: Bearer $HUBEQ_API_KEY\""},{"lang":"Python","label":"Python","source":"import httpx\n\nheaders = {\"Authorization\": \"Bearer $HUBEQ_API_KEY\"}\nresp = httpx.get(\n    \"https://api.hub-equity.com/api/v1/dictionary/versions\",\n    headers=headers,\n)\nresp.raise_for_status()\ndata = resp.json()[\"data\"]  # every response is wrapped in an envelope"}],"x-code-samples":[{"lang":"curl","label":"curl","source":"curl \"https://api.hub-equity.com/api/v1/dictionary/versions\" \\\n  -H \"Authorization: Bearer $HUBEQ_API_KEY\""},{"lang":"Python","label":"Python","source":"import httpx\n\nheaders = {\"Authorization\": \"Bearer $HUBEQ_API_KEY\"}\nresp = httpx.get(\n    \"https://api.hub-equity.com/api/v1/dictionary/versions\",\n    headers=headers,\n)\nresp.raise_for_status()\ndata = resp.json()[\"data\"]  # every response is wrapped in an envelope"}]}},"/api/v1/dictionary":{"get":{"tags":["Data Dictionary"],"summary":"Get the data dictionary","description":"Return the Hub-Equity data dictionary: the canonical hub catalog (code, label, definition, statement, period type, sign, comparability tier, participating accounting identities), the extraction / mapping / calculation / restatement methodology, a live coverage snapshot and the enforced accounting identities.\n\nWithout `version`, returns the current published version. With `version=X.Y.Z`, returns that version if published, else `404`.\n\nA Free key is enough.","operationId":"get_dictionary_api_v1_dictionary_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"version","in":"query","required":false,"schema":{"anyOf":[{"type":"string","maxLength":32},{"type":"null"}],"description":"Published semver to fetch (e.g. `1.0.0`). Omit for the current version.","title":"Version"},"description":"Published semver to fetch (e.g. `1.0.0`). Omit for the current version."}],"responses":{"200":{"description":"The data dictionary.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse_dict_"}}}},"404":{"description":"Unknown or unpublished version."},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"x-codeSamples":[{"lang":"curl","label":"curl","source":"curl \"https://api.hub-equity.com/api/v1/dictionary\" \\\n  -H \"Authorization: Bearer $HUBEQ_API_KEY\""},{"lang":"Python","label":"Python","source":"import httpx\n\nheaders = {\"Authorization\": \"Bearer $HUBEQ_API_KEY\"}\nresp = httpx.get(\n    \"https://api.hub-equity.com/api/v1/dictionary\",\n    headers=headers,\n)\nresp.raise_for_status()\ndata = resp.json()[\"data\"]  # every response is wrapped in an envelope"}],"x-code-samples":[{"lang":"curl","label":"curl","source":"curl \"https://api.hub-equity.com/api/v1/dictionary\" \\\n  -H \"Authorization: Bearer $HUBEQ_API_KEY\""},{"lang":"Python","label":"Python","source":"import httpx\n\nheaders = {\"Authorization\": \"Bearer $HUBEQ_API_KEY\"}\nresp = httpx.get(\n    \"https://api.hub-equity.com/api/v1/dictionary\",\n    headers=headers,\n)\nresp.raise_for_status()\ndata = resp.json()[\"data\"]  # every response is wrapped in an envelope"}]}},"/api/v1/companies/screen":{"get":{"tags":["Companies"],"summary":"Screen the Hub-Equity universe by criteria","description":"Filters the company universe: 'European tech companies with revenue > 1B audited by Big 4' in one call. All filters are optional ; results carry the matched `applied_filters` back.\n\nQuery params : `country` (ISO-2), `sector` (substring), `gics_sector`, `min_revenue` / `max_revenue` (USD, ECB spot rate), `min_employees` / `max_employees`, `revenue_year`, `auditor_name` (substring), `bankruptcy_flag`, `min_quality_grade` (A+/A/B/C/D), `sort_by` ∈ {revenue_desc, revenue_asc, employees_desc, employees_asc, quality_desc, name_asc}, `limit` (1-50).\n\nFree plan: `limit` up to 20 and no `min_quality_grade` filter (beyond that: 401 AUTH_REQUIRED for an anonymous caller, 403 SCOPE_MISSING for a Free key); any paid plan lifts both. Rate limit: the plan of the calling key (Free 120, Builder 300, Team 600, Enterprise 1,000 per minute).","operationId":"screen_companies_endpoint_api_v1_companies_screen_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"country","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"ISO-2 country code.","title":"Country"},"description":"ISO-2 country code."},{"name":"sector","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Sector substring match.","title":"Sector"},"description":"Sector substring match."},{"name":"gics_sector","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Exact GICS sector.","title":"Gics Sector"},"description":"Exact GICS sector."},{"name":"min_revenue","in":"query","required":false,"schema":{"anyOf":[{"type":"number"},{"type":"null"}],"description":"Min revenue (USD, ECB spot rate).","title":"Min Revenue"},"description":"Min revenue (USD, ECB spot rate)."},{"name":"max_revenue","in":"query","required":false,"schema":{"anyOf":[{"type":"number"},{"type":"null"}],"description":"Max revenue (USD, ECB spot rate).","title":"Max Revenue"},"description":"Max revenue (USD, ECB spot rate)."},{"name":"min_employees","in":"query","required":false,"schema":{"anyOf":[{"type":"integer","minimum":0},{"type":"null"}],"title":"Min Employees"}},{"name":"max_employees","in":"query","required":false,"schema":{"anyOf":[{"type":"integer","minimum":0},{"type":"null"}],"title":"Max Employees"}},{"name":"min_quality_grade","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"A+/A/B/C/D minimum grade.","title":"Min Quality Grade"},"description":"A+/A/B/C/D minimum grade."},{"name":"auditor_name","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Auditor name substring.","title":"Auditor Name"},"description":"Auditor name substring."},{"name":"bankruptcy_flag","in":"query","required":false,"schema":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Bankruptcy Flag"}},{"name":"revenue_year","in":"query","required":false,"schema":{"anyOf":[{"type":"integer","maximum":2100,"minimum":1990},{"type":"null"}],"title":"Revenue Year"}},{"name":"sort_by","in":"query","required":false,"schema":{"type":"string","description":"revenue_desc | revenue_asc | employees_desc | employees_asc | quality_desc | name_asc.","default":"revenue_desc","title":"Sort By"},"description":"revenue_desc | revenue_asc | employees_desc | employees_asc | quality_desc | name_asc."},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","minimum":1,"description":"Max rows (clamped to 50).","default":20,"title":"Limit"},"description":"Max rows (clamped to 50)."}],"responses":{"200":{"description":"Screened companies + applied filters.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse_ScreenCompaniesResult_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"x-codeSamples":[{"lang":"curl","label":"curl","source":"curl \"https://api.hub-equity.com/api/v1/companies/screen\" \\\n  -H \"Authorization: Bearer $HUBEQ_API_KEY\""},{"lang":"Python","label":"Python","source":"import httpx\n\nheaders = {\"Authorization\": \"Bearer $HUBEQ_API_KEY\"}\nresp = httpx.get(\n    \"https://api.hub-equity.com/api/v1/companies/screen\",\n    headers=headers,\n)\nresp.raise_for_status()\ndata = resp.json()[\"data\"]  # every response is wrapped in an envelope"}],"x-code-samples":[{"lang":"curl","label":"curl","source":"curl \"https://api.hub-equity.com/api/v1/companies/screen\" \\\n  -H \"Authorization: Bearer $HUBEQ_API_KEY\""},{"lang":"Python","label":"Python","source":"import httpx\n\nheaders = {\"Authorization\": \"Bearer $HUBEQ_API_KEY\"}\nresp = httpx.get(\n    \"https://api.hub-equity.com/api/v1/companies/screen\",\n    headers=headers,\n)\nresp.raise_for_status()\ndata = resp.json()[\"data\"]  # every response is wrapped in an envelope"}]}},"/api/v1/tenants/me/invitations":{"get":{"tags":["Tenants"],"summary":"List own tenant invitations (admin)","description":"Returns every invitation issued for the workspace (active, accepted, revoked, expired), newest first. Tokens are readable so the admin can share them again.","operationId":"list_invitations_api_v1_tenants_me_invitations_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse_list_InvitationResponse__"}}}}},"security":[{"HTTPBearer":[]}],"x-codeSamples":[{"lang":"curl","label":"curl","source":"curl \"https://api.hub-equity.com/api/v1/tenants/me/invitations\" \\\n  -H \"Authorization: Bearer $HUBEQ_API_KEY\""},{"lang":"Python","label":"Python","source":"import httpx\n\nheaders = {\"Authorization\": \"Bearer $HUBEQ_API_KEY\"}\nresp = httpx.get(\n    \"https://api.hub-equity.com/api/v1/tenants/me/invitations\",\n    headers=headers,\n)\nresp.raise_for_status()\ndata = resp.json()[\"data\"]  # every response is wrapped in an envelope"}],"x-code-samples":[{"lang":"curl","label":"curl","source":"curl \"https://api.hub-equity.com/api/v1/tenants/me/invitations\" \\\n  -H \"Authorization: Bearer $HUBEQ_API_KEY\""},{"lang":"Python","label":"Python","source":"import httpx\n\nheaders = {\"Authorization\": \"Bearer $HUBEQ_API_KEY\"}\nresp = httpx.get(\n    \"https://api.hub-equity.com/api/v1/tenants/me/invitations\",\n    headers=headers,\n)\nresp.raise_for_status()\ndata = resp.json()[\"data\"]  # every response is wrapped in an envelope"}]},"post":{"tags":["Tenants"],"summary":"Generate a tenant invitation token (admin)","description":"Creates an invitation token that the admin shares with the invitee, who then uses it via POST /api/v1/tenants/me/invitations/accept or the signup flow `/signup?invitation_token={token}`. At most 5 active invitations per admin, and only while the plan has a seat left (`409` otherwise).","operationId":"create_invitation_api_v1_tenants_me_invitations_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateInvitationRequest"}}},"required":true},"responses":{"201":{"description":"Invitation created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse_InvitationCreatedResponse_"}}}},"403":{"description":"Tenant admin role required"},"409":{"description":"Max 5 active invitations reached, or no seat left on the plan"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}],"x-codeSamples":[{"lang":"curl","label":"curl","source":"curl -X POST \"https://api.hub-equity.com/api/v1/tenants/me/invitations\" \\\n  -H \"Authorization: Bearer $HUBEQ_API_KEY\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{}'"},{"lang":"Python","label":"Python","source":"import httpx\n\nheaders = {\"Authorization\": \"Bearer $HUBEQ_API_KEY\"}\nresp = httpx.post(\n    \"https://api.hub-equity.com/api/v1/tenants/me/invitations\",\n    headers=headers,\n    json={},\n)\nresp.raise_for_status()\ndata = resp.json()[\"data\"]  # every response is wrapped in an envelope"}],"x-code-samples":[{"lang":"curl","label":"curl","source":"curl -X POST \"https://api.hub-equity.com/api/v1/tenants/me/invitations\" \\\n  -H \"Authorization: Bearer $HUBEQ_API_KEY\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{}'"},{"lang":"Python","label":"Python","source":"import httpx\n\nheaders = {\"Authorization\": \"Bearer $HUBEQ_API_KEY\"}\nresp = httpx.post(\n    \"https://api.hub-equity.com/api/v1/tenants/me/invitations\",\n    headers=headers,\n    json={},\n)\nresp.raise_for_status()\ndata = resp.json()[\"data\"]  # every response is wrapped in an envelope"}]}},"/api/v1/tenants/me/invitations/{invitation_id}":{"delete":{"tags":["Tenants"],"summary":"Revoke a tenant invitation (admin)","description":"Revokes a pending invitation token so it can no longer be accepted. Tenant-admin only. Returns `404` if the invitation isn't in your tenant and `409` if it was already revoked or already accepted.","operationId":"revoke_invitation_api_v1_tenants_me_invitations__invitation_id__delete","security":[{"HTTPBearer":[]}],"parameters":[{"name":"invitation_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Invitation Id"}}],"responses":{"204":{"description":"Invitation revoked"},"404":{"description":"Invitation not found in this tenant"},"409":{"description":"Invitation already revoked or already accepted"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"x-codeSamples":[{"lang":"curl","label":"curl","source":"curl -X DELETE \"https://api.hub-equity.com/api/v1/tenants/me/invitations/{invitation_id}\" \\\n  -H \"Authorization: Bearer $HUBEQ_API_KEY\""},{"lang":"Python","label":"Python","source":"import httpx\n\nheaders = {\"Authorization\": \"Bearer $HUBEQ_API_KEY\"}\nresp = httpx.delete(\n    \"https://api.hub-equity.com/api/v1/tenants/me/invitations/{invitation_id}\",\n    headers=headers,\n)\nresp.raise_for_status()\ndata = resp.json()[\"data\"]  # every response is wrapped in an envelope"}],"x-code-samples":[{"lang":"curl","label":"curl","source":"curl -X DELETE \"https://api.hub-equity.com/api/v1/tenants/me/invitations/{invitation_id}\" \\\n  -H \"Authorization: Bearer $HUBEQ_API_KEY\""},{"lang":"Python","label":"Python","source":"import httpx\n\nheaders = {\"Authorization\": \"Bearer $HUBEQ_API_KEY\"}\nresp = httpx.delete(\n    \"https://api.hub-equity.com/api/v1/tenants/me/invitations/{invitation_id}\",\n    headers=headers,\n)\nresp.raise_for_status()\ndata = resp.json()[\"data\"]  # every response is wrapped in an envelope"}]}},"/api/v1/tenants/me/invitations/accept":{"post":{"tags":["Tenants"],"summary":"Accept a tenant invitation (any authenticated user)","description":"Accepts an invitation token: when it is valid (not expired, revoked or already used), the caller joins the workspace with the invited role and the invitation is marked accepted.","operationId":"accept_invitation_api_v1_tenants_me_invitations_accept_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AcceptInvitationRequest"}}},"required":true},"responses":{"200":{"description":"Invitation accepted, caller joined the tenant","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse_AcceptInvitationResponse_"}}}},"400":{"description":"Token invalid / expired / already accepted / revoked"},"401":{"description":"Authentication required"},"409":{"description":"No seat left on the workspace's plan"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}],"x-codeSamples":[{"lang":"curl","label":"curl","source":"curl -X POST \"https://api.hub-equity.com/api/v1/tenants/me/invitations/accept\" \\\n  -H \"Authorization: Bearer $HUBEQ_API_KEY\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{}'"},{"lang":"Python","label":"Python","source":"import httpx\n\nheaders = {\"Authorization\": \"Bearer $HUBEQ_API_KEY\"}\nresp = httpx.post(\n    \"https://api.hub-equity.com/api/v1/tenants/me/invitations/accept\",\n    headers=headers,\n    json={},\n)\nresp.raise_for_status()\ndata = resp.json()[\"data\"]  # every response is wrapped in an envelope"}],"x-code-samples":[{"lang":"curl","label":"curl","source":"curl -X POST \"https://api.hub-equity.com/api/v1/tenants/me/invitations/accept\" \\\n  -H \"Authorization: Bearer $HUBEQ_API_KEY\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{}'"},{"lang":"Python","label":"Python","source":"import httpx\n\nheaders = {\"Authorization\": \"Bearer $HUBEQ_API_KEY\"}\nresp = httpx.post(\n    \"https://api.hub-equity.com/api/v1/tenants/me/invitations/accept\",\n    headers=headers,\n    json={},\n)\nresp.raise_for_status()\ndata = resp.json()[\"data\"]  # every response is wrapped in an envelope"}]}},"/api/v1/tenants/me/members":{"get":{"tags":["Tenants"],"summary":"List tenant members (any tenant member)","description":"Returns every member of the workspace with their role, email and full_name. Visible to every member of the workspace (admins and members).","operationId":"list_members_api_v1_tenants_me_members_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse_list_MemberResponse__"}}}}},"security":[{"HTTPBearer":[]}],"x-codeSamples":[{"lang":"curl","label":"curl","source":"curl \"https://api.hub-equity.com/api/v1/tenants/me/members\" \\\n  -H \"Authorization: Bearer $HUBEQ_API_KEY\""},{"lang":"Python","label":"Python","source":"import httpx\n\nheaders = {\"Authorization\": \"Bearer $HUBEQ_API_KEY\"}\nresp = httpx.get(\n    \"https://api.hub-equity.com/api/v1/tenants/me/members\",\n    headers=headers,\n)\nresp.raise_for_status()\ndata = resp.json()[\"data\"]  # every response is wrapped in an envelope"}],"x-code-samples":[{"lang":"curl","label":"curl","source":"curl \"https://api.hub-equity.com/api/v1/tenants/me/members\" \\\n  -H \"Authorization: Bearer $HUBEQ_API_KEY\""},{"lang":"Python","label":"Python","source":"import httpx\n\nheaders = {\"Authorization\": \"Bearer $HUBEQ_API_KEY\"}\nresp = httpx.get(\n    \"https://api.hub-equity.com/api/v1/tenants/me/members\",\n    headers=headers,\n)\nresp.raise_for_status()\ndata = resp.json()[\"data\"]  # every response is wrapped in an envelope"}]}},"/api/v1/tenants/me/members/{user_id}":{"patch":{"tags":["Tenants"],"summary":"Change member role (admin)","description":"Promotes or demotes a tenant member between `admin` and `member`. Tenant-admin only. The last remaining admin cannot be demoted (`400`) — promote another member first.","operationId":"update_member_api_v1_tenants_me_members__user_id__patch","security":[{"HTTPBearer":[]}],"parameters":[{"name":"user_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"User Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateMemberRequest"}}}},"responses":{"200":{"description":"Role updated","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse_MemberResponse_"}}}},"400":{"description":"Cannot demote the only admin"},"404":{"description":"Member not found in this tenant"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"x-codeSamples":[{"lang":"curl","label":"curl","source":"curl -X PATCH \"https://api.hub-equity.com/api/v1/tenants/me/members/{user_id}\" \\\n  -H \"Authorization: Bearer $HUBEQ_API_KEY\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{}'"},{"lang":"Python","label":"Python","source":"import httpx\n\nheaders = {\"Authorization\": \"Bearer $HUBEQ_API_KEY\"}\nresp = httpx.patch(\n    \"https://api.hub-equity.com/api/v1/tenants/me/members/{user_id}\",\n    headers=headers,\n    json={},\n)\nresp.raise_for_status()\ndata = resp.json()[\"data\"]  # every response is wrapped in an envelope"}],"x-code-samples":[{"lang":"curl","label":"curl","source":"curl -X PATCH \"https://api.hub-equity.com/api/v1/tenants/me/members/{user_id}\" \\\n  -H \"Authorization: Bearer $HUBEQ_API_KEY\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{}'"},{"lang":"Python","label":"Python","source":"import httpx\n\nheaders = {\"Authorization\": \"Bearer $HUBEQ_API_KEY\"}\nresp = httpx.patch(\n    \"https://api.hub-equity.com/api/v1/tenants/me/members/{user_id}\",\n    headers=headers,\n    json={},\n)\nresp.raise_for_status()\ndata = resp.json()[\"data\"]  # every response is wrapped in an envelope"}]},"delete":{"tags":["Tenants"],"summary":"Remove a member from the tenant (admin)","description":"Removes a member from the tenant, revoking their access to shared resources and the API keys they created in it. Tenant-admin only. The last remaining admin cannot be removed (`400`) — transfer the role first.","operationId":"remove_member_api_v1_tenants_me_members__user_id__delete","security":[{"HTTPBearer":[]}],"parameters":[{"name":"user_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"User Id"}}],"responses":{"204":{"description":"Member removed"},"400":{"description":"Cannot remove the only admin (or yourself if you're it)"},"404":{"description":"Member not found in this tenant"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"x-codeSamples":[{"lang":"curl","label":"curl","source":"curl -X DELETE \"https://api.hub-equity.com/api/v1/tenants/me/members/{user_id}\" \\\n  -H \"Authorization: Bearer $HUBEQ_API_KEY\""},{"lang":"Python","label":"Python","source":"import httpx\n\nheaders = {\"Authorization\": \"Bearer $HUBEQ_API_KEY\"}\nresp = httpx.delete(\n    \"https://api.hub-equity.com/api/v1/tenants/me/members/{user_id}\",\n    headers=headers,\n)\nresp.raise_for_status()\ndata = resp.json()[\"data\"]  # every response is wrapped in an envelope"}],"x-code-samples":[{"lang":"curl","label":"curl","source":"curl -X DELETE \"https://api.hub-equity.com/api/v1/tenants/me/members/{user_id}\" \\\n  -H \"Authorization: Bearer $HUBEQ_API_KEY\""},{"lang":"Python","label":"Python","source":"import httpx\n\nheaders = {\"Authorization\": \"Bearer $HUBEQ_API_KEY\"}\nresp = httpx.delete(\n    \"https://api.hub-equity.com/api/v1/tenants/me/members/{user_id}\",\n    headers=headers,\n)\nresp.raise_for_status()\ndata = resp.json()[\"data\"]  # every response is wrapped in an envelope"}]}}},"components":{"schemas":{"AcceptInvitationRequest":{"properties":{"token":{"type":"string","format":"uuid","title":"Token","description":"The invitation token received from the workspace admin."}},"type":"object","required":["token"],"title":"AcceptInvitationRequest"},"AcceptInvitationResponse":{"properties":{"tenant_id":{"type":"string","format":"uuid","title":"Tenant Id"},"role":{"type":"string","title":"Role"},"joined_at":{"type":"string","format":"date-time","title":"Joined At"}},"type":"object","required":["tenant_id","role","joined_at"],"title":"AcceptInvitationResponse"},"AmendmentDiffResult":{"properties":{"entity_id":{"type":"string","title":"Entity Id"},"entity_name":{"type":"string","title":"Entity Name"},"changes":{"items":{"$ref":"#/components/schemas/ConceptChange"},"type":"array","title":"Changes"},"total_count":{"type":"integer","title":"Total Count"},"applied_filters":{"additionalProperties":true,"type":"object","title":"Applied Filters"},"notes":{"items":{"type":"string"},"type":"array","title":"Notes"}},"type":"object","required":["entity_id","entity_name","changes","total_count"],"title":"AmendmentDiffResult"},"AmendmentsResponse":{"properties":{"entity_id":{"type":"string","title":"Entity Id"},"entity_name":{"type":"string","title":"Entity Name"},"total":{"type":"integer","title":"Total"},"amendments":{"items":{"$ref":"#/components/schemas/src__models__schemas__Amendment"},"type":"array","title":"Amendments"},"series":{"additionalProperties":{"items":{"$ref":"#/components/schemas/ConceptHistoryPoint"},"type":"array"},"type":"object","title":"Series"}},"type":"object","required":["entity_id","entity_name","total","amendments"],"title":"AmendmentsResponse","description":"Response for GET /entities/{id}/amendments."},"AmendmentsResult":{"properties":{"entity_id":{"type":"string","title":"Entity Id"},"entity_name":{"type":"string","title":"Entity Name"},"amendments":{"items":{"$ref":"#/components/schemas/hub_equity_mcp__tools__get_amendments__Amendment"},"type":"array","title":"Amendments"},"notes":{"items":{"type":"string"},"type":"array","title":"Notes"}},"type":"object","required":["entity_id","entity_name","amendments"],"title":"AmendmentsResult"},"ApiError":{"properties":{"code":{"type":"string","title":"Code"},"message":{"type":"string","title":"Message"},"details":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Details"}},"type":"object","required":["code","message"],"title":"ApiError","description":"API error details."},"ApiKeyCreatedResponse":{"properties":{"id":{"type":"string","format":"uuid","title":"Id"},"name":{"type":"string","title":"Name"},"full_key":{"type":"string","title":"Full Key","description":"The complete `hubq_{env}_…` token. Shown ONCE — store it securely (password manager). It cannot be retrieved again — only revoked."},"key_prefix":{"type":"string","title":"Key Prefix"},"scopes":{"items":{"type":"string"},"type":"array","title":"Scopes"},"allowed_cidrs":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Allowed Cidrs"},"plan_override":{"type":"null","title":"Plan Override","description":"DEPRECATED, always null. The column was dropped; the field stays in the response because it is `required` in the published OpenAPI and a third-party client consumes these endpoints. Removing it would be a breaking change, not a cleanup.","deprecated":true},"environment":{"type":"string","title":"Environment"},"expires_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Expires At"},"created_at":{"type":"string","format":"date-time","title":"Created At"}},"type":"object","required":["id","name","full_key","key_prefix","scopes","plan_override","environment","expires_at","created_at"],"title":"ApiKeyCreatedResponse","description":"Returned ONCE at POST creation — `full_key` is shown only here."},"ApiKeyResponse":{"properties":{"id":{"type":"string","format":"uuid","title":"Id"},"name":{"type":"string","title":"Name"},"key_prefix":{"type":"string","title":"Key Prefix"},"scopes":{"items":{"type":"string"},"type":"array","title":"Scopes"},"allowed_cidrs":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Allowed Cidrs"},"plan_override":{"type":"null","title":"Plan Override","description":"DEPRECATED, always null -- see `ApiKeyCreatedResponse.plan_override`.","deprecated":true},"environment":{"type":"string","title":"Environment"},"last_used_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Last Used At"},"last_used_ip":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Last Used Ip"},"revoked_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Revoked At"},"revoked_reason":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Revoked Reason"},"expires_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Expires At"},"created_at":{"type":"string","format":"date-time","title":"Created At"},"tos_version":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Tos Version"}},"type":"object","required":["id","name","key_prefix","scopes","plan_override","environment","last_used_at","last_used_ip","revoked_at","revoked_reason","expires_at","created_at","tos_version"],"title":"ApiKeyResponse","description":"Masked view (no full_key) — used for list / detail / patch."},"ApiLinks":{"properties":{"self":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Self"},"first":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"First"},"prev":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Prev"},"next":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Next"},"last":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Last"}},"type":"object","title":"ApiLinks","description":"HATEOAS-style pagination cursors.\n\nHost-relative path + query links for a collection page. Present on\ncollection endpoints, ``null`` fields where a page doesn't exist (``next``\non the last page, ``prev`` on the first). The whole ``links`` object is\nomitted from single-resource responses (see ``ApiResponse`` serializer)."},"ApiMeta":{"properties":{"timestamp":{"type":"string","format":"date-time","title":"Timestamp"},"request_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Request Id"},"page":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Page"},"per_page":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Per Page"},"total":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Total"}},"type":"object","title":"ApiMeta","description":"API response metadata.\n\nPagination fields (``page`` / ``per_page`` / ``total``) are populated on\ncollection endpoints only. They are omitted from the payload on\nsingle-resource endpoints."},"ApiResponse_AcceptInvitationResponse_":{"properties":{"success":{"type":"boolean","title":"Success"},"data":{"anyOf":[{"$ref":"#/components/schemas/AcceptInvitationResponse"},{"type":"null"}]},"error":{"anyOf":[{"$ref":"#/components/schemas/ApiError"},{"type":"null"}]},"meta":{"$ref":"#/components/schemas/ApiMeta"},"links":{"anyOf":[{"$ref":"#/components/schemas/ApiLinks"},{"type":"null"}]}},"type":"object","required":["success"],"title":"ApiResponse[AcceptInvitationResponse]"},"ApiResponse_AmendmentDiffResult_":{"properties":{"success":{"type":"boolean","title":"Success"},"data":{"anyOf":[{"$ref":"#/components/schemas/AmendmentDiffResult"},{"type":"null"}]},"error":{"anyOf":[{"$ref":"#/components/schemas/ApiError"},{"type":"null"}]},"meta":{"$ref":"#/components/schemas/ApiMeta"},"links":{"anyOf":[{"$ref":"#/components/schemas/ApiLinks"},{"type":"null"}]}},"type":"object","required":["success"],"title":"ApiResponse[AmendmentDiffResult]"},"ApiResponse_AmendmentsResponse_":{"properties":{"success":{"type":"boolean","title":"Success"},"data":{"anyOf":[{"$ref":"#/components/schemas/AmendmentsResponse"},{"type":"null"}]},"error":{"anyOf":[{"$ref":"#/components/schemas/ApiError"},{"type":"null"}]},"meta":{"$ref":"#/components/schemas/ApiMeta"},"links":{"anyOf":[{"$ref":"#/components/schemas/ApiLinks"},{"type":"null"}]}},"type":"object","required":["success"],"title":"ApiResponse[AmendmentsResponse]"},"ApiResponse_AmendmentsResult_":{"properties":{"success":{"type":"boolean","title":"Success"},"data":{"anyOf":[{"$ref":"#/components/schemas/AmendmentsResult"},{"type":"null"}]},"error":{"anyOf":[{"$ref":"#/components/schemas/ApiError"},{"type":"null"}]},"meta":{"$ref":"#/components/schemas/ApiMeta"},"links":{"anyOf":[{"$ref":"#/components/schemas/ApiLinks"},{"type":"null"}]}},"type":"object","required":["success"],"title":"ApiResponse[AmendmentsResult]"},"ApiResponse_ApiKeyCreatedResponse_":{"properties":{"success":{"type":"boolean","title":"Success"},"data":{"anyOf":[{"$ref":"#/components/schemas/ApiKeyCreatedResponse"},{"type":"null"}]},"error":{"anyOf":[{"$ref":"#/components/schemas/ApiError"},{"type":"null"}]},"meta":{"$ref":"#/components/schemas/ApiMeta"},"links":{"anyOf":[{"$ref":"#/components/schemas/ApiLinks"},{"type":"null"}]}},"type":"object","required":["success"],"title":"ApiResponse[ApiKeyCreatedResponse]"},"ApiResponse_ApiKeyResponse_":{"properties":{"success":{"type":"boolean","title":"Success"},"data":{"anyOf":[{"$ref":"#/components/schemas/ApiKeyResponse"},{"type":"null"}]},"error":{"anyOf":[{"$ref":"#/components/schemas/ApiError"},{"type":"null"}]},"meta":{"$ref":"#/components/schemas/ApiMeta"},"links":{"anyOf":[{"$ref":"#/components/schemas/ApiLinks"},{"type":"null"}]}},"type":"object","required":["success"],"title":"ApiResponse[ApiKeyResponse]"},"ApiResponse_AsOfResponse_":{"properties":{"success":{"type":"boolean","title":"Success"},"data":{"anyOf":[{"$ref":"#/components/schemas/AsOfResponse"},{"type":"null"}]},"error":{"anyOf":[{"$ref":"#/components/schemas/ApiError"},{"type":"null"}]},"meta":{"$ref":"#/components/schemas/ApiMeta"},"links":{"anyOf":[{"$ref":"#/components/schemas/ApiLinks"},{"type":"null"}]}},"type":"object","required":["success"],"title":"ApiResponse[AsOfResponse]"},"ApiResponse_BillingSessionResponse_":{"properties":{"success":{"type":"boolean","title":"Success"},"data":{"anyOf":[{"$ref":"#/components/schemas/BillingSessionResponse"},{"type":"null"}]},"error":{"anyOf":[{"$ref":"#/components/schemas/ApiError"},{"type":"null"}]},"meta":{"$ref":"#/components/schemas/ApiMeta"},"links":{"anyOf":[{"$ref":"#/components/schemas/ApiLinks"},{"type":"null"}]}},"type":"object","required":["success"],"title":"ApiResponse[BillingSessionResponse]"},"ApiResponse_BillingStatusResponse_":{"properties":{"success":{"type":"boolean","title":"Success"},"data":{"anyOf":[{"$ref":"#/components/schemas/BillingStatusResponse"},{"type":"null"}]},"error":{"anyOf":[{"$ref":"#/components/schemas/ApiError"},{"type":"null"}]},"meta":{"$ref":"#/components/schemas/ApiMeta"},"links":{"anyOf":[{"$ref":"#/components/schemas/ApiLinks"},{"type":"null"}]}},"type":"object","required":["success"],"title":"ApiResponse[BillingStatusResponse]"},"ApiResponse_BreakdownResponse_":{"properties":{"success":{"type":"boolean","title":"Success"},"data":{"anyOf":[{"$ref":"#/components/schemas/BreakdownResponse"},{"type":"null"}]},"error":{"anyOf":[{"$ref":"#/components/schemas/ApiError"},{"type":"null"}]},"meta":{"$ref":"#/components/schemas/ApiMeta"},"links":{"anyOf":[{"$ref":"#/components/schemas/ApiLinks"},{"type":"null"}]}},"type":"object","required":["success"],"title":"ApiResponse[BreakdownResponse]"},"ApiResponse_ComparativeRestatementsResponse_":{"properties":{"success":{"type":"boolean","title":"Success"},"data":{"anyOf":[{"$ref":"#/components/schemas/ComparativeRestatementsResponse"},{"type":"null"}]},"error":{"anyOf":[{"$ref":"#/components/schemas/ApiError"},{"type":"null"}]},"meta":{"$ref":"#/components/schemas/ApiMeta"},"links":{"anyOf":[{"$ref":"#/components/schemas/ApiLinks"},{"type":"null"}]}},"type":"object","required":["success"],"title":"ApiResponse[ComparativeRestatementsResponse]"},"ApiResponse_CompareEntitiesResult_":{"properties":{"success":{"type":"boolean","title":"Success"},"data":{"anyOf":[{"$ref":"#/components/schemas/CompareEntitiesResult"},{"type":"null"}]},"error":{"anyOf":[{"$ref":"#/components/schemas/ApiError"},{"type":"null"}]},"meta":{"$ref":"#/components/schemas/ApiMeta"},"links":{"anyOf":[{"$ref":"#/components/schemas/ApiLinks"},{"type":"null"}]}},"type":"object","required":["success"],"title":"ApiResponse[CompareEntitiesResult]"},"ApiResponse_CompareFilingsResult_":{"properties":{"success":{"type":"boolean","title":"Success"},"data":{"anyOf":[{"$ref":"#/components/schemas/CompareFilingsResult"},{"type":"null"}]},"error":{"anyOf":[{"$ref":"#/components/schemas/ApiError"},{"type":"null"}]},"meta":{"$ref":"#/components/schemas/ApiMeta"},"links":{"anyOf":[{"$ref":"#/components/schemas/ApiLinks"},{"type":"null"}]}},"type":"object","required":["success"],"title":"ApiResponse[CompareFilingsResult]"},"ApiResponse_ConceptDetail_":{"properties":{"success":{"type":"boolean","title":"Success"},"data":{"anyOf":[{"$ref":"#/components/schemas/ConceptDetail"},{"type":"null"}]},"error":{"anyOf":[{"$ref":"#/components/schemas/ApiError"},{"type":"null"}]},"meta":{"$ref":"#/components/schemas/ApiMeta"},"links":{"anyOf":[{"$ref":"#/components/schemas/ApiLinks"},{"type":"null"}]}},"type":"object","required":["success"],"title":"ApiResponse[ConceptDetail]"},"ApiResponse_ConceptSearchResponse_":{"properties":{"success":{"type":"boolean","title":"Success"},"data":{"anyOf":[{"$ref":"#/components/schemas/ConceptSearchResponse"},{"type":"null"}]},"error":{"anyOf":[{"$ref":"#/components/schemas/ApiError"},{"type":"null"}]},"meta":{"$ref":"#/components/schemas/ApiMeta"},"links":{"anyOf":[{"$ref":"#/components/schemas/ApiLinks"},{"type":"null"}]}},"type":"object","required":["success"],"title":"ApiResponse[ConceptSearchResponse]"},"ApiResponse_ConvertCurrencyResult_":{"properties":{"success":{"type":"boolean","title":"Success"},"data":{"anyOf":[{"$ref":"#/components/schemas/ConvertCurrencyResult"},{"type":"null"}]},"error":{"anyOf":[{"$ref":"#/components/schemas/ApiError"},{"type":"null"}]},"meta":{"$ref":"#/components/schemas/ApiMeta"},"links":{"anyOf":[{"$ref":"#/components/schemas/ApiLinks"},{"type":"null"}]}},"type":"object","required":["success"],"title":"ApiResponse[ConvertCurrencyResult]"},"ApiResponse_DashboardStats_":{"properties":{"success":{"type":"boolean","title":"Success"},"data":{"anyOf":[{"$ref":"#/components/schemas/DashboardStats"},{"type":"null"}]},"error":{"anyOf":[{"$ref":"#/components/schemas/ApiError"},{"type":"null"}]},"meta":{"$ref":"#/components/schemas/ApiMeta"},"links":{"anyOf":[{"$ref":"#/components/schemas/ApiLinks"},{"type":"null"}]}},"type":"object","required":["success"],"title":"ApiResponse[DashboardStats]"},"ApiResponse_DataQualityResult_":{"properties":{"success":{"type":"boolean","title":"Success"},"data":{"anyOf":[{"$ref":"#/components/schemas/DataQualityResult"},{"type":"null"}]},"error":{"anyOf":[{"$ref":"#/components/schemas/ApiError"},{"type":"null"}]},"meta":{"$ref":"#/components/schemas/ApiMeta"},"links":{"anyOf":[{"$ref":"#/components/schemas/ApiLinks"},{"type":"null"}]}},"type":"object","required":["success"],"title":"ApiResponse[DataQualityResult]"},"ApiResponse_DatasetCoverage_":{"properties":{"success":{"type":"boolean","title":"Success"},"data":{"anyOf":[{"$ref":"#/components/schemas/DatasetCoverage"},{"type":"null"}]},"error":{"anyOf":[{"$ref":"#/components/schemas/ApiError"},{"type":"null"}]},"meta":{"$ref":"#/components/schemas/ApiMeta"},"links":{"anyOf":[{"$ref":"#/components/schemas/ApiLinks"},{"type":"null"}]}},"type":"object","required":["success"],"title":"ApiResponse[DatasetCoverage]"},"ApiResponse_Decomposition_":{"properties":{"success":{"type":"boolean","title":"Success"},"data":{"anyOf":[{"$ref":"#/components/schemas/Decomposition"},{"type":"null"}]},"error":{"anyOf":[{"$ref":"#/components/schemas/ApiError"},{"type":"null"}]},"meta":{"$ref":"#/components/schemas/ApiMeta"},"links":{"anyOf":[{"$ref":"#/components/schemas/ApiLinks"},{"type":"null"}]}},"type":"object","required":["success"],"title":"ApiResponse[Decomposition]"},"ApiResponse_DisclosureHtmlPayload_":{"properties":{"success":{"type":"boolean","title":"Success"},"data":{"anyOf":[{"$ref":"#/components/schemas/DisclosureHtmlPayload"},{"type":"null"}]},"error":{"anyOf":[{"$ref":"#/components/schemas/ApiError"},{"type":"null"}]},"meta":{"$ref":"#/components/schemas/ApiMeta"},"links":{"anyOf":[{"$ref":"#/components/schemas/ApiLinks"},{"type":"null"}]}},"type":"object","required":["success"],"title":"ApiResponse[DisclosureHtmlPayload]"},"ApiResponse_DisclosureUrlPayload_":{"properties":{"success":{"type":"boolean","title":"Success"},"data":{"anyOf":[{"$ref":"#/components/schemas/DisclosureUrlPayload"},{"type":"null"}]},"error":{"anyOf":[{"$ref":"#/components/schemas/ApiError"},{"type":"null"}]},"meta":{"$ref":"#/components/schemas/ApiMeta"},"links":{"anyOf":[{"$ref":"#/components/schemas/ApiLinks"},{"type":"null"}]}},"type":"object","required":["success"],"title":"ApiResponse[DisclosureUrlPayload]"},"ApiResponse_DisclosuresResponse_":{"properties":{"success":{"type":"boolean","title":"Success"},"data":{"anyOf":[{"$ref":"#/components/schemas/DisclosuresResponse"},{"type":"null"}]},"error":{"anyOf":[{"$ref":"#/components/schemas/ApiError"},{"type":"null"}]},"meta":{"$ref":"#/components/schemas/ApiMeta"},"links":{"anyOf":[{"$ref":"#/components/schemas/ApiLinks"},{"type":"null"}]}},"type":"object","required":["success"],"title":"ApiResponse[DisclosuresResponse]"},"ApiResponse_EntityDei_":{"properties":{"success":{"type":"boolean","title":"Success"},"data":{"anyOf":[{"$ref":"#/components/schemas/EntityDei"},{"type":"null"}]},"error":{"anyOf":[{"$ref":"#/components/schemas/ApiError"},{"type":"null"}]},"meta":{"$ref":"#/components/schemas/ApiMeta"},"links":{"anyOf":[{"$ref":"#/components/schemas/ApiLinks"},{"type":"null"}]}},"type":"object","required":["success"],"title":"ApiResponse[EntityDei]"},"ApiResponse_EntityDimensionsResponse_":{"properties":{"success":{"type":"boolean","title":"Success"},"data":{"anyOf":[{"$ref":"#/components/schemas/EntityDimensionsResponse"},{"type":"null"}]},"error":{"anyOf":[{"$ref":"#/components/schemas/ApiError"},{"type":"null"}]},"meta":{"$ref":"#/components/schemas/ApiMeta"},"links":{"anyOf":[{"$ref":"#/components/schemas/ApiLinks"},{"type":"null"}]}},"type":"object","required":["success"],"title":"ApiResponse[EntityDimensionsResponse]"},"ApiResponse_EntityProfile_":{"properties":{"success":{"type":"boolean","title":"Success"},"data":{"anyOf":[{"$ref":"#/components/schemas/EntityProfile"},{"type":"null"}]},"error":{"anyOf":[{"$ref":"#/components/schemas/ApiError"},{"type":"null"}]},"meta":{"$ref":"#/components/schemas/ApiMeta"},"links":{"anyOf":[{"$ref":"#/components/schemas/ApiLinks"},{"type":"null"}]}},"type":"object","required":["success"],"title":"ApiResponse[EntityProfile]"},"ApiResponse_Entity_":{"properties":{"success":{"type":"boolean","title":"Success"},"data":{"anyOf":[{"$ref":"#/components/schemas/Entity"},{"type":"null"}]},"error":{"anyOf":[{"$ref":"#/components/schemas/ApiError"},{"type":"null"}]},"meta":{"$ref":"#/components/schemas/ApiMeta"},"links":{"anyOf":[{"$ref":"#/components/schemas/ApiLinks"},{"type":"null"}]}},"type":"object","required":["success"],"title":"ApiResponse[Entity]"},"ApiResponse_ExportJobResponse_":{"properties":{"success":{"type":"boolean","title":"Success"},"data":{"anyOf":[{"$ref":"#/components/schemas/ExportJobResponse"},{"type":"null"}]},"error":{"anyOf":[{"$ref":"#/components/schemas/ApiError"},{"type":"null"}]},"meta":{"$ref":"#/components/schemas/ApiMeta"},"links":{"anyOf":[{"$ref":"#/components/schemas/ApiLinks"},{"type":"null"}]}},"type":"object","required":["success"],"title":"ApiResponse[ExportJobResponse]"},"ApiResponse_ExtensionConceptsResult_":{"properties":{"success":{"type":"boolean","title":"Success"},"data":{"anyOf":[{"$ref":"#/components/schemas/ExtensionConceptsResult"},{"type":"null"}]},"error":{"anyOf":[{"$ref":"#/components/schemas/ApiError"},{"type":"null"}]},"meta":{"$ref":"#/components/schemas/ApiMeta"},"links":{"anyOf":[{"$ref":"#/components/schemas/ApiLinks"},{"type":"null"}]}},"type":"object","required":["success"],"title":"ApiResponse[ExtensionConceptsResult]"},"ApiResponse_FXRatesResponse_":{"properties":{"success":{"type":"boolean","title":"Success"},"data":{"anyOf":[{"$ref":"#/components/schemas/FXRatesResponse"},{"type":"null"}]},"error":{"anyOf":[{"$ref":"#/components/schemas/ApiError"},{"type":"null"}]},"meta":{"$ref":"#/components/schemas/ApiMeta"},"links":{"anyOf":[{"$ref":"#/components/schemas/ApiLinks"},{"type":"null"}]}},"type":"object","required":["success"],"title":"ApiResponse[FXRatesResponse]"},"ApiResponse_Fact_":{"properties":{"success":{"type":"boolean","title":"Success"},"data":{"anyOf":[{"$ref":"#/components/schemas/Fact"},{"type":"null"}]},"error":{"anyOf":[{"$ref":"#/components/schemas/ApiError"},{"type":"null"}]},"meta":{"$ref":"#/components/schemas/ApiMeta"},"links":{"anyOf":[{"$ref":"#/components/schemas/ApiLinks"},{"type":"null"}]}},"type":"object","required":["success"],"title":"ApiResponse[Fact]"},"ApiResponse_FilingCalcTreeResult_":{"properties":{"success":{"type":"boolean","title":"Success"},"data":{"anyOf":[{"$ref":"#/components/schemas/FilingCalcTreeResult"},{"type":"null"}]},"error":{"anyOf":[{"$ref":"#/components/schemas/ApiError"},{"type":"null"}]},"meta":{"$ref":"#/components/schemas/ApiMeta"},"links":{"anyOf":[{"$ref":"#/components/schemas/ApiLinks"},{"type":"null"}]}},"type":"object","required":["success"],"title":"ApiResponse[FilingCalcTreeResult]"},"ApiResponse_FilingDocumentPayload_":{"properties":{"success":{"type":"boolean","title":"Success"},"data":{"anyOf":[{"$ref":"#/components/schemas/FilingDocumentPayload"},{"type":"null"}]},"error":{"anyOf":[{"$ref":"#/components/schemas/ApiError"},{"type":"null"}]},"meta":{"$ref":"#/components/schemas/ApiMeta"},"links":{"anyOf":[{"$ref":"#/components/schemas/ApiLinks"},{"type":"null"}]}},"type":"object","required":["success"],"title":"ApiResponse[FilingDocumentPayload]"},"ApiResponse_FinancialsResponse_":{"properties":{"success":{"type":"boolean","title":"Success"},"data":{"anyOf":[{"$ref":"#/components/schemas/FinancialsResponse"},{"type":"null"}]},"error":{"anyOf":[{"$ref":"#/components/schemas/ApiError"},{"type":"null"}]},"meta":{"$ref":"#/components/schemas/ApiMeta"},"links":{"anyOf":[{"$ref":"#/components/schemas/ApiLinks"},{"type":"null"}]}},"type":"object","required":["success"],"title":"ApiResponse[FinancialsResponse]"},"ApiResponse_FindEntityResult_":{"properties":{"success":{"type":"boolean","title":"Success"},"data":{"anyOf":[{"$ref":"#/components/schemas/FindEntityResult"},{"type":"null"}]},"error":{"anyOf":[{"$ref":"#/components/schemas/ApiError"},{"type":"null"}]},"meta":{"$ref":"#/components/schemas/ApiMeta"},"links":{"anyOf":[{"$ref":"#/components/schemas/ApiLinks"},{"type":"null"}]}},"type":"object","required":["success"],"title":"ApiResponse[FindEntityResult]"},"ApiResponse_FlowResponse_":{"properties":{"success":{"type":"boolean","title":"Success"},"data":{"anyOf":[{"$ref":"#/components/schemas/FlowResponse"},{"type":"null"}]},"error":{"anyOf":[{"$ref":"#/components/schemas/ApiError"},{"type":"null"}]},"meta":{"$ref":"#/components/schemas/ApiMeta"},"links":{"anyOf":[{"$ref":"#/components/schemas/ApiLinks"},{"type":"null"}]}},"type":"object","required":["success"],"title":"ApiResponse[FlowResponse]"},"ApiResponse_HasDimensionsResponse_":{"properties":{"success":{"type":"boolean","title":"Success"},"data":{"anyOf":[{"$ref":"#/components/schemas/HasDimensionsResponse"},{"type":"null"}]},"error":{"anyOf":[{"$ref":"#/components/schemas/ApiError"},{"type":"null"}]},"meta":{"$ref":"#/components/schemas/ApiMeta"},"links":{"anyOf":[{"$ref":"#/components/schemas/ApiLinks"},{"type":"null"}]}},"type":"object","required":["success"],"title":"ApiResponse[HasDimensionsResponse]"},"ApiResponse_InspectorPayload_":{"properties":{"success":{"type":"boolean","title":"Success"},"data":{"anyOf":[{"$ref":"#/components/schemas/InspectorPayload"},{"type":"null"}]},"error":{"anyOf":[{"$ref":"#/components/schemas/ApiError"},{"type":"null"}]},"meta":{"$ref":"#/components/schemas/ApiMeta"},"links":{"anyOf":[{"$ref":"#/components/schemas/ApiLinks"},{"type":"null"}]}},"type":"object","required":["success"],"title":"ApiResponse[InspectorPayload]"},"ApiResponse_IntersectionCube_":{"properties":{"success":{"type":"boolean","title":"Success"},"data":{"anyOf":[{"$ref":"#/components/schemas/IntersectionCube"},{"type":"null"}]},"error":{"anyOf":[{"$ref":"#/components/schemas/ApiError"},{"type":"null"}]},"meta":{"$ref":"#/components/schemas/ApiMeta"},"links":{"anyOf":[{"$ref":"#/components/schemas/ApiLinks"},{"type":"null"}]}},"type":"object","required":["success"],"title":"ApiResponse[IntersectionCube]"},"ApiResponse_InvitationCreatedResponse_":{"properties":{"success":{"type":"boolean","title":"Success"},"data":{"anyOf":[{"$ref":"#/components/schemas/InvitationCreatedResponse"},{"type":"null"}]},"error":{"anyOf":[{"$ref":"#/components/schemas/ApiError"},{"type":"null"}]},"meta":{"$ref":"#/components/schemas/ApiMeta"},"links":{"anyOf":[{"$ref":"#/components/schemas/ApiLinks"},{"type":"null"}]}},"type":"object","required":["success"],"title":"ApiResponse[InvitationCreatedResponse]"},"ApiResponse_LegalEntityGroupResponse_":{"properties":{"success":{"type":"boolean","title":"Success"},"data":{"anyOf":[{"$ref":"#/components/schemas/LegalEntityGroupResponse"},{"type":"null"}]},"error":{"anyOf":[{"$ref":"#/components/schemas/ApiError"},{"type":"null"}]},"meta":{"$ref":"#/components/schemas/ApiMeta"},"links":{"anyOf":[{"$ref":"#/components/schemas/ApiLinks"},{"type":"null"}]}},"type":"object","required":["success"],"title":"ApiResponse[LegalEntityGroupResponse]"},"ApiResponse_LegalEntityMemberResponse_":{"properties":{"success":{"type":"boolean","title":"Success"},"data":{"anyOf":[{"$ref":"#/components/schemas/LegalEntityMemberResponse"},{"type":"null"}]},"error":{"anyOf":[{"$ref":"#/components/schemas/ApiError"},{"type":"null"}]},"meta":{"$ref":"#/components/schemas/ApiMeta"},"links":{"anyOf":[{"$ref":"#/components/schemas/ApiLinks"},{"type":"null"}]}},"type":"object","required":["success"],"title":"ApiResponse[LegalEntityMemberResponse]"},"ApiResponse_ListHubsResult_":{"properties":{"success":{"type":"boolean","title":"Success"},"data":{"anyOf":[{"$ref":"#/components/schemas/ListHubsResult"},{"type":"null"}]},"error":{"anyOf":[{"$ref":"#/components/schemas/ApiError"},{"type":"null"}]},"meta":{"$ref":"#/components/schemas/ApiMeta"},"links":{"anyOf":[{"$ref":"#/components/schemas/ApiLinks"},{"type":"null"}]}},"type":"object","required":["success"],"title":"ApiResponse[ListHubsResult]"},"ApiResponse_MePlanResponse_":{"properties":{"success":{"type":"boolean","title":"Success"},"data":{"anyOf":[{"$ref":"#/components/schemas/MePlanResponse"},{"type":"null"}]},"error":{"anyOf":[{"$ref":"#/components/schemas/ApiError"},{"type":"null"}]},"meta":{"$ref":"#/components/schemas/ApiMeta"},"links":{"anyOf":[{"$ref":"#/components/schemas/ApiLinks"},{"type":"null"}]}},"type":"object","required":["success"],"title":"ApiResponse[MePlanResponse]"},"ApiResponse_MeResponse_":{"properties":{"success":{"type":"boolean","title":"Success"},"data":{"anyOf":[{"$ref":"#/components/schemas/MeResponse"},{"type":"null"}]},"error":{"anyOf":[{"$ref":"#/components/schemas/ApiError"},{"type":"null"}]},"meta":{"$ref":"#/components/schemas/ApiMeta"},"links":{"anyOf":[{"$ref":"#/components/schemas/ApiLinks"},{"type":"null"}]}},"type":"object","required":["success"],"title":"ApiResponse[MeResponse]"},"ApiResponse_MemberResponse_":{"properties":{"success":{"type":"boolean","title":"Success"},"data":{"anyOf":[{"$ref":"#/components/schemas/MemberResponse"},{"type":"null"}]},"error":{"anyOf":[{"$ref":"#/components/schemas/ApiError"},{"type":"null"}]},"meta":{"$ref":"#/components/schemas/ApiMeta"},"links":{"anyOf":[{"$ref":"#/components/schemas/ApiLinks"},{"type":"null"}]}},"type":"object","required":["success"],"title":"ApiResponse[MemberResponse]"},"ApiResponse_MetricHistory_":{"properties":{"success":{"type":"boolean","title":"Success"},"data":{"anyOf":[{"$ref":"#/components/schemas/MetricHistory"},{"type":"null"}]},"error":{"anyOf":[{"$ref":"#/components/schemas/ApiError"},{"type":"null"}]},"meta":{"$ref":"#/components/schemas/ApiMeta"},"links":{"anyOf":[{"$ref":"#/components/schemas/ApiLinks"},{"type":"null"}]}},"type":"object","required":["success"],"title":"ApiResponse[MetricHistory]"},"ApiResponse_PortfolioChangesResponse_":{"properties":{"success":{"type":"boolean","title":"Success"},"data":{"anyOf":[{"$ref":"#/components/schemas/PortfolioChangesResponse"},{"type":"null"}]},"error":{"anyOf":[{"$ref":"#/components/schemas/ApiError"},{"type":"null"}]},"meta":{"$ref":"#/components/schemas/ApiMeta"},"links":{"anyOf":[{"$ref":"#/components/schemas/ApiLinks"},{"type":"null"}]}},"type":"object","required":["success"],"title":"ApiResponse[PortfolioChangesResponse]"},"ApiResponse_QualityGradeResponse_":{"properties":{"success":{"type":"boolean","title":"Success"},"data":{"anyOf":[{"$ref":"#/components/schemas/QualityGradeResponse"},{"type":"null"}]},"error":{"anyOf":[{"$ref":"#/components/schemas/ApiError"},{"type":"null"}]},"meta":{"$ref":"#/components/schemas/ApiMeta"},"links":{"anyOf":[{"$ref":"#/components/schemas/ApiLinks"},{"type":"null"}]}},"type":"object","required":["success"],"title":"ApiResponse[QualityGradeResponse]"},"ApiResponse_RawFactsResponse_":{"properties":{"success":{"type":"boolean","title":"Success"},"data":{"anyOf":[{"$ref":"#/components/schemas/RawFactsResponse"},{"type":"null"}]},"error":{"anyOf":[{"$ref":"#/components/schemas/ApiError"},{"type":"null"}]},"meta":{"$ref":"#/components/schemas/ApiMeta"},"links":{"anyOf":[{"$ref":"#/components/schemas/ApiLinks"},{"type":"null"}]}},"type":"object","required":["success"],"title":"ApiResponse[RawFactsResponse]"},"ApiResponse_RollUpResult_":{"properties":{"success":{"type":"boolean","title":"Success"},"data":{"anyOf":[{"$ref":"#/components/schemas/RollUpResult"},{"type":"null"}]},"error":{"anyOf":[{"$ref":"#/components/schemas/ApiError"},{"type":"null"}]},"meta":{"$ref":"#/components/schemas/ApiMeta"},"links":{"anyOf":[{"$ref":"#/components/schemas/ApiLinks"},{"type":"null"}]}},"type":"object","required":["success"],"title":"ApiResponse[RollUpResult]"},"ApiResponse_ScreenCompaniesResult_":{"properties":{"success":{"type":"boolean","title":"Success"},"data":{"anyOf":[{"$ref":"#/components/schemas/ScreenCompaniesResult"},{"type":"null"}]},"error":{"anyOf":[{"$ref":"#/components/schemas/ApiError"},{"type":"null"}]},"meta":{"$ref":"#/components/schemas/ApiMeta"},"links":{"anyOf":[{"$ref":"#/components/schemas/ApiLinks"},{"type":"null"}]}},"type":"object","required":["success"],"title":"ApiResponse[ScreenCompaniesResult]"},"ApiResponse_SearchConceptResult_":{"properties":{"success":{"type":"boolean","title":"Success"},"data":{"anyOf":[{"$ref":"#/components/schemas/SearchConceptResult"},{"type":"null"}]},"error":{"anyOf":[{"$ref":"#/components/schemas/ApiError"},{"type":"null"}]},"meta":{"$ref":"#/components/schemas/ApiMeta"},"links":{"anyOf":[{"$ref":"#/components/schemas/ApiLinks"},{"type":"null"}]}},"type":"object","required":["success"],"title":"ApiResponse[SearchConceptResult]"},"ApiResponse_SearchResponse_":{"properties":{"success":{"type":"boolean","title":"Success"},"data":{"anyOf":[{"$ref":"#/components/schemas/SearchResponse"},{"type":"null"}]},"error":{"anyOf":[{"$ref":"#/components/schemas/ApiError"},{"type":"null"}]},"meta":{"$ref":"#/components/schemas/ApiMeta"},"links":{"anyOf":[{"$ref":"#/components/schemas/ApiLinks"},{"type":"null"}]}},"type":"object","required":["success"],"title":"ApiResponse[SearchResponse]"},"ApiResponse_SegmentBreakdown_":{"properties":{"success":{"type":"boolean","title":"Success"},"data":{"anyOf":[{"$ref":"#/components/schemas/SegmentBreakdown"},{"type":"null"}]},"error":{"anyOf":[{"$ref":"#/components/schemas/ApiError"},{"type":"null"}]},"meta":{"$ref":"#/components/schemas/ApiMeta"},"links":{"anyOf":[{"$ref":"#/components/schemas/ApiLinks"},{"type":"null"}]}},"type":"object","required":["success"],"title":"ApiResponse[SegmentBreakdown]"},"ApiResponse_SnowflakeResponse_":{"properties":{"success":{"type":"boolean","title":"Success"},"data":{"anyOf":[{"$ref":"#/components/schemas/SnowflakeResponse"},{"type":"null"}]},"error":{"anyOf":[{"$ref":"#/components/schemas/ApiError"},{"type":"null"}]},"meta":{"$ref":"#/components/schemas/ApiMeta"},"links":{"anyOf":[{"$ref":"#/components/schemas/ApiLinks"},{"type":"null"}]}},"type":"object","required":["success"],"title":"ApiResponse[SnowflakeResponse]"},"ApiResponse_Union_CalculationTree__CalculationSectionsResponse__":{"properties":{"success":{"type":"boolean","title":"Success"},"data":{"anyOf":[{"$ref":"#/components/schemas/CalculationTree"},{"$ref":"#/components/schemas/CalculationSectionsResponse"},{"type":"null"}],"title":"Data"},"error":{"anyOf":[{"$ref":"#/components/schemas/ApiError"},{"type":"null"}]},"meta":{"$ref":"#/components/schemas/ApiMeta"},"links":{"anyOf":[{"$ref":"#/components/schemas/ApiLinks"},{"type":"null"}]}},"type":"object","required":["success"],"title":"ApiResponse[Union[CalculationTree, CalculationSectionsResponse]]"},"ApiResponse_UsageMeResponse_":{"properties":{"success":{"type":"boolean","title":"Success"},"data":{"anyOf":[{"$ref":"#/components/schemas/UsageMeResponse"},{"type":"null"}]},"error":{"anyOf":[{"$ref":"#/components/schemas/ApiError"},{"type":"null"}]},"meta":{"$ref":"#/components/schemas/ApiMeta"},"links":{"anyOf":[{"$ref":"#/components/schemas/ApiLinks"},{"type":"null"}]}},"type":"object","required":["success"],"title":"ApiResponse[UsageMeResponse]"},"ApiResponse_ValidationResult_":{"properties":{"success":{"type":"boolean","title":"Success"},"data":{"anyOf":[{"$ref":"#/components/schemas/ValidationResult"},{"type":"null"}]},"error":{"anyOf":[{"$ref":"#/components/schemas/ApiError"},{"type":"null"}]},"meta":{"$ref":"#/components/schemas/ApiMeta"},"links":{"anyOf":[{"$ref":"#/components/schemas/ApiLinks"},{"type":"null"}]}},"type":"object","required":["success"],"title":"ApiResponse[ValidationResult]"},"ApiResponse_VersionResponse_":{"properties":{"success":{"type":"boolean","title":"Success"},"data":{"anyOf":[{"$ref":"#/components/schemas/VersionResponse"},{"type":"null"}]},"error":{"anyOf":[{"$ref":"#/components/schemas/ApiError"},{"type":"null"}]},"meta":{"$ref":"#/components/schemas/ApiMeta"},"links":{"anyOf":[{"$ref":"#/components/schemas/ApiLinks"},{"type":"null"}]}},"type":"object","required":["success"],"title":"ApiResponse[VersionResponse]"},"ApiResponse_WebhookCreatedResponse_":{"properties":{"success":{"type":"boolean","title":"Success"},"data":{"anyOf":[{"$ref":"#/components/schemas/WebhookCreatedResponse"},{"type":"null"}]},"error":{"anyOf":[{"$ref":"#/components/schemas/ApiError"},{"type":"null"}]},"meta":{"$ref":"#/components/schemas/ApiMeta"},"links":{"anyOf":[{"$ref":"#/components/schemas/ApiLinks"},{"type":"null"}]}},"type":"object","required":["success"],"title":"ApiResponse[WebhookCreatedResponse]"},"ApiResponse_WebhookResponse_":{"properties":{"success":{"type":"boolean","title":"Success"},"data":{"anyOf":[{"$ref":"#/components/schemas/WebhookResponse"},{"type":"null"}]},"error":{"anyOf":[{"$ref":"#/components/schemas/ApiError"},{"type":"null"}]},"meta":{"$ref":"#/components/schemas/ApiMeta"},"links":{"anyOf":[{"$ref":"#/components/schemas/ApiLinks"},{"type":"null"}]}},"type":"object","required":["success"],"title":"ApiResponse[WebhookResponse]"},"ApiResponse_WebhookTestResponse_":{"properties":{"success":{"type":"boolean","title":"Success"},"data":{"anyOf":[{"$ref":"#/components/schemas/WebhookTestResponse"},{"type":"null"}]},"error":{"anyOf":[{"$ref":"#/components/schemas/ApiError"},{"type":"null"}]},"meta":{"$ref":"#/components/schemas/ApiMeta"},"links":{"anyOf":[{"$ref":"#/components/schemas/ApiLinks"},{"type":"null"}]}},"type":"object","required":["success"],"title":"ApiResponse[WebhookTestResponse]"},"ApiResponse_WithdrawalResponse_":{"properties":{"success":{"type":"boolean","title":"Success"},"data":{"anyOf":[{"$ref":"#/components/schemas/WithdrawalResponse"},{"type":"null"}]},"error":{"anyOf":[{"$ref":"#/components/schemas/ApiError"},{"type":"null"}]},"meta":{"$ref":"#/components/schemas/ApiMeta"},"links":{"anyOf":[{"$ref":"#/components/schemas/ApiLinks"},{"type":"null"}]}},"type":"object","required":["success"],"title":"ApiResponse[WithdrawalResponse]"},"ApiResponse_dict_":{"properties":{"success":{"type":"boolean","title":"Success"},"data":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Data"},"error":{"anyOf":[{"$ref":"#/components/schemas/ApiError"},{"type":"null"}]},"meta":{"$ref":"#/components/schemas/ApiMeta"},"links":{"anyOf":[{"$ref":"#/components/schemas/ApiLinks"},{"type":"null"}]}},"type":"object","required":["success"],"title":"ApiResponse[dict]"},"ApiResponse_list_ApiKeyResponse__":{"properties":{"success":{"type":"boolean","title":"Success"},"data":{"anyOf":[{"items":{"$ref":"#/components/schemas/ApiKeyResponse"},"type":"array"},{"type":"null"}],"title":"Data"},"error":{"anyOf":[{"$ref":"#/components/schemas/ApiError"},{"type":"null"}]},"meta":{"$ref":"#/components/schemas/ApiMeta"},"links":{"anyOf":[{"$ref":"#/components/schemas/ApiLinks"},{"type":"null"}]}},"type":"object","required":["success"],"title":"ApiResponse[list[ApiKeyResponse]]"},"ApiResponse_list_ExportJobResponse__":{"properties":{"success":{"type":"boolean","title":"Success"},"data":{"anyOf":[{"items":{"$ref":"#/components/schemas/ExportJobResponse"},"type":"array"},{"type":"null"}],"title":"Data"},"error":{"anyOf":[{"$ref":"#/components/schemas/ApiError"},{"type":"null"}]},"meta":{"$ref":"#/components/schemas/ApiMeta"},"links":{"anyOf":[{"$ref":"#/components/schemas/ApiLinks"},{"type":"null"}]}},"type":"object","required":["success"],"title":"ApiResponse[list[ExportJobResponse]]"},"ApiResponse_list_InvitationResponse__":{"properties":{"success":{"type":"boolean","title":"Success"},"data":{"anyOf":[{"items":{"$ref":"#/components/schemas/InvitationResponse"},"type":"array"},{"type":"null"}],"title":"Data"},"error":{"anyOf":[{"$ref":"#/components/schemas/ApiError"},{"type":"null"}]},"meta":{"$ref":"#/components/schemas/ApiMeta"},"links":{"anyOf":[{"$ref":"#/components/schemas/ApiLinks"},{"type":"null"}]}},"type":"object","required":["success"],"title":"ApiResponse[list[InvitationResponse]]"},"ApiResponse_list_MemberResponse__":{"properties":{"success":{"type":"boolean","title":"Success"},"data":{"anyOf":[{"items":{"$ref":"#/components/schemas/MemberResponse"},"type":"array"},{"type":"null"}],"title":"Data"},"error":{"anyOf":[{"$ref":"#/components/schemas/ApiError"},{"type":"null"}]},"meta":{"$ref":"#/components/schemas/ApiMeta"},"links":{"anyOf":[{"$ref":"#/components/schemas/ApiLinks"},{"type":"null"}]}},"type":"object","required":["success"],"title":"ApiResponse[list[MemberResponse]]"},"ApiResponse_list_WebhookDeliveryResponse__":{"properties":{"success":{"type":"boolean","title":"Success"},"data":{"anyOf":[{"items":{"$ref":"#/components/schemas/WebhookDeliveryResponse"},"type":"array"},{"type":"null"}],"title":"Data"},"error":{"anyOf":[{"$ref":"#/components/schemas/ApiError"},{"type":"null"}]},"meta":{"$ref":"#/components/schemas/ApiMeta"},"links":{"anyOf":[{"$ref":"#/components/schemas/ApiLinks"},{"type":"null"}]}},"type":"object","required":["success"],"title":"ApiResponse[list[WebhookDeliveryResponse]]"},"ApiResponse_list_WebhookResponse__":{"properties":{"success":{"type":"boolean","title":"Success"},"data":{"anyOf":[{"items":{"$ref":"#/components/schemas/WebhookResponse"},"type":"array"},{"type":"null"}],"title":"Data"},"error":{"anyOf":[{"$ref":"#/components/schemas/ApiError"},{"type":"null"}]},"meta":{"$ref":"#/components/schemas/ApiMeta"},"links":{"anyOf":[{"$ref":"#/components/schemas/ApiLinks"},{"type":"null"}]}},"type":"object","required":["success"],"title":"ApiResponse[list[WebhookResponse]]"},"AsOfPoint":{"properties":{"fiscal_year":{"type":"integer","title":"Fiscal Year"},"fiscal_period":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Fiscal Period"},"period_end":{"type":"string","title":"Period End"},"value":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Value"},"currency":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Currency"},"filing_id":{"type":"string","title":"Filing Id"},"filing_date":{"type":"string","title":"Filing Date"},"form_type":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Form Type"}},"type":"object","required":["fiscal_year","period_end","filing_id","filing_date"],"title":"AsOfPoint"},"AsOfResponse":{"properties":{"entity_id":{"type":"string","title":"Entity Id"},"entity_name":{"type":"string","title":"Entity Name"},"hub_concept_code":{"type":"string","title":"Hub Concept Code"},"as_of":{"type":"string","title":"As Of"},"fiscal_period_type":{"type":"string","title":"Fiscal Period Type"},"points":{"items":{"$ref":"#/components/schemas/AsOfPoint"},"type":"array","title":"Points"},"notes":{"items":{"type":"string"},"type":"array","title":"Notes"}},"type":"object","required":["entity_id","entity_name","hub_concept_code","as_of","fiscal_period_type"],"title":"AsOfResponse"},"AuditorInfo":{"properties":{"name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Name"},"pcaob_firm_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Pcaob Firm Id"},"location":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Location"},"opinion_excerpt":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Opinion Excerpt"}},"type":"object","title":"AuditorInfo"},"AvailableMetric":{"properties":{"code":{"type":"string","title":"Code"},"label":{"type":"string","title":"Label"},"category":{"type":"string","title":"Category"},"axis_count":{"type":"integer","title":"Axis Count"},"member_count":{"type":"integer","title":"Member Count"},"primary":{"type":"boolean","title":"Primary","default":false}},"type":"object","required":["code","label","category","axis_count","member_count"],"title":"AvailableMetric","description":"Rich descriptor for a metric exposed in BreakdownResponse.available_metrics.\n\nCarries the category (Income Statement / Balance Sheet / Cash Flow / Other)\nand the dimensional richness (axis_count, member_count) so a client can group\nand rank the metrics."},"BillingSessionResponse":{"properties":{"url":{"type":"string","title":"Url","description":"Stripe-hosted page to redirect the customer to."}},"type":"object","required":["url"],"title":"BillingSessionResponse"},"BillingStatusResponse":{"properties":{"plan":{"type":"string","title":"Plan","description":"The workspace's plan, as its raw plan code."},"has_subscription":{"type":"boolean","title":"Has Subscription"},"plan_period_end":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Plan Period End","description":"End of the paid period, ISO 8601, when known."},"manageable":{"type":"boolean","title":"Manageable","description":"True when a Stripe customer exists, i.e. when the Customer Portal can be opened. False for a plan provisioned by hand."},"cancels_at_period_end":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Cancels At Period End","description":"True when the subscription is set to stop at `plan_period_end` instead of renewing. None when it could not be read from Stripe, and the caller must then say neither 'renews' nor 'ends'."},"team_self_service":{"type":"boolean","title":"Team Self Service","description":"True when the Team plan can be bought on Checkout, i.e. when both Team prices are configured on this deployment. The settings page offers Team only on this flag.","default":false},"withdrawal":{"anyOf":[{"$ref":"#/components/schemas/WithdrawalState"},{"type":"null"}],"description":"The consumer's right of withdrawal on this subscription: open until `open_until`, or already declared at `declared_at`. Null when there is none (period over, VAT number given at checkout, no subscription)."}},"type":"object","required":["plan","has_subscription","manageable"],"title":"BillingStatusResponse"},"BreakdownAxis":{"properties":{"axis_qname":{"type":"string","title":"Axis Qname"},"axis_label":{"type":"string","title":"Axis Label"},"axis_kind":{"type":"string","title":"Axis Kind"},"members":{"items":{"$ref":"#/components/schemas/BreakdownMember"},"type":"array","title":"Members"},"is_additive":{"type":"boolean","title":"Is Additive"},"sum_to_consolidated":{"additionalProperties":{"anyOf":[{"type":"number"},{"type":"null"}]},"type":"object","title":"Sum To Consolidated"},"as_filed_total":{"additionalProperties":{"anyOf":[{"type":"number"},{"type":"null"}]},"type":"object","title":"As Filed Total"},"served_total":{"additionalProperties":{"anyOf":[{"type":"number"},{"type":"null"}]},"type":"object","title":"Served Total"},"reconciliation_basis":{"type":"string","title":"Reconciliation Basis","default":"served"},"currencies":{"items":{"type":"string"},"type":"array","title":"Currencies"},"is_multi_currency":{"type":"boolean","title":"Is Multi Currency","default":false},"disclosure_filing_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Disclosure Filing Id"},"disclosure_link_role":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Disclosure Link Role"},"reconciliation":{"anyOf":[{"$ref":"#/components/schemas/ReconciliationSummary"},{"type":"null"}]},"has_structural_sign_error":{"type":"boolean","title":"Has Structural Sign Error","default":false},"partition_key":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Partition Key"},"partition_label":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Partition Label"}},"type":"object","required":["axis_qname","axis_label","axis_kind","members","is_additive","sum_to_consolidated"],"title":"BreakdownAxis","description":"A single XBRL axis with its members.\n\n``axis_kind`` is the semantic classification of the axis (geography,\nsegment, product, equity_rollforward, debt, fv_hierarchy, concentration,\nppe, awards, generic), usable to pick a rendering per kind.\n\n``currencies`` lists the distinct ISO codes observed across\nthe axis members. ``is_multi_currency`` is True when more than one\ncurrency is present, so the lane can render an explicit warning banner\ninstead of silently mixing units."},"BreakdownMember":{"properties":{"member_qname":{"type":"string","title":"Member Qname"},"member_label":{"type":"string","title":"Member Label"},"values":{"additionalProperties":{"anyOf":[{"type":"number"},{"type":"null"}]},"type":"object","title":"Values"},"currency":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Currency"},"parent_member_qname":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Parent Member Qname"},"level":{"type":"integer","title":"Level","default":0},"reconciliation_role":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Reconciliation Role"}},"type":"object","required":["member_qname","member_label","values","currency"],"title":"BreakdownMember","description":"A single member within an axis.\n\n``parent_member_qname`` and ``level`` carry an inferred\nparent/child hierarchy when the same axis is tagged with two\ngranularities in two distinct ``link_role`` (e.g. Apple's P&L\nProductMember vs disaggregation iPhoneMember/MacMember/…). ``level=0``\nis the top of the hierarchy, ``level=1`` is a direct child. Defaults\npreserve flat behaviour for axes without a detected hierarchy."},"BreakdownResponse":{"properties":{"entity_id":{"type":"string","title":"Entity Id"},"entity_name":{"type":"string","title":"Entity Name"},"metric":{"type":"string","title":"Metric"},"requested_metric":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Requested Metric"},"metric_selection":{"type":"string","enum":["as_requested","auto_selected","requested_not_dimensional","none_available"],"title":"Metric Selection","default":"as_requested"},"metric_label":{"type":"string","title":"Metric Label"},"metric_data_type":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Metric Data Type"},"currency":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Currency"},"available_metrics":{"items":{"$ref":"#/components/schemas/AvailableMetric"},"type":"array","title":"Available Metrics"},"consolidated":{"additionalProperties":{"anyOf":[{"type":"number"},{"type":"null"}]},"type":"object","title":"Consolidated"},"trend_consolidated":{"additionalProperties":{"anyOf":[{"type":"number"},{"type":"null"}]},"type":"object","title":"Trend Consolidated","default":{}},"consolidated_derived":{"additionalProperties":{"type":"boolean"},"type":"object","title":"Consolidated Derived","default":{}},"axes":{"items":{"$ref":"#/components/schemas/BreakdownAxis"},"type":"array","title":"Axes"},"fiscal_years":{"items":{"type":"integer"},"type":"array","title":"Fiscal Years"},"twin_provenance":{"anyOf":[{"$ref":"#/components/schemas/BreakdownTwinProvenance"},{"type":"null"}]}},"type":"object","required":["entity_id","entity_name","metric","metric_label","currency","available_metrics","consolidated","axes","fiscal_years"],"title":"BreakdownResponse","description":"Axis-grouped breakdown.\n\nMembers are grouped by XBRL axis rather than returned as one flat list."},"BreakdownTwinDrop":{"properties":{"hub_concept_code":{"type":"string","title":"Hub Concept Code"},"fiscal_year":{"type":"integer","title":"Fiscal Year"},"reason":{"type":"string","title":"Reason"},"page_total":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Page Total"},"twin_total":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Twin Total"}},"type":"object","required":["hub_concept_code","fiscal_year","reason"],"title":"BreakdownTwinDrop","description":"One (hub, year) of the twin's breakdown not served, and why."},"BreakdownTwinProvenance":{"properties":{"twin_entity_id":{"type":"string","title":"Twin Entity Id"},"twin_entity_name":{"type":"string","title":"Twin Entity Name"},"twin_form_type":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Twin Form Type"},"twin_standard":{"anyOf":[{"type":"string","enum":["ifrs","us-gaap","mixed"]},{"type":"null"}],"title":"Twin Standard"},"twin_url":{"type":"string","title":"Twin Url"},"tolerance":{"type":"number","title":"Tolerance"},"hub_years_served":{"type":"integer","title":"Hub Years Served"},"dropped":{"items":{"$ref":"#/components/schemas/BreakdownTwinDrop"},"type":"array","title":"Dropped","default":[]}},"type":"object","required":["twin_entity_id","twin_entity_name","twin_url","tolerance","hub_years_served"],"title":"BreakdownTwinProvenance","description":"Where a European page's business breakdown comes from.\n\nThe page's own filings (ESEF) carry no business axis; the same issuer's SEC\nfilings (20-F / 40-F) do. Members are served under THIS page's consolidated\ntotals only for the (hub, year) couples where the twin's served total agrees\nwith this page's within ``tolerance``; the others are listed in ``dropped``."},"CalculationEdge":{"properties":{"from_concept":{"type":"string","title":"From Concept","description":"Parent qname (the total). E.g. `us-gaap:Assets` rolls up `us-gaap:AssetsCurrent` + `us-gaap:AssetsNoncurrent`."},"to_concept":{"type":"string","title":"To Concept","description":"Child qname (the component)."},"from_namespace":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"From Namespace"},"to_namespace":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"To Namespace"},"weight":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Weight","description":"Filer-declared weight from the calculation linkbase. ±1 in 99% of cases. `+1` means the child is added to the parent, `-1` means it is subtracted (treasury stock, accumulated depreciation)."},"corrected_weight":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Corrected Weight","description":"The sign the filed values support, when the declared signs do not add up and another combination does (a sign drift, such as treasury stock declared +1). Null when the declared weight stands. Compare against `weight` to spot a filer's mistake."},"correction_status":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Correction Status","description":"Outcome of checking the arc's whole group (its total and components) against the filed values: `correct` (the declared signs add up), `rounding` (they add up within rounding), `corrected` (another sign combination adds up; the arcs whose sign changed carry `corrected_weight`), `structural_error` (no sign combination adds up, e.g. a double-counted component), `skipped` (the values needed to check are not in the filing)."},"is_corrected":{"type":"boolean","title":"Is Corrected","description":"Convenience flag — true iff `corrected_weight IS NOT NULL` AND `corrected_weight != weight`. Lets SDK callers filter `tree.edges | where .is_corrected` to surface filer bugs.","default":false},"order_index":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Order Index"},"is_extension":{"type":"boolean","title":"Is Extension","default":false},"preferred_label":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Preferred Label"}},"type":"object","required":["from_concept","to_concept"],"title":"CalculationEdge","description":"One parent → child calculation arc."},"CalculationSection":{"properties":{"link_role":{"type":"string","title":"Link Role","description":"XBRL extended link role URI, e.g. `http://www.apple.com/role/CONSOLIDATEDSTATEMENTSOFOPERATIONS`. Pass it back as `link_role=` to fetch the tree for that section."},"section_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Section Name","description":"Human-readable label parsed from the role's roleType arc."},"edge_count":{"type":"integer","title":"Edge Count","description":"Number of calculation arcs in this section."}},"type":"object","required":["link_role","edge_count"],"title":"CalculationSection","description":"One calculation link_role available on a filing."},"CalculationSectionsResponse":{"properties":{"filing_id":{"type":"string","title":"Filing Id"},"sections":{"items":{"$ref":"#/components/schemas/CalculationSection"},"type":"array","title":"Sections"},"total":{"type":"integer","title":"Total"}},"type":"object","required":["filing_id","total"],"title":"CalculationSectionsResponse","description":"List of calculation sections available on a filing."},"CalculationTree":{"properties":{"filing_id":{"type":"string","title":"Filing Id"},"link_role":{"type":"string","title":"Link Role"},"section_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Section Name"},"edges":{"items":{"$ref":"#/components/schemas/CalculationEdge"},"type":"array","title":"Edges"},"edge_count":{"type":"integer","title":"Edge Count"},"corrected_count":{"type":"integer","title":"Corrected Count","description":"Number of edges with `is_corrected=true`. Quick sanity check for the consumer — if non-zero, the filer's calc linkbase had at least one sign drift the verifier caught."}},"type":"object","required":["filing_id","link_role","edge_count","corrected_count"],"title":"CalculationTree","description":"Calculation tree response (one link_role)."},"CategoryInfo":{"properties":{"code":{"type":"string","title":"Code"},"name":{"type":"string","title":"Name"},"name_fr":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Name Fr"},"metrics_count":{"type":"integer","title":"Metrics Count"}},"type":"object","required":["code","name","name_fr","metrics_count"],"title":"CategoryInfo","description":"Category summary info."},"CheckoutRequest":{"properties":{"plan":{"type":"string","enum":["builder","team","pro"],"title":"Plan","description":"Plan to subscribe to: `builder` or `team`. `pro` is accepted as the former name of `team`. Defaults to Builder.","default":"builder"},"interval":{"type":"string","enum":["monthly","annual"],"title":"Interval","description":"Billing interval for the chosen plan.","default":"monthly"},"return_path":{"type":"string","title":"Return Path","description":"Same-site path the customer returns to. Only absolute same-site paths are honoured; anything else falls back to the default.","default":"/settings/billing"}},"type":"object","title":"CheckoutRequest"},"CompanionChangesSummary":{"properties":{"by_category":{"additionalProperties":{"type":"integer"},"type":"object","title":"By Category"},"max_materiality":{"type":"string","enum":["none","low","medium","high"],"title":"Max Materiality","default":"none"},"primary_concepts_affected":{"items":{"type":"string"},"type":"array","title":"Primary Concepts Affected"}},"type":"object","title":"CompanionChangesSummary","description":"Summary of the changes an amendment carries, by category and materiality."},"ComparativeRestatement":{"properties":{"hub_concept_code":{"type":"string","title":"Hub Concept Code"},"hub_concept_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Hub Concept Name"},"hub_concept_category":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Hub Concept Category"},"fiscal_year":{"type":"integer","title":"Fiscal Year"},"fiscal_period":{"type":"string","title":"Fiscal Period"},"period_end":{"type":"string","title":"Period End"},"currency":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Currency"},"original_value":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Original Value"},"restated_value":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Restated Value"},"delta_percent":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Delta Percent"},"classification":{"type":"string","enum":["revised","restated","new_disclosure"],"title":"Classification"},"materiality":{"type":"string","enum":["none","low","medium","high"],"title":"Materiality"},"original_filing_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Original Filing Id"},"restating_filing_id":{"type":"string","title":"Restating Filing Id"},"detected_at":{"type":"string","title":"Detected At"},"original_filing_date":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Original Filing Date"},"original_form_type":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Original Form Type"},"original_fiscal_year":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Original Fiscal Year"},"restating_filing_date":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Restating Filing Date"},"restating_form_type":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Restating Form Type"},"restating_fiscal_year":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Restating Fiscal Year"}},"type":"object","required":["hub_concept_code","fiscal_year","fiscal_period","period_end","classification","materiality","restating_filing_id","detected_at"],"title":"ComparativeRestatement","description":"One concept-level retroactive restatement detected via comparatives.\n\nDistinct from `AmendmentChange` (10-K/A explicit amendments) : these\ndeltas are inferred from the comparative columns of a later 10-K\nreporting a different value for an earlier fiscal year. The flagship\ncase is Cisco FY2023 CapEx 477M → 849M revealed by the FY2025 10-K's\nN-2 comparative, with no 10-K/A ever filed."},"ComparativeRestatementsResponse":{"properties":{"entity_id":{"type":"string","title":"Entity Id"},"entity_name":{"type":"string","title":"Entity Name"},"total":{"type":"integer","title":"Total"},"restatements":{"items":{"$ref":"#/components/schemas/ComparativeRestatement"},"type":"array","title":"Restatements"},"series":{"additionalProperties":{"items":{"$ref":"#/components/schemas/ConceptHistoryPoint"},"type":"array"},"type":"object","title":"Series"}},"type":"object","required":["entity_id","entity_name","total","restatements"],"title":"ComparativeRestatementsResponse","description":"Response for GET /entities/{id}/restatements/comparatives."},"CompareCell":{"properties":{"hub_code":{"type":"string","title":"Hub Code"},"hub_label":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Hub Label"},"value":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Value"},"currency":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Currency"},"period_end":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Period End"},"period_start":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Period Start"},"fiscal_year":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Fiscal Year"},"source":{"anyOf":[{"$ref":"#/components/schemas/Source"},{"type":"null"}]}},"type":"object","required":["hub_code"],"title":"CompareCell","description":"A single (entity, concept, period) value in the comparison matrix."},"CompareEntitiesResult":{"properties":{"fiscal_year":{"type":"integer","title":"Fiscal Year"},"fiscal_period_type":{"type":"string","title":"Fiscal Period Type"},"rows":{"items":{"$ref":"#/components/schemas/CompareRow"},"type":"array","title":"Rows"},"notes":{"items":{"type":"string"},"type":"array","title":"Notes"},"period_alignment":{"type":"string","title":"Period Alignment","description":"How rows were aligned across issuers. 'calendar_year': a cell is the row whose period_end falls in [YYYY-01-01, YYYY-12-31], so a non-December filer may be shown a different fiscal year than the one its own annual report labels. Compare period_start / period_end / fiscal_year on each cell to see the span actually served.","default":"calendar_year"}},"type":"object","required":["fiscal_year","fiscal_period_type","rows"],"title":"CompareEntitiesResult"},"CompareFilingsResult":{"properties":{"entity_id":{"type":"string","title":"Entity Id"},"entity_name":{"type":"string","title":"Entity Name"},"fiscal_period_type":{"type":"string","title":"Fiscal Period Type"},"filing_a":{"anyOf":[{"$ref":"#/components/schemas/FilingRef"},{"type":"null"}]},"filing_b":{"anyOf":[{"$ref":"#/components/schemas/FilingRef"},{"type":"null"}]},"rows":{"items":{"$ref":"#/components/schemas/CompareFilingsRow"},"type":"array","title":"Rows"},"summary":{"$ref":"#/components/schemas/CompareFilingsSummary"},"notes":{"items":{"type":"string"},"type":"array","title":"Notes"}},"type":"object","required":["entity_id","entity_name","fiscal_period_type","rows","summary"],"title":"CompareFilingsResult"},"CompareFilingsRow":{"properties":{"hub_concept_code":{"type":"string","title":"Hub Concept Code"},"label":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Label"},"category":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Category","description":"income_statement | balance_sheet | cash_flow | ratio | equity_info | metadata"},"value_a":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Value A"},"value_b":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Value B"},"delta_abs":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Delta Abs"},"delta_pct":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Delta Pct","description":"Signed pct change b vs a. None when value_a is 0/null."},"currency_a":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Currency A"},"currency_b":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Currency B"},"is_new_in_b":{"type":"boolean","title":"Is New In B","description":"Concept reported in filing_b but absent from filing_a.","default":false},"is_removed_in_b":{"type":"boolean","title":"Is Removed In B","description":"Concept reported in filing_a but absent from filing_b.","default":false},"is_sign_flip":{"type":"boolean","title":"Is Sign Flip","description":"value_a and value_b have opposite signs (P&L drift, eg. net loss → net income).","default":false},"has_restatement_warning":{"type":"boolean","title":"Has Restatement Warning","description":"filing_b's comparative columns retroactively restate filing_a's value.","default":false},"restatement_source":{"anyOf":[{"$ref":"#/components/schemas/RestatementSource"},{"type":"null"}]}},"type":"object","required":["hub_concept_code"],"title":"CompareFilingsRow"},"CompareFilingsSummary":{"properties":{"concepts_appeared":{"type":"integer","title":"Concepts Appeared"},"concepts_disappeared":{"type":"integer","title":"Concepts Disappeared"},"concepts_with_restatement_warning":{"type":"integer","title":"Concepts With Restatement Warning"},"currency_changed":{"type":"boolean","title":"Currency Changed"}},"type":"object","required":["concepts_appeared","concepts_disappeared","concepts_with_restatement_warning","currency_changed"],"title":"CompareFilingsSummary"},"CompareRequest":{"properties":{"entity_ids":{"items":{"type":"string"},"type":"array","maxItems":10,"minItems":1,"title":"Entity Ids","description":"Entities to compare (max 10): UUID, ticker or `TICKER.MIC`, as on every `/entities/{id}` route. An unknown identifier answers 404, an ambiguous ticker 409."},"hub_concept_codes":{"items":{"type":"string"},"type":"array","maxItems":10,"minItems":1,"title":"Hub Concept Codes","description":"Hub-Equity standardized concept codes (max 10), e.g. ['REVENUE', 'NET_INCOME', 'TOTAL_ASSETS']."},"fiscal_year":{"type":"integer","maximum":2100.0,"minimum":1990.0,"title":"Fiscal Year","description":"Calendar year — for each issuer we pick the FY whose period_end falls in that year (Bloomberg / FactSet convention). Example : `fiscal_year=2024` returns AAPL's FY ending Sep 2024, MSFT's FY ending Jun 2024, LVMH's FY ending Dec 2024."},"fiscal_period_type":{"type":"string","enum":["FY","Q1","Q2","Q3","Q4","H1","H2"],"title":"Fiscal Period Type","description":"Fiscal period type. Default 'FY' (full year). Other values are accepted for forward compatibility but currently force-overridden to 'FY' with a note in the response, since quarterly periods are not calendar-comparable across issuers (Apple Q1 ends Dec, MSFT Q1 ends Sep).","default":"FY"}},"type":"object","required":["entity_ids","hub_concept_codes","fiscal_year"],"title":"CompareRequest","description":"Request body for POST /api/v1/compare."},"CompareRow":{"properties":{"entity_id":{"type":"string","title":"Entity Id"},"name":{"type":"string","title":"Name"},"ticker":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Ticker"},"country":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Country"},"sector":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Sector"},"gics_sector":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Gics Sector"},"auditor_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Auditor Name"},"cells":{"additionalProperties":{"$ref":"#/components/schemas/CompareCell"},"type":"object","title":"Cells","description":"Map hub_concept_code → CompareCell. Missing key = no fact for that pair."}},"type":"object","required":["entity_id","name","cells"],"title":"CompareRow","description":"One row per entity in the comparison result."},"ConceptChange":{"properties":{"hub_concept_code":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Hub Concept Code"},"label":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Label"},"fiscal_year":{"type":"integer","title":"Fiscal Year"},"fiscal_period":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Fiscal Period"},"period_end":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Period End"},"old_value":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Old Value"},"new_value":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"New Value"},"diff_abs":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Diff Abs"},"diff_pct":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Diff Pct","description":"In percent (21.5 = 21.5 %)"},"kind":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Kind","description":"added | modified | unchanged"},"base_filing":{"anyOf":[{"$ref":"#/components/schemas/Source"},{"type":"null"}]},"amendment_filing":{"anyOf":[{"$ref":"#/components/schemas/Source"},{"type":"null"}]}},"type":"object","required":["fiscal_year"],"title":"ConceptChange"},"ConceptDetail":{"properties":{"code":{"type":"string","title":"Code"},"name_en":{"type":"string","title":"Name En"},"name_fr":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Name Fr"},"category":{"type":"string","title":"Category"},"subcategory":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Subcategory"},"data_type":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Data Type"},"typical_period":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Typical Period"},"typical_balance":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Typical Balance"},"is_primary":{"type":"boolean","title":"Is Primary","default":false},"is_derived":{"type":"boolean","title":"Is Derived","default":false},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description"},"taxonomy_scope":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Taxonomy Scope"}},"type":"object","required":["code","name_en","category"],"title":"ConceptDetail","description":"Forward catalog entry returned by /concepts/{code}."},"ConceptHistoryPoint":{"properties":{"fiscal_year":{"type":"integer","title":"Fiscal Year"},"period_end":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Period End"},"fiscal_period":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Fiscal Period"},"value":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Value"},"is_amendment":{"type":"boolean","title":"Is Amendment","default":false},"previous_value":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Previous Value"}},"type":"object","required":["fiscal_year"],"title":"ConceptHistoryPoint","description":"One point on a concept sparkline."},"ConceptSearchResponse":{"properties":{"query":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Query"},"total":{"type":"integer","title":"Total"},"results":{"items":{"$ref":"#/components/schemas/ConceptSummary"},"type":"array","title":"Results"},"applied_filters":{"additionalProperties":true,"type":"object","title":"Applied Filters"},"next_cursor":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Next Cursor"},"has_more":{"type":"boolean","title":"Has More","default":false}},"type":"object","required":["total"],"title":"ConceptSearchResponse","description":"Container for /concepts/search results."},"ConceptSummary":{"properties":{"code":{"type":"string","title":"Code"},"name_en":{"type":"string","title":"Name En"},"name_fr":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Name Fr"},"category":{"type":"string","title":"Category"},"subcategory":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Subcategory"},"data_type":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Data Type"},"is_derived":{"type":"boolean","title":"Is Derived","default":false},"taxonomy_scope":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Taxonomy Scope"},"description_excerpt":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description Excerpt"}},"type":"object","required":["code","name_en","category"],"title":"ConceptSummary","description":"Lightweight hub concept entry for search results."},"ConfidenceComponents":{"properties":{"s_tier":{"type":"number","title":"S Tier"},"s_identity":{"type":"number","title":"S Identity"},"s_agree":{"type":"number","title":"S Agree"},"s_reliability":{"type":"number","title":"S Reliability"},"s_structure":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"S Structure"}},"type":"object","required":["s_tier","s_identity","s_agree","s_reliability"],"title":"ConfidenceComponents","description":"Sub-scores of the confidence score."},"ConfidenceV2":{"properties":{"score":{"type":"number","title":"Score"},"components":{"$ref":"#/components/schemas/ConfidenceComponents"},"model_version":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Model Version"},"would_change":{"type":"boolean","title":"Would Change","default":false},"argmax_source":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Argmax Source"},"enforced":{"type":"boolean","title":"Enforced","default":false},"enforced_by":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Enforced By"},"replaced_value":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Replaced Value"},"replaced_source":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Replaced Source"},"would_change_structure":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Would Change Structure"}},"type":"object","required":["score","components"],"title":"ConfidenceV2","description":"Confidence score for a served value."},"ConvertCurrencyResult":{"properties":{"success":{"type":"boolean","title":"Success","description":"False when no FX fix could be resolved (rate_used == 0). When false, DO NOT cite converted_amount - it is 0.0, not a real conversion.","default":true},"converted_amount":{"type":"number","title":"Converted Amount"},"rate_used":{"type":"number","title":"Rate Used"},"rate_type":{"type":"string","enum":["closing","average_ytd","average_prior_year"],"title":"Rate Type"},"rate_kind_resolved":{"type":"string","title":"Rate Kind Resolved","description":"Kind of rate that resolved this conversion : 'spot' or 'avg_period'."},"from_currency":{"type":"string","title":"From Currency"},"to_currency":{"type":"string","title":"To Currency"},"requested_date":{"type":"string","title":"Requested Date"},"fix_date":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Fix Date","description":"The requested date, echoed. The rate used is the latest ECB fixing available on or before it (weekend, holiday, or no recent fixing)."},"source":{"type":"string","title":"Source","description":"Provenance - currently ECB Reference Rates only.","default":"ECB"},"notes":{"items":{"type":"string"},"type":"array","title":"Notes"}},"type":"object","required":["converted_amount","rate_used","rate_type","rate_kind_resolved","from_currency","to_currency","requested_date"],"title":"ConvertCurrencyResult"},"CoverageCountry":{"properties":{"country":{"type":"string","title":"Country"},"entity_count":{"type":"integer","title":"Entity Count"}},"type":"object","required":["country","entity_count"],"title":"CoverageCountry"},"CoverageSource":{"properties":{"source":{"type":"string","title":"Source"},"filing_count":{"type":"integer","title":"Filing Count"}},"type":"object","required":["source","filing_count"],"title":"CoverageSource"},"CreateApiKeyRequest":{"properties":{"name":{"type":"string","maxLength":100,"minLength":1,"title":"Name","description":"Human-readable label"},"allowed_cidrs":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Allowed Cidrs","description":"IP ranges (CIDR, IPv4 or IPv6) allowed to present this key (Enterprise plan); absent or empty = every IP. A call from outside the list is refused (401)."},"scopes":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Scopes","description":"Requested scopes, validated against your plan. If absent, defaults to your plan's scope set. A scope your plan does not grant is rejected (403). Grantable scopes: facts.public, screener.read (free) + facts.premium, export.write (builder and up) + export.bulk (team and up) + webhooks.manage (enterprise). `admin:*` is never self-grantable."},"plan_override":{"anyOf":[{"type":"string","enum":["free","pro","enterprise"]},{"type":"null"}],"title":"Plan Override","description":"DEPRECATED, ignored, and no longer stored: the backing column was dropped. The key's effective plan resolves from the workspace's plan at every verification. A value sent here is still ACCEPTED rather than rejected, on purpose -- turning a request that returns 200 today into a 422 would break a public write contract for a field that already has no effect.","deprecated":true},"environment":{"type":"string","enum":["live","test"],"title":"Environment","description":"'test' generates a hubq_test_... key, 'live' generates hubq_live_...","default":"live"},"expires_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Expires At","description":"Optional TTL. NULL = no expiry."},"tos_accepted":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Tos Accepted","description":"Set to true after reading https://hub-equity.com/legal/api-terms. Required from the frontend; optional for curl/SDK callers."},"tos_version":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Tos Version","description":"Version of the API Terms accepted (e.g. '1.0.0-draft'). Stored on the row to detect when a future update requires re-acceptance."}},"type":"object","required":["name"],"title":"CreateApiKeyRequest"},"CreateExportRequest":{"properties":{"entity_ids":{"items":{"type":"string"},"type":"array","maxItems":100,"minItems":1,"title":"Entity Ids","description":"Companies to export, 1 to 100: UUIDs, tickers or `TICKER.MIC` (as `GET /entities/{id}`). Duplicates are dropped.","examples":[["AAPL","MC.XPAR","JNJ"]]},"years":{"type":"integer","maximum":99.0,"minimum":1.0,"title":"Years","description":"Fiscal years per company, 99 for every year we hold.","default":3},"category":{"type":"string","title":"Category","description":"One of all, balance_sheet, cash_flow, income_statement, ratio.","default":"all"},"xbrl":{"type":"string","enum":["none","core","calculation","full"],"title":"Xbrl","description":"XBRL linkbase sheets to embed in each workbook, as `GET /entities/{id}/export`.","default":"none"}},"type":"object","required":["entity_ids"],"title":"CreateExportRequest"},"CreateInvitationRequest":{"properties":{"role":{"type":"string","enum":["admin","member"],"title":"Role","description":"Role given to the invitee when the token is accepted.","default":"member"},"expires_in_days":{"type":"integer","maximum":30.0,"minimum":1.0,"title":"Expires In Days","description":"Token validity in days. Default 7.","default":7}},"type":"object","title":"CreateInvitationRequest"},"DashboardStats":{"properties":{"total_entities":{"type":"integer","title":"Total Entities"},"total_entities_universe":{"type":"string","title":"Total Entities Universe","default":"active_entities"},"entities_trend":{"items":{"type":"integer"},"type":"array","title":"Entities Trend"},"entities_trend_period":{"type":"string","title":"Entities Trend Period","default":"6_months"},"entities_trend_universe":{"type":"string","title":"Entities Trend Universe","default":"active_entities"},"recent_filings_count":{"type":"integer","title":"Recent Filings Count"},"recent_filings_period":{"type":"string","title":"Recent Filings Period","default":"7_days"},"recent_filings_universe":{"type":"string","title":"Recent Filings Universe","default":"all_entities_filings"},"last_update":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Last Update"},"last_update_universe":{"type":"string","title":"Last Update Universe","default":"all_entities_filings"},"coverage_percent":{"type":"number","title":"Coverage Percent"},"coverage_trend":{"type":"number","title":"Coverage Trend"},"coverage_trend_period":{"type":"string","title":"Coverage Trend Period","default":"30_days"},"coverage_universe":{"type":"string","title":"Coverage Universe","default":"mature_hub_concepts"},"system_activities":{"items":{"$ref":"#/components/schemas/SystemActivity"},"type":"array","title":"System Activities"}},"type":"object","required":["total_entities","entities_trend","recent_filings_count","last_update","coverage_percent","coverage_trend","system_activities"],"title":"DashboardStats","description":"Dashboard statistics. Each counter names its population in the sibling\n``*_universe`` field (active_entities, screener_companies,\nall_entities_filings, anon_visible_filings, mature_hub_concepts); two\ncounters are comparable only when their universes match."},"DataQualityResult":{"properties":{"entity_id":{"type":"string","title":"Entity Id"},"entity_name":{"type":"string","title":"Entity Name"},"grade":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Grade","description":"A+ | A | B | C | D: the WORSE of the two gates. **None** when no grade is available for this entity (no served fiscal year, or `is_fallback` is true). A missing grade is not a bad grade: never render None as D, and filter it out before ranking."},"core_universal_covered":{"type":"integer","title":"Core Universal Covered","description":"Gate 1 numerator: mandatory core concepts served on `graded_fiscal_year`.","default":0},"core_universal_total":{"type":"integer","title":"Core Universal Total","description":"Gate 1 denominator: 18, or 17 for an IFRS filer.","default":0},"core_applicable_covered":{"type":"integer","title":"Core Applicable Covered","description":"Gate 2 numerator: reported concepts served on `graded_fiscal_year`.","default":0},"core_applicable_total":{"type":"integer","title":"Core Applicable Total","description":"Gate 2 denominator: core concepts this company reports at all. Built from our own extractions, so a concept we never extracted for this company is absent from it (stated limit, see module docstring). **Always read this against `core_reference_total`**: a hole removes a concept from the numerator AND the denominator at once, so it makes this ratio look better, never worse.","default":0},"core_reference_total":{"type":"integer","title":"Core Reference Total","description":"The FULL core-concept reference: 43, or 40 for an IFRS filer. `core_applicable_total` well below this means either a genuinely simple balance sheet or concepts we never extracted: this field is what makes the difference visible at all.","default":0},"graded_fiscal_year":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Graded Fiscal Year","description":"The fiscal year the grade is computed on. None when nothing is served."},"avg_confidence":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Avg Confidence"},"direct_count":{"type":"integer","title":"Direct Count"},"derived_count":{"type":"integer","title":"Derived Count"},"has_gaap":{"type":"boolean","title":"Has Gaap"},"has_ifrs":{"type":"boolean","title":"Has Ifrs"},"latest_filing_date":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Latest Filing Date"},"freshness_days":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Freshness Days","description":"Days since latest_filing_date. None when no filing recorded."},"is_fallback":{"type":"boolean","title":"Is Fallback","description":"True when computed on-the-fly because no precomputed snapshot exists for this entity. In that mode the two gates cannot be computed and `grade` is None (an incomparable grade is not served as a grade).","default":false},"notes":{"items":{"type":"string"},"type":"array","title":"Notes"}},"type":"object","required":["entity_id","entity_name","direct_count","derived_count","has_gaap","has_ifrs"],"title":"DataQualityResult"},"DatasetCoverage":{"properties":{"version":{"type":"string","title":"Version","default":"1.1.0"},"total_entities":{"type":"integer","title":"Total Entities"},"covered_entities":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Covered Entities"},"total_filings":{"type":"integer","title":"Total Filings"},"sources":{"items":{"$ref":"#/components/schemas/CoverageSource"},"type":"array","title":"Sources"},"taxonomies":{"items":{"type":"string"},"type":"array","title":"Taxonomies"},"fiscal_year_range":{"$ref":"#/components/schemas/FiscalYearRange"},"coverage_by_country":{"items":{"$ref":"#/components/schemas/CoverageCountry"},"type":"array","title":"Coverage By Country"},"notes":{"items":{"type":"string"},"type":"array","title":"Notes"}},"type":"object","required":["total_entities","total_filings"],"title":"DatasetCoverage","description":"Aggregate snapshot of the served dataset.\n\nPure aggregate counts (entities/filings/sources/\ncountries + fiscal-year range): no per-entity provenance, no mapping."},"Decomposition":{"properties":{"parent":{"$ref":"#/components/schemas/Fact"},"rollup_children":{"items":{"$ref":"#/components/schemas/RollupChild"},"type":"array","title":"Rollup Children","description":"The signed components of this figure for this entity (Pro)"},"linkbase_children":{"items":{"$ref":"#/components/schemas/LinkbaseChild"},"type":"array","title":"Linkbase Children","description":"XBRL calculation linkbase children (filing-specific)"},"dimensional_breakdown":{"items":{"$ref":"#/components/schemas/DimensionalSlice"},"type":"array","title":"Dimensional Breakdown","description":"Axis/member slices of the same XBRL fact"},"notes":{"items":{"type":"string"},"type":"array","title":"Notes","description":"Diagnostic notes about missing data, e.g. 'no calculation linkbase'"}},"type":"object","required":["parent","rollup_children","linkbase_children","dimensional_breakdown"],"title":"Decomposition","description":"Result of `get_fact_decomposition` - combines 3 layers of granularity."},"DimensionAxis":{"properties":{"axis_qname":{"type":"string","title":"Axis Qname","description":"Full XBRL qname of the axis, e.g. `us-gaap:StatementBusinessSegmentsAxis`."},"axis_label":{"type":"string","title":"Axis Label","description":"Human-readable label (Statement prefix + Axis suffix stripped, camelCase split)."},"axis_kind":{"type":"string","title":"Axis Kind","description":"Semantic classification: one of `geography`, `segment`, `product`, `equity_rollforward`, `debt`, `fv_hierarchy`, `concentration`, `ppe`, `awards`, or `generic`."},"member_count":{"type":"integer","title":"Member Count","description":"Distinct members observed on this axis for this entity."},"members":{"items":{"$ref":"#/components/schemas/DimensionMember"},"type":"array","title":"Members"},"metrics_using_axis":{"items":{"type":"string"},"type":"array","title":"Metrics Using Axis","description":"Hub concept codes that are tagged with this axis on at least one fact. Tells SDK callers which metrics support a `/financials/breakdown?metric=…` drill on this axis."}},"type":"object","required":["axis_qname","axis_label","axis_kind","member_count"],"title":"DimensionAxis","description":"One XBRL axis reported by the entity."},"DimensionMember":{"properties":{"member_qname":{"type":"string","title":"Member Qname","description":"Full XBRL qname, e.g. `msft:IntelligentCloudMember` or `country:US`."},"member_label":{"type":"string","title":"Member Label","description":"Human-readable label derived from the qname (Member suffix stripped, camelCase split). Short uppercase locals (country codes) preserved as-is."}},"type":"object","required":["member_qname","member_label"],"title":"DimensionMember","description":"One member of an XBRL axis."},"DimensionalSlice":{"properties":{"dimensions":{"items":{"additionalProperties":{"type":"string"},"type":"object"},"type":"array","title":"Dimensions","description":"List of {axis, member} pairs from the XBRL fact context"},"value":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Value"},"unit":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Unit"}},"type":"object","required":["dimensions"],"title":"DimensionalSlice","description":"A dimensional breakdown of a fact (axis + member)."},"DisclosureCatalogEntry":{"properties":{"link_role":{"type":"string","title":"Link Role"},"label":{"type":"string","title":"Label"},"category":{"type":"string","title":"Category","default":""},"concept_count":{"type":"integer","title":"Concept Count"},"has_native_html":{"type":"boolean","title":"Has Native Html"}},"type":"object","required":["link_role","label","concept_count","has_native_html"],"title":"DisclosureCatalogEntry","description":"One disclosure section discovered on a filing's presentation linkbase.\n\nSEC filings set `has_native_html=true`: the section's native HTML table\ncan be fetched with `GET /filings/{id}/disclosure-html`. ESEF filings set\n`has_native_html=false`: use the filing-level iXBRL `viewer_url`."},"DisclosureHtmlPayload":{"properties":{"filing_id":{"type":"string","title":"Filing Id"},"link_role":{"type":"string","title":"Link Role"},"title":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Title","description":"Human-readable disclosure title parsed from the SEC table corner (e.g. 'Revenue Classified by Significant Product and Service Offerings (Detail) - USD ($) $ in Millions')."},"html":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Html","description":"Self-contained HTML document with our CSS override applied, suitable for ``<iframe srcdoc>``. None when SEC is unreachable or the role is not exposed in FilingSummary.xml."},"source_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Source Url","description":"Absolute URL of the original SEC R{n}.htm (for the 'Open original' link)."},"viewer_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Viewer Url","description":"Filing's iXBRL viewer URL (fallback when html is None)."},"anchor_fact_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Anchor Fact Id","description":"iXBRL element ID of the topmost fact in this disclosure's presentation tree. When non-null, the frontend can build `{viewer_url}#{fact_id}` (SEC ix-viewer) or `{viewer_url}#f-{fact_id}` (Arelle) to scroll the original 10-K to the exact section. Null when no tagged fact exists in this link_role (legacy filings, abstract-only roles)."},"document_lang":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Document Lang","description":"ISO 639-1 language code declared by the filing document (ESEF filings are deposited in the home-state language). Null for SEC filings (English) and when the filer declared no xml:lang."}},"type":"object","required":["filing_id","link_role"],"title":"DisclosureHtmlPayload","description":"Payload returned by ``GET /filings/{id}/disclosure-html``."},"DisclosureUrlPayload":{"properties":{"filing_id":{"type":"string","title":"Filing Id"},"link_role":{"type":"string","title":"Link Role"},"disclosure_url":{"type":"string","title":"Disclosure Url","description":"Absolute URL to the per-disclosure HTML page (R{n}.htm) when the link_role can be matched in FilingSummary.xml; otherwise the filing's full iXBRL viewer URL as a fallback."},"fallback_to_viewer":{"type":"boolean","title":"Fallback To Viewer","description":"True when the disclosure URL is the filing's viewer rather than a specific R{n}.htm page (ESEF filings, missing summary, or unmatched link_role)."}},"type":"object","required":["filing_id","link_role","disclosure_url","fallback_to_viewer"],"title":"DisclosureUrlPayload","description":"Payload returned by ``GET /filings/{id}/disclosure-url``."},"DisclosuresResponse":{"properties":{"entity_id":{"type":"string","title":"Entity Id"},"filing_id":{"type":"string","title":"Filing Id"},"fiscal_year":{"type":"integer","title":"Fiscal Year"},"period_end":{"type":"string","title":"Period End"},"source":{"type":"string","title":"Source"},"form_type":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Form Type"},"viewer_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Viewer Url"},"tables":{"items":{"$ref":"#/components/schemas/DisclosureCatalogEntry"},"type":"array","title":"Tables"},"total_tables":{"type":"integer","title":"Total Tables"}},"type":"object","required":["entity_id","filing_id","fiscal_year","period_end","source","tables","total_tables"],"title":"DisclosuresResponse","description":"Container response for the /disclosures endpoint."},"Entity":{"properties":{"id":{"type":"string","title":"Id"},"name":{"type":"string","title":"Name"},"legal_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Legal Name"},"ticker":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Ticker"},"mic":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Mic"},"country":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Country"},"market":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Market"},"exchange":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Exchange"},"currency":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Currency"},"sector":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Sector"},"industry":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Industry"},"cik":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Cik"},"lei":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Lei"},"isin":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Isin"},"fiscal_year_end":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Fiscal Year End"},"fiscal_year_end_month":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Fiscal Year End Month"},"fiscal_year_end_day":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Fiscal Year End Day"},"website":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Website"},"is_active":{"type":"boolean","title":"Is Active"},"latest_filing":{"anyOf":[{"$ref":"#/components/schemas/Filing"},{"type":"null"}]}},"type":"object","required":["id","name","legal_name","ticker","mic","country","market","exchange","currency","sector","industry","cik","lei","isin","fiscal_year_end","website","is_active","latest_filing"],"title":"Entity","description":"Entity details."},"EntityDei":{"properties":{"entity_id":{"type":"string","title":"Entity Id"},"source_filing_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Source Filing Id"},"source_fiscal_year":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Source Fiscal Year"},"source_period_end":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Source Period End"},"number_of_employees":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Number Of Employees"},"incorporation_date":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Incorporation Date"},"bankruptcy_flag":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Bankruptcy Flag"},"legal_form":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Legal Form"},"former_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Former Name"},"former_name_change_date":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Former Name Change Date"},"parent_entity_legal_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Parent Entity Legal Name"},"home_country_iso":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Home Country Iso"},"incorporation_state_country":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Incorporation State Country"},"reporting_currency_iso":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Reporting Currency Iso"},"lei_from_filing":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Lei From Filing"},"ein":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Ein"},"duns":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Duns"},"sic_primary":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Sic Primary"},"filer_category":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Filer Category"},"well_known_seasoned_issuer":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Well Known Seasoned Issuer"},"voluntary_filer":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Voluntary Filer"},"current_reporting_status":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Current Reporting Status"},"small_business":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Small Business"},"emerging_growth_company":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Emerging Growth Company"},"shell_company":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Shell Company"},"ex_transition_period":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Ex Transition Period"},"inv_company_type":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Inv Company Type"},"public_float":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Public Float"},"common_shares_outstanding":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Common Shares Outstanding"},"common_shares_outstanding_by_class":{"anyOf":[{"items":{"additionalProperties":true,"type":"object"},"type":"array"},{"type":"null"}],"title":"Common Shares Outstanding By Class"},"auditor_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Auditor Id"},"auditor_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Auditor Name"},"auditor_pcaob_firm_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Auditor Pcaob Firm Id"},"auditor_location":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Auditor Location"},"auditor_opinion_excerpt":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Auditor Opinion Excerpt"},"icfr_auditor_attestation_flag":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Icfr Auditor Attestation Flag"},"icfr_attestation_status":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Icfr Attestation Status"},"material_weakness_disclosed":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Material Weakness Disclosed"},"fiscal_year_end_month":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Fiscal Year End Month"},"fiscal_year_end_day":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Fiscal Year End Day"}},"type":"object","required":["entity_id","source_filing_id","source_fiscal_year","source_period_end","number_of_employees","incorporation_date","bankruptcy_flag","legal_form","former_name","former_name_change_date","parent_entity_legal_name","home_country_iso","incorporation_state_country","reporting_currency_iso","lei_from_filing","ein","duns","sic_primary","filer_category","well_known_seasoned_issuer","voluntary_filer","current_reporting_status","small_business","emerging_growth_company","shell_company","ex_transition_period","inv_company_type","public_float","common_shares_outstanding","auditor_id","auditor_name","auditor_pcaob_firm_id","auditor_location","auditor_opinion_excerpt"],"title":"EntityDei","description":"DEI attributes for an entity (from the latest filing)."},"EntityDimensionsResponse":{"properties":{"entity_id":{"type":"string","title":"Entity Id"},"axes":{"items":{"$ref":"#/components/schemas/DimensionAxis"},"type":"array","title":"Axes"},"total":{"type":"integer","title":"Total"}},"type":"object","required":["entity_id","total"],"title":"EntityDimensionsResponse","description":"Dimensions overview for one entity."},"EntityMatch":{"properties":{"entity_id":{"type":"string","title":"Entity Id"},"name":{"type":"string","title":"Name"},"ticker":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Ticker"},"mic":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Mic","description":"ISO 10383 Market Identifier Code (XPAR, XNYS, XNAS, ...). Used together with ticker to disambiguate cross-exchange collisions (e.g. MC.XPAR=LVMH vs MC.XNYS=Moelis)."},"cik":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Cik"},"country":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Country"},"sector":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Sector"}},"type":"object","required":["entity_id","name"],"title":"EntityMatch","description":"A single entity returned by `find_entity`."},"EntityProfile":{"properties":{"name":{"type":"string","title":"Name"},"name_en":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Name En"},"ticker":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Ticker"},"cik":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Cik"},"isin":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Isin"},"lei":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Lei"},"country":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Country"},"market":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Market"},"exchange":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Exchange"},"sector":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Sector"},"industry":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Industry"},"fiscal_year_end":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Fiscal Year End","description":"MMDD"},"reporting_currency":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Reporting Currency"},"legal_form":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Legal Form"},"incorporation_country":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Incorporation Country"},"incorporation_date":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Incorporation Date"},"number_of_employees":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Number Of Employees"},"public_float":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Public Float"},"common_shares_outstanding":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Common Shares Outstanding","description":"Cover-page share count: the filed total, or the only class; null when several classes are filed without a total"},"common_shares_outstanding_by_class":{"anyOf":[{"items":{"additionalProperties":true,"type":"object"},"type":"array"},{"type":"null"}],"title":"Common Shares Outstanding By Class","description":"Cover-page share count per class as filed: [{\"class\": <XBRL member>, \"shares\": <n>}]"},"filer_category":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Filer Category"},"bankruptcy_flag":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Bankruptcy Flag"},"shell_company":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Shell Company"},"well_known_seasoned_issuer":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Well Known Seasoned Issuer"},"parent_entity_legal_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Parent Entity Legal Name"},"former_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Former Name"},"sic_primary":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Sic Primary"},"auditor":{"anyOf":[{"$ref":"#/components/schemas/AuditorInfo"},{"type":"null"}]},"filings_count_by_form":{"additionalProperties":{"type":"integer"},"type":"object","title":"Filings Count By Form"},"latest_filings":{"items":{"$ref":"#/components/schemas/FilingBrief"},"type":"array","title":"Latest Filings"},"notes":{"items":{"type":"string"},"type":"array","title":"Notes"}},"type":"object","required":["name"],"title":"EntityProfile"},"ExportJobResponse":{"properties":{"id":{"type":"string","title":"Id"},"status":{"type":"string","enum":["pending","running","ready","failed"],"title":"Status"},"filename":{"type":"string","title":"Filename"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description"},"size_bytes":{"type":"integer","title":"Size Bytes","default":0},"error":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Error","description":"Why the job failed, when it did"},"created_at":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Created At"},"expires_at":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Expires At","description":"The archive is deleted after this instant (7 days)"},"download_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Download Url","description":"Set once status is `ready`: redirects to a signed URL valid 10 minutes"}},"type":"object","required":["id","status","filename"],"title":"ExportJobResponse","description":"A background export as the API serves it. Only what the row carries."},"ExtensionConcept":{"properties":{"qname":{"type":"string","title":"Qname"},"local_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Local Name"},"namespace":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Namespace"},"label":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Label"},"label_fr":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Label Fr"},"item_type":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Item Type","description":"xbrli:monetaryItemType / xbrli:stringItemType / etc"},"period_type":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Period Type","description":"instant | duration"},"balance":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Balance","description":"debit | credit | null"},"substitution_group":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Substitution Group"},"abstract":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Abstract"},"usage_count":{"type":"integer","title":"Usage Count","default":0},"sample_value":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Sample Value"},"documentation":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Documentation","description":"Issuer's own documentation label for this concept, verbatim from its label linkbase. Null when absent or when it merely copies the label."},"canonical_section":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Canonical Section","description":"Accounting section inferred from the issuer's own presentation link-role URIs (P&L / BS / CF / OCI / EQUITY / DISCLOSURE_*)."},"anchored_to":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Anchored To","description":"The standard concept this extension is anchored to, as the issuer itself declared it in the ESMA wider-narrower arc of its own definition linkbase (ESEF filers, mandatory since 2020). Read from the issuer's most recent filing that carries the arc. Null when the issuer declared none (US filers do not anchor)."},"anchor_direction":{"anyOf":[{"type":"string","enum":["narrower","wider"]},{"type":"null"}],"title":"Anchor Direction","description":"'narrower' : the extension is narrower than `anchored_to` (the usual case) ; 'wider' : the extension is wider than it."}},"type":"object","required":["qname"],"title":"ExtensionConcept"},"ExtensionConceptsResult":{"properties":{"entity_id":{"type":"string","title":"Entity Id"},"entity_name":{"type":"string","title":"Entity Name"},"total_count":{"type":"integer","title":"Total Count"},"extensions":{"items":{"$ref":"#/components/schemas/ExtensionConcept"},"type":"array","title":"Extensions"},"applied_filters":{"additionalProperties":true,"type":"object","title":"Applied Filters"},"notes":{"items":{"type":"string"},"type":"array","title":"Notes"}},"type":"object","required":["entity_id","entity_name","total_count","extensions"],"title":"ExtensionConceptsResult"},"FXRate":{"properties":{"rate":{"type":"number","title":"Rate"},"kind":{"type":"string","enum":["spot","avg_period"],"title":"Kind"},"date":{"type":"string","title":"Date"}},"type":"object","required":["rate","kind","date"],"title":"FXRate","description":"One resolved rate (either spot or period-average)."},"FXRatesByPeriod":{"properties":{"instant":{"anyOf":[{"$ref":"#/components/schemas/FXRate"},{"type":"null"}]},"duration":{"anyOf":[{"$ref":"#/components/schemas/FXRate"},{"type":"null"}]}},"type":"object","title":"FXRatesByPeriod","description":"Both IAS 21 dispatches for a single period_end window."},"FXRatesResponse":{"properties":{"source":{"type":"string","title":"Source"},"target":{"type":"string","title":"Target"},"rates":{"additionalProperties":{"$ref":"#/components/schemas/FXRatesByPeriod"},"type":"object","title":"Rates"}},"type":"object","required":["source","target","rates"],"title":"FXRatesResponse","description":"Map ``period_end ISO → { instant, duration }`` plus echo of inputs."},"Fact":{"properties":{"entity_id":{"type":"string","title":"Entity Id"},"entity_name":{"type":"string","title":"Entity Name"},"hub_code":{"type":"string","title":"Hub Code"},"hub_label":{"type":"string","title":"Hub Label"},"statement":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Statement"},"value":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Value"},"value_text":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Value Text"},"currency":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Currency"},"period_start":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Period Start"},"period_end":{"type":"string","title":"Period End"},"fiscal_year":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Fiscal Year"},"fiscal_period":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Fiscal Period"},"fiscal_period_type":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Fiscal Period Type"},"period_type":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Period Type"},"source_concept":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Source Concept","description":"Original XBRL qname"},"source":{"$ref":"#/components/schemas/Source"},"is_restated":{"type":"boolean","title":"Is Restated","default":false},"as_filed_value":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"As Filed Value","description":"Always the value as printed in the filing cited by `source`; equals `value` unless `is_restated`"},"restatement_delta_pct":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Restatement Delta Pct"}},"type":"object","required":["entity_id","entity_name","hub_code","hub_label","period_end","source"],"title":"Fact","description":"A single normalized fact returned by `get_fact`."},"Filing":{"properties":{"id":{"type":"string","title":"Id"},"form_type":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Form Type"},"fiscal_year":{"type":"integer","title":"Fiscal Year"},"fiscal_period":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Fiscal Period"},"filing_date":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Filing Date"},"period_end":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Period End"},"status":{"type":"string","title":"Status"},"facts_count":{"type":"integer","title":"Facts Count"}},"type":"object","required":["id","form_type","fiscal_year","fiscal_period","filing_date","period_end","status","facts_count"],"title":"Filing","description":"Filing summary."},"FilingBrief":{"properties":{"form_type":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Form Type"},"fiscal_year":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Fiscal Year"},"fiscal_period":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Fiscal Period"},"period_end":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Period End"},"filing_date":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Filing Date"},"viewer_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Viewer Url"}},"type":"object","title":"FilingBrief"},"FilingCalcTreeResult":{"properties":{"filing_id":{"type":"string","title":"Filing Id"},"link_role":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Link Role"},"statement":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Statement"},"nodes":{"items":{"$ref":"#/components/schemas/TreeNode"},"type":"array","title":"Nodes","description":"Root-level nodes. Each node carries its own children recursively."},"total_node_count":{"type":"integer","title":"Total Node Count"},"truncated":{"type":"boolean","title":"Truncated","default":false},"notes":{"items":{"type":"string"},"type":"array","title":"Notes"}},"type":"object","required":["filing_id","nodes","total_node_count"],"title":"FilingCalcTreeResult"},"FilingDocumentPayload":{"properties":{"filing_id":{"type":"string","title":"Filing Id"},"html":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Html","description":"The filing's document as filed, as one complete HTML document for an `<iframe sandbox srcdoc>` WITHOUT `allow-scripts`: scripts and event handlers removed, the filer's styles and iXBRL element ids kept, a CSP that refuses every network load, photos above 100 KB dropped. Scroll to a cited number with `getElementById(fact_id)`. Null when the document cannot be reached: open `viewer_url` instead."},"document_lang":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Document Lang","description":"ISO 639-1 language declared by the document."},"viewer_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Viewer Url","description":"The filing's viewer, the fallback when html is null."}},"type":"object","required":["filing_id"],"title":"FilingDocumentPayload","description":"Payload returned by ``GET /filings/{id}/document`` (Story 60.4)."},"FilingRef":{"properties":{"filing_id":{"type":"string","title":"Filing Id"},"fiscal_year":{"type":"integer","title":"Fiscal Year"},"period_end":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Period End"},"form_type":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Form Type"},"filing_date":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Filing Date"},"viewer_url":{"type":"string","title":"Viewer Url","description":"Hub-Equity deep link to the filing"},"external_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"External Url"}},"type":"object","required":["filing_id","fiscal_year","viewer_url"],"title":"FilingRef","description":"Reference to one of the two filings being compared."},"FinancialsResponse":{"properties":{"entity_id":{"type":"string","title":"Entity Id"},"entity_name":{"type":"string","title":"Entity Name"},"currency":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Currency"},"periods":{"items":{"$ref":"#/components/schemas/Period"},"type":"array","title":"Periods"},"metrics":{"items":{"$ref":"#/components/schemas/Metric"},"type":"array","title":"Metrics"},"categories":{"items":{"$ref":"#/components/schemas/CategoryInfo"},"type":"array","title":"Categories"},"original_currency":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Original Currency"},"display_currency":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Display Currency"},"conversion_method":{"anyOf":[{"type":"string","enum":["ias21","spot","native"]},{"type":"null"}],"title":"Conversion Method"},"constant_currency_base_year":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Constant Currency Base Year"},"fx_unconverted":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Fx Unconverted"}},"type":"object","required":["entity_id","entity_name","currency","periods","metrics","categories"],"title":"FinancialsResponse","description":"Financials response with metrics."},"FindEntityResult":{"properties":{"matches":{"items":{"$ref":"#/components/schemas/EntityMatch"},"type":"array","title":"Matches"}},"type":"object","required":["matches"],"title":"FindEntityResult"},"FiscalYearRange":{"properties":{"min":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Min"},"max":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Max"}},"type":"object","title":"FiscalYearRange"},"FlowResponse":{"properties":{"entity_id":{"type":"string","title":"Entity Id"},"entity_name":{"type":"string","title":"Entity Name"},"fiscal_year":{"type":"integer","title":"Fiscal Year"},"currency":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Currency"},"nodes":{"items":{"$ref":"#/components/schemas/SankeyNode"},"type":"array","title":"Nodes"},"links":{"items":{"$ref":"#/components/schemas/SankeyLink"},"type":"array","title":"Links"},"available_years":{"items":{"type":"integer"},"type":"array","title":"Available Years"},"empty_reason":{"anyOf":[{"type":"string","enum":["no_anchor","no_revenue_ever","extraction_gap"]},{"type":"null"}],"title":"Empty Reason"},"empty_reason_year":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Empty Reason Year"}},"type":"object","required":["entity_id","entity_name","fiscal_year","currency","nodes","links","available_years"],"title":"FlowResponse","description":"Sankey / flow response for income statement visualization."},"GroupMember":{"properties":{"member_qname":{"type":"string","title":"Member Qname"},"member_label":{"type":"string","title":"Member Label"},"is_parent":{"type":"boolean","title":"Is Parent","default":false},"n_hubs":{"type":"integer","title":"N Hubs","default":0},"size_value":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Size Value"},"metrics":{"additionalProperties":{"anyOf":[{"type":"number"},{"type":"null"}]},"type":"object","title":"Metrics"}},"type":"object","required":["member_qname","member_label"],"title":"GroupMember","description":"A filing subsidiary (tentacle) — or the consolidated parent reference row.\n\n``member_qname`` is the ``dei:LegalEntityAxis`` member (\"\" for the parent\nreference). ``n_hubs`` is the count of distinct hubs the member carries at\nthe snapshot year (richness — drives eligibility). ``size_value`` is the\nvalue of the node-size metric (default TOTAL_ASSETS). ``metrics`` maps each\ncurated headline hub code to the member's standalone value."},"GroupMemberCategory":{"properties":{"category":{"type":"string","title":"Category"},"label":{"type":"string","title":"Label"},"metrics":{"items":{"$ref":"#/components/schemas/GroupMemberMetricRow"},"type":"array","title":"Metrics"}},"type":"object","required":["category","label"],"title":"GroupMemberCategory","description":"A statement section (Income Statement / Balance Sheet / Cash Flow / …)."},"GroupMemberMetricRow":{"properties":{"code":{"type":"string","title":"Code"},"label":{"type":"string","title":"Label"},"values":{"additionalProperties":{"anyOf":[{"type":"number"},{"type":"null"}]},"type":"object","title":"Values"}},"type":"object","required":["code","label"],"title":"GroupMemberMetricRow","description":"One hub line of a subsidiary's standalone statements (values per year)."},"GroupMetricMeta":{"properties":{"code":{"type":"string","title":"Code"},"label":{"type":"string","title":"Label"},"category":{"type":"string","title":"Category"}},"type":"object","required":["code","label","category"],"title":"GroupMetricMeta","description":"Metadata for one curated headline metric in the member comparison table."},"HTTPValidationError":{"properties":{"detail":{"items":{"$ref":"#/components/schemas/ValidationError"},"type":"array","title":"Detail"}},"type":"object","title":"HTTPValidationError"},"HasDimensionsResponse":{"properties":{"entity_id":{"type":"string","title":"Entity Id"},"metrics":{"additionalProperties":{"items":{"type":"integer"},"type":"array"},"type":"object","title":"Metrics"}},"type":"object","required":["entity_id","metrics"],"title":"HasDimensionsResponse","description":"Per-metric per-year flag indicating where dimensional data exists for an entity.\n\nMaps each metric to the fiscal years that carry dimensional data, so a\nclient can tell which (metric, year) cells have a breakdown."},"HistoryPoint":{"properties":{"fiscal_year":{"type":"integer","title":"Fiscal Year"},"fiscal_period":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Fiscal Period"},"period_end":{"type":"string","title":"Period End"},"value":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Value"},"currency":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Currency"},"yoy_growth_pct":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Yoy Growth Pct","description":"Year-over-year growth %, null for the first point, across a missing year, or when the previous value is zero, negative or null (not meaningful)"},"source":{"anyOf":[{"$ref":"#/components/schemas/Source"},{"type":"null"}]}},"type":"object","required":["fiscal_year","period_end"],"title":"HistoryPoint"},"HubConceptMatch":{"properties":{"code":{"type":"string","title":"Code"},"label":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Label"},"statement":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Statement"},"category":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Category"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description"}},"type":"object","required":["code"],"title":"HubConceptMatch"},"HubListItem":{"properties":{"code":{"type":"string","title":"Code"},"label":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Label"},"category":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Category"},"subcategory":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Subcategory"},"is_derived":{"type":"boolean","title":"Is Derived","default":false}},"type":"object","required":["code"],"title":"HubListItem"},"IdentityCheck":{"properties":{"status":{"type":"string","enum":["reconciles","violation","deferred"],"title":"Status"},"identity":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Identity"},"expected":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Expected"},"actual":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Actual"},"delta_pct":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Delta Pct"},"deferred_reason":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Deferred Reason"}},"type":"object","required":["status"],"title":"IdentityCheck","description":"Whether the served value reconciles with the accounting identities it\ntakes part in.\n\n``status``:\n  - ``reconciles``: at least one accounting identity holds for this value.\n  - ``violation``: every computable identity failed; ``identity``/``expected``/\n    ``actual``/``delta_pct`` give the closest one.\n  - ``deferred``: the filer's own calculation linkbase declares this concept a\n    total, so a cross-statement identity does not apply; not an error.\n\n``None`` when no check is available for the value."},"InspectorAmendment":{"properties":{"id":{"type":"string","title":"Id"},"base_filing_id":{"type":"string","title":"Base Filing Id"},"amendment_filing_id":{"type":"string","title":"Amendment Filing Id"},"amendment_date":{"type":"string","title":"Amendment Date"},"fiscal_year":{"type":"integer","title":"Fiscal Year"},"amendment_filing_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Amendment Filing Url"},"base_filing_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Base Filing Url"},"cik":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Cik"},"form_type":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Form Type"},"base_form_type":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Base Form Type"}},"type":"object","required":["id","base_filing_id","amendment_filing_id","amendment_date","fiscal_year"],"title":"InspectorAmendment","description":"Filing-level context shown in the Inspector Drawer header."},"InspectorPayload":{"properties":{"entity_id":{"type":"string","title":"Entity Id"},"entity_name":{"type":"string","title":"Entity Name"},"change":{"$ref":"#/components/schemas/src__models__schemas__AmendmentChange"},"amendment":{"$ref":"#/components/schemas/InspectorAmendment"},"companion_changes":{"items":{"$ref":"#/components/schemas/src__models__schemas__AmendmentChange"},"type":"array","title":"Companion Changes"},"concept_history":{"items":{"$ref":"#/components/schemas/ConceptHistoryPoint"},"type":"array","title":"Concept History"},"later_restatement":{"anyOf":[{"$ref":"#/components/schemas/LaterRestatement"},{"type":"null"}]},"data_quality_warning":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Data Quality Warning"}},"type":"object","required":["entity_id","entity_name","change","amendment","companion_changes","concept_history"],"title":"InspectorPayload","description":"Single payload for the amendment inspector.\n\nReturned by GET /entities/{id}/amendments/inspector?concept=X&fy=Y.\nBundles the change, the amendment, its companion changes and the concept\nhistory in one call."},"IntersectionCell":{"properties":{"row_qname":{"type":"string","title":"Row Qname"},"row_label":{"type":"string","title":"Row Label"},"col_qname":{"type":"string","title":"Col Qname"},"col_label":{"type":"string","title":"Col Label"},"value":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Value"},"currency":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Currency"}},"type":"object","required":["row_qname","row_label","col_qname","col_label","value","currency"],"title":"IntersectionCell","description":"Single intersection cell — value at the crossroads of two axis members."},"IntersectionCube":{"properties":{"entity_id":{"type":"string","title":"Entity Id"},"metric":{"type":"string","title":"Metric"},"fiscal_year":{"type":"integer","title":"Fiscal Year"},"row_axis_qname":{"type":"string","title":"Row Axis Qname"},"row_axis_label":{"type":"string","title":"Row Axis Label"},"row_axis_kind":{"type":"string","title":"Row Axis Kind"},"col_axis_qname":{"type":"string","title":"Col Axis Qname"},"col_axis_label":{"type":"string","title":"Col Axis Label"},"col_axis_kind":{"type":"string","title":"Col Axis Kind"},"row_members":{"items":{"type":"string"},"type":"array","title":"Row Members"},"col_members":{"items":{"type":"string"},"type":"array","title":"Col Members"},"cells":{"items":{"$ref":"#/components/schemas/IntersectionCell"},"type":"array","title":"Cells"},"available_pairs":{"items":{"prefixItems":[{"type":"string"},{"type":"string"}],"type":"array","maxItems":2,"minItems":2},"type":"array","title":"Available Pairs"},"currency":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Currency"}},"type":"object","required":["entity_id","metric","fiscal_year","row_axis_qname","row_axis_label","row_axis_kind","col_axis_qname","col_axis_label","col_axis_kind","row_members","col_members","cells","available_pairs","currency"],"title":"IntersectionCube","description":"A 2-axis pivot for an entity × metric × fiscal_year.\n\nExposes intersections that ``get_breakdown`` deliberately filters out\n(``len(dims) != 1``), so analysts can see Geography × Segment slices\nthat single-axis lanes can't show. The first detected axis pair with\nenough cells (≥4) is returned by default; a specific pair can be\nrequested via the ``axes`` query param."},"InvitationCreatedResponse":{"properties":{"id":{"type":"string","format":"uuid","title":"Id"},"role":{"type":"string","title":"Role"},"token":{"type":"string","format":"uuid","title":"Token","description":"Invitation token to share with the invitee. It is accepted at https://hub-equity.com/signup?invitation_token={token} or via POST /api/v1/tenants/me/invitations/accept."},"expires_at":{"type":"string","format":"date-time","title":"Expires At"},"created_at":{"type":"string","format":"date-time","title":"Created At"}},"type":"object","required":["id","role","token","expires_at","created_at"],"title":"InvitationCreatedResponse","description":"Returned on invitation creation: the token the admin shares with the invitee."},"InvitationResponse":{"properties":{"id":{"type":"string","format":"uuid","title":"Id"},"role":{"type":"string","title":"Role"},"token":{"type":"string","format":"uuid","title":"Token"},"invited_by_user_id":{"type":"string","format":"uuid","title":"Invited By User Id"},"expires_at":{"type":"string","format":"date-time","title":"Expires At"},"accepted_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Accepted At"},"accepted_by_user_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Accepted By User Id"},"revoked_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Revoked At"},"revoked_reason":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Revoked Reason"},"created_at":{"type":"string","format":"date-time","title":"Created At"}},"type":"object","required":["id","role","token","invited_by_user_id","expires_at","accepted_at","accepted_by_user_id","revoked_at","revoked_reason","created_at"],"title":"InvitationResponse","description":"Invitation as listed to a workspace admin (the token stays readable)."},"LaterRestatement":{"properties":{"value":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Value"},"delta_percent":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Delta Percent"},"form_type":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Form Type"},"filing_date":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Filing Date"},"fiscal_year":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Fiscal Year"}},"type":"object","title":"LaterRestatement","description":"The next correction of a cell, when a later document corrected it again\n(a cell can be corrected by a 10-K/A and then by the comparative column of a\nlater 10-K). ``delta_percent`` is measured against the value set by the\namendment."},"LeafContribution":{"properties":{"hub_code":{"type":"string","title":"Hub Code"},"label":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Label"},"sign":{"type":"string","title":"Sign","default":"+"},"value":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Value"},"currency":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Currency"}},"type":"object","required":["hub_code"],"title":"LeafContribution","description":"A leaf hub that contributed to the rolled-up value."},"LegalEntityGroupResponse":{"properties":{"entity_id":{"type":"string","title":"Entity Id"},"entity_name":{"type":"string","title":"Entity Name"},"currency":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Currency"},"is_group":{"type":"boolean","title":"Is Group"},"fiscal_year":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Fiscal Year"},"size_metric":{"type":"string","title":"Size Metric","default":"TOTAL_ASSETS"},"headline_metrics":{"items":{"$ref":"#/components/schemas/GroupMetricMeta"},"type":"array","title":"Headline Metrics"},"parent":{"anyOf":[{"$ref":"#/components/schemas/GroupMember"},{"type":"null"}]},"members":{"items":{"$ref":"#/components/schemas/GroupMember"},"type":"array","title":"Members"},"note":{"type":"string","title":"Note","default":""}},"type":"object","required":["entity_id","entity_name","currency","is_group"],"title":"LegalEntityGroupResponse","description":"Group view: the filing subsidiaries of a combined report.\n\n``is_group`` gates the whole view: True only when the entity files a\ncombined report carrying ≥2 filing subsidiaries with rich standalone\nfinancials at the snapshot ``fiscal_year``. When False the rest is empty."},"LegalEntityMemberResponse":{"properties":{"entity_id":{"type":"string","title":"Entity Id"},"member_qname":{"type":"string","title":"Member Qname"},"member_label":{"type":"string","title":"Member Label"},"currency":{"type":"string","title":"Currency"},"fiscal_years":{"items":{"type":"integer"},"type":"array","title":"Fiscal Years"},"categories":{"items":{"$ref":"#/components/schemas/GroupMemberCategory"},"type":"array","title":"Categories"}},"type":"object","required":["entity_id","member_qname","member_label","currency"],"title":"LegalEntityMemberResponse","description":"A single filing subsidiary's standalone financials.\n\nThe member's facts as filed in the parent's combined report, grouped into\nstatement sections — the same hubs the parent has, but scoped to this\nregistrant via dei:LegalEntityAxis."},"LinkbaseChild":{"properties":{"qname":{"type":"string","title":"Qname"},"label":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Label"},"weight":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Weight"},"corrected_weight":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Corrected Weight"},"order_index":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Order Index"},"value":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Value"},"unit":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Unit"},"fact_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Fact Url","description":"The issuer's document opened at this child's tagged number"},"children":{"items":{"$ref":"#/components/schemas/LinkbaseChild"},"type":"array","title":"Children"}},"type":"object","required":["qname"],"title":"LinkbaseChild","description":"A child concept in the XBRL calculation linkbase.\n\n`children` is populated when `get_fact_decomposition(depth>=2)` recurses;\nempty for leaf nodes or when depth budget is exhausted."},"ListHubsResult":{"properties":{"matches":{"items":{"$ref":"#/components/schemas/HubListItem"},"type":"array","title":"Matches","description":"Hubs matching the filters, sorted by category then catalog order"},"total":{"type":"integer","title":"Total","description":"Number of items returned (at most `limit`, itself capped at 200)"}},"type":"object","required":["matches","total"],"title":"ListHubsResult"},"MePlanResponse":{"properties":{"commercial_plan":{"type":"string","enum":["free","pro","enterprise"],"title":"Commercial Plan","description":"Resolved commercial axis, mapped from tenant_plan."},"tenant_plan":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Tenant Plan","description":"The workspace's raw plan code: 'free', 'builder', 'team', 'enterprise', or null."},"tenant_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Tenant Id"},"max_active_keys":{"type":"integer","title":"Max Active Keys","description":"Active API keys the workspace may hold, live and test together."},"max_seats":{"type":"integer","title":"Max Seats","description":"Members the workspace may hold; -1 = negotiated."}},"type":"object","required":["commercial_plan","tenant_plan","tenant_id","max_active_keys","max_seats"],"title":"MePlanResponse","description":"Resolved commercial plan of the caller, for client-side gating."},"MeResponse":{"properties":{"user_id":{"type":"string","title":"User Id"},"email":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Email"},"role":{"anyOf":[{"type":"string","enum":["admin","member"]},{"type":"null"}],"title":"Role","description":"Role within the workspace. Null if the user has no workspace (every new account gets a personal workspace, so this should not occur)."},"tenant_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Tenant Id"},"tenant_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Tenant Name"},"tenant_plan":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Tenant Plan","description":"The workspace's plan: 'free', 'builder', 'team', or 'enterprise'."},"scopes":{"items":{"type":"string"},"type":"array","title":"Scopes","description":"Scopes the caller's plan opens. A session is gated on them exactly like an API key; there is no implicit access."}},"type":"object","required":["user_id","email","role","tenant_id","tenant_name","tenant_plan"],"title":"MeResponse","description":"Caller profile + tenant resolution."},"MemberResponse":{"properties":{"user_id":{"type":"string","format":"uuid","title":"User Id"},"email":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Email","description":"Member's email. Null when it cannot be resolved."},"full_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Full Name","description":"Display name given at signup. Suggested display order: full_name, then email, then user_id."},"role":{"type":"string","enum":["admin","member"],"title":"Role"},"joined_at":{"type":"string","format":"date-time","title":"Joined At","description":"When the member joined the workspace."}},"type":"object","required":["user_id","role","joined_at"],"title":"MemberResponse"},"Metric":{"properties":{"code":{"type":"string","title":"Code"},"name":{"type":"string","title":"Name"},"name_fr":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Name Fr"},"category":{"type":"string","title":"Category"},"priority":{"type":"integer","title":"Priority"},"data_type":{"type":"string","title":"Data Type"},"original_qname":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Original Qname"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description"},"is_derived":{"type":"boolean","title":"Is Derived","default":false},"formula":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Formula"},"tier":{"type":"string","title":"Tier","default":"core"},"typical_period":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Typical Period"},"confidence_score":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Confidence Score"},"extraction_method":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Extraction Method"},"calculation_details_by_year":{"anyOf":[{"additionalProperties":{"additionalProperties":true,"type":"object"},"type":"object"},{"type":"null"}],"title":"Calculation Details By Year"},"original_qname_by_year":{"anyOf":[{"additionalProperties":{"anyOf":[{"type":"string"},{"type":"null"}]},"type":"object"},{"type":"null"}],"title":"Original Qname By Year"},"values":{"items":{"$ref":"#/components/schemas/MetricValue"},"type":"array","title":"Values"},"name_period_start":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Name Period Start"},"name_period_end":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Name Period End"},"name_negated":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Name Negated"},"name_total":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Name Total"},"labels_by_section":{"additionalProperties":{"type":"string"},"type":"object","title":"Labels By Section"}},"type":"object","required":["code","name","name_fr","category","priority","data_type","values"],"title":"Metric","description":"Financial metric with values across periods."},"MetricHistory":{"properties":{"entity_id":{"type":"string","title":"Entity Id"},"entity_name":{"type":"string","title":"Entity Name"},"hub_code":{"type":"string","title":"Hub Code"},"hub_label":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Hub Label"},"fiscal_period_type":{"type":"string","title":"Fiscal Period Type"},"points":{"items":{"$ref":"#/components/schemas/HistoryPoint"},"type":"array","title":"Points"},"cagr_pct":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Cagr Pct","description":"CAGR % over the window (first to last point), null unless both ends are positive"},"notes":{"items":{"type":"string"},"type":"array","title":"Notes"}},"type":"object","required":["entity_id","entity_name","hub_code","fiscal_period_type","points"],"title":"MetricHistory"},"MetricValue":{"properties":{"fiscal_year":{"type":"integer","title":"Fiscal Year"},"value":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Value","description":"The value as printed in the filing of that fiscal year, never changed. When a later filing restated it, the number to cite is `display_value`."},"formatted":{"type":"string","title":"Formatted","description":"`display_value`, formatted for display."},"change_percent":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Change Percent"},"change_direction":{"anyOf":[{"type":"string","enum":["up","down"]},{"type":"null"}],"title":"Change Direction"},"sign_changed":{"type":"boolean","title":"Sign Changed","default":false},"is_amendment":{"type":"boolean","title":"Is Amendment","default":false},"is_restated":{"type":"boolean","title":"Is Restated","default":false},"restated_value":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Restated Value"},"restatement_delta_pct":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Restatement Delta Pct"},"display_value":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Display Value","description":"The served value, the one to cite: `restated_value` when a later filing restated the cell, `value` otherwise. Every other endpoint serves this number."},"overlay_source":{"anyOf":[{"type":"string","enum":["none","row","log"]},{"type":"null"}],"title":"Overlay Source"},"served_filing_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Served Filing Id"},"currency":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Currency"},"original_currency":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Original Currency"},"period_type":{"anyOf":[{"type":"string","enum":["instant","duration"]},{"type":"null"}],"title":"Period Type"},"fiscal_period_type":{"anyOf":[{"type":"string","enum":["FY","Q1","Q2","Q3","Q4","H1","H2"]},{"type":"null"}],"title":"Fiscal Period Type"},"period_end":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Period End"},"reported_fiscal_year":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Reported Fiscal Year"},"original_value":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Original Value"},"conversion_rate":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Conversion Rate"},"conversion_rate_kind":{"anyOf":[{"type":"string","enum":["spot","avg_period"]},{"type":"null"}],"title":"Conversion Rate Kind"},"conversion_rate_date":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Conversion Rate Date"},"reported_value":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Reported Value"},"fx_impact":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Fx Impact"},"confidence":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Confidence"},"extraction_method":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Extraction Method"},"confidence_v2":{"anyOf":[{"$ref":"#/components/schemas/ConfidenceV2"},{"type":"null"}]},"provenance_method":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Provenance Method"},"identity_check":{"anyOf":[{"$ref":"#/components/schemas/IdentityCheck"},{"type":"null"}]},"outlier_yoy":{"anyOf":[{"$ref":"#/components/schemas/OutlierYoY"},{"type":"null"}]},"not_reported":{"type":"boolean","title":"Not Reported","default":false},"not_reported_reason":{"anyOf":[{"type":"string","enum":["not_reported","no_longer_reported","not_applicable","zero","combined_into"]},{"type":"null"}],"title":"Not Reported Reason"},"not_reported_detail":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Not Reported Detail"}},"type":"object","required":["fiscal_year","value","formatted","change_percent","change_direction"],"title":"MetricValue","description":"Single metric value for a period."},"OutlierYoY":{"properties":{"delta_pct":{"type":"number","title":"Delta Pct"},"prev_value":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Prev Value"},"next_value":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Next Value"},"baseline_return_pct":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Baseline Return Pct"}},"type":"object","required":["delta_pct"],"title":"OutlierYoY","description":"Isolated year-over-year spike: the value moved by more than a threshold\nagainst the prior fiscal year and the following year returned to the prior\nlevel, i.e. an isolated spike, not a level shift.\n\nA flag, not an error: on volatile cash-flow lines an isolated spike is often a\ngenuine one-off (acquisition, buyback). The value is never corrected.\n``None`` when the value carries no flag."},"Period":{"properties":{"fiscal_year":{"type":"integer","title":"Fiscal Year"},"period_end":{"type":"string","title":"Period End"},"filing_id":{"type":"string","title":"Filing Id"}},"type":"object","required":["fiscal_year","period_end","filing_id"],"title":"Period","description":"Fiscal period info."},"PortfolioChangeFiling":{"properties":{"entity_id":{"type":"string","title":"Entity Id"},"entity_name":{"type":"string","title":"Entity Name"},"filing_id":{"type":"string","title":"Filing Id"},"form_type":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Form Type"},"fiscal_year":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Fiscal Year"},"period_end":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Period End"},"filing_date":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Filing Date"},"ingested_at":{"type":"string","title":"Ingested At"},"viewer_url":{"type":"string","title":"Viewer Url"}},"type":"object","required":["entity_id","entity_name","filing_id","ingested_at","viewer_url"],"title":"PortfolioChangeFiling","description":"A filing ingested since the caller's last visit."},"PortfolioChangeRestatement":{"properties":{"entity_id":{"type":"string","title":"Entity Id"},"entity_name":{"type":"string","title":"Entity Name"},"hub_concept_code":{"type":"string","title":"Hub Concept Code"},"hub_label":{"type":"string","title":"Hub Label"},"fiscal_year":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Fiscal Year"},"original_value":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Original Value"},"restated_value":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Restated Value"},"delta_pct":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Delta Pct"},"materiality":{"type":"string","enum":["low","medium","high"],"title":"Materiality"},"restating_filing_id":{"type":"string","title":"Restating Filing Id"},"restating_form_type":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Restating Form Type"},"restating_filing_date":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Restating Filing Date"},"ingested_at":{"type":"string","title":"Ingested At"},"viewer_url":{"type":"string","title":"Viewer Url"}},"type":"object","required":["entity_id","entity_name","hub_concept_code","hub_label","materiality","restating_filing_id","ingested_at","viewer_url"],"title":"PortfolioChangeRestatement","description":"A material restatement whose restating filing was ingested since the last\nvisit: the event is dated by that filing."},"PortfolioChangesResponse":{"properties":{"since":{"type":"string","title":"Since"},"entity_ids":{"items":{"type":"string"},"type":"array","title":"Entity Ids"},"new_filings":{"items":{"$ref":"#/components/schemas/PortfolioChangeFiling"},"type":"array","title":"New Filings"},"material_restatements":{"items":{"$ref":"#/components/schemas/PortfolioChangeRestatement"},"type":"array","title":"Material Restatements"},"truncated":{"type":"boolean","title":"Truncated","default":false}},"type":"object","required":["since","entity_ids","new_filings","material_restatements"],"title":"PortfolioChangesResponse","description":"What moved, for a set of entities, since ``since``."},"QualityDriver":{"properties":{"name":{"type":"string","title":"Name"},"score":{"type":"number","maximum":1.0,"minimum":0.0,"title":"Score"},"weight":{"type":"number","maximum":1.0,"minimum":0.0,"title":"Weight"},"observation":{"type":"string","title":"Observation"},"details":{"additionalProperties":true,"type":"object","title":"Details"}},"type":"object","required":["name","score","weight","observation"],"title":"QualityDriver","description":"One of the 4 signals contributing to the overall grade."},"QualityGradeResponse":{"properties":{"filing_id":{"type":"string","title":"Filing Id"},"entity_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Entity Id"},"fiscal_year":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Fiscal Year"},"form_type":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Form Type"},"overall_score":{"type":"number","maximum":1.0,"minimum":0.0,"title":"Overall Score"},"letter_grade":{"type":"string","title":"Letter Grade"},"drivers":{"items":{"$ref":"#/components/schemas/QualityDriver"},"type":"array","title":"Drivers"},"methodology":{"type":"string","title":"Methodology","default":"Weighted average of coverage (40%), consistency (30%), validation (20%), and extension restraint (10%). Letter grade thresholds: >=0.90 A, >=0.80 B, >=0.70 C, >=0.60 D, <0.60 F."},"notes":{"items":{"type":"string"},"type":"array","title":"Notes"}},"type":"object","required":["filing_id","overall_score","letter_grade","drivers"],"title":"QualityGradeResponse"},"RawFact":{"properties":{"fact_id":{"type":"string","title":"Fact Id"},"concept_qname":{"type":"string","title":"Concept Qname"},"concept_local_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Concept Local Name"},"is_extension":{"type":"boolean","title":"Is Extension","default":false},"value_numeric":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Value Numeric"},"value_text":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Value Text"},"value_boolean":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Value Boolean"},"unit":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Unit"},"decimals":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Decimals"},"period_type":{"type":"string","title":"Period Type"},"period_start":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Period Start"},"period_end":{"type":"string","title":"Period End"},"dimensions":{"additionalProperties":true,"type":"object","title":"Dimensions"},"presentation_link_role":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Presentation Link Role"},"presentation_order":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Presentation Order"},"presentation_level":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Presentation Level"}},"type":"object","required":["fact_id","concept_qname","period_type","period_end"],"title":"RawFact","description":"One fact as declared in the filing."},"RawFactsResponse":{"properties":{"filing_id":{"type":"string","title":"Filing Id"},"total":{"type":"integer","title":"Total"},"limit":{"type":"integer","title":"Limit"},"offset":{"type":"integer","title":"Offset"},"facts":{"items":{"$ref":"#/components/schemas/RawFact"},"type":"array","title":"Facts"},"applied_filters":{"additionalProperties":true,"type":"object","title":"Applied Filters"},"notes":{"items":{"type":"string"},"type":"array","title":"Notes"}},"type":"object","required":["filing_id","total","limit","offset"],"title":"RawFactsResponse","description":"Container response for ``GET /filings/{id}/facts``."},"ReconciliationSummary":{"properties":{"total":{"additionalProperties":{"anyOf":[{"type":"number"},{"type":"null"}]},"type":"object","title":"Total"},"buildup_total":{"additionalProperties":{"anyOf":[{"type":"number"},{"type":"null"}]},"type":"object","title":"Buildup Total"},"bridge_total":{"additionalProperties":{"anyOf":[{"type":"number"},{"type":"null"}]},"type":"object","title":"Bridge Total"},"is_balanced":{"type":"boolean","title":"Is Balanced","default":false}},"type":"object","title":"ReconciliationSummary","description":"Server-side reconciliation arithmetic for a ConsolidationItems axis.\n\nEach scalar is a per-fiscal-year map, so a client can switch the selected\nyear without re-querying. Computed deterministically:\n    buildup_total = Σ values of buildup members (segment contributions\n                      carried via the sibling BusinessSegments axis)\n    bridge_total  = Σ values of bridge members (with sign flipped when\n                      XBRL stores a deduction as positive — the canonical\n                      Apple CorporateNonSegmentMember case)\n    total         = consolidated value of the metric for the period\nInvariant per year (within 1% tolerance):\n    buildup_total + bridge_total ≈ total"},"RestatementSource":{"properties":{"original_value":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Original Value"},"restated_value":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Restated Value"},"delta_percent":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Delta Percent"},"classification":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Classification","description":"rounding | revised | restated | new_disclosure"}},"type":"object","title":"RestatementSource","description":"Set when filing_b retroactively restates the value reported in\nfiling_a's comparative columns."},"RollUpResult":{"properties":{"parent_code":{"type":"string","title":"Parent Code"},"parent_label":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Parent Label"},"fiscal_year":{"type":"integer","title":"Fiscal Year"},"fiscal_period_type":{"type":"string","title":"Fiscal Period Type"},"value":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Value"},"currency":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Currency"},"algorithm":{"type":"string","title":"Algorithm","description":"How the value was obtained for this entity, on a paid plan: tagged, equivalent_concept or sum_of_components ('unknown' otherwise)."},"contributions":{"items":{"$ref":"#/components/schemas/LeafContribution"},"type":"array","title":"Contributions"},"source":{"anyOf":[{"$ref":"#/components/schemas/Source"},{"type":"null"}]},"notes":{"items":{"type":"string"},"type":"array","title":"Notes"}},"type":"object","required":["parent_code","fiscal_year","fiscal_period_type","algorithm"],"title":"RollUpResult"},"RollupChild":{"properties":{"hub_code":{"type":"string","title":"Hub Code"},"label":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Label"},"sign":{"type":"string","title":"Sign","description":"'+' or '-'"},"value":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Value"},"currency":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Currency"}},"type":"object","required":["hub_code","sign"],"title":"RollupChild","description":"A signed component of this figure for this entity."},"SankeyLink":{"properties":{"source":{"type":"string","title":"Source"},"target":{"type":"string","title":"Target"},"value":{"type":"number","title":"Value"},"is_subtraction":{"type":"boolean","title":"Is Subtraction","default":false}},"type":"object","required":["source","target","value"],"title":"SankeyLink","description":"A link between two Sankey nodes."},"SankeyNode":{"properties":{"id":{"type":"string","title":"Id"},"label":{"type":"string","title":"Label"},"value":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Value"},"category":{"type":"string","title":"Category"},"confidence":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Confidence"},"provenance":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Provenance"}},"type":"object","required":["id","label","value","category"],"title":"SankeyNode","description":"A node in the Sankey diagram."},"ScreenCompaniesResult":{"properties":{"rows":{"items":{"$ref":"#/components/schemas/ScreenedCompany"},"type":"array","title":"Rows"},"total_count":{"type":"integer","title":"Total Count","description":"Number of rows returned (capped at limit)"},"applied_filters":{"additionalProperties":true,"type":"object","title":"Applied Filters"},"notes":{"items":{"type":"string"},"type":"array","title":"Notes"}},"type":"object","required":["rows","total_count"],"title":"ScreenCompaniesResult"},"ScreenedCompany":{"properties":{"entity_id":{"type":"string","title":"Entity Id"},"name":{"type":"string","title":"Name"},"name_en":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Name En"},"ticker":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Ticker"},"country":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Country"},"exchange":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Exchange"},"sector":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Sector"},"gics_sector":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Gics Sector"},"revenue":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Revenue"},"revenue_currency":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Revenue Currency"},"revenue_year":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Revenue Year"},"revenue_usd":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Revenue Usd"},"revenue_usd_rate_date":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Revenue Usd Rate Date"},"number_of_employees":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Number Of Employees"},"incorporation_date":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Incorporation Date"},"bankruptcy_flag":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Bankruptcy Flag"},"auditor_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Auditor Name"},"quality_grade":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Quality Grade"},"avg_confidence":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Avg Confidence"}},"type":"object","required":["entity_id","name"],"title":"ScreenedCompany"},"SearchConceptResult":{"properties":{"matches":{"items":{"$ref":"#/components/schemas/HubConceptMatch"},"type":"array","title":"Matches"}},"type":"object","required":["matches"],"title":"SearchConceptResult"},"SearchResponse":{"properties":{"results":{"items":{"$ref":"#/components/schemas/SearchResult"},"type":"array","title":"Results"},"total":{"type":"integer","title":"Total"},"query":{"type":"string","title":"Query"},"offset":{"type":"integer","title":"Offset","default":0},"has_more":{"type":"boolean","title":"Has More","default":false}},"type":"object","required":["results","total","query"],"title":"SearchResponse","description":"Search response with results."},"SearchResult":{"properties":{"id":{"type":"string","title":"Id"},"name":{"type":"string","title":"Name"},"ticker":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Ticker"},"mic":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Mic"},"country":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Country"},"market":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Market"}},"type":"object","required":["id","name","ticker","mic","country","market"],"title":"SearchResult","description":"Single search result."},"SegmentAxis":{"properties":{"axis":{"type":"string","title":"Axis"},"members":{"items":{"$ref":"#/components/schemas/SegmentValue"},"type":"array","title":"Members"}},"type":"object","required":["axis","members"],"title":"SegmentAxis"},"SegmentBreakdown":{"properties":{"entity_id":{"type":"string","title":"Entity Id"},"entity_name":{"type":"string","title":"Entity Name"},"hub_code":{"type":"string","title":"Hub Code"},"fiscal_year":{"type":"integer","title":"Fiscal Year"},"fiscal_period_type":{"type":"string","title":"Fiscal Period Type"},"period_end":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Period End"},"axes":{"items":{"$ref":"#/components/schemas/SegmentAxis"},"type":"array","title":"Axes","description":"One entry per axis (geo / business / product). Empty if issuer didn't tag dimensional segments."},"source":{"anyOf":[{"$ref":"#/components/schemas/Source"},{"type":"null"}]},"notes":{"items":{"type":"string"},"type":"array","title":"Notes"}},"type":"object","required":["entity_id","entity_name","hub_code","fiscal_year","fiscal_period_type","axes"],"title":"SegmentBreakdown"},"SegmentValue":{"properties":{"axis":{"type":"string","title":"Axis","description":"Axis qname, e.g. 'us-gaap:StatementGeographicalAxis'"},"member":{"type":"string","title":"Member","description":"Member qname, e.g. 'country:US'"},"value":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Value"},"currency":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Currency"}},"type":"object","required":["axis","member"],"title":"SegmentValue"},"SnowflakeAxis":{"properties":{"id":{"type":"string","title":"Id"},"label":{"type":"string","title":"Label"},"value":{"type":"number","title":"Value"},"raw_value":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Raw Value"},"description":{"type":"string","title":"Description"}},"type":"object","required":["id","label","value","raw_value","description"],"title":"SnowflakeAxis","description":"A single axis of the snowflake radar chart."},"SnowflakeResponse":{"properties":{"entity_id":{"type":"string","title":"Entity Id"},"entity_name":{"type":"string","title":"Entity Name"},"axes":{"items":{"$ref":"#/components/schemas/SnowflakeAxis"},"type":"array","title":"Axes"},"overall_score":{"type":"number","title":"Overall Score"}},"type":"object","required":["entity_id","entity_name","axes","overall_score"],"title":"SnowflakeResponse","description":"Snowflake radar response."},"Source":{"properties":{"filing_id":{"type":"string","title":"Filing Id"},"form_type":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Form Type"},"filing_date":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Filing Date"},"period_end":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Period End"},"viewer_url":{"type":"string","title":"Viewer Url","description":"Hub-Equity deep link to the filing"},"external_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"External Url","description":"Original filing URL (e.g. SEC EDGAR viewer) when available"},"anchor":{"anyOf":[{"type":"string","enum":["tagged","derived"]},{"type":"null"}],"title":"Anchor","description":"tagged = the value is one tag of the issuer's document; derived = computed by Hub-Equity from several tags, no single anchor exists by construction"},"fact_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Fact Url","description":"The issuer's document opened AT the tagged number (iXBRL viewer anchored on the fact id), served by get_fact and the decomposition parent when the id resolved in the serving filing; empty on history points: call get_fact for the year to cite"}},"type":"object","required":["filing_id","viewer_url"],"title":"Source","description":"Filing source for a fact (always attached so the LLM can cite).\n\n`anchor` says what kind of number this is: `tagged` (read off one tag of the\nissuer) or `derived` (computed by Hub-Equity from several tags, so no single place\nin the document holds it, by construction). `fact_url` opens the issuer's own\ndocument AT the tagged number (the iXBRL element id, resolved in the filing that\nSERVES the value, which is not always the filing of that fiscal year); it is served\nby `get_fact` and on the parent of `get_fact_decomposition`, and left empty by\n`get_metric_history`, whose points carry `anchor` only: one `get_fact` call gives\nthe deep link of the point to cite."},"SystemActivity":{"properties":{"id":{"type":"string","title":"Id"},"type":{"type":"string","enum":["new_filing","new_entity","quality_change","extension_detected","new_country","taxonomy_update","coverage_milestone"],"title":"Type"},"message":{"type":"string","title":"Message"},"timestamp":{"type":"string","format":"date-time","title":"Timestamp"},"metadata":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Metadata"},"entity_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Entity Id"},"filing_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Filing Id"}},"type":"object","required":["id","type","message","timestamp"],"title":"SystemActivity","description":"System activity entry for timeline."},"TreeNode":{"properties":{"concept":{"type":"string","title":"Concept"},"label":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Label"},"depth":{"type":"integer","title":"Depth","default":0},"sort_order":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Sort Order"},"hub_concept_code":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Hub Concept Code"},"parent_concept":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Parent Concept"},"children":{"items":{"$ref":"#/components/schemas/TreeNode"},"type":"array","title":"Children"}},"type":"object","required":["concept"],"title":"TreeNode"},"UpdateApiKeyRequest":{"properties":{"name":{"anyOf":[{"type":"string","maxLength":100,"minLength":1},{"type":"null"}],"title":"Name"},"scopes":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Scopes"},"allowed_cidrs":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Allowed Cidrs","description":"Replace the allowed IP ranges (Enterprise plan); send [] to allow every IP again."},"plan_override":{"anyOf":[{"type":"string","enum":["free","pro","enterprise"]},{"type":"null"}],"title":"Plan Override","deprecated":true}},"type":"object","title":"UpdateApiKeyRequest"},"UpdateMemberRequest":{"properties":{"role":{"type":"string","enum":["admin","member"],"title":"Role"}},"type":"object","required":["role"],"title":"UpdateMemberRequest"},"UsageDayBucket":{"properties":{"date":{"type":"string","title":"Date","description":"YYYY-MM-DD UTC"},"count":{"type":"integer","title":"Count"}},"type":"object","required":["date","count"],"title":"UsageDayBucket"},"UsageKeyBucket":{"properties":{"api_key_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Api Key Id"},"count":{"type":"integer","title":"Count"}},"type":"object","required":["api_key_id","count"],"title":"UsageKeyBucket"},"UsageMeResponse":{"properties":{"period":{"type":"string","enum":["day","week","month","all"],"title":"Period"},"since":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Since","description":"UTC cutoff. None when period='all'."},"total_calls":{"type":"integer","title":"Total Calls"},"by_status":{"items":{"$ref":"#/components/schemas/UsageStatusBucket"},"type":"array","title":"By Status"},"by_path":{"items":{"$ref":"#/components/schemas/UsagePathBucket"},"type":"array","title":"By Path","description":"Top 20 paths by count"},"by_day":{"items":{"$ref":"#/components/schemas/UsageDayBucket"},"type":"array","title":"By Day","description":"Daily counts within the period"},"by_key":{"items":{"$ref":"#/components/schemas/UsageKeyBucket"},"type":"array","title":"By Key","description":"Breakdown by api_key_id (NULL = JWT call)"}},"type":"object","required":["period","since","total_calls","by_status","by_path","by_day","by_key"],"title":"UsageMeResponse"},"UsagePathBucket":{"properties":{"path":{"type":"string","title":"Path"},"count":{"type":"integer","title":"Count"}},"type":"object","required":["path","count"],"title":"UsagePathBucket"},"UsageStatusBucket":{"properties":{"status_code":{"type":"integer","title":"Status Code"},"count":{"type":"integer","title":"Count"}},"type":"object","required":["status_code","count"],"title":"UsageStatusBucket"},"ValidationCheck":{"properties":{"validation_type":{"type":"string","title":"Validation Type","description":"accounting_equation | calculation | calculation_filing | dqc_cf_sign | dqc_0015_never_negative"},"status":{"type":"string","title":"Status","description":"valid | info | warning | error | skipped"},"hub_concept_code":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Hub Concept Code"},"expected_value":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Expected Value"},"actual_value":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Actual Value"},"difference":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Difference"},"relative_difference":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Relative Difference","description":"Signed fraction (0.01 = 1% gap). NULL when not computable."},"details":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Details"},"filing_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Filing Id"}},"type":"object","required":["validation_type","status"],"title":"ValidationCheck"},"ValidationError":{"properties":{"loc":{"items":{"anyOf":[{"type":"string"},{"type":"integer"}]},"type":"array","title":"Location"},"msg":{"type":"string","title":"Message"},"type":{"type":"string","title":"Error Type"},"input":{"title":"Input"},"ctx":{"type":"object","title":"Context"}},"type":"object","required":["loc","msg","type"],"title":"ValidationError"},"ValidationResult":{"properties":{"entity_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Entity Id"},"entity_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Entity Name"},"filing_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Filing Id"},"fiscal_year":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Fiscal Year"},"total_count":{"type":"integer","title":"Total Count"},"checks":{"items":{"$ref":"#/components/schemas/ValidationCheck"},"type":"array","title":"Checks"},"applied_filters":{"additionalProperties":true,"type":"object","title":"Applied Filters"},"notes":{"items":{"type":"string"},"type":"array","title":"Notes"}},"type":"object","required":["total_count","checks"],"title":"ValidationResult"},"VersionResponse":{"properties":{"version":{"type":"string","title":"Version","description":"API version, e.g. '1.0'"},"api_prefix":{"type":"string","title":"Api Prefix","description":"API path prefix, e.g. '/api/v1'"},"git_commit":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Git Commit","description":"Short commit SHA of the running build, when known."},"served_at":{"type":"string","format":"date-time","title":"Served At","description":"Server-side timestamp at the moment of the call."},"config":{"anyOf":[{"additionalProperties":{"type":"string"},"type":"object"},{"type":"null"}],"title":"Config","description":"Behaviour configuration as this API process resolves it. Admin callers only: null for anonymous and for ordinary authenticated callers."}},"type":"object","required":["version","api_prefix"],"title":"VersionResponse","description":"API build / version metadata."},"WebhookCreateRequest":{"properties":{"name":{"type":"string","maxLength":100,"minLength":1,"title":"Name","description":"Human-readable label"},"url":{"type":"string","title":"Url","description":"https URL of your receiver, on a public host"},"events":{"items":{"type":"string","enum":["filing.ingested","restatement.material"]},"type":"array","title":"Events","description":"Events to receive; at least one","default":["filing.ingested","restatement.material"]},"entity_ids":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Entity Ids","description":"Entity UUIDs to watch (at most 500, a snapshot). Absent or empty: every entity your workspace can see."}},"type":"object","required":["name","url"],"title":"WebhookCreateRequest"},"WebhookCreatedResponse":{"properties":{"id":{"type":"string","format":"uuid","title":"Id"},"name":{"type":"string","title":"Name"},"url":{"type":"string","title":"Url"},"events":{"items":{"type":"string"},"type":"array","title":"Events"},"entity_ids":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Entity Ids"},"is_active":{"type":"boolean","title":"Is Active"},"disabled_reason":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Disabled Reason"},"consecutive_failures":{"type":"integer","title":"Consecutive Failures","default":0},"last_delivery_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Last Delivery At"},"last_delivery_status":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Last Delivery Status"},"created_at":{"type":"string","format":"date-time","title":"Created At"},"secret":{"type":"string","title":"Secret","description":"The signing secret (`whsec_...`). Shown ONCE, at creation or rotation: store it now. `POST /webhooks/{id}/rotate-secret` replaces it; the previous one keeps signing for 24 hours."}},"type":"object","required":["id","name","url","events","is_active","created_at","secret"],"title":"WebhookCreatedResponse"},"WebhookDeliveryResponse":{"properties":{"id":{"type":"string","format":"uuid","title":"Id"},"event":{"type":"string","title":"Event"},"filing_id":{"type":"string","format":"uuid","title":"Filing Id"},"status":{"type":"string","enum":["pending","delivered","failed","skipped"],"title":"Status"},"attempts":{"type":"integer","title":"Attempts"},"last_status_code":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Last Status Code"},"last_error":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Last Error"},"created_at":{"type":"string","format":"date-time","title":"Created At"},"delivered_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Delivered At"},"next_attempt_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Next Attempt At"},"payload":{"additionalProperties":true,"type":"object","title":"Payload"}},"type":"object","required":["id","event","filing_id","status","attempts","created_at","payload"],"title":"WebhookDeliveryResponse"},"WebhookResponse":{"properties":{"id":{"type":"string","format":"uuid","title":"Id"},"name":{"type":"string","title":"Name"},"url":{"type":"string","title":"Url"},"events":{"items":{"type":"string"},"type":"array","title":"Events"},"entity_ids":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Entity Ids"},"is_active":{"type":"boolean","title":"Is Active"},"disabled_reason":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Disabled Reason"},"consecutive_failures":{"type":"integer","title":"Consecutive Failures","default":0},"last_delivery_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Last Delivery At"},"last_delivery_status":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Last Delivery Status"},"created_at":{"type":"string","format":"date-time","title":"Created At"}},"type":"object","required":["id","name","url","events","is_active","created_at"],"title":"WebhookResponse"},"WebhookTestResponse":{"properties":{"delivered":{"type":"boolean","title":"Delivered"},"status_code":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Status Code"},"error":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Error"},"delivery_id":{"type":"string","format":"uuid","title":"Delivery Id"}},"type":"object","required":["delivered","delivery_id"],"title":"WebhookTestResponse","description":"One synchronous attempt: `/test` and `/redeliver` answer the same shape."},"WebhookUpdateRequest":{"properties":{"name":{"anyOf":[{"type":"string","maxLength":100,"minLength":1},{"type":"null"}],"title":"Name"},"url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Url"},"events":{"anyOf":[{"items":{"type":"string","enum":["filing.ingested","restatement.material"]},"type":"array"},{"type":"null"}],"title":"Events"},"entity_ids":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Entity Ids","description":"Replace the scope; send [] to watch every visible entity again."},"is_active":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Is Active","description":"false pauses; true resumes and resets the failure counter."}},"type":"object","title":"WebhookUpdateRequest"},"WithdrawalRequest":{"properties":{"name":{"type":"string","maxLength":200,"minLength":2,"title":"Name","description":"First and last name of the consumer."},"email":{"type":"string","maxLength":320,"minLength":3,"pattern":"^[^@\\s]+@[^@\\s]+\\.[^@\\s]+$","title":"Email","description":"Address the acknowledgment of receipt is sent to."}},"type":"object","required":["name","email"],"title":"WithdrawalRequest"},"WithdrawalResponse":{"properties":{"declared_at":{"type":"string","title":"Declared At"},"contract":{"type":"string","title":"Contract"},"acknowledgment_sent":{"type":"boolean","title":"Acknowledgment Sent","description":"False when the acknowledgment email could not be sent; the declaration stands."}},"type":"object","required":["declared_at","contract","acknowledgment_sent"],"title":"WithdrawalResponse"},"WithdrawalState":{"properties":{"open_until":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Open Until","description":"End of the withdrawal period, ISO 8601, while it is open."},"declared_at":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Declared At","description":"When the withdrawal was declared, ISO 8601, once it has been."},"contract":{"type":"string","title":"Contract","description":"The contract the withdrawal applies to, as the customer reads it."},"acknowledgment_sent":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Acknowledgment Sent","description":"Once declared: whether the acknowledgment email went out."}},"type":"object","required":["contract"],"title":"WithdrawalState"},"hub_equity_mcp__tools__get_amendments__Amendment":{"properties":{"fiscal_year":{"type":"integer","title":"Fiscal Year"},"amendment_date":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Amendment Date"},"base_filing":{"anyOf":[{"$ref":"#/components/schemas/Source"},{"type":"null"}]},"amendment_filing":{"anyOf":[{"$ref":"#/components/schemas/Source"},{"type":"null"}]},"concepts_added":{"type":"integer","title":"Concepts Added","default":0},"concepts_modified":{"type":"integer","title":"Concepts Modified","default":0},"concepts_unchanged":{"type":"integer","title":"Concepts Unchanged","default":0},"changes":{"items":{"$ref":"#/components/schemas/hub_equity_mcp__tools__get_amendments__AmendmentChange"},"type":"array","title":"Changes","description":"Per-concept diff. Empty when only filing pair detected, no diff materialized."}},"type":"object","required":["fiscal_year"],"title":"Amendment"},"hub_equity_mcp__tools__get_amendments__AmendmentChange":{"properties":{"hub_concept_code":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Hub Concept Code"},"fiscal_period":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Fiscal Period"},"period_end":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Period End"},"old_value":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Old Value"},"new_value":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"New Value"},"diff_pct":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Diff Pct","description":"In percent (21.5 = 21.5 %)"},"kind":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Kind","description":"added / modified / unchanged"}},"type":"object","title":"AmendmentChange"},"src__models__schemas__Amendment":{"properties":{"id":{"type":"string","title":"Id"},"base_filing_id":{"type":"string","title":"Base Filing Id"},"amendment_filing_id":{"type":"string","title":"Amendment Filing Id"},"fiscal_year":{"type":"integer","title":"Fiscal Year"},"amendment_date":{"type":"string","title":"Amendment Date"},"concepts_added":{"type":"integer","title":"Concepts Added"},"concepts_modified":{"type":"integer","title":"Concepts Modified"},"concepts_unchanged":{"type":"integer","title":"Concepts Unchanged"},"changes":{"items":{"$ref":"#/components/schemas/src__models__schemas__AmendmentChange"},"type":"array","title":"Changes"},"companion_changes_summary":{"anyOf":[{"$ref":"#/components/schemas/CompanionChangesSummary"},{"type":"null"}]}},"type":"object","required":["id","base_filing_id","amendment_filing_id","fiscal_year","amendment_date","concepts_added","concepts_modified","concepts_unchanged","changes"],"title":"Amendment","description":"Summary of one 10-K/A applied on top of a base 10-K."},"src__models__schemas__AmendmentChange":{"properties":{"hub_concept_code":{"type":"string","title":"Hub Concept Code"},"fiscal_period":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Fiscal Period"},"period_end":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Period End"},"old_value":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Old Value"},"new_value":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"New Value"},"diff_pct":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Diff Pct"},"kind":{"type":"string","enum":["added","modified"],"title":"Kind"},"hub_concept_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Hub Concept Name"},"hub_concept_category":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Hub Concept Category"},"diff_abs":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Diff Abs"},"materiality":{"type":"string","enum":["none","low","medium","high"],"title":"Materiality","default":"medium"}},"type":"object","required":["hub_concept_code","fiscal_period","period_end","old_value","new_value","diff_pct","kind"],"title":"AmendmentChange","description":"One concept-level diff between a 10-K and its 10-K/A.\n\nCarries hub_concept_name, hub_concept_category, diff_abs and materiality\nso the change can be rendered without further lookups."}},"securitySchemes":{"HTTPBearer":{"type":"http","scheme":"bearer"}}},"tags":[{"name":"Info","description":"Service metadata — API root and available doc surfaces."},{"name":"Health","description":"Liveness (`/health/live`) and readiness (`/health/ready`) probes. Readiness verifies downstream dependencies and returns `503` when they are unreachable."},{"name":"Dashboard","description":"Platform-level statistics and aggregate dataset coverage across the whole universe."},{"name":"Search","description":"Full-text search across the entity universe."},{"name":"Companies","description":"Universe screener — filter issuers by country, sector, size, data-quality grade or auditor."},{"name":"Entities","description":"Companies (issuers): identity resolution, full profile, DEI attributes, single normalized facts, per-metric history, fact decomposition, dimensional segments, restatements and data-quality grade."},{"name":"Financials","description":"Normalized financial statements and their structure: multi-year matrix, per-axis dimensional breakdowns, 2-axis intersection cubes, income-statement (Sankey) flow, and the legal-entity group view."},{"name":"Filings","description":"Individual filings: raw XBRL facts, calculation and presentation linkbase trees, per-filing quality grade, validation results and per-disclosure HTML."},{"name":"Disclosures","description":"The disclosure (footnote) catalog reported by an entity."},{"name":"Concepts","description":"The standardized Hub concept catalog — forward search, free-text match, single-concept lookup and hub enumeration."},{"name":"Data Dictionary","description":"The client-facing data dictionary — catalog of served metrics with definitions, accounting identities and methodology."},{"name":"Compare","description":"Cross-issuer N×M comparison at one fiscal period, with built-in calendar-year alignment. Premium (`facts.premium`)."},{"name":"FX","description":"Foreign-exchange rates (ECB / IAS 21 dual-rate) and single-amount currency conversion."},{"name":"Export","description":"Spreadsheet export of an entity's normalized financials (watermarked), on a paid plan (scope `export.write`). `POST /exports` builds several companies in the background and delivers one archive to the workspace's deliverables zone (Team and Enterprise, scope `export.bulk`)."},{"name":"Webhooks","description":"HMAC-signed `POST`s on `filing.ingested` and `restatement.material`, per workspace, on the Enterprise plan (scope `webhooks.manage`). Each event is dated by the filing that carries it."},{"name":"API Keys","description":"Self-service API-key lifecycle — create, list, update and revoke your own keys. JWT (web-app session) only; API keys cannot manage other keys."},{"name":"Billing","description":"Self-service subscription for the Builder plan. These endpoints return a Stripe-hosted URL to redirect the customer to; no card data, invoice or VAT computation ever transits this API. JWT (web-app session) only."},{"name":"Me","description":"The authenticated caller's identity, scopes and the API build/version."},{"name":"Usage","description":"Per-caller usage aggregates and quota consumption."},{"name":"Tenants","description":"Team (tenant) membership and invitations. JWT only; most actions require the tenant-admin role."}]}