{"openapi":"3.1.0","info":{"title":"Friends Data API","description":"Independent, owner-allowlisted gateway for WarrenHub data. This service does not share AlphaHub identity or sessions.","version":"3.0.0","x-friends-data-dictionary":"https://api.alphahubs.uk/static/downloads/friends-data-dictionary-v2.json","x-friends-data-dictionary-schema":"https://api.alphahubs.uk/static/downloads/friends-data-dictionary-v2.schema.json","x-friends-data-dictionary-full":"https://api.alphahubs.uk/static/downloads/friends-data-dictionary-v2.full.json.gz"},"servers":[{"url":"https://api.alphahubs.uk"}],"paths":{"/api/v1/data/catalog":{"get":{"tags":["Catalog"],"summary":"List available datasets","operationId":"api_catalog_api_v1_data_catalog_get","responses":{"200":{"description":"Stable Friends Data API list envelope","headers":{"X-Request-ID":{"description":"Stable trace identifier echoed in the response body.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Requests allowed per key in the current minute.","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Requests remaining in the current key bucket.","schema":{"type":"integer"}},"X-RateLimit-Reset":{"description":"Unix timestamp after which capacity is replenished.","schema":{"type":"integer"}},"Retry-After":{"description":"Seconds to wait when a response is retryable.","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicListResponse"}}}},"400":{"description":"Invalid query or cursor","headers":{"X-Request-ID":{"description":"Stable trace identifier echoed in the response body.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Requests allowed per key in the current minute.","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Requests remaining in the current key bucket.","schema":{"type":"integer"}},"X-RateLimit-Reset":{"description":"Unix timestamp after which capacity is replenished.","schema":{"type":"integer"}},"Retry-After":{"description":"Seconds to wait when a response is retryable.","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicErrorResponse"}}}},"401":{"description":"Missing, invalid, or revoked key","headers":{"X-Request-ID":{"description":"Stable trace identifier echoed in the response body.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Requests allowed per key in the current minute.","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Requests remaining in the current key bucket.","schema":{"type":"integer"}},"X-RateLimit-Reset":{"description":"Unix timestamp after which capacity is replenished.","schema":{"type":"integer"}},"Retry-After":{"description":"Seconds to wait when a response is retryable.","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicErrorResponse"}}}},"403":{"description":"Key cannot access this resource","headers":{"X-Request-ID":{"description":"Stable trace identifier echoed in the response body.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Requests allowed per key in the current minute.","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Requests remaining in the current key bucket.","schema":{"type":"integer"}},"X-RateLimit-Reset":{"description":"Unix timestamp after which capacity is replenished.","schema":{"type":"integer"}},"Retry-After":{"description":"Seconds to wait when a response is retryable.","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicErrorResponse"}}}},"404":{"description":"Dataset or resource not found","headers":{"X-Request-ID":{"description":"Stable trace identifier echoed in the response body.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Requests allowed per key in the current minute.","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Requests remaining in the current key bucket.","schema":{"type":"integer"}},"X-RateLimit-Reset":{"description":"Unix timestamp after which capacity is replenished.","schema":{"type":"integer"}},"Retry-After":{"description":"Seconds to wait when a response is retryable.","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicErrorResponse"}}}},"422":{"description":"Parameter validation failed","headers":{"X-Request-ID":{"description":"Stable trace identifier echoed in the response body.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Requests allowed per key in the current minute.","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Requests remaining in the current key bucket.","schema":{"type":"integer"}},"X-RateLimit-Reset":{"description":"Unix timestamp after which capacity is replenished.","schema":{"type":"integer"}},"Retry-After":{"description":"Seconds to wait when a response is retryable.","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicErrorResponse"}}}},"429":{"description":"Request admission or per-key rate limit exceeded","headers":{"X-Request-ID":{"description":"Stable trace identifier echoed in the response body.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Requests allowed per key in the current minute.","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Requests remaining in the current key bucket.","schema":{"type":"integer"}},"X-RateLimit-Reset":{"description":"Unix timestamp after which capacity is replenished.","schema":{"type":"integer"}},"Retry-After":{"description":"Seconds to wait when a response is retryable.","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicErrorResponse"}}}},"503":{"description":"Required dependency unavailable","headers":{"X-Request-ID":{"description":"Stable trace identifier echoed in the response body.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Requests allowed per key in the current minute.","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Requests remaining in the current key bucket.","schema":{"type":"integer"}},"X-RateLimit-Reset":{"description":"Unix timestamp after which capacity is replenished.","schema":{"type":"integer"}},"Retry-After":{"description":"Seconds to wait when a response is retryable.","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicErrorResponse"}}}}},"security":[{"FriendsAPIKey":[]}]}},"/api/v1/data/datasets/{namespace}/{dataset}/rows":{"get":{"tags":["Datasets"],"summary":"Read dataset rows","operationId":"api_dataset_rows_api_v1_data_datasets__namespace___dataset__rows_get","security":[{"FriendsAPIKey":[]}],"parameters":[{"name":"namespace","in":"path","required":true,"schema":{"type":"string","title":"Namespace"}},{"name":"dataset","in":"path","required":true,"schema":{"type":"string","title":"Dataset"}},{"name":"start","in":"query","required":false,"schema":{"anyOf":[{"type":"string","maxLength":64},{"type":"null"}],"description":"Inclusive UTC start","title":"Start"},"description":"Inclusive UTC start"},{"name":"end","in":"query","required":false,"schema":{"anyOf":[{"type":"string","maxLength":64},{"type":"null"}],"description":"Inclusive UTC end","title":"End"},"description":"Inclusive UTC end"},{"name":"limit","in":"query","required":false,"schema":{"anyOf":[{"type":"integer","maximum":5000,"minimum":1},{"type":"null"}],"title":"Limit"}},{"name":"order","in":"query","required":false,"schema":{"anyOf":[{"enum":["asc","desc"],"type":"string"},{"type":"null"}],"title":"Order"}},{"name":"cursor","in":"query","required":false,"schema":{"anyOf":[{"type":"string","maxLength":4096},{"type":"null"}],"description":"Opaque next_cursor","title":"Cursor"},"description":"Opaque next_cursor"},{"name":"as_of","in":"query","required":false,"schema":{"anyOf":[{"type":"string","maxLength":64},{"type":"null"}],"description":"Server-enforced availability cutoff. Rows that became available after this instant are excluded. Refused with a typed error on datasets that carry no availability clock.","title":"As Of"},"description":"Server-enforced availability cutoff. Rows that became available after this instant are excluded. Refused with a typed error on datasets that carry no availability clock."},{"name":"pack_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string","maxLength":80},{"type":"null"}],"description":"Opaque correlation handle for one research pack.","title":"Pack Id"},"description":"Opaque correlation handle for one research pack."}],"responses":{"200":{"description":"Stable Friends Data API list envelope","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicListResponse"}}},"headers":{"X-Request-ID":{"description":"Stable trace identifier echoed in the response body.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Requests allowed per key in the current minute.","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Requests remaining in the current key bucket.","schema":{"type":"integer"}},"X-RateLimit-Reset":{"description":"Unix timestamp after which capacity is replenished.","schema":{"type":"integer"}},"Retry-After":{"description":"Seconds to wait when a response is retryable.","schema":{"type":"integer"}}}},"400":{"description":"Invalid query or cursor","headers":{"X-Request-ID":{"description":"Stable trace identifier echoed in the response body.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Requests allowed per key in the current minute.","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Requests remaining in the current key bucket.","schema":{"type":"integer"}},"X-RateLimit-Reset":{"description":"Unix timestamp after which capacity is replenished.","schema":{"type":"integer"}},"Retry-After":{"description":"Seconds to wait when a response is retryable.","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicErrorResponse"}}}},"401":{"description":"Missing, invalid, or revoked key","headers":{"X-Request-ID":{"description":"Stable trace identifier echoed in the response body.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Requests allowed per key in the current minute.","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Requests remaining in the current key bucket.","schema":{"type":"integer"}},"X-RateLimit-Reset":{"description":"Unix timestamp after which capacity is replenished.","schema":{"type":"integer"}},"Retry-After":{"description":"Seconds to wait when a response is retryable.","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicErrorResponse"}}}},"403":{"description":"Key cannot access this resource","headers":{"X-Request-ID":{"description":"Stable trace identifier echoed in the response body.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Requests allowed per key in the current minute.","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Requests remaining in the current key bucket.","schema":{"type":"integer"}},"X-RateLimit-Reset":{"description":"Unix timestamp after which capacity is replenished.","schema":{"type":"integer"}},"Retry-After":{"description":"Seconds to wait when a response is retryable.","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicErrorResponse"}}}},"404":{"description":"Dataset or resource not found","headers":{"X-Request-ID":{"description":"Stable trace identifier echoed in the response body.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Requests allowed per key in the current minute.","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Requests remaining in the current key bucket.","schema":{"type":"integer"}},"X-RateLimit-Reset":{"description":"Unix timestamp after which capacity is replenished.","schema":{"type":"integer"}},"Retry-After":{"description":"Seconds to wait when a response is retryable.","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicErrorResponse"}}}},"422":{"description":"Parameter validation failed","headers":{"X-Request-ID":{"description":"Stable trace identifier echoed in the response body.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Requests allowed per key in the current minute.","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Requests remaining in the current key bucket.","schema":{"type":"integer"}},"X-RateLimit-Reset":{"description":"Unix timestamp after which capacity is replenished.","schema":{"type":"integer"}},"Retry-After":{"description":"Seconds to wait when a response is retryable.","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicErrorResponse"}}}},"429":{"description":"Request admission or per-key rate limit exceeded","headers":{"X-Request-ID":{"description":"Stable trace identifier echoed in the response body.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Requests allowed per key in the current minute.","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Requests remaining in the current key bucket.","schema":{"type":"integer"}},"X-RateLimit-Reset":{"description":"Unix timestamp after which capacity is replenished.","schema":{"type":"integer"}},"Retry-After":{"description":"Seconds to wait when a response is retryable.","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicErrorResponse"}}}},"503":{"description":"Required dependency unavailable","headers":{"X-Request-ID":{"description":"Stable trace identifier echoed in the response body.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Requests allowed per key in the current minute.","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Requests remaining in the current key bucket.","schema":{"type":"integer"}},"X-RateLimit-Reset":{"description":"Unix timestamp after which capacity is replenished.","schema":{"type":"integer"}},"Retry-After":{"description":"Seconds to wait when a response is retryable.","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicErrorResponse"}}}}}}},"/api/v1/data/instruments/search":{"get":{"tags":["Markets"],"summary":"Search instruments","operationId":"api_instruments_api_v1_data_instruments_search_get","security":[{"FriendsAPIKey":[]}],"parameters":[{"name":"q","in":"query","required":false,"schema":{"type":"string","maxLength":60,"default":"","title":"Q"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":50,"minimum":1,"default":12,"title":"Limit"}}],"responses":{"200":{"description":"Stable Friends Data API list envelope","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicListResponse"}}},"headers":{"X-Request-ID":{"description":"Stable trace identifier echoed in the response body.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Requests allowed per key in the current minute.","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Requests remaining in the current key bucket.","schema":{"type":"integer"}},"X-RateLimit-Reset":{"description":"Unix timestamp after which capacity is replenished.","schema":{"type":"integer"}},"Retry-After":{"description":"Seconds to wait when a response is retryable.","schema":{"type":"integer"}}}},"400":{"description":"Invalid query or cursor","headers":{"X-Request-ID":{"description":"Stable trace identifier echoed in the response body.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Requests allowed per key in the current minute.","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Requests remaining in the current key bucket.","schema":{"type":"integer"}},"X-RateLimit-Reset":{"description":"Unix timestamp after which capacity is replenished.","schema":{"type":"integer"}},"Retry-After":{"description":"Seconds to wait when a response is retryable.","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicErrorResponse"}}}},"401":{"description":"Missing, invalid, or revoked key","headers":{"X-Request-ID":{"description":"Stable trace identifier echoed in the response body.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Requests allowed per key in the current minute.","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Requests remaining in the current key bucket.","schema":{"type":"integer"}},"X-RateLimit-Reset":{"description":"Unix timestamp after which capacity is replenished.","schema":{"type":"integer"}},"Retry-After":{"description":"Seconds to wait when a response is retryable.","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicErrorResponse"}}}},"403":{"description":"Key cannot access this resource","headers":{"X-Request-ID":{"description":"Stable trace identifier echoed in the response body.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Requests allowed per key in the current minute.","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Requests remaining in the current key bucket.","schema":{"type":"integer"}},"X-RateLimit-Reset":{"description":"Unix timestamp after which capacity is replenished.","schema":{"type":"integer"}},"Retry-After":{"description":"Seconds to wait when a response is retryable.","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicErrorResponse"}}}},"404":{"description":"Dataset or resource not found","headers":{"X-Request-ID":{"description":"Stable trace identifier echoed in the response body.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Requests allowed per key in the current minute.","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Requests remaining in the current key bucket.","schema":{"type":"integer"}},"X-RateLimit-Reset":{"description":"Unix timestamp after which capacity is replenished.","schema":{"type":"integer"}},"Retry-After":{"description":"Seconds to wait when a response is retryable.","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicErrorResponse"}}}},"422":{"description":"Parameter validation failed","headers":{"X-Request-ID":{"description":"Stable trace identifier echoed in the response body.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Requests allowed per key in the current minute.","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Requests remaining in the current key bucket.","schema":{"type":"integer"}},"X-RateLimit-Reset":{"description":"Unix timestamp after which capacity is replenished.","schema":{"type":"integer"}},"Retry-After":{"description":"Seconds to wait when a response is retryable.","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicErrorResponse"}}}},"429":{"description":"Request admission or per-key rate limit exceeded","headers":{"X-Request-ID":{"description":"Stable trace identifier echoed in the response body.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Requests allowed per key in the current minute.","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Requests remaining in the current key bucket.","schema":{"type":"integer"}},"X-RateLimit-Reset":{"description":"Unix timestamp after which capacity is replenished.","schema":{"type":"integer"}},"Retry-After":{"description":"Seconds to wait when a response is retryable.","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicErrorResponse"}}}},"503":{"description":"Required dependency unavailable","headers":{"X-Request-ID":{"description":"Stable trace identifier echoed in the response body.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Requests allowed per key in the current minute.","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Requests remaining in the current key bucket.","schema":{"type":"integer"}},"X-RateLimit-Reset":{"description":"Unix timestamp after which capacity is replenished.","schema":{"type":"integer"}},"Retry-After":{"description":"Seconds to wait when a response is retryable.","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicErrorResponse"}}}}}}},"/api/v1/data/instruments/resolve":{"get":{"tags":["Markets"],"summary":"Resolve an instrument identifier","operationId":"api_instrument_resolve_api_v1_data_instruments_resolve_get","security":[{"FriendsAPIKey":[]}],"parameters":[{"name":"identifier","in":"query","required":true,"schema":{"type":"string","minLength":1,"maxLength":60,"title":"Identifier"}},{"name":"market","in":"query","required":false,"schema":{"anyOf":[{"type":"string","maxLength":16},{"type":"null"}],"title":"Market"}}],"responses":{"200":{"description":"Stable Friends Data API list envelope","content":{"application/json":{"schema":{}}},"headers":{"X-Request-ID":{"description":"Stable trace identifier echoed in the response body.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Requests allowed per key in the current minute.","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Requests remaining in the current key bucket.","schema":{"type":"integer"}},"X-RateLimit-Reset":{"description":"Unix timestamp after which capacity is replenished.","schema":{"type":"integer"}},"Retry-After":{"description":"Seconds to wait when a response is retryable.","schema":{"type":"integer"}}}},"400":{"description":"Invalid query or cursor","headers":{"X-Request-ID":{"description":"Stable trace identifier echoed in the response body.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Requests allowed per key in the current minute.","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Requests remaining in the current key bucket.","schema":{"type":"integer"}},"X-RateLimit-Reset":{"description":"Unix timestamp after which capacity is replenished.","schema":{"type":"integer"}},"Retry-After":{"description":"Seconds to wait when a response is retryable.","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicErrorResponse"}}}},"401":{"description":"Missing, invalid, or revoked key","headers":{"X-Request-ID":{"description":"Stable trace identifier echoed in the response body.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Requests allowed per key in the current minute.","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Requests remaining in the current key bucket.","schema":{"type":"integer"}},"X-RateLimit-Reset":{"description":"Unix timestamp after which capacity is replenished.","schema":{"type":"integer"}},"Retry-After":{"description":"Seconds to wait when a response is retryable.","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicErrorResponse"}}}},"403":{"description":"Key cannot access this resource","headers":{"X-Request-ID":{"description":"Stable trace identifier echoed in the response body.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Requests allowed per key in the current minute.","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Requests remaining in the current key bucket.","schema":{"type":"integer"}},"X-RateLimit-Reset":{"description":"Unix timestamp after which capacity is replenished.","schema":{"type":"integer"}},"Retry-After":{"description":"Seconds to wait when a response is retryable.","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicErrorResponse"}}}},"404":{"description":"Dataset or resource not found","headers":{"X-Request-ID":{"description":"Stable trace identifier echoed in the response body.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Requests allowed per key in the current minute.","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Requests remaining in the current key bucket.","schema":{"type":"integer"}},"X-RateLimit-Reset":{"description":"Unix timestamp after which capacity is replenished.","schema":{"type":"integer"}},"Retry-After":{"description":"Seconds to wait when a response is retryable.","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicErrorResponse"}}}},"422":{"description":"Parameter validation failed","headers":{"X-Request-ID":{"description":"Stable trace identifier echoed in the response body.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Requests allowed per key in the current minute.","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Requests remaining in the current key bucket.","schema":{"type":"integer"}},"X-RateLimit-Reset":{"description":"Unix timestamp after which capacity is replenished.","schema":{"type":"integer"}},"Retry-After":{"description":"Seconds to wait when a response is retryable.","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicErrorResponse"}}}},"429":{"description":"Request admission or per-key rate limit exceeded","headers":{"X-Request-ID":{"description":"Stable trace identifier echoed in the response body.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Requests allowed per key in the current minute.","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Requests remaining in the current key bucket.","schema":{"type":"integer"}},"X-RateLimit-Reset":{"description":"Unix timestamp after which capacity is replenished.","schema":{"type":"integer"}},"Retry-After":{"description":"Seconds to wait when a response is retryable.","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicErrorResponse"}}}},"503":{"description":"Required dependency unavailable","headers":{"X-Request-ID":{"description":"Stable trace identifier echoed in the response body.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Requests allowed per key in the current minute.","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Requests remaining in the current key bucket.","schema":{"type":"integer"}},"X-RateLimit-Reset":{"description":"Unix timestamp after which capacity is replenished.","schema":{"type":"integer"}},"Retry-After":{"description":"Seconds to wait when a response is retryable.","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicErrorResponse"}}}}}}},"/api/v1/data/market/quotes":{"get":{"tags":["Markets"],"summary":"Get latest market quotes","operationId":"api_quotes_api_v1_data_market_quotes_get","security":[{"FriendsAPIKey":[]}],"parameters":[{"name":"symbols","in":"query","required":true,"schema":{"type":"string","minLength":1,"maxLength":800,"description":"Comma-separated symbols, e.g. AAPL,MSFT","title":"Symbols"},"description":"Comma-separated symbols, e.g. AAPL,MSFT"}],"responses":{"200":{"description":"Stable Friends Data API list envelope","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicListResponse"}}},"headers":{"X-Request-ID":{"description":"Stable trace identifier echoed in the response body.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Requests allowed per key in the current minute.","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Requests remaining in the current key bucket.","schema":{"type":"integer"}},"X-RateLimit-Reset":{"description":"Unix timestamp after which capacity is replenished.","schema":{"type":"integer"}},"Retry-After":{"description":"Seconds to wait when a response is retryable.","schema":{"type":"integer"}}}},"400":{"description":"Invalid query or cursor","headers":{"X-Request-ID":{"description":"Stable trace identifier echoed in the response body.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Requests allowed per key in the current minute.","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Requests remaining in the current key bucket.","schema":{"type":"integer"}},"X-RateLimit-Reset":{"description":"Unix timestamp after which capacity is replenished.","schema":{"type":"integer"}},"Retry-After":{"description":"Seconds to wait when a response is retryable.","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicErrorResponse"}}}},"401":{"description":"Missing, invalid, or revoked key","headers":{"X-Request-ID":{"description":"Stable trace identifier echoed in the response body.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Requests allowed per key in the current minute.","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Requests remaining in the current key bucket.","schema":{"type":"integer"}},"X-RateLimit-Reset":{"description":"Unix timestamp after which capacity is replenished.","schema":{"type":"integer"}},"Retry-After":{"description":"Seconds to wait when a response is retryable.","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicErrorResponse"}}}},"403":{"description":"Key cannot access this resource","headers":{"X-Request-ID":{"description":"Stable trace identifier echoed in the response body.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Requests allowed per key in the current minute.","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Requests remaining in the current key bucket.","schema":{"type":"integer"}},"X-RateLimit-Reset":{"description":"Unix timestamp after which capacity is replenished.","schema":{"type":"integer"}},"Retry-After":{"description":"Seconds to wait when a response is retryable.","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicErrorResponse"}}}},"404":{"description":"Dataset or resource not found","headers":{"X-Request-ID":{"description":"Stable trace identifier echoed in the response body.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Requests allowed per key in the current minute.","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Requests remaining in the current key bucket.","schema":{"type":"integer"}},"X-RateLimit-Reset":{"description":"Unix timestamp after which capacity is replenished.","schema":{"type":"integer"}},"Retry-After":{"description":"Seconds to wait when a response is retryable.","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicErrorResponse"}}}},"422":{"description":"Parameter validation failed","headers":{"X-Request-ID":{"description":"Stable trace identifier echoed in the response body.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Requests allowed per key in the current minute.","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Requests remaining in the current key bucket.","schema":{"type":"integer"}},"X-RateLimit-Reset":{"description":"Unix timestamp after which capacity is replenished.","schema":{"type":"integer"}},"Retry-After":{"description":"Seconds to wait when a response is retryable.","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicErrorResponse"}}}},"429":{"description":"Request admission or per-key rate limit exceeded","headers":{"X-Request-ID":{"description":"Stable trace identifier echoed in the response body.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Requests allowed per key in the current minute.","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Requests remaining in the current key bucket.","schema":{"type":"integer"}},"X-RateLimit-Reset":{"description":"Unix timestamp after which capacity is replenished.","schema":{"type":"integer"}},"Retry-After":{"description":"Seconds to wait when a response is retryable.","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicErrorResponse"}}}},"503":{"description":"Required dependency unavailable","headers":{"X-Request-ID":{"description":"Stable trace identifier echoed in the response body.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Requests allowed per key in the current minute.","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Requests remaining in the current key bucket.","schema":{"type":"integer"}},"X-RateLimit-Reset":{"description":"Unix timestamp after which capacity is replenished.","schema":{"type":"integer"}},"Retry-After":{"description":"Seconds to wait when a response is retryable.","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicErrorResponse"}}}}}}},"/api/v1/data/market/candles":{"get":{"tags":["Markets"],"summary":"Get market candles","operationId":"api_candles_api_v1_data_market_candles_get","security":[{"FriendsAPIKey":[]}],"parameters":[{"name":"symbol","in":"query","required":true,"schema":{"type":"string","minLength":1,"maxLength":20,"pattern":"^[A-Za-z0-9._-]+$","title":"Symbol"}},{"name":"timeframe","in":"query","required":false,"schema":{"enum":["1H","4H","1D","1W","1M"],"type":"string","default":"1D","title":"Timeframe"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":2000,"minimum":1,"default":360,"title":"Limit"}}],"responses":{"200":{"description":"Stable Friends Data API list envelope","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicListResponse"}}},"headers":{"X-Request-ID":{"description":"Stable trace identifier echoed in the response body.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Requests allowed per key in the current minute.","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Requests remaining in the current key bucket.","schema":{"type":"integer"}},"X-RateLimit-Reset":{"description":"Unix timestamp after which capacity is replenished.","schema":{"type":"integer"}},"Retry-After":{"description":"Seconds to wait when a response is retryable.","schema":{"type":"integer"}}}},"400":{"description":"Invalid query or cursor","headers":{"X-Request-ID":{"description":"Stable trace identifier echoed in the response body.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Requests allowed per key in the current minute.","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Requests remaining in the current key bucket.","schema":{"type":"integer"}},"X-RateLimit-Reset":{"description":"Unix timestamp after which capacity is replenished.","schema":{"type":"integer"}},"Retry-After":{"description":"Seconds to wait when a response is retryable.","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicErrorResponse"}}}},"401":{"description":"Missing, invalid, or revoked key","headers":{"X-Request-ID":{"description":"Stable trace identifier echoed in the response body.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Requests allowed per key in the current minute.","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Requests remaining in the current key bucket.","schema":{"type":"integer"}},"X-RateLimit-Reset":{"description":"Unix timestamp after which capacity is replenished.","schema":{"type":"integer"}},"Retry-After":{"description":"Seconds to wait when a response is retryable.","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicErrorResponse"}}}},"403":{"description":"Key cannot access this resource","headers":{"X-Request-ID":{"description":"Stable trace identifier echoed in the response body.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Requests allowed per key in the current minute.","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Requests remaining in the current key bucket.","schema":{"type":"integer"}},"X-RateLimit-Reset":{"description":"Unix timestamp after which capacity is replenished.","schema":{"type":"integer"}},"Retry-After":{"description":"Seconds to wait when a response is retryable.","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicErrorResponse"}}}},"404":{"description":"Dataset or resource not found","headers":{"X-Request-ID":{"description":"Stable trace identifier echoed in the response body.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Requests allowed per key in the current minute.","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Requests remaining in the current key bucket.","schema":{"type":"integer"}},"X-RateLimit-Reset":{"description":"Unix timestamp after which capacity is replenished.","schema":{"type":"integer"}},"Retry-After":{"description":"Seconds to wait when a response is retryable.","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicErrorResponse"}}}},"422":{"description":"Parameter validation failed","headers":{"X-Request-ID":{"description":"Stable trace identifier echoed in the response body.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Requests allowed per key in the current minute.","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Requests remaining in the current key bucket.","schema":{"type":"integer"}},"X-RateLimit-Reset":{"description":"Unix timestamp after which capacity is replenished.","schema":{"type":"integer"}},"Retry-After":{"description":"Seconds to wait when a response is retryable.","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicErrorResponse"}}}},"429":{"description":"Request admission or per-key rate limit exceeded","headers":{"X-Request-ID":{"description":"Stable trace identifier echoed in the response body.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Requests allowed per key in the current minute.","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Requests remaining in the current key bucket.","schema":{"type":"integer"}},"X-RateLimit-Reset":{"description":"Unix timestamp after which capacity is replenished.","schema":{"type":"integer"}},"Retry-After":{"description":"Seconds to wait when a response is retryable.","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicErrorResponse"}}}},"503":{"description":"Required dependency unavailable","headers":{"X-Request-ID":{"description":"Stable trace identifier echoed in the response body.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Requests allowed per key in the current minute.","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Requests remaining in the current key bucket.","schema":{"type":"integer"}},"X-RateLimit-Reset":{"description":"Unix timestamp after which capacity is replenished.","schema":{"type":"integer"}},"Retry-After":{"description":"Seconds to wait when a response is retryable.","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicErrorResponse"}}}}}}},"/api/v1/data/pit/{namespace}/{dataset}/rows":{"get":{"tags":["Point-in-time"],"summary":"Read point-in-time rows","operationId":"api_pit_rows_api_v1_data_pit__namespace___dataset__rows_get","security":[{"FriendsAPIKey":[]}],"parameters":[{"name":"namespace","in":"path","required":true,"schema":{"type":"string","title":"Namespace"}},{"name":"dataset","in":"path","required":true,"schema":{"type":"string","title":"Dataset"}},{"name":"as_of","in":"query","required":true,"schema":{"type":"string","minLength":1,"maxLength":64,"description":"Point-in-time UTC boundary","title":"As Of"},"description":"Point-in-time UTC boundary"},{"name":"start","in":"query","required":false,"schema":{"anyOf":[{"type":"string","maxLength":64},{"type":"null"}],"title":"Start"}},{"name":"end","in":"query","required":false,"schema":{"anyOf":[{"type":"string","maxLength":64},{"type":"null"}],"title":"End"}},{"name":"limit","in":"query","required":false,"schema":{"anyOf":[{"type":"integer","maximum":1000,"minimum":1},{"type":"null"}],"title":"Limit"}},{"name":"cursor","in":"query","required":false,"schema":{"anyOf":[{"type":"string","minLength":1,"maxLength":4096},{"type":"null"}],"title":"Cursor"}},{"name":"instrument_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string","maxLength":30},{"type":"null"}],"title":"Instrument Id"}},{"name":"code","in":"query","required":false,"schema":{"anyOf":[{"type":"string","maxLength":160},{"type":"null"}],"title":"Code"}},{"name":"market","in":"query","required":false,"schema":{"anyOf":[{"type":"string","maxLength":160},{"type":"null"}],"title":"Market"}},{"name":"metric","in":"query","required":false,"schema":{"anyOf":[{"type":"string","maxLength":160},{"type":"null"}],"title":"Metric"}},{"name":"source","in":"query","required":false,"schema":{"anyOf":[{"type":"string","maxLength":160},{"type":"null"}],"title":"Source"}},{"name":"period","in":"query","required":false,"schema":{"anyOf":[{"type":"string","maxLength":160},{"type":"null"}],"title":"Period"}},{"name":"period_type","in":"query","required":false,"schema":{"anyOf":[{"type":"string","maxLength":160},{"type":"null"}],"title":"Period Type"}}],"responses":{"200":{"description":"Stable Friends Data API list envelope","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicListResponse"}}},"headers":{"X-Request-ID":{"description":"Stable trace identifier echoed in the response body.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Requests allowed per key in the current minute.","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Requests remaining in the current key bucket.","schema":{"type":"integer"}},"X-RateLimit-Reset":{"description":"Unix timestamp after which capacity is replenished.","schema":{"type":"integer"}},"Retry-After":{"description":"Seconds to wait when a response is retryable.","schema":{"type":"integer"}}}},"400":{"description":"Invalid query or cursor","headers":{"X-Request-ID":{"description":"Stable trace identifier echoed in the response body.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Requests allowed per key in the current minute.","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Requests remaining in the current key bucket.","schema":{"type":"integer"}},"X-RateLimit-Reset":{"description":"Unix timestamp after which capacity is replenished.","schema":{"type":"integer"}},"Retry-After":{"description":"Seconds to wait when a response is retryable.","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicErrorResponse"}}}},"401":{"description":"Missing, invalid, or revoked key","headers":{"X-Request-ID":{"description":"Stable trace identifier echoed in the response body.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Requests allowed per key in the current minute.","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Requests remaining in the current key bucket.","schema":{"type":"integer"}},"X-RateLimit-Reset":{"description":"Unix timestamp after which capacity is replenished.","schema":{"type":"integer"}},"Retry-After":{"description":"Seconds to wait when a response is retryable.","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicErrorResponse"}}}},"403":{"description":"Key cannot access this resource","headers":{"X-Request-ID":{"description":"Stable trace identifier echoed in the response body.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Requests allowed per key in the current minute.","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Requests remaining in the current key bucket.","schema":{"type":"integer"}},"X-RateLimit-Reset":{"description":"Unix timestamp after which capacity is replenished.","schema":{"type":"integer"}},"Retry-After":{"description":"Seconds to wait when a response is retryable.","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicErrorResponse"}}}},"404":{"description":"Dataset or resource not found","headers":{"X-Request-ID":{"description":"Stable trace identifier echoed in the response body.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Requests allowed per key in the current minute.","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Requests remaining in the current key bucket.","schema":{"type":"integer"}},"X-RateLimit-Reset":{"description":"Unix timestamp after which capacity is replenished.","schema":{"type":"integer"}},"Retry-After":{"description":"Seconds to wait when a response is retryable.","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicErrorResponse"}}}},"422":{"description":"Parameter validation failed","headers":{"X-Request-ID":{"description":"Stable trace identifier echoed in the response body.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Requests allowed per key in the current minute.","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Requests remaining in the current key bucket.","schema":{"type":"integer"}},"X-RateLimit-Reset":{"description":"Unix timestamp after which capacity is replenished.","schema":{"type":"integer"}},"Retry-After":{"description":"Seconds to wait when a response is retryable.","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicErrorResponse"}}}},"429":{"description":"Request admission or per-key rate limit exceeded","headers":{"X-Request-ID":{"description":"Stable trace identifier echoed in the response body.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Requests allowed per key in the current minute.","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Requests remaining in the current key bucket.","schema":{"type":"integer"}},"X-RateLimit-Reset":{"description":"Unix timestamp after which capacity is replenished.","schema":{"type":"integer"}},"Retry-After":{"description":"Seconds to wait when a response is retryable.","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicErrorResponse"}}}},"503":{"description":"Required dependency unavailable","headers":{"X-Request-ID":{"description":"Stable trace identifier echoed in the response body.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Requests allowed per key in the current minute.","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Requests remaining in the current key bucket.","schema":{"type":"integer"}},"X-RateLimit-Reset":{"description":"Unix timestamp after which capacity is replenished.","schema":{"type":"integer"}},"Retry-After":{"description":"Seconds to wait when a response is retryable.","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicErrorResponse"}}}}}}},"/api/v1/data/event-context/sec-earnings":{"get":{"tags":["Events"],"summary":"Read SEC earnings event context","operationId":"api_event_context_api_v1_data_event_context_sec_earnings_get","security":[{"FriendsAPIKey":[]}],"parameters":[{"name":"event_ts_from","in":"query","required":false,"schema":{"anyOf":[{"type":"string","maxLength":64},{"type":"null"}],"title":"Event Ts From"}},{"name":"event_ts_to","in":"query","required":false,"schema":{"anyOf":[{"type":"string","maxLength":64},{"type":"null"}],"title":"Event Ts To"}},{"name":"symbol","in":"query","required":false,"schema":{"anyOf":[{"type":"string","maxLength":30},{"type":"null"}],"title":"Symbol"}},{"name":"source","in":"query","required":false,"schema":{"anyOf":[{"type":"string","minLength":1,"maxLength":40},{"type":"null"}],"title":"Source"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":1000,"minimum":1,"default":100,"title":"Limit"}},{"name":"cursor","in":"query","required":false,"schema":{"anyOf":[{"type":"string","maxLength":4096},{"type":"null"}],"description":"Opaque next_cursor","title":"Cursor"},"description":"Opaque next_cursor"}],"responses":{"200":{"description":"Stable Friends Data API list envelope","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicListResponse"}}},"headers":{"X-Request-ID":{"description":"Stable trace identifier echoed in the response body.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Requests allowed per key in the current minute.","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Requests remaining in the current key bucket.","schema":{"type":"integer"}},"X-RateLimit-Reset":{"description":"Unix timestamp after which capacity is replenished.","schema":{"type":"integer"}},"Retry-After":{"description":"Seconds to wait when a response is retryable.","schema":{"type":"integer"}}}},"400":{"description":"Invalid query or cursor","headers":{"X-Request-ID":{"description":"Stable trace identifier echoed in the response body.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Requests allowed per key in the current minute.","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Requests remaining in the current key bucket.","schema":{"type":"integer"}},"X-RateLimit-Reset":{"description":"Unix timestamp after which capacity is replenished.","schema":{"type":"integer"}},"Retry-After":{"description":"Seconds to wait when a response is retryable.","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicErrorResponse"}}}},"401":{"description":"Missing, invalid, or revoked key","headers":{"X-Request-ID":{"description":"Stable trace identifier echoed in the response body.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Requests allowed per key in the current minute.","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Requests remaining in the current key bucket.","schema":{"type":"integer"}},"X-RateLimit-Reset":{"description":"Unix timestamp after which capacity is replenished.","schema":{"type":"integer"}},"Retry-After":{"description":"Seconds to wait when a response is retryable.","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicErrorResponse"}}}},"403":{"description":"Key cannot access this resource","headers":{"X-Request-ID":{"description":"Stable trace identifier echoed in the response body.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Requests allowed per key in the current minute.","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Requests remaining in the current key bucket.","schema":{"type":"integer"}},"X-RateLimit-Reset":{"description":"Unix timestamp after which capacity is replenished.","schema":{"type":"integer"}},"Retry-After":{"description":"Seconds to wait when a response is retryable.","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicErrorResponse"}}}},"404":{"description":"Dataset or resource not found","headers":{"X-Request-ID":{"description":"Stable trace identifier echoed in the response body.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Requests allowed per key in the current minute.","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Requests remaining in the current key bucket.","schema":{"type":"integer"}},"X-RateLimit-Reset":{"description":"Unix timestamp after which capacity is replenished.","schema":{"type":"integer"}},"Retry-After":{"description":"Seconds to wait when a response is retryable.","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicErrorResponse"}}}},"422":{"description":"Parameter validation failed","headers":{"X-Request-ID":{"description":"Stable trace identifier echoed in the response body.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Requests allowed per key in the current minute.","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Requests remaining in the current key bucket.","schema":{"type":"integer"}},"X-RateLimit-Reset":{"description":"Unix timestamp after which capacity is replenished.","schema":{"type":"integer"}},"Retry-After":{"description":"Seconds to wait when a response is retryable.","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicErrorResponse"}}}},"429":{"description":"Request admission or per-key rate limit exceeded","headers":{"X-Request-ID":{"description":"Stable trace identifier echoed in the response body.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Requests allowed per key in the current minute.","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Requests remaining in the current key bucket.","schema":{"type":"integer"}},"X-RateLimit-Reset":{"description":"Unix timestamp after which capacity is replenished.","schema":{"type":"integer"}},"Retry-After":{"description":"Seconds to wait when a response is retryable.","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicErrorResponse"}}}},"503":{"description":"Required dependency unavailable","headers":{"X-Request-ID":{"description":"Stable trace identifier echoed in the response body.","schema":{"type":"string"}},"X-RateLimit-Limit":{"description":"Requests allowed per key in the current minute.","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Requests remaining in the current key bucket.","schema":{"type":"integer"}},"X-RateLimit-Reset":{"description":"Unix timestamp after which capacity is replenished.","schema":{"type":"integer"}},"Retry-After":{"description":"Seconds to wait when a response is retryable.","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicErrorResponse"}}}}}}}},"components":{"schemas":{"PublicErrorDetail":{"properties":{"type":{"type":"string","enum":["authentication_error","permission_error","not_found_error","conflict_error","rate_limit_error","api_error","invalid_request_error"],"title":"Type"},"code":{"type":"string","title":"Code"},"message":{"type":"string","title":"Message"},"param":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Param"},"request_id":{"type":"string","title":"Request Id"},"docs_url":{"type":"string","title":"Docs Url"},"retryable":{"type":"boolean","title":"Retryable"}},"type":"object","required":["type","code","message","request_id","docs_url","retryable"],"title":"PublicErrorDetail","description":"Stable machine-readable API error."},"PublicErrorResponse":{"properties":{"error":{"$ref":"#/components/schemas/PublicErrorDetail"}},"type":"object","required":["error"],"title":"PublicErrorResponse","description":"Top-level error envelope."},"PublicListResponse":{"properties":{"object":{"type":"string","const":"list","title":"Object","default":"list"},"data":{"items":{"additionalProperties":true,"type":"object"},"type":"array","title":"Data"},"has_more":{"type":"boolean","title":"Has More"},"next_cursor":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Next Cursor"},"request_id":{"type":"string","title":"Request Id"},"meta":{"$ref":"#/components/schemas/PublicMeta"}},"type":"object","required":["has_more","request_id","meta"],"title":"PublicListResponse","description":"The only success envelope returned by public data endpoints."},"PublicMeta":{"properties":{"dataset":{"type":"string","title":"Dataset"},"count":{"type":"integer","minimum":0.0,"title":"Count"},"as_of":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"As Of"},"timezone":{"type":"string","const":"UTC","title":"Timezone","default":"UTC"}},"additionalProperties":true,"type":"object","required":["dataset","count"],"title":"PublicMeta","description":"Common provenance and paging metadata, with dataset-specific additions."}},"securitySchemes":{"FriendsAPIKey":{"type":"http","description":"Independent Friends Data API key using Authorization: Bearer <key>.","scheme":"bearer","bearerFormat":"fds_live_…"}}},"externalDocs":{"description":"Friends Data API dataset and field dictionary","url":"https://api.alphahubs.uk/datasets"}}