{"openapi":"3.1.0","info":{"title":"AltIndex Developer API","description":"Alternative data for US equities: retail chatter, employment signals,\nnews, insider and congressional trading, and the AltIndex composite score.\n\n**Authentication.** Send your key in an `X-API-Key` header on every request.\nOne key works on this REST API and on the MCP server.\n\n**Rate limits.** AltIndex returns `X-RateLimit-Limit`,\n`X-RateLimit-Remaining` and `X-RateLimit-Reset` on every response to an\nauthenticated request. A refusal also includes them, so your client can read\nits remaining budget from a 403 or a 413. A 429 adds `Retry-After`. A key on\nan unmetered plan gets no rate-limit headers, because no limit applies.\n\n**Errors.** Every non-2xx response uses one shape:\n`{\"error\": {\"code\", \"message\", \"request_id\"}}`. This includes 404 and 500.\nBranch your code on `code`, because the text of `message` can change.\nAltIndex also returns `request_id` in the `X-Request-ID` header. Quote that\nvalue in a support ticket and AltIndex can find the request.\n\n**Dates.** All date parameters are `from` and `to`, in ISO-8601 format.\nAll timestamps are UTC.\n\n**Coverage.** Coverage is different for each dataset, and each endpoint\nstates its own. AltIndex dates a row by the day that the row describes.\nAltIndex can revise a value in place when it collects a source again, and\nAltIndex keeps no vintage history. A series that you read today can\ntherefore differ from the same series that you read last month.","contact":{"name":"AltIndex Support","url":"https://help.altindex.com/"},"version":"2.0.0"},"servers":[{"url":"https://v2.api.altindex.com/api","description":"Production"}],"paths":{"/entities/search":{"get":{"tags":["entities"],"summary":"Search the covered universe","description":"Search the covered universe. This endpoint returns the companies that AltIndex collects data for. Each company comes with the ticker that every other endpoint keys on. The search matches on the ticker and on the company name. If you omit `query`, the endpoint returns the whole universe, one page at a time.\n\nThis is the one offset-paginated endpoint on the API. A universe is a directory that you read page by page, not a series of dated rows. `total` is the full match count, so a client can size the job before it starts.","operationId":"entities_search","security":[{"ApiKeyAuth":[]}],"parameters":[{"name":"query","in":"query","required":false,"schema":{"anyOf":[{"type":"string","maxLength":200},{"type":"null"}],"description":"Match against the ticker and the company name. Omit this parameter to page the whole universe.","examples":["apple"],"title":"Query"},"description":"Match against the ticker and the company name. Omit this parameter to page the whole universe."},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":200,"minimum":1,"description":"Rows per page, 1 to 200.","default":50,"title":"Limit"},"description":"Rows per page, 1 to 200."},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","minimum":0,"description":"Rows to skip. Use with `total` to page.","default":0,"title":"Offset"},"description":"Rows to skip. Use with `total` to page."}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/EntityListResponse"}}}},"401":{"description":"MISSING_API_KEY","content":{"application/json":{"examples":{"MISSING_API_KEY":{"summary":"MISSING_API_KEY","value":{"error":{"code":"MISSING_API_KEY","message":"API key is required.","request_id":"req_8f14e45fceea167a5a36dedd4bea2543"}}}},"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"403":{"description":"INVALID_API_KEY · API_KEY_EXPIRED · INVALID_KEY_CONFIGURATION · INVALID_SCOPES · INSUFFICIENT_SCOPE","content":{"application/json":{"examples":{"INVALID_API_KEY":{"summary":"INVALID_API_KEY","value":{"error":{"code":"INVALID_API_KEY","message":"API key is invalid or inactive.","request_id":"req_8f14e45fceea167a5a36dedd4bea2543"}}},"API_KEY_EXPIRED":{"summary":"API_KEY_EXPIRED","value":{"error":{"code":"API_KEY_EXPIRED","message":"This API key was rotated and its grace window has ended.","request_id":"req_8f14e45fceea167a5a36dedd4bea2543"}}},"INVALID_KEY_CONFIGURATION":{"summary":"INVALID_KEY_CONFIGURATION","value":{"error":{"code":"INVALID_KEY_CONFIGURATION","message":"This API key is misconfigured. Contact support.","request_id":"req_8f14e45fceea167a5a36dedd4bea2543"}}},"INVALID_SCOPES":{"summary":"INVALID_SCOPES","value":{"error":{"code":"INVALID_SCOPES","message":"API key has invalid scopes configuration.","request_id":"req_8f14e45fceea167a5a36dedd4bea2543"}}},"INSUFFICIENT_SCOPE":{"summary":"INSUFFICIENT_SCOPE","value":{"error":{"code":"INSUFFICIENT_SCOPE","message":"This API key's plan does not include this data family.","request_id":"req_8f14e45fceea167a5a36dedd4bea2543"}}}},"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"422":{"description":"VALIDATION_ERROR","content":{"application/json":{"examples":{"VALIDATION_ERROR":{"summary":"VALIDATION_ERROR","value":{"error":{"code":"VALIDATION_ERROR","message":"Request validation failed.","request_id":"req_8f14e45fceea167a5a36dedd4bea2543"}}}},"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"429":{"description":"RATE_LIMIT_EXCEEDED","content":{"application/json":{"examples":{"RATE_LIMIT_EXCEEDED":{"summary":"RATE_LIMIT_EXCEEDED","value":{"error":{"code":"RATE_LIMIT_EXCEEDED","message":"Request limit exceeded.","request_id":"req_8f14e45fceea167a5a36dedd4bea2543"}}}},"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"500":{"description":"INTERNAL_ERROR","content":{"application/json":{"examples":{"INTERNAL_ERROR":{"summary":"INTERNAL_ERROR","value":{"error":{"code":"INTERNAL_ERROR","message":"An unexpected error occurred. Please try again.","request_id":"req_8f14e45fceea167a5a36dedd4bea2543"}}}},"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"503":{"description":"DATABASE_UNAVAILABLE","content":{"application/json":{"examples":{"DATABASE_UNAVAILABLE":{"summary":"DATABASE_UNAVAILABLE","value":{"error":{"code":"DATABASE_UNAVAILABLE","message":"Database temporarily unavailable. Please retry.","request_id":"req_8f14e45fceea167a5a36dedd4bea2543"}}}},"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}}}}},"/entities/detail":{"get":{"tags":["entities"],"summary":"One company and its mapped handles","description":"One company, and the handle that AltIndex maps it to on each platform AltIndex collects from.\n\nA null handle means that AltIndex maps no dedicated account or community for that platform. That is not the same as no data. AltIndex collects Reddit and X mentions and sentiment by keyword across the whole platform, mapped or not. Reddit covers every company in the universe. X covers most of it, with a shorter history; see the coverage notes on `/social/mentions`. Only an audience count needs a mapped account.\n\nFacebook and YouTube are not included in `social_handles` even though AltIndex stores identifiers for them upstream. Those identifiers are page ids and channel ids, not human handles, so they are omitted here rather than shipped as ids. Their audience series remain available from `/social/audience` with `platform=facebook` and with `platform=youtube`.\n\n`next_earnings_date` is included where AltIndex has one on file and it has not already passed. Absent when the next date has not been sourced.","operationId":"entities_detail","security":[{"ApiKeyAuth":[]}],"parameters":[{"name":"ticker","in":"query","required":true,"schema":{"type":"string","maxLength":20,"description":"Ticker, for example AAPL.","examples":["AAPL"],"title":"Ticker"},"description":"Ticker, for example AAPL."}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/EntityDetail"}}}},"401":{"description":"MISSING_API_KEY","content":{"application/json":{"examples":{"MISSING_API_KEY":{"summary":"MISSING_API_KEY","value":{"error":{"code":"MISSING_API_KEY","message":"API key is required.","request_id":"req_8f14e45fceea167a5a36dedd4bea2543"}}}},"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"403":{"description":"INVALID_API_KEY · API_KEY_EXPIRED · INVALID_KEY_CONFIGURATION · INVALID_SCOPES · INSUFFICIENT_SCOPE","content":{"application/json":{"examples":{"INVALID_API_KEY":{"summary":"INVALID_API_KEY","value":{"error":{"code":"INVALID_API_KEY","message":"API key is invalid or inactive.","request_id":"req_8f14e45fceea167a5a36dedd4bea2543"}}},"API_KEY_EXPIRED":{"summary":"API_KEY_EXPIRED","value":{"error":{"code":"API_KEY_EXPIRED","message":"This API key was rotated and its grace window has ended.","request_id":"req_8f14e45fceea167a5a36dedd4bea2543"}}},"INVALID_KEY_CONFIGURATION":{"summary":"INVALID_KEY_CONFIGURATION","value":{"error":{"code":"INVALID_KEY_CONFIGURATION","message":"This API key is misconfigured. Contact support.","request_id":"req_8f14e45fceea167a5a36dedd4bea2543"}}},"INVALID_SCOPES":{"summary":"INVALID_SCOPES","value":{"error":{"code":"INVALID_SCOPES","message":"API key has invalid scopes configuration.","request_id":"req_8f14e45fceea167a5a36dedd4bea2543"}}},"INSUFFICIENT_SCOPE":{"summary":"INSUFFICIENT_SCOPE","value":{"error":{"code":"INSUFFICIENT_SCOPE","message":"This API key's plan does not include this data family.","request_id":"req_8f14e45fceea167a5a36dedd4bea2543"}}}},"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"404":{"description":"TICKER_NOT_FOUND","content":{"application/json":{"examples":{"TICKER_NOT_FOUND":{"summary":"TICKER_NOT_FOUND","value":{"error":{"code":"TICKER_NOT_FOUND","message":"That ticker is not in our covered universe.","request_id":"req_8f14e45fceea167a5a36dedd4bea2543"}}}},"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"422":{"description":"VALIDATION_ERROR","content":{"application/json":{"examples":{"VALIDATION_ERROR":{"summary":"VALIDATION_ERROR","value":{"error":{"code":"VALIDATION_ERROR","message":"Request validation failed.","request_id":"req_8f14e45fceea167a5a36dedd4bea2543"}}}},"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"429":{"description":"RATE_LIMIT_EXCEEDED","content":{"application/json":{"examples":{"RATE_LIMIT_EXCEEDED":{"summary":"RATE_LIMIT_EXCEEDED","value":{"error":{"code":"RATE_LIMIT_EXCEEDED","message":"Request limit exceeded.","request_id":"req_8f14e45fceea167a5a36dedd4bea2543"}}}},"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"500":{"description":"INTERNAL_ERROR","content":{"application/json":{"examples":{"INTERNAL_ERROR":{"summary":"INTERNAL_ERROR","value":{"error":{"code":"INTERNAL_ERROR","message":"An unexpected error occurred. Please try again.","request_id":"req_8f14e45fceea167a5a36dedd4bea2543"}}}},"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"503":{"description":"DATABASE_UNAVAILABLE","content":{"application/json":{"examples":{"DATABASE_UNAVAILABLE":{"summary":"DATABASE_UNAVAILABLE","value":{"error":{"code":"DATABASE_UNAVAILABLE","message":"Database temporarily unavailable. Please retry.","request_id":"req_8f14e45fceea167a5a36dedd4bea2543"}}}},"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}}}}},"/score/composite":{"get":{"tags":["score"],"summary":"Composite score and pillars, daily","description":"Daily AltIndex composite score, 0-100, and its four pillars. The four pillars are audience, employment, customer and fundamental.\n\nA pillar is null on a day when the pillar had no input. AltIndex never returns 0 in its place. A stored 0 in this data means 'not collected'. If AltIndex returned that 0 as a score, a reader would take it for a genuine floor value. The composite has no such ambiguity and is always a real value.\n\nAltIndex scores the covered universe daily. Coverage is not every company on every day. A day with no scored row for a company has no row in the series. AltIndex does not add a row with a 0 in its place. Rows are oldest first.\n\nGive `ticker` for one series. Give `tickers` for a comma-separated batch. Your plan sets the limit on tickers in one request. A batch is one request, whatever the ticker count. The response includes `results` and an `errors` list. One ticker that does not resolve does not fail the request.","operationId":"score_composite","security":[{"ApiKeyAuth":[]}],"parameters":[{"name":"ticker","in":"query","required":false,"schema":{"anyOf":[{"type":"string","maxLength":20},{"type":"null"}],"description":"One ticker, for example AAPL.","title":"Ticker"},"description":"One ticker, for example AAPL."},{"name":"tickers","in":"query","required":false,"schema":{"anyOf":[{"type":"string","maxLength":2000},{"type":"null"}],"description":"Comma-separated tickers for a batch.","title":"Tickers"},"description":"Comma-separated tickers for a batch."},{"name":"from","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"description":"ISO-8601 start date.","title":"From"},"description":"ISO-8601 start date."},{"name":"to","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"description":"ISO-8601 end date.","title":"To"},"description":"ISO-8601 end date."}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"anyOf":[{"$ref":"#/components/schemas/SeriesResponse_ScoreCompositePoint_"},{"$ref":"#/components/schemas/BatchSeriesResponse_ScoreCompositePoint_"}],"title":"Response Score Composite"}}}},"401":{"description":"MISSING_API_KEY","content":{"application/json":{"examples":{"MISSING_API_KEY":{"summary":"MISSING_API_KEY","value":{"error":{"code":"MISSING_API_KEY","message":"API key is required.","request_id":"req_8f14e45fceea167a5a36dedd4bea2543"}}}},"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"403":{"description":"INVALID_API_KEY · API_KEY_EXPIRED · INVALID_KEY_CONFIGURATION · INVALID_SCOPES · INSUFFICIENT_SCOPE · HISTORY_LIMIT_EXCEEDED · BATCH_NOT_INCLUDED · TOO_MANY_TICKERS","content":{"application/json":{"examples":{"INVALID_API_KEY":{"summary":"INVALID_API_KEY","value":{"error":{"code":"INVALID_API_KEY","message":"API key is invalid or inactive.","request_id":"req_8f14e45fceea167a5a36dedd4bea2543"}}},"API_KEY_EXPIRED":{"summary":"API_KEY_EXPIRED","value":{"error":{"code":"API_KEY_EXPIRED","message":"This API key was rotated and its grace window has ended.","request_id":"req_8f14e45fceea167a5a36dedd4bea2543"}}},"INVALID_KEY_CONFIGURATION":{"summary":"INVALID_KEY_CONFIGURATION","value":{"error":{"code":"INVALID_KEY_CONFIGURATION","message":"This API key is misconfigured. Contact support.","request_id":"req_8f14e45fceea167a5a36dedd4bea2543"}}},"INVALID_SCOPES":{"summary":"INVALID_SCOPES","value":{"error":{"code":"INVALID_SCOPES","message":"API key has invalid scopes configuration.","request_id":"req_8f14e45fceea167a5a36dedd4bea2543"}}},"INSUFFICIENT_SCOPE":{"summary":"INSUFFICIENT_SCOPE","value":{"error":{"code":"INSUFFICIENT_SCOPE","message":"This API key's plan does not include this data family.","request_id":"req_8f14e45fceea167a5a36dedd4bea2543"}}},"HISTORY_LIMIT_EXCEEDED":{"summary":"HISTORY_LIMIT_EXCEEDED","value":{"error":{"code":"HISTORY_LIMIT_EXCEEDED","message":"The requested range is older than your plan allows.","request_id":"req_8f14e45fceea167a5a36dedd4bea2543"}}},"BATCH_NOT_INCLUDED":{"summary":"BATCH_NOT_INCLUDED","value":{"error":{"code":"BATCH_NOT_INCLUDED","message":"Your plan allows one ticker per call.","request_id":"req_8f14e45fceea167a5a36dedd4bea2543"}}},"TOO_MANY_TICKERS":{"summary":"TOO_MANY_TICKERS","value":{"error":{"code":"TOO_MANY_TICKERS","message":"More tickers were requested than your plan allows per call.","request_id":"req_8f14e45fceea167a5a36dedd4bea2543"}}}},"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"404":{"description":"TICKER_NOT_FOUND","content":{"application/json":{"examples":{"TICKER_NOT_FOUND":{"summary":"TICKER_NOT_FOUND","value":{"error":{"code":"TICKER_NOT_FOUND","message":"That ticker is not in our covered universe.","request_id":"req_8f14e45fceea167a5a36dedd4bea2543"}}}},"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"413":{"description":"RESULT_TOO_LARGE","content":{"application/json":{"examples":{"RESULT_TOO_LARGE":{"summary":"RESULT_TOO_LARGE","value":{"error":{"code":"RESULT_TOO_LARGE","message":"This range returns more rows than one response carries.","request_id":"req_8f14e45fceea167a5a36dedd4bea2543"}}}},"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"422":{"description":"VALIDATION_ERROR · INVALID_TICKERS · INVALID_DATE_RANGE","content":{"application/json":{"examples":{"VALIDATION_ERROR":{"summary":"VALIDATION_ERROR","value":{"error":{"code":"VALIDATION_ERROR","message":"Request validation failed.","request_id":"req_8f14e45fceea167a5a36dedd4bea2543"}}},"INVALID_TICKERS":{"summary":"INVALID_TICKERS","value":{"error":{"code":"INVALID_TICKERS","message":"`tickers` must name at least one ticker.","request_id":"req_8f14e45fceea167a5a36dedd4bea2543"}}},"INVALID_DATE_RANGE":{"summary":"INVALID_DATE_RANGE","value":{"error":{"code":"INVALID_DATE_RANGE","message":"`from` must be on or before `to`.","request_id":"req_8f14e45fceea167a5a36dedd4bea2543"}}}},"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"429":{"description":"RATE_LIMIT_EXCEEDED","content":{"application/json":{"examples":{"RATE_LIMIT_EXCEEDED":{"summary":"RATE_LIMIT_EXCEEDED","value":{"error":{"code":"RATE_LIMIT_EXCEEDED","message":"Request limit exceeded.","request_id":"req_8f14e45fceea167a5a36dedd4bea2543"}}}},"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"500":{"description":"INTERNAL_ERROR","content":{"application/json":{"examples":{"INTERNAL_ERROR":{"summary":"INTERNAL_ERROR","value":{"error":{"code":"INTERNAL_ERROR","message":"An unexpected error occurred. Please try again.","request_id":"req_8f14e45fceea167a5a36dedd4bea2543"}}}},"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"503":{"description":"DATABASE_UNAVAILABLE","content":{"application/json":{"examples":{"DATABASE_UNAVAILABLE":{"summary":"DATABASE_UNAVAILABLE","value":{"error":{"code":"DATABASE_UNAVAILABLE","message":"Database temporarily unavailable. Please retry.","request_id":"req_8f14e45fceea167a5a36dedd4bea2543"}}}},"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}}}}},"/score/forecast":{"get":{"tags":["score"],"summary":"Model price forecast, daily","description":"Daily model-implied price forecast.\n\n`ai_price` is the output of the AltIndex model. It is not an analyst consensus, not a third-party price target, and not tied to a fixed forecast horizon — do not read it as a 1-month or 12-month price target. It is the price the model implies for the ticker at the time it was stamped.\n\n`anchor_price` is the reference price the model was priced against when it stamped this forecast. It is not today's spot price. When the model was not rerun on a day, the upstream writer restamps the same anchor on that day — so an identical anchor across several days means the forecast is coasting from an earlier repricing, not that the market did not move. Compute an implied return as `(ai_price - anchor_price) / anchor_price`.\n\nAltIndex scores the covered universe daily. Coverage is not every company on every day. A day with no scored row for a company has no row in the series. AltIndex does not add a row with a 0 in its place. Rows are oldest first.\n\nGive `ticker` for one series. Give `tickers` for a comma-separated batch. Your plan sets the limit on tickers in one request. A batch is one request, whatever the ticker count. The response includes `results` and an `errors` list. One ticker that does not resolve does not fail the request.","operationId":"score_forecast","security":[{"ApiKeyAuth":[]}],"parameters":[{"name":"ticker","in":"query","required":false,"schema":{"anyOf":[{"type":"string","maxLength":20},{"type":"null"}],"description":"One ticker, for example AAPL.","title":"Ticker"},"description":"One ticker, for example AAPL."},{"name":"tickers","in":"query","required":false,"schema":{"anyOf":[{"type":"string","maxLength":2000},{"type":"null"}],"description":"Comma-separated tickers for a batch.","title":"Tickers"},"description":"Comma-separated tickers for a batch."},{"name":"from","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"description":"ISO-8601 start date.","title":"From"},"description":"ISO-8601 start date."},{"name":"to","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"description":"ISO-8601 end date.","title":"To"},"description":"ISO-8601 end date."}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"anyOf":[{"$ref":"#/components/schemas/SeriesResponse_ScoreForecastPoint_"},{"$ref":"#/components/schemas/BatchSeriesResponse_ScoreForecastPoint_"}],"title":"Response Score Forecast"}}}},"401":{"description":"MISSING_API_KEY","content":{"application/json":{"examples":{"MISSING_API_KEY":{"summary":"MISSING_API_KEY","value":{"error":{"code":"MISSING_API_KEY","message":"API key is required.","request_id":"req_8f14e45fceea167a5a36dedd4bea2543"}}}},"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"403":{"description":"INVALID_API_KEY · API_KEY_EXPIRED · INVALID_KEY_CONFIGURATION · INVALID_SCOPES · INSUFFICIENT_SCOPE · HISTORY_LIMIT_EXCEEDED · BATCH_NOT_INCLUDED · TOO_MANY_TICKERS","content":{"application/json":{"examples":{"INVALID_API_KEY":{"summary":"INVALID_API_KEY","value":{"error":{"code":"INVALID_API_KEY","message":"API key is invalid or inactive.","request_id":"req_8f14e45fceea167a5a36dedd4bea2543"}}},"API_KEY_EXPIRED":{"summary":"API_KEY_EXPIRED","value":{"error":{"code":"API_KEY_EXPIRED","message":"This API key was rotated and its grace window has ended.","request_id":"req_8f14e45fceea167a5a36dedd4bea2543"}}},"INVALID_KEY_CONFIGURATION":{"summary":"INVALID_KEY_CONFIGURATION","value":{"error":{"code":"INVALID_KEY_CONFIGURATION","message":"This API key is misconfigured. Contact support.","request_id":"req_8f14e45fceea167a5a36dedd4bea2543"}}},"INVALID_SCOPES":{"summary":"INVALID_SCOPES","value":{"error":{"code":"INVALID_SCOPES","message":"API key has invalid scopes configuration.","request_id":"req_8f14e45fceea167a5a36dedd4bea2543"}}},"INSUFFICIENT_SCOPE":{"summary":"INSUFFICIENT_SCOPE","value":{"error":{"code":"INSUFFICIENT_SCOPE","message":"This API key's plan does not include this data family.","request_id":"req_8f14e45fceea167a5a36dedd4bea2543"}}},"HISTORY_LIMIT_EXCEEDED":{"summary":"HISTORY_LIMIT_EXCEEDED","value":{"error":{"code":"HISTORY_LIMIT_EXCEEDED","message":"The requested range is older than your plan allows.","request_id":"req_8f14e45fceea167a5a36dedd4bea2543"}}},"BATCH_NOT_INCLUDED":{"summary":"BATCH_NOT_INCLUDED","value":{"error":{"code":"BATCH_NOT_INCLUDED","message":"Your plan allows one ticker per call.","request_id":"req_8f14e45fceea167a5a36dedd4bea2543"}}},"TOO_MANY_TICKERS":{"summary":"TOO_MANY_TICKERS","value":{"error":{"code":"TOO_MANY_TICKERS","message":"More tickers were requested than your plan allows per call.","request_id":"req_8f14e45fceea167a5a36dedd4bea2543"}}}},"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"404":{"description":"TICKER_NOT_FOUND","content":{"application/json":{"examples":{"TICKER_NOT_FOUND":{"summary":"TICKER_NOT_FOUND","value":{"error":{"code":"TICKER_NOT_FOUND","message":"That ticker is not in our covered universe.","request_id":"req_8f14e45fceea167a5a36dedd4bea2543"}}}},"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"413":{"description":"RESULT_TOO_LARGE","content":{"application/json":{"examples":{"RESULT_TOO_LARGE":{"summary":"RESULT_TOO_LARGE","value":{"error":{"code":"RESULT_TOO_LARGE","message":"This range returns more rows than one response carries.","request_id":"req_8f14e45fceea167a5a36dedd4bea2543"}}}},"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"422":{"description":"VALIDATION_ERROR · INVALID_TICKERS · INVALID_DATE_RANGE","content":{"application/json":{"examples":{"VALIDATION_ERROR":{"summary":"VALIDATION_ERROR","value":{"error":{"code":"VALIDATION_ERROR","message":"Request validation failed.","request_id":"req_8f14e45fceea167a5a36dedd4bea2543"}}},"INVALID_TICKERS":{"summary":"INVALID_TICKERS","value":{"error":{"code":"INVALID_TICKERS","message":"`tickers` must name at least one ticker.","request_id":"req_8f14e45fceea167a5a36dedd4bea2543"}}},"INVALID_DATE_RANGE":{"summary":"INVALID_DATE_RANGE","value":{"error":{"code":"INVALID_DATE_RANGE","message":"`from` must be on or before `to`.","request_id":"req_8f14e45fceea167a5a36dedd4bea2543"}}}},"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"429":{"description":"RATE_LIMIT_EXCEEDED","content":{"application/json":{"examples":{"RATE_LIMIT_EXCEEDED":{"summary":"RATE_LIMIT_EXCEEDED","value":{"error":{"code":"RATE_LIMIT_EXCEEDED","message":"Request limit exceeded.","request_id":"req_8f14e45fceea167a5a36dedd4bea2543"}}}},"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"500":{"description":"INTERNAL_ERROR","content":{"application/json":{"examples":{"INTERNAL_ERROR":{"summary":"INTERNAL_ERROR","value":{"error":{"code":"INTERNAL_ERROR","message":"An unexpected error occurred. Please try again.","request_id":"req_8f14e45fceea167a5a36dedd4bea2543"}}}},"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"503":{"description":"DATABASE_UNAVAILABLE","content":{"application/json":{"examples":{"DATABASE_UNAVAILABLE":{"summary":"DATABASE_UNAVAILABLE","value":{"error":{"code":"DATABASE_UNAVAILABLE","message":"Database temporarily unavailable. Please retry.","request_id":"req_8f14e45fceea167a5a36dedd4bea2543"}}}},"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}}}}},"/score/latest":{"get":{"tags":["score"],"summary":"Latest score snapshot, batch-capable","description":"Most recent scored day for each ticker. Each row includes the composite, all four pillars and the price forecast.\n\nGive a comma-separated `tickers` list. Your plan sets the limit on tickers in one request. A batch is one request, whatever the ticker count. A ticker that does not resolve, or that has no scored day, returns one row in `errors` and does not fail the request.\n\nThe endpoint looks back 90 days, or the history limit of your plan if that limit is shorter. A company with no scored day inside that range returns one row in `errors`.\n\nA pillar is null on a day when the pillar had no input. AltIndex never returns 0 in its place. A stored 0 in this data means 'not collected'. If AltIndex returned that 0 as a score, a reader would take it for a genuine floor value. The composite has no such ambiguity and is always a real value.","operationId":"score_latest","security":[{"ApiKeyAuth":[]}],"parameters":[{"name":"tickers","in":"query","required":true,"schema":{"type":"string","maxLength":2000,"description":"Comma-separated tickers, for example AAPL,MSFT,NVDA.","title":"Tickers"},"description":"Comma-separated tickers, for example AAPL,MSFT,NVDA."}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SnapshotBatchResponse_ScoreSnapshot_"}}}},"401":{"description":"MISSING_API_KEY","content":{"application/json":{"examples":{"MISSING_API_KEY":{"summary":"MISSING_API_KEY","value":{"error":{"code":"MISSING_API_KEY","message":"API key is required.","request_id":"req_8f14e45fceea167a5a36dedd4bea2543"}}}},"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"403":{"description":"INVALID_API_KEY · API_KEY_EXPIRED · INVALID_KEY_CONFIGURATION · INVALID_SCOPES · INSUFFICIENT_SCOPE · BATCH_NOT_INCLUDED · TOO_MANY_TICKERS","content":{"application/json":{"examples":{"INVALID_API_KEY":{"summary":"INVALID_API_KEY","value":{"error":{"code":"INVALID_API_KEY","message":"API key is invalid or inactive.","request_id":"req_8f14e45fceea167a5a36dedd4bea2543"}}},"API_KEY_EXPIRED":{"summary":"API_KEY_EXPIRED","value":{"error":{"code":"API_KEY_EXPIRED","message":"This API key was rotated and its grace window has ended.","request_id":"req_8f14e45fceea167a5a36dedd4bea2543"}}},"INVALID_KEY_CONFIGURATION":{"summary":"INVALID_KEY_CONFIGURATION","value":{"error":{"code":"INVALID_KEY_CONFIGURATION","message":"This API key is misconfigured. Contact support.","request_id":"req_8f14e45fceea167a5a36dedd4bea2543"}}},"INVALID_SCOPES":{"summary":"INVALID_SCOPES","value":{"error":{"code":"INVALID_SCOPES","message":"API key has invalid scopes configuration.","request_id":"req_8f14e45fceea167a5a36dedd4bea2543"}}},"INSUFFICIENT_SCOPE":{"summary":"INSUFFICIENT_SCOPE","value":{"error":{"code":"INSUFFICIENT_SCOPE","message":"This API key's plan does not include this data family.","request_id":"req_8f14e45fceea167a5a36dedd4bea2543"}}},"BATCH_NOT_INCLUDED":{"summary":"BATCH_NOT_INCLUDED","value":{"error":{"code":"BATCH_NOT_INCLUDED","message":"Your plan allows one ticker per call.","request_id":"req_8f14e45fceea167a5a36dedd4bea2543"}}},"TOO_MANY_TICKERS":{"summary":"TOO_MANY_TICKERS","value":{"error":{"code":"TOO_MANY_TICKERS","message":"More tickers were requested than your plan allows per call.","request_id":"req_8f14e45fceea167a5a36dedd4bea2543"}}}},"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"422":{"description":"VALIDATION_ERROR · INVALID_TICKERS","content":{"application/json":{"examples":{"VALIDATION_ERROR":{"summary":"VALIDATION_ERROR","value":{"error":{"code":"VALIDATION_ERROR","message":"Request validation failed.","request_id":"req_8f14e45fceea167a5a36dedd4bea2543"}}},"INVALID_TICKERS":{"summary":"INVALID_TICKERS","value":{"error":{"code":"INVALID_TICKERS","message":"`tickers` must name at least one ticker.","request_id":"req_8f14e45fceea167a5a36dedd4bea2543"}}}},"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"429":{"description":"RATE_LIMIT_EXCEEDED","content":{"application/json":{"examples":{"RATE_LIMIT_EXCEEDED":{"summary":"RATE_LIMIT_EXCEEDED","value":{"error":{"code":"RATE_LIMIT_EXCEEDED","message":"Request limit exceeded.","request_id":"req_8f14e45fceea167a5a36dedd4bea2543"}}}},"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"500":{"description":"INTERNAL_ERROR","content":{"application/json":{"examples":{"INTERNAL_ERROR":{"summary":"INTERNAL_ERROR","value":{"error":{"code":"INTERNAL_ERROR","message":"An unexpected error occurred. Please try again.","request_id":"req_8f14e45fceea167a5a36dedd4bea2543"}}}},"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"503":{"description":"DATABASE_UNAVAILABLE","content":{"application/json":{"examples":{"DATABASE_UNAVAILABLE":{"summary":"DATABASE_UNAVAILABLE","value":{"error":{"code":"DATABASE_UNAVAILABLE","message":"Database temporarily unavailable. Please retry.","request_id":"req_8f14e45fceea167a5a36dedd4bea2543"}}}},"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}}}}},"/news/volume":{"get":{"tags":["news"],"summary":"News coverage volume, daily","description":"Daily count of news mentions for a ticker across the news sources that AltIndex monitors.\n\nThis is a breadth-of-coverage measure. It is not the number of articles that /news/articles returns for the same day. AltIndex collects the two in different ways, and they do not reconcile.\n\nA day with no value has no row in the series. AltIndex does not report 0 in its place. Rows are oldest first.\n\nGive `ticker` for one series. Give `tickers` for a comma-separated batch. Your plan sets the limit on tickers in one request. A batch is one request, whatever the ticker count.","operationId":"news_volume","security":[{"ApiKeyAuth":[]}],"parameters":[{"name":"ticker","in":"query","required":false,"schema":{"anyOf":[{"type":"string","maxLength":20},{"type":"null"}],"description":"One ticker, for example AAPL.","title":"Ticker"},"description":"One ticker, for example AAPL."},{"name":"tickers","in":"query","required":false,"schema":{"anyOf":[{"type":"string","maxLength":2000},{"type":"null"}],"description":"Comma-separated tickers for a batch.","title":"Tickers"},"description":"Comma-separated tickers for a batch."},{"name":"from","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"description":"ISO-8601 start date.","title":"From"},"description":"ISO-8601 start date."},{"name":"to","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"description":"ISO-8601 end date.","title":"To"},"description":"ISO-8601 end date."}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"anyOf":[{"$ref":"#/components/schemas/SeriesResponse_NewsVolumePoint_"},{"$ref":"#/components/schemas/BatchSeriesResponse_NewsVolumePoint_"}],"title":"Response News Volume"}}}},"401":{"description":"MISSING_API_KEY","content":{"application/json":{"examples":{"MISSING_API_KEY":{"summary":"MISSING_API_KEY","value":{"error":{"code":"MISSING_API_KEY","message":"API key is required.","request_id":"req_8f14e45fceea167a5a36dedd4bea2543"}}}},"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"403":{"description":"INVALID_API_KEY · API_KEY_EXPIRED · INVALID_KEY_CONFIGURATION · INVALID_SCOPES · INSUFFICIENT_SCOPE · BATCH_NOT_INCLUDED · TOO_MANY_TICKERS · HISTORY_LIMIT_EXCEEDED","content":{"application/json":{"examples":{"INVALID_API_KEY":{"summary":"INVALID_API_KEY","value":{"error":{"code":"INVALID_API_KEY","message":"API key is invalid or inactive.","request_id":"req_8f14e45fceea167a5a36dedd4bea2543"}}},"API_KEY_EXPIRED":{"summary":"API_KEY_EXPIRED","value":{"error":{"code":"API_KEY_EXPIRED","message":"This API key was rotated and its grace window has ended.","request_id":"req_8f14e45fceea167a5a36dedd4bea2543"}}},"INVALID_KEY_CONFIGURATION":{"summary":"INVALID_KEY_CONFIGURATION","value":{"error":{"code":"INVALID_KEY_CONFIGURATION","message":"This API key is misconfigured. Contact support.","request_id":"req_8f14e45fceea167a5a36dedd4bea2543"}}},"INVALID_SCOPES":{"summary":"INVALID_SCOPES","value":{"error":{"code":"INVALID_SCOPES","message":"API key has invalid scopes configuration.","request_id":"req_8f14e45fceea167a5a36dedd4bea2543"}}},"INSUFFICIENT_SCOPE":{"summary":"INSUFFICIENT_SCOPE","value":{"error":{"code":"INSUFFICIENT_SCOPE","message":"This API key's plan does not include this data family.","request_id":"req_8f14e45fceea167a5a36dedd4bea2543"}}},"BATCH_NOT_INCLUDED":{"summary":"BATCH_NOT_INCLUDED","value":{"error":{"code":"BATCH_NOT_INCLUDED","message":"Your plan allows one ticker per call.","request_id":"req_8f14e45fceea167a5a36dedd4bea2543"}}},"TOO_MANY_TICKERS":{"summary":"TOO_MANY_TICKERS","value":{"error":{"code":"TOO_MANY_TICKERS","message":"More tickers were requested than your plan allows per call.","request_id":"req_8f14e45fceea167a5a36dedd4bea2543"}}},"HISTORY_LIMIT_EXCEEDED":{"summary":"HISTORY_LIMIT_EXCEEDED","value":{"error":{"code":"HISTORY_LIMIT_EXCEEDED","message":"The requested range is older than your plan allows.","request_id":"req_8f14e45fceea167a5a36dedd4bea2543"}}}},"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"404":{"description":"TICKER_NOT_FOUND","content":{"application/json":{"examples":{"TICKER_NOT_FOUND":{"summary":"TICKER_NOT_FOUND","value":{"error":{"code":"TICKER_NOT_FOUND","message":"That ticker is not in our covered universe.","request_id":"req_8f14e45fceea167a5a36dedd4bea2543"}}}},"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"413":{"description":"RESULT_TOO_LARGE","content":{"application/json":{"examples":{"RESULT_TOO_LARGE":{"summary":"RESULT_TOO_LARGE","value":{"error":{"code":"RESULT_TOO_LARGE","message":"This range returns more rows than one response carries.","request_id":"req_8f14e45fceea167a5a36dedd4bea2543"}}}},"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"422":{"description":"VALIDATION_ERROR · INVALID_TICKERS · INVALID_DATE_RANGE","content":{"application/json":{"examples":{"VALIDATION_ERROR":{"summary":"VALIDATION_ERROR","value":{"error":{"code":"VALIDATION_ERROR","message":"Request validation failed.","request_id":"req_8f14e45fceea167a5a36dedd4bea2543"}}},"INVALID_TICKERS":{"summary":"INVALID_TICKERS","value":{"error":{"code":"INVALID_TICKERS","message":"`tickers` must name at least one ticker.","request_id":"req_8f14e45fceea167a5a36dedd4bea2543"}}},"INVALID_DATE_RANGE":{"summary":"INVALID_DATE_RANGE","value":{"error":{"code":"INVALID_DATE_RANGE","message":"`from` must be on or before `to`.","request_id":"req_8f14e45fceea167a5a36dedd4bea2543"}}}},"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"429":{"description":"RATE_LIMIT_EXCEEDED","content":{"application/json":{"examples":{"RATE_LIMIT_EXCEEDED":{"summary":"RATE_LIMIT_EXCEEDED","value":{"error":{"code":"RATE_LIMIT_EXCEEDED","message":"Request limit exceeded.","request_id":"req_8f14e45fceea167a5a36dedd4bea2543"}}}},"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"500":{"description":"INTERNAL_ERROR","content":{"application/json":{"examples":{"INTERNAL_ERROR":{"summary":"INTERNAL_ERROR","value":{"error":{"code":"INTERNAL_ERROR","message":"An unexpected error occurred. Please try again.","request_id":"req_8f14e45fceea167a5a36dedd4bea2543"}}}},"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"503":{"description":"DATABASE_UNAVAILABLE","content":{"application/json":{"examples":{"DATABASE_UNAVAILABLE":{"summary":"DATABASE_UNAVAILABLE","value":{"error":{"code":"DATABASE_UNAVAILABLE","message":"Database temporarily unavailable. Please retry.","request_id":"req_8f14e45fceea167a5a36dedd4bea2543"}}}},"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}}}}},"/news/articles":{"get":{"tags":["news"],"summary":"News articles, cursor-paginated","description":"News articles that AltIndex collected for a ticker, newest first. Use the `cursor` parameter to get the next page.\n\nEach row includes the headline, the description, the publication name, the link and the image, where the upstream source supplied them. `article_id` is opaque — a stable id for deduping across reruns.\n\nThe upstream tagger is a NewsAPI keyword search over the company display name, so the raw feed is over-inclusive. AltIndex layers two precision filters on top of the ticker join. First, `?include_unfeatured=` defaults to `false`, restricting the response to rows the upstream `featured` title-mention flag fired on. Second, `?min_relevance=` defaults to `0.5`, filtering on a scored per-row relevance (see the `relevance` field on the row). A page that the filters shorten still advances the cursor; keep paging until `next_cursor` is null rather than until a page comes back full.\n\nTreat the earliest row that the endpoint returns as the start of AltIndex coverage for that ticker. It is not the start of the news history of that ticker. Coverage depth is different for each ticker: some tickers have several years of articles, and others start much more recently.\n\n`published` is the timestamp string of the upstream source. AltIndex passes it through as supplied.\n\nIf you omit `from`, the endpoint returns the last 365 days, not all available history. Give an explicit `from` to go further back.","operationId":"news_articles","security":[{"ApiKeyAuth":[]}],"parameters":[{"name":"ticker","in":"query","required":false,"schema":{"anyOf":[{"type":"string","maxLength":20},{"type":"null"}],"description":"Ticker, for example AAPL. Give this parameter unless you give `cursor`.","title":"Ticker"},"description":"Ticker, for example AAPL. Give this parameter unless you give `cursor`."},{"name":"from","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"description":"ISO-8601 start date.","title":"From"},"description":"ISO-8601 start date."},{"name":"to","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"description":"ISO-8601 end date.","title":"To"},"description":"ISO-8601 end date."},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":500,"minimum":1,"description":"Rows per page, 1 to 500. The relevance and featured filters remove rows after the page is read, so a page can hold fewer rows than this. Keep requesting pages until `next_cursor` is null.","default":100,"title":"Limit"},"description":"Rows per page, 1 to 500. The relevance and featured filters remove rows after the page is read, so a page can hold fewer rows than this. Keep requesting pages until `next_cursor` is null."},{"name":"cursor","in":"query","required":false,"schema":{"anyOf":[{"type":"string","maxLength":2000},{"type":"null"}],"description":"Opaque token from the `next_cursor` value of a previous response. Omit it to start at the first page. Request pages until `next_cursor` is null.\n\nThe token includes the query that it belongs to. You do not need to repeat the filters of that query on a later page. You can repeat them if they match the cursor. The endpoint refuses a value that disagrees with the cursor, and does not silently override the cursor. Start a new query to change a filter.","title":"Cursor"},"description":"Opaque token from the `next_cursor` value of a previous response. Omit it to start at the first page. Request pages until `next_cursor` is null.\n\nThe token includes the query that it belongs to. You do not need to repeat the filters of that query on a later page. You can repeat them if they match the cursor. The endpoint refuses a value that disagrees with the cursor, and does not silently override the cursor. Start a new query to change a filter."},{"name":"include_unfeatured","in":"query","required":false,"schema":{"anyOf":[{"type":"boolean"},{"type":"null"}],"description":"Include articles whose upstream `featured` title-mention flag did not fire. Off by default — the raw NewsAPI keyword join is over-inclusive, and off gives a title-mention precision filter. On later pages the cursor carries this filter; you do not need to repeat it.","title":"Include Unfeatured"},"description":"Include articles whose upstream `featured` title-mention flag did not fire. Off by default — the raw NewsAPI keyword join is over-inclusive, and off gives a title-mention precision filter. On later pages the cursor carries this filter; you do not need to repeat it."},{"name":"min_relevance","in":"query","required":false,"schema":{"anyOf":[{"type":"number","maximum":1.0,"minimum":0.0},{"type":"null"}],"description":"Drop rows whose scored relevance is below this cutoff. 1.0 = company name in title on a word boundary. 0.8 = ticker in title. 0.5 = company name in the first 200 chars of the description. 0.3 = the article passed the upstream ticker join but has no textual evidence in the fields AltIndex serves. Default 0.5. On later pages the cursor carries this filter; you do not need to repeat it.","title":"Min Relevance"},"description":"Drop rows whose scored relevance is below this cutoff. 1.0 = company name in title on a word boundary. 0.8 = ticker in title. 0.5 = company name in the first 200 chars of the description. 0.3 = the article passed the upstream ticker join but has no textual evidence in the fields AltIndex serves. Default 0.5. On later pages the cursor carries this filter; you do not need to repeat it."}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/EventPage_NewsArticle_"}}}},"400":{"description":"INVALID_CURSOR","content":{"application/json":{"examples":{"INVALID_CURSOR":{"summary":"INVALID_CURSOR","value":{"error":{"code":"INVALID_CURSOR","message":"The cursor is not valid for this endpoint.","request_id":"req_8f14e45fceea167a5a36dedd4bea2543"}}}},"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"401":{"description":"MISSING_API_KEY","content":{"application/json":{"examples":{"MISSING_API_KEY":{"summary":"MISSING_API_KEY","value":{"error":{"code":"MISSING_API_KEY","message":"API key is required.","request_id":"req_8f14e45fceea167a5a36dedd4bea2543"}}}},"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"403":{"description":"INVALID_API_KEY · API_KEY_EXPIRED · INVALID_KEY_CONFIGURATION · INVALID_SCOPES · INSUFFICIENT_SCOPE · HISTORY_LIMIT_EXCEEDED","content":{"application/json":{"examples":{"INVALID_API_KEY":{"summary":"INVALID_API_KEY","value":{"error":{"code":"INVALID_API_KEY","message":"API key is invalid or inactive.","request_id":"req_8f14e45fceea167a5a36dedd4bea2543"}}},"API_KEY_EXPIRED":{"summary":"API_KEY_EXPIRED","value":{"error":{"code":"API_KEY_EXPIRED","message":"This API key was rotated and its grace window has ended.","request_id":"req_8f14e45fceea167a5a36dedd4bea2543"}}},"INVALID_KEY_CONFIGURATION":{"summary":"INVALID_KEY_CONFIGURATION","value":{"error":{"code":"INVALID_KEY_CONFIGURATION","message":"This API key is misconfigured. Contact support.","request_id":"req_8f14e45fceea167a5a36dedd4bea2543"}}},"INVALID_SCOPES":{"summary":"INVALID_SCOPES","value":{"error":{"code":"INVALID_SCOPES","message":"API key has invalid scopes configuration.","request_id":"req_8f14e45fceea167a5a36dedd4bea2543"}}},"INSUFFICIENT_SCOPE":{"summary":"INSUFFICIENT_SCOPE","value":{"error":{"code":"INSUFFICIENT_SCOPE","message":"This API key's plan does not include this data family.","request_id":"req_8f14e45fceea167a5a36dedd4bea2543"}}},"HISTORY_LIMIT_EXCEEDED":{"summary":"HISTORY_LIMIT_EXCEEDED","value":{"error":{"code":"HISTORY_LIMIT_EXCEEDED","message":"The requested range is older than your plan allows.","request_id":"req_8f14e45fceea167a5a36dedd4bea2543"}}}},"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"404":{"description":"TICKER_NOT_FOUND","content":{"application/json":{"examples":{"TICKER_NOT_FOUND":{"summary":"TICKER_NOT_FOUND","value":{"error":{"code":"TICKER_NOT_FOUND","message":"That ticker is not in our covered universe.","request_id":"req_8f14e45fceea167a5a36dedd4bea2543"}}}},"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"422":{"description":"VALIDATION_ERROR · INVALID_TICKERS · INVALID_DATE_RANGE","content":{"application/json":{"examples":{"VALIDATION_ERROR":{"summary":"VALIDATION_ERROR","value":{"error":{"code":"VALIDATION_ERROR","message":"Request validation failed.","request_id":"req_8f14e45fceea167a5a36dedd4bea2543"}}},"INVALID_TICKERS":{"summary":"INVALID_TICKERS","value":{"error":{"code":"INVALID_TICKERS","message":"`tickers` must name at least one ticker.","request_id":"req_8f14e45fceea167a5a36dedd4bea2543"}}},"INVALID_DATE_RANGE":{"summary":"INVALID_DATE_RANGE","value":{"error":{"code":"INVALID_DATE_RANGE","message":"`from` must be on or before `to`.","request_id":"req_8f14e45fceea167a5a36dedd4bea2543"}}}},"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"429":{"description":"RATE_LIMIT_EXCEEDED","content":{"application/json":{"examples":{"RATE_LIMIT_EXCEEDED":{"summary":"RATE_LIMIT_EXCEEDED","value":{"error":{"code":"RATE_LIMIT_EXCEEDED","message":"Request limit exceeded.","request_id":"req_8f14e45fceea167a5a36dedd4bea2543"}}}},"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"500":{"description":"INTERNAL_ERROR","content":{"application/json":{"examples":{"INTERNAL_ERROR":{"summary":"INTERNAL_ERROR","value":{"error":{"code":"INTERNAL_ERROR","message":"An unexpected error occurred. Please try again.","request_id":"req_8f14e45fceea167a5a36dedd4bea2543"}}}},"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"503":{"description":"DATABASE_UNAVAILABLE","content":{"application/json":{"examples":{"DATABASE_UNAVAILABLE":{"summary":"DATABASE_UNAVAILABLE","value":{"error":{"code":"DATABASE_UNAVAILABLE","message":"Database temporarily unavailable. Please retry.","request_id":"req_8f14e45fceea167a5a36dedd4bea2543"}}}},"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}}}}},"/news/djt":{"get":{"tags":["news"],"summary":"Truth Social posts with market-impact tag, cursor-paginated","description":"Truth Social posts from the sitting US President, newest first. Use the `cursor` parameter to get the next page.\n\nThis series is market-wide and takes no ticker filter, because the source does not link a post to a company. There is no per-ticker view of these posts anywhere on this API.\n\nEach post includes `market_impact`. This is the classification by the AltIndex model of whether the post is likely to move the stock market. A post that the model classifies as market-moving also includes `ai_narrative`, the explanation by the model of the likely effect. A post that the model classifies as not market-moving includes no narrative, by design.\n\nThe same posts also appear as events on /research/events?type=djt_realtime, which is the market-wide series of that endpoint.\n\nIf you omit `from`, the endpoint returns the last 365 days, not all available history. Give an explicit `from` to go further back. That matters more here than on other endpoints. This archive starts well over a year ago, so the default date range currently excludes about a third of it.","operationId":"news_djt","security":[{"ApiKeyAuth":[]}],"parameters":[{"name":"from","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"description":"ISO-8601 start date.","title":"From"},"description":"ISO-8601 start date."},{"name":"to","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"description":"ISO-8601 end date.","title":"To"},"description":"ISO-8601 end date."},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":500,"minimum":1,"description":"Rows per page, 1 to 500.","default":100,"title":"Limit"},"description":"Rows per page, 1 to 500."},{"name":"cursor","in":"query","required":false,"schema":{"anyOf":[{"type":"string","maxLength":2000},{"type":"null"}],"description":"Opaque token from the `next_cursor` value of a previous response. Omit it to start at the first page. Request pages until `next_cursor` is null.\n\nThe token includes the query that it belongs to. You do not need to repeat the filters of that query on a later page. You can repeat them if they match the cursor. The endpoint refuses a value that disagrees with the cursor, and does not silently override the cursor. Start a new query to change a filter.","title":"Cursor"},"description":"Opaque token from the `next_cursor` value of a previous response. Omit it to start at the first page. Request pages until `next_cursor` is null.\n\nThe token includes the query that it belongs to. You do not need to repeat the filters of that query on a later page. You can repeat them if they match the cursor. The endpoint refuses a value that disagrees with the cursor, and does not silently override the cursor. Start a new query to change a filter."}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/EventPage_DjtPost_"}}}},"400":{"description":"INVALID_CURSOR","content":{"application/json":{"examples":{"INVALID_CURSOR":{"summary":"INVALID_CURSOR","value":{"error":{"code":"INVALID_CURSOR","message":"The cursor is not valid for this endpoint.","request_id":"req_8f14e45fceea167a5a36dedd4bea2543"}}}},"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"401":{"description":"MISSING_API_KEY","content":{"application/json":{"examples":{"MISSING_API_KEY":{"summary":"MISSING_API_KEY","value":{"error":{"code":"MISSING_API_KEY","message":"API key is required.","request_id":"req_8f14e45fceea167a5a36dedd4bea2543"}}}},"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"403":{"description":"INVALID_API_KEY · API_KEY_EXPIRED · INVALID_KEY_CONFIGURATION · INVALID_SCOPES · INSUFFICIENT_SCOPE · HISTORY_LIMIT_EXCEEDED","content":{"application/json":{"examples":{"INVALID_API_KEY":{"summary":"INVALID_API_KEY","value":{"error":{"code":"INVALID_API_KEY","message":"API key is invalid or inactive.","request_id":"req_8f14e45fceea167a5a36dedd4bea2543"}}},"API_KEY_EXPIRED":{"summary":"API_KEY_EXPIRED","value":{"error":{"code":"API_KEY_EXPIRED","message":"This API key was rotated and its grace window has ended.","request_id":"req_8f14e45fceea167a5a36dedd4bea2543"}}},"INVALID_KEY_CONFIGURATION":{"summary":"INVALID_KEY_CONFIGURATION","value":{"error":{"code":"INVALID_KEY_CONFIGURATION","message":"This API key is misconfigured. Contact support.","request_id":"req_8f14e45fceea167a5a36dedd4bea2543"}}},"INVALID_SCOPES":{"summary":"INVALID_SCOPES","value":{"error":{"code":"INVALID_SCOPES","message":"API key has invalid scopes configuration.","request_id":"req_8f14e45fceea167a5a36dedd4bea2543"}}},"INSUFFICIENT_SCOPE":{"summary":"INSUFFICIENT_SCOPE","value":{"error":{"code":"INSUFFICIENT_SCOPE","message":"This API key's plan does not include this data family.","request_id":"req_8f14e45fceea167a5a36dedd4bea2543"}}},"HISTORY_LIMIT_EXCEEDED":{"summary":"HISTORY_LIMIT_EXCEEDED","value":{"error":{"code":"HISTORY_LIMIT_EXCEEDED","message":"The requested range is older than your plan allows.","request_id":"req_8f14e45fceea167a5a36dedd4bea2543"}}}},"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"422":{"description":"VALIDATION_ERROR · INVALID_DATE_RANGE","content":{"application/json":{"examples":{"VALIDATION_ERROR":{"summary":"VALIDATION_ERROR","value":{"error":{"code":"VALIDATION_ERROR","message":"Request validation failed.","request_id":"req_8f14e45fceea167a5a36dedd4bea2543"}}},"INVALID_DATE_RANGE":{"summary":"INVALID_DATE_RANGE","value":{"error":{"code":"INVALID_DATE_RANGE","message":"`from` must be on or before `to`.","request_id":"req_8f14e45fceea167a5a36dedd4bea2543"}}}},"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"429":{"description":"RATE_LIMIT_EXCEEDED","content":{"application/json":{"examples":{"RATE_LIMIT_EXCEEDED":{"summary":"RATE_LIMIT_EXCEEDED","value":{"error":{"code":"RATE_LIMIT_EXCEEDED","message":"Request limit exceeded.","request_id":"req_8f14e45fceea167a5a36dedd4bea2543"}}}},"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"500":{"description":"INTERNAL_ERROR","content":{"application/json":{"examples":{"INTERNAL_ERROR":{"summary":"INTERNAL_ERROR","value":{"error":{"code":"INTERNAL_ERROR","message":"An unexpected error occurred. Please try again.","request_id":"req_8f14e45fceea167a5a36dedd4bea2543"}}}},"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"503":{"description":"DATABASE_UNAVAILABLE","content":{"application/json":{"examples":{"DATABASE_UNAVAILABLE":{"summary":"DATABASE_UNAVAILABLE","value":{"error":{"code":"DATABASE_UNAVAILABLE","message":"Database temporarily unavailable. Please retry.","request_id":"req_8f14e45fceea167a5a36dedd4bea2543"}}}},"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}}}}},"/social/mentions":{"get":{"tags":["social"],"summary":"Mention counts, daily","description":"Daily count of the mentions of a ticker on a platform.\n\nThe platforms are reddit, stocktwits, x, wikipedia.\n\nGive `ticker` for one series. Give `tickers` for a comma-separated batch. Your plan sets the limit on tickers in one request. A batch is one request, whatever the ticker count. The response includes `results` and an `errors` list. One ticker that does not resolve does not fail the request.\n\nRows are oldest first. A date where AltIndex collected nothing has no row in the series, and AltIndex does not report 0 in its place. Where a platform reports a genuine 0, AltIndex returns that 0. The two are different facts, and AltIndex does not turn one into the other.\n\nCoverage is different for each platform.\n\nreddit: whole-platform coverage, not one subreddit. 100% of the universe, collected by keyword since 2021. stocktwits: 99% of the universe, keyed by cashtag. x: 83% of the universe, but collection began 2025-09-24 and earlier history was never backfilled, so this series is materially shorter than the others regardless of the range requested. wikipedia: pageviews, and coverage is 21% of the universe, the thinnest series on this endpoint. Absence here is usually absence of collection, not absence of attention.","operationId":"social_mentions","security":[{"ApiKeyAuth":[]}],"parameters":[{"name":"platform","in":"query","required":true,"schema":{"type":"string","description":"The platform to read. The list shows every platform this endpoint serves.","examples":["reddit"],"enum":["reddit","stocktwits","x","wikipedia"],"title":"Platform"},"description":"The platform to read. The list shows every platform this endpoint serves."},{"name":"ticker","in":"query","required":false,"schema":{"anyOf":[{"type":"string","maxLength":20},{"type":"null"}],"description":"One ticker, for example AAPL.","title":"Ticker"},"description":"One ticker, for example AAPL."},{"name":"tickers","in":"query","required":false,"schema":{"anyOf":[{"type":"string","maxLength":2000},{"type":"null"}],"description":"Comma-separated tickers for a batch.","title":"Tickers"},"description":"Comma-separated tickers for a batch."},{"name":"from","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"description":"ISO-8601 start date.","title":"From"},"description":"ISO-8601 start date."},{"name":"to","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"description":"ISO-8601 end date.","title":"To"},"description":"ISO-8601 end date."}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"anyOf":[{"$ref":"#/components/schemas/SeriesResponse_SocialMentionsPoint_"},{"$ref":"#/components/schemas/BatchSeriesResponse_SocialMentionsPoint_"}],"title":"Response Social Mentions"}}}},"400":{"description":"INVALID_PLATFORM","content":{"application/json":{"examples":{"INVALID_PLATFORM":{"summary":"INVALID_PLATFORM","value":{"error":{"code":"INVALID_PLATFORM","message":"This platform is not available on this endpoint.","request_id":"req_8f14e45fceea167a5a36dedd4bea2543"}}}},"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"401":{"description":"MISSING_API_KEY","content":{"application/json":{"examples":{"MISSING_API_KEY":{"summary":"MISSING_API_KEY","value":{"error":{"code":"MISSING_API_KEY","message":"API key is required.","request_id":"req_8f14e45fceea167a5a36dedd4bea2543"}}}},"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"403":{"description":"INVALID_API_KEY · API_KEY_EXPIRED · INVALID_KEY_CONFIGURATION · INVALID_SCOPES · INSUFFICIENT_SCOPE · HISTORY_LIMIT_EXCEEDED · BATCH_NOT_INCLUDED · TOO_MANY_TICKERS","content":{"application/json":{"examples":{"INVALID_API_KEY":{"summary":"INVALID_API_KEY","value":{"error":{"code":"INVALID_API_KEY","message":"API key is invalid or inactive.","request_id":"req_8f14e45fceea167a5a36dedd4bea2543"}}},"API_KEY_EXPIRED":{"summary":"API_KEY_EXPIRED","value":{"error":{"code":"API_KEY_EXPIRED","message":"This API key was rotated and its grace window has ended.","request_id":"req_8f14e45fceea167a5a36dedd4bea2543"}}},"INVALID_KEY_CONFIGURATION":{"summary":"INVALID_KEY_CONFIGURATION","value":{"error":{"code":"INVALID_KEY_CONFIGURATION","message":"This API key is misconfigured. Contact support.","request_id":"req_8f14e45fceea167a5a36dedd4bea2543"}}},"INVALID_SCOPES":{"summary":"INVALID_SCOPES","value":{"error":{"code":"INVALID_SCOPES","message":"API key has invalid scopes configuration.","request_id":"req_8f14e45fceea167a5a36dedd4bea2543"}}},"INSUFFICIENT_SCOPE":{"summary":"INSUFFICIENT_SCOPE","value":{"error":{"code":"INSUFFICIENT_SCOPE","message":"This API key's plan does not include this data family.","request_id":"req_8f14e45fceea167a5a36dedd4bea2543"}}},"HISTORY_LIMIT_EXCEEDED":{"summary":"HISTORY_LIMIT_EXCEEDED","value":{"error":{"code":"HISTORY_LIMIT_EXCEEDED","message":"The requested range is older than your plan allows.","request_id":"req_8f14e45fceea167a5a36dedd4bea2543"}}},"BATCH_NOT_INCLUDED":{"summary":"BATCH_NOT_INCLUDED","value":{"error":{"code":"BATCH_NOT_INCLUDED","message":"Your plan allows one ticker per call.","request_id":"req_8f14e45fceea167a5a36dedd4bea2543"}}},"TOO_MANY_TICKERS":{"summary":"TOO_MANY_TICKERS","value":{"error":{"code":"TOO_MANY_TICKERS","message":"More tickers were requested than your plan allows per call.","request_id":"req_8f14e45fceea167a5a36dedd4bea2543"}}}},"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"404":{"description":"TICKER_NOT_FOUND","content":{"application/json":{"examples":{"TICKER_NOT_FOUND":{"summary":"TICKER_NOT_FOUND","value":{"error":{"code":"TICKER_NOT_FOUND","message":"That ticker is not in our covered universe.","request_id":"req_8f14e45fceea167a5a36dedd4bea2543"}}}},"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"413":{"description":"RESULT_TOO_LARGE","content":{"application/json":{"examples":{"RESULT_TOO_LARGE":{"summary":"RESULT_TOO_LARGE","value":{"error":{"code":"RESULT_TOO_LARGE","message":"This range returns more rows than one response carries.","request_id":"req_8f14e45fceea167a5a36dedd4bea2543"}}}},"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"422":{"description":"VALIDATION_ERROR · INVALID_TICKERS · INVALID_DATE_RANGE","content":{"application/json":{"examples":{"VALIDATION_ERROR":{"summary":"VALIDATION_ERROR","value":{"error":{"code":"VALIDATION_ERROR","message":"Request validation failed.","request_id":"req_8f14e45fceea167a5a36dedd4bea2543"}}},"INVALID_TICKERS":{"summary":"INVALID_TICKERS","value":{"error":{"code":"INVALID_TICKERS","message":"`tickers` must name at least one ticker.","request_id":"req_8f14e45fceea167a5a36dedd4bea2543"}}},"INVALID_DATE_RANGE":{"summary":"INVALID_DATE_RANGE","value":{"error":{"code":"INVALID_DATE_RANGE","message":"`from` must be on or before `to`.","request_id":"req_8f14e45fceea167a5a36dedd4bea2543"}}}},"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"429":{"description":"RATE_LIMIT_EXCEEDED","content":{"application/json":{"examples":{"RATE_LIMIT_EXCEEDED":{"summary":"RATE_LIMIT_EXCEEDED","value":{"error":{"code":"RATE_LIMIT_EXCEEDED","message":"Request limit exceeded.","request_id":"req_8f14e45fceea167a5a36dedd4bea2543"}}}},"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"500":{"description":"INTERNAL_ERROR","content":{"application/json":{"examples":{"INTERNAL_ERROR":{"summary":"INTERNAL_ERROR","value":{"error":{"code":"INTERNAL_ERROR","message":"An unexpected error occurred. Please try again.","request_id":"req_8f14e45fceea167a5a36dedd4bea2543"}}}},"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"503":{"description":"DATABASE_UNAVAILABLE","content":{"application/json":{"examples":{"DATABASE_UNAVAILABLE":{"summary":"DATABASE_UNAVAILABLE","value":{"error":{"code":"DATABASE_UNAVAILABLE","message":"Database temporarily unavailable. Please retry.","request_id":"req_8f14e45fceea167a5a36dedd4bea2543"}}}},"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}}}}},"/social/sentiment":{"get":{"tags":["social"],"summary":"Sentiment values, daily","description":"Daily sentiment value for a ticker on a platform, 0-100, where 50 is neutral. AltIndex normalizes the value when it returns the row, so every platform reports the same scale, whatever the collection method.\n\nThe platforms are reddit, stocktwits, x.\n\nGive `ticker` for one series. Give `tickers` for a comma-separated batch. Your plan sets the limit on tickers in one request. A batch is one request, whatever the ticker count. The response includes `results` and an `errors` list. One ticker that does not resolve does not fail the request.\n\nRows are oldest first. A date where AltIndex collected nothing has no row in the series, and AltIndex does not report 0 in its place. Where a platform reports a genuine 0, AltIndex returns that 0. The two are different facts, and AltIndex does not turn one into the other.\n\nCoverage is different for each platform.\n\nreddit: 16.6% of the universe includes a sentiment row. AltIndex measured this over the last 30 days. stocktwits: 47% of the universe includes a sentiment row. x: 16.8% of the universe includes a sentiment row. AltIndex measured this over the last 30 days. That is the same short collection history as x mentions.","operationId":"social_sentiment","security":[{"ApiKeyAuth":[]}],"parameters":[{"name":"platform","in":"query","required":true,"schema":{"type":"string","description":"The platform to read. The list shows every platform this endpoint serves.","examples":["reddit"],"enum":["reddit","stocktwits","x"],"title":"Platform"},"description":"The platform to read. The list shows every platform this endpoint serves."},{"name":"ticker","in":"query","required":false,"schema":{"anyOf":[{"type":"string","maxLength":20},{"type":"null"}],"description":"One ticker, for example AAPL.","title":"Ticker"},"description":"One ticker, for example AAPL."},{"name":"tickers","in":"query","required":false,"schema":{"anyOf":[{"type":"string","maxLength":2000},{"type":"null"}],"description":"Comma-separated tickers for a batch.","title":"Tickers"},"description":"Comma-separated tickers for a batch."},{"name":"from","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"description":"ISO-8601 start date.","title":"From"},"description":"ISO-8601 start date."},{"name":"to","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"description":"ISO-8601 end date.","title":"To"},"description":"ISO-8601 end date."}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"anyOf":[{"$ref":"#/components/schemas/SeriesResponse_SocialSentimentPoint_"},{"$ref":"#/components/schemas/BatchSeriesResponse_SocialSentimentPoint_"}],"title":"Response Social Sentiment"}}}},"400":{"description":"INVALID_PLATFORM","content":{"application/json":{"examples":{"INVALID_PLATFORM":{"summary":"INVALID_PLATFORM","value":{"error":{"code":"INVALID_PLATFORM","message":"This platform is not available on this endpoint.","request_id":"req_8f14e45fceea167a5a36dedd4bea2543"}}}},"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"401":{"description":"MISSING_API_KEY","content":{"application/json":{"examples":{"MISSING_API_KEY":{"summary":"MISSING_API_KEY","value":{"error":{"code":"MISSING_API_KEY","message":"API key is required.","request_id":"req_8f14e45fceea167a5a36dedd4bea2543"}}}},"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"403":{"description":"INVALID_API_KEY · API_KEY_EXPIRED · INVALID_KEY_CONFIGURATION · INVALID_SCOPES · INSUFFICIENT_SCOPE · HISTORY_LIMIT_EXCEEDED · BATCH_NOT_INCLUDED · TOO_MANY_TICKERS","content":{"application/json":{"examples":{"INVALID_API_KEY":{"summary":"INVALID_API_KEY","value":{"error":{"code":"INVALID_API_KEY","message":"API key is invalid or inactive.","request_id":"req_8f14e45fceea167a5a36dedd4bea2543"}}},"API_KEY_EXPIRED":{"summary":"API_KEY_EXPIRED","value":{"error":{"code":"API_KEY_EXPIRED","message":"This API key was rotated and its grace window has ended.","request_id":"req_8f14e45fceea167a5a36dedd4bea2543"}}},"INVALID_KEY_CONFIGURATION":{"summary":"INVALID_KEY_CONFIGURATION","value":{"error":{"code":"INVALID_KEY_CONFIGURATION","message":"This API key is misconfigured. Contact support.","request_id":"req_8f14e45fceea167a5a36dedd4bea2543"}}},"INVALID_SCOPES":{"summary":"INVALID_SCOPES","value":{"error":{"code":"INVALID_SCOPES","message":"API key has invalid scopes configuration.","request_id":"req_8f14e45fceea167a5a36dedd4bea2543"}}},"INSUFFICIENT_SCOPE":{"summary":"INSUFFICIENT_SCOPE","value":{"error":{"code":"INSUFFICIENT_SCOPE","message":"This API key's plan does not include this data family.","request_id":"req_8f14e45fceea167a5a36dedd4bea2543"}}},"HISTORY_LIMIT_EXCEEDED":{"summary":"HISTORY_LIMIT_EXCEEDED","value":{"error":{"code":"HISTORY_LIMIT_EXCEEDED","message":"The requested range is older than your plan allows.","request_id":"req_8f14e45fceea167a5a36dedd4bea2543"}}},"BATCH_NOT_INCLUDED":{"summary":"BATCH_NOT_INCLUDED","value":{"error":{"code":"BATCH_NOT_INCLUDED","message":"Your plan allows one ticker per call.","request_id":"req_8f14e45fceea167a5a36dedd4bea2543"}}},"TOO_MANY_TICKERS":{"summary":"TOO_MANY_TICKERS","value":{"error":{"code":"TOO_MANY_TICKERS","message":"More tickers were requested than your plan allows per call.","request_id":"req_8f14e45fceea167a5a36dedd4bea2543"}}}},"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"404":{"description":"TICKER_NOT_FOUND","content":{"application/json":{"examples":{"TICKER_NOT_FOUND":{"summary":"TICKER_NOT_FOUND","value":{"error":{"code":"TICKER_NOT_FOUND","message":"That ticker is not in our covered universe.","request_id":"req_8f14e45fceea167a5a36dedd4bea2543"}}}},"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"413":{"description":"RESULT_TOO_LARGE","content":{"application/json":{"examples":{"RESULT_TOO_LARGE":{"summary":"RESULT_TOO_LARGE","value":{"error":{"code":"RESULT_TOO_LARGE","message":"This range returns more rows than one response carries.","request_id":"req_8f14e45fceea167a5a36dedd4bea2543"}}}},"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"422":{"description":"VALIDATION_ERROR · INVALID_TICKERS · INVALID_DATE_RANGE","content":{"application/json":{"examples":{"VALIDATION_ERROR":{"summary":"VALIDATION_ERROR","value":{"error":{"code":"VALIDATION_ERROR","message":"Request validation failed.","request_id":"req_8f14e45fceea167a5a36dedd4bea2543"}}},"INVALID_TICKERS":{"summary":"INVALID_TICKERS","value":{"error":{"code":"INVALID_TICKERS","message":"`tickers` must name at least one ticker.","request_id":"req_8f14e45fceea167a5a36dedd4bea2543"}}},"INVALID_DATE_RANGE":{"summary":"INVALID_DATE_RANGE","value":{"error":{"code":"INVALID_DATE_RANGE","message":"`from` must be on or before `to`.","request_id":"req_8f14e45fceea167a5a36dedd4bea2543"}}}},"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"429":{"description":"RATE_LIMIT_EXCEEDED","content":{"application/json":{"examples":{"RATE_LIMIT_EXCEEDED":{"summary":"RATE_LIMIT_EXCEEDED","value":{"error":{"code":"RATE_LIMIT_EXCEEDED","message":"Request limit exceeded.","request_id":"req_8f14e45fceea167a5a36dedd4bea2543"}}}},"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"500":{"description":"INTERNAL_ERROR","content":{"application/json":{"examples":{"INTERNAL_ERROR":{"summary":"INTERNAL_ERROR","value":{"error":{"code":"INTERNAL_ERROR","message":"An unexpected error occurred. Please try again.","request_id":"req_8f14e45fceea167a5a36dedd4bea2543"}}}},"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"503":{"description":"DATABASE_UNAVAILABLE","content":{"application/json":{"examples":{"DATABASE_UNAVAILABLE":{"summary":"DATABASE_UNAVAILABLE","value":{"error":{"code":"DATABASE_UNAVAILABLE","message":"Database temporarily unavailable. Please retry.","request_id":"req_8f14e45fceea167a5a36dedd4bea2543"}}}},"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}}}}},"/social/audience":{"get":{"tags":["social"],"summary":"Audience size, daily","description":"Audience size for the account of a ticker on a platform. Most platforms report one `followers` count. Facebook reports `fans` and `ptat`. TikTok reports `followers` and `likes`. Each row includes only the fields that the requested platform reports.\n\nThe platforms are reddit, stocktwits, x, linkedin, facebook, instagram, youtube, tiktok, threads, pinterest.\n\nGive `ticker` for one series. Give `tickers` for a comma-separated batch. Your plan sets the limit on tickers in one request. A batch is one request, whatever the ticker count. The response includes `results` and an `errors` list. One ticker that does not resolve does not fail the request.\n\nRows are oldest first. A date where AltIndex collected nothing has no row in the series, and AltIndex does not report 0 in its place. Where a platform reports a genuine 0, AltIndex returns that 0. The two are different facts, and AltIndex does not turn one into the other.\n\nCoverage is different for each platform.\n\nreddit: subscriber counts require a mapped subreddit and only 2% of the universe has one. Mentions and sentiment do not depend on this and are far wider. A thin audience series is not a coverage gap in the other two. stocktwits: 99% of the universe. x: follower counts require a mapped account. 70% of the universe. linkedin: AltIndex collects this monthly, not daily. One row per month, dated the 15th. 81% of the universe. facebook: two fields on each row. `fans` is the page follower count, `ptat` is people-talking-about-this, Facebook's own engagement measure. 61% of the universe. instagram: 50% of the universe. youtube: subscriber count. 47% of the universe. tiktok: two fields on each row. Followers and cumulative likes across the account's posts. 10% of the universe. threads: 5% of the universe. pinterest: 3% of the universe.","operationId":"social_audience","security":[{"ApiKeyAuth":[]}],"parameters":[{"name":"platform","in":"query","required":true,"schema":{"type":"string","description":"The platform to read. The list shows every platform this endpoint serves.","examples":["reddit"],"enum":["reddit","stocktwits","x","linkedin","facebook","instagram","youtube","tiktok","threads","pinterest"],"title":"Platform"},"description":"The platform to read. The list shows every platform this endpoint serves."},{"name":"ticker","in":"query","required":false,"schema":{"anyOf":[{"type":"string","maxLength":20},{"type":"null"}],"description":"One ticker, for example AAPL.","title":"Ticker"},"description":"One ticker, for example AAPL."},{"name":"tickers","in":"query","required":false,"schema":{"anyOf":[{"type":"string","maxLength":2000},{"type":"null"}],"description":"Comma-separated tickers for a batch.","title":"Tickers"},"description":"Comma-separated tickers for a batch."},{"name":"from","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"description":"ISO-8601 start date.","title":"From"},"description":"ISO-8601 start date."},{"name":"to","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"description":"ISO-8601 end date.","title":"To"},"description":"ISO-8601 end date."}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"anyOf":[{"$ref":"#/components/schemas/SeriesResponse_SocialAudiencePoint_"},{"$ref":"#/components/schemas/BatchSeriesResponse_SocialAudiencePoint_"}],"title":"Response Social Audience"}}}},"400":{"description":"INVALID_PLATFORM","content":{"application/json":{"examples":{"INVALID_PLATFORM":{"summary":"INVALID_PLATFORM","value":{"error":{"code":"INVALID_PLATFORM","message":"This platform is not available on this endpoint.","request_id":"req_8f14e45fceea167a5a36dedd4bea2543"}}}},"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"401":{"description":"MISSING_API_KEY","content":{"application/json":{"examples":{"MISSING_API_KEY":{"summary":"MISSING_API_KEY","value":{"error":{"code":"MISSING_API_KEY","message":"API key is required.","request_id":"req_8f14e45fceea167a5a36dedd4bea2543"}}}},"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"403":{"description":"INVALID_API_KEY · API_KEY_EXPIRED · INVALID_KEY_CONFIGURATION · INVALID_SCOPES · INSUFFICIENT_SCOPE · HISTORY_LIMIT_EXCEEDED · BATCH_NOT_INCLUDED · TOO_MANY_TICKERS","content":{"application/json":{"examples":{"INVALID_API_KEY":{"summary":"INVALID_API_KEY","value":{"error":{"code":"INVALID_API_KEY","message":"API key is invalid or inactive.","request_id":"req_8f14e45fceea167a5a36dedd4bea2543"}}},"API_KEY_EXPIRED":{"summary":"API_KEY_EXPIRED","value":{"error":{"code":"API_KEY_EXPIRED","message":"This API key was rotated and its grace window has ended.","request_id":"req_8f14e45fceea167a5a36dedd4bea2543"}}},"INVALID_KEY_CONFIGURATION":{"summary":"INVALID_KEY_CONFIGURATION","value":{"error":{"code":"INVALID_KEY_CONFIGURATION","message":"This API key is misconfigured. Contact support.","request_id":"req_8f14e45fceea167a5a36dedd4bea2543"}}},"INVALID_SCOPES":{"summary":"INVALID_SCOPES","value":{"error":{"code":"INVALID_SCOPES","message":"API key has invalid scopes configuration.","request_id":"req_8f14e45fceea167a5a36dedd4bea2543"}}},"INSUFFICIENT_SCOPE":{"summary":"INSUFFICIENT_SCOPE","value":{"error":{"code":"INSUFFICIENT_SCOPE","message":"This API key's plan does not include this data family.","request_id":"req_8f14e45fceea167a5a36dedd4bea2543"}}},"HISTORY_LIMIT_EXCEEDED":{"summary":"HISTORY_LIMIT_EXCEEDED","value":{"error":{"code":"HISTORY_LIMIT_EXCEEDED","message":"The requested range is older than your plan allows.","request_id":"req_8f14e45fceea167a5a36dedd4bea2543"}}},"BATCH_NOT_INCLUDED":{"summary":"BATCH_NOT_INCLUDED","value":{"error":{"code":"BATCH_NOT_INCLUDED","message":"Your plan allows one ticker per call.","request_id":"req_8f14e45fceea167a5a36dedd4bea2543"}}},"TOO_MANY_TICKERS":{"summary":"TOO_MANY_TICKERS","value":{"error":{"code":"TOO_MANY_TICKERS","message":"More tickers were requested than your plan allows per call.","request_id":"req_8f14e45fceea167a5a36dedd4bea2543"}}}},"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"404":{"description":"TICKER_NOT_FOUND","content":{"application/json":{"examples":{"TICKER_NOT_FOUND":{"summary":"TICKER_NOT_FOUND","value":{"error":{"code":"TICKER_NOT_FOUND","message":"That ticker is not in our covered universe.","request_id":"req_8f14e45fceea167a5a36dedd4bea2543"}}}},"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"413":{"description":"RESULT_TOO_LARGE","content":{"application/json":{"examples":{"RESULT_TOO_LARGE":{"summary":"RESULT_TOO_LARGE","value":{"error":{"code":"RESULT_TOO_LARGE","message":"This range returns more rows than one response carries.","request_id":"req_8f14e45fceea167a5a36dedd4bea2543"}}}},"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"422":{"description":"VALIDATION_ERROR · INVALID_TICKERS · INVALID_DATE_RANGE","content":{"application/json":{"examples":{"VALIDATION_ERROR":{"summary":"VALIDATION_ERROR","value":{"error":{"code":"VALIDATION_ERROR","message":"Request validation failed.","request_id":"req_8f14e45fceea167a5a36dedd4bea2543"}}},"INVALID_TICKERS":{"summary":"INVALID_TICKERS","value":{"error":{"code":"INVALID_TICKERS","message":"`tickers` must name at least one ticker.","request_id":"req_8f14e45fceea167a5a36dedd4bea2543"}}},"INVALID_DATE_RANGE":{"summary":"INVALID_DATE_RANGE","value":{"error":{"code":"INVALID_DATE_RANGE","message":"`from` must be on or before `to`.","request_id":"req_8f14e45fceea167a5a36dedd4bea2543"}}}},"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"429":{"description":"RATE_LIMIT_EXCEEDED","content":{"application/json":{"examples":{"RATE_LIMIT_EXCEEDED":{"summary":"RATE_LIMIT_EXCEEDED","value":{"error":{"code":"RATE_LIMIT_EXCEEDED","message":"Request limit exceeded.","request_id":"req_8f14e45fceea167a5a36dedd4bea2543"}}}},"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"500":{"description":"INTERNAL_ERROR","content":{"application/json":{"examples":{"INTERNAL_ERROR":{"summary":"INTERNAL_ERROR","value":{"error":{"code":"INTERNAL_ERROR","message":"An unexpected error occurred. Please try again.","request_id":"req_8f14e45fceea167a5a36dedd4bea2543"}}}},"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"503":{"description":"DATABASE_UNAVAILABLE","content":{"application/json":{"examples":{"DATABASE_UNAVAILABLE":{"summary":"DATABASE_UNAVAILABLE","value":{"error":{"code":"DATABASE_UNAVAILABLE","message":"Database temporarily unavailable. Please retry.","request_id":"req_8f14e45fceea167a5a36dedd4bea2543"}}}},"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}}}}},"/social/leaderboard":{"get":{"tags":["social"],"summary":"Most-mentioned tickers right now","description":"Most-mentioned tickers on a platform right now, ranked.\n\nThis is a snapshot, not a series. AltIndex rebuilds the source about every half hour and returns only the newest build. The response includes `as_of` for that reason, and two requests minutes apart can legitimately disagree.\n\nEach row includes the count from the previous snapshot, for direction. Each row also includes the AltIndex composite score of the ticker, and a sentiment value where one exists. About half of the wallstreetbets rows have no sentiment value, which is why sentiment is not a ranking option.","operationId":"social_leaderboard","security":[{"ApiKeyAuth":[]}],"parameters":[{"name":"platform","in":"query","required":true,"schema":{"type":"string","description":"The community to rank.","examples":["reddit"],"enum":["reddit","wallstreetbets"],"title":"Platform"},"description":"The community to rank."},{"name":"metric","in":"query","required":false,"schema":{"type":"string","description":"The metric that orders the rows.","examples":["mentions"],"enum":["mentions"],"default":"mentions","title":"Metric"},"description":"The metric that orders the rows."},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"description":"Rows to return, 1 to 100.","default":25,"title":"Limit"},"description":"Rows to return, 1 to 100."}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SocialLeaderboardResponse"}}}},"400":{"description":"INVALID_PLATFORM · INVALID_METRIC","content":{"application/json":{"examples":{"INVALID_PLATFORM":{"summary":"INVALID_PLATFORM","value":{"error":{"code":"INVALID_PLATFORM","message":"This platform is not available on this endpoint.","request_id":"req_8f14e45fceea167a5a36dedd4bea2543"}}},"INVALID_METRIC":{"summary":"INVALID_METRIC","value":{"error":{"code":"INVALID_METRIC","message":"This metric is not available for the requested platform.","request_id":"req_8f14e45fceea167a5a36dedd4bea2543"}}}},"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"401":{"description":"MISSING_API_KEY","content":{"application/json":{"examples":{"MISSING_API_KEY":{"summary":"MISSING_API_KEY","value":{"error":{"code":"MISSING_API_KEY","message":"API key is required.","request_id":"req_8f14e45fceea167a5a36dedd4bea2543"}}}},"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"403":{"description":"INVALID_API_KEY · API_KEY_EXPIRED · INVALID_KEY_CONFIGURATION · INVALID_SCOPES · INSUFFICIENT_SCOPE","content":{"application/json":{"examples":{"INVALID_API_KEY":{"summary":"INVALID_API_KEY","value":{"error":{"code":"INVALID_API_KEY","message":"API key is invalid or inactive.","request_id":"req_8f14e45fceea167a5a36dedd4bea2543"}}},"API_KEY_EXPIRED":{"summary":"API_KEY_EXPIRED","value":{"error":{"code":"API_KEY_EXPIRED","message":"This API key was rotated and its grace window has ended.","request_id":"req_8f14e45fceea167a5a36dedd4bea2543"}}},"INVALID_KEY_CONFIGURATION":{"summary":"INVALID_KEY_CONFIGURATION","value":{"error":{"code":"INVALID_KEY_CONFIGURATION","message":"This API key is misconfigured. Contact support.","request_id":"req_8f14e45fceea167a5a36dedd4bea2543"}}},"INVALID_SCOPES":{"summary":"INVALID_SCOPES","value":{"error":{"code":"INVALID_SCOPES","message":"API key has invalid scopes configuration.","request_id":"req_8f14e45fceea167a5a36dedd4bea2543"}}},"INSUFFICIENT_SCOPE":{"summary":"INSUFFICIENT_SCOPE","value":{"error":{"code":"INSUFFICIENT_SCOPE","message":"This API key's plan does not include this data family.","request_id":"req_8f14e45fceea167a5a36dedd4bea2543"}}}},"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"422":{"description":"VALIDATION_ERROR","content":{"application/json":{"examples":{"VALIDATION_ERROR":{"summary":"VALIDATION_ERROR","value":{"error":{"code":"VALIDATION_ERROR","message":"Request validation failed.","request_id":"req_8f14e45fceea167a5a36dedd4bea2543"}}}},"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"429":{"description":"RATE_LIMIT_EXCEEDED","content":{"application/json":{"examples":{"RATE_LIMIT_EXCEEDED":{"summary":"RATE_LIMIT_EXCEEDED","value":{"error":{"code":"RATE_LIMIT_EXCEEDED","message":"Request limit exceeded.","request_id":"req_8f14e45fceea167a5a36dedd4bea2543"}}}},"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"500":{"description":"INTERNAL_ERROR","content":{"application/json":{"examples":{"INTERNAL_ERROR":{"summary":"INTERNAL_ERROR","value":{"error":{"code":"INTERNAL_ERROR","message":"An unexpected error occurred. Please try again.","request_id":"req_8f14e45fceea167a5a36dedd4bea2543"}}}},"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"503":{"description":"DATABASE_UNAVAILABLE","content":{"application/json":{"examples":{"DATABASE_UNAVAILABLE":{"summary":"DATABASE_UNAVAILABLE","value":{"error":{"code":"DATABASE_UNAVAILABLE","message":"Database temporarily unavailable. Please retry.","request_id":"req_8f14e45fceea167a5a36dedd4bea2543"}}}},"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}}}}},"/employment/jobs":{"get":{"tags":["employment"],"summary":"Open job postings, daily","description":"Daily count of open job postings on LinkedIn for a company.\n\n`linkedin_open_postings` is the single definition of job postings that every AltIndex surface publishes — the site, the app, the MCP tools and this API all report this number. Earlier versions of this endpoint served a LinkedIn/Glassdoor mean beside the raw counts; the blended and Glassdoor fields are gone, because the two boards measure different things and the mean halved the real count on single-source days.\n\nA day without a usable LinkedIn observation is absent from the series. AltIndex does not substitute another source for it and does not serve zero for it. A missing day is a collection gap, not a hiring freeze.\n\nCoverage: LinkedIn, about 91% of the universe over a trailing 30-day window.\n\nGive `ticker` for one series. Give `tickers` for a comma-separated batch. Your plan sets the limit on tickers in one request. A batch is one request, whatever the ticker count.\n\nRows are oldest first. A date with no value has no row in the series. AltIndex does not add a row with a 0 in its place.","operationId":"employment_jobs","security":[{"ApiKeyAuth":[]}],"parameters":[{"name":"ticker","in":"query","required":false,"schema":{"anyOf":[{"type":"string","maxLength":20},{"type":"null"}],"description":"One ticker, for example AAPL.","title":"Ticker"},"description":"One ticker, for example AAPL."},{"name":"tickers","in":"query","required":false,"schema":{"anyOf":[{"type":"string","maxLength":2000},{"type":"null"}],"description":"Comma-separated tickers for a batch.","title":"Tickers"},"description":"Comma-separated tickers for a batch."},{"name":"from","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"description":"ISO-8601 start date.","title":"From"},"description":"ISO-8601 start date."},{"name":"to","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"description":"ISO-8601 end date.","title":"To"},"description":"ISO-8601 end date."}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"anyOf":[{"$ref":"#/components/schemas/SeriesResponse_JobsPoint_"},{"$ref":"#/components/schemas/BatchSeriesResponse_JobsPoint_"}],"title":"Response Employment Jobs"}}}},"401":{"description":"MISSING_API_KEY","content":{"application/json":{"examples":{"MISSING_API_KEY":{"summary":"MISSING_API_KEY","value":{"error":{"code":"MISSING_API_KEY","message":"API key is required.","request_id":"req_8f14e45fceea167a5a36dedd4bea2543"}}}},"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"403":{"description":"INVALID_API_KEY · API_KEY_EXPIRED · INVALID_KEY_CONFIGURATION · INVALID_SCOPES · INSUFFICIENT_SCOPE · HISTORY_LIMIT_EXCEEDED · BATCH_NOT_INCLUDED · TOO_MANY_TICKERS","content":{"application/json":{"examples":{"INVALID_API_KEY":{"summary":"INVALID_API_KEY","value":{"error":{"code":"INVALID_API_KEY","message":"API key is invalid or inactive.","request_id":"req_8f14e45fceea167a5a36dedd4bea2543"}}},"API_KEY_EXPIRED":{"summary":"API_KEY_EXPIRED","value":{"error":{"code":"API_KEY_EXPIRED","message":"This API key was rotated and its grace window has ended.","request_id":"req_8f14e45fceea167a5a36dedd4bea2543"}}},"INVALID_KEY_CONFIGURATION":{"summary":"INVALID_KEY_CONFIGURATION","value":{"error":{"code":"INVALID_KEY_CONFIGURATION","message":"This API key is misconfigured. Contact support.","request_id":"req_8f14e45fceea167a5a36dedd4bea2543"}}},"INVALID_SCOPES":{"summary":"INVALID_SCOPES","value":{"error":{"code":"INVALID_SCOPES","message":"API key has invalid scopes configuration.","request_id":"req_8f14e45fceea167a5a36dedd4bea2543"}}},"INSUFFICIENT_SCOPE":{"summary":"INSUFFICIENT_SCOPE","value":{"error":{"code":"INSUFFICIENT_SCOPE","message":"This API key's plan does not include this data family.","request_id":"req_8f14e45fceea167a5a36dedd4bea2543"}}},"HISTORY_LIMIT_EXCEEDED":{"summary":"HISTORY_LIMIT_EXCEEDED","value":{"error":{"code":"HISTORY_LIMIT_EXCEEDED","message":"The requested range is older than your plan allows.","request_id":"req_8f14e45fceea167a5a36dedd4bea2543"}}},"BATCH_NOT_INCLUDED":{"summary":"BATCH_NOT_INCLUDED","value":{"error":{"code":"BATCH_NOT_INCLUDED","message":"Your plan allows one ticker per call.","request_id":"req_8f14e45fceea167a5a36dedd4bea2543"}}},"TOO_MANY_TICKERS":{"summary":"TOO_MANY_TICKERS","value":{"error":{"code":"TOO_MANY_TICKERS","message":"More tickers were requested than your plan allows per call.","request_id":"req_8f14e45fceea167a5a36dedd4bea2543"}}}},"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"404":{"description":"TICKER_NOT_FOUND","content":{"application/json":{"examples":{"TICKER_NOT_FOUND":{"summary":"TICKER_NOT_FOUND","value":{"error":{"code":"TICKER_NOT_FOUND","message":"That ticker is not in our covered universe.","request_id":"req_8f14e45fceea167a5a36dedd4bea2543"}}}},"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"413":{"description":"RESULT_TOO_LARGE","content":{"application/json":{"examples":{"RESULT_TOO_LARGE":{"summary":"RESULT_TOO_LARGE","value":{"error":{"code":"RESULT_TOO_LARGE","message":"This range returns more rows than one response carries.","request_id":"req_8f14e45fceea167a5a36dedd4bea2543"}}}},"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"422":{"description":"VALIDATION_ERROR · INVALID_TICKERS · INVALID_DATE_RANGE","content":{"application/json":{"examples":{"VALIDATION_ERROR":{"summary":"VALIDATION_ERROR","value":{"error":{"code":"VALIDATION_ERROR","message":"Request validation failed.","request_id":"req_8f14e45fceea167a5a36dedd4bea2543"}}},"INVALID_TICKERS":{"summary":"INVALID_TICKERS","value":{"error":{"code":"INVALID_TICKERS","message":"`tickers` must name at least one ticker.","request_id":"req_8f14e45fceea167a5a36dedd4bea2543"}}},"INVALID_DATE_RANGE":{"summary":"INVALID_DATE_RANGE","value":{"error":{"code":"INVALID_DATE_RANGE","message":"`from` must be on or before `to`.","request_id":"req_8f14e45fceea167a5a36dedd4bea2543"}}}},"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"429":{"description":"RATE_LIMIT_EXCEEDED","content":{"application/json":{"examples":{"RATE_LIMIT_EXCEEDED":{"summary":"RATE_LIMIT_EXCEEDED","value":{"error":{"code":"RATE_LIMIT_EXCEEDED","message":"Request limit exceeded.","request_id":"req_8f14e45fceea167a5a36dedd4bea2543"}}}},"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"500":{"description":"INTERNAL_ERROR","content":{"application/json":{"examples":{"INTERNAL_ERROR":{"summary":"INTERNAL_ERROR","value":{"error":{"code":"INTERNAL_ERROR","message":"An unexpected error occurred. Please try again.","request_id":"req_8f14e45fceea167a5a36dedd4bea2543"}}}},"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"503":{"description":"DATABASE_UNAVAILABLE","content":{"application/json":{"examples":{"DATABASE_UNAVAILABLE":{"summary":"DATABASE_UNAVAILABLE","value":{"error":{"code":"DATABASE_UNAVAILABLE","message":"Database temporarily unavailable. Please retry.","request_id":"req_8f14e45fceea167a5a36dedd4bea2543"}}}},"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}}}}},"/employment/headcount":{"get":{"tags":["employment"],"summary":"LinkedIn headcount, monthly","description":"Employees on LinkedIn for a company.\n\nTreat this series as a directional measure of workforce size, not as a filing value. It is a platform-derived count, not the headcount that the company reports, and it typically reads higher. Apple reports about 164,000 employees while this series reads about 208,000.\n\nCoverage: 90% of the universe. AltIndex collects this series monthly, not daily. Expect one row each month, dated the 15th. A daily-resolution chart of this series looks almost entirely empty. That is the collection cadence, not a coverage gap.\n\nGive `ticker` for one series. Give `tickers` for a comma-separated batch. Your plan sets the limit on tickers in one request. A batch is one request, whatever the ticker count.\n\nRows are oldest first. A date with no value has no row in the series. AltIndex does not add a row with a 0 in its place.","operationId":"employment_headcount","security":[{"ApiKeyAuth":[]}],"parameters":[{"name":"ticker","in":"query","required":false,"schema":{"anyOf":[{"type":"string","maxLength":20},{"type":"null"}],"description":"One ticker, for example AAPL.","title":"Ticker"},"description":"One ticker, for example AAPL."},{"name":"tickers","in":"query","required":false,"schema":{"anyOf":[{"type":"string","maxLength":2000},{"type":"null"}],"description":"Comma-separated tickers for a batch.","title":"Tickers"},"description":"Comma-separated tickers for a batch."},{"name":"from","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"description":"ISO-8601 start date.","title":"From"},"description":"ISO-8601 start date."},{"name":"to","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"description":"ISO-8601 end date.","title":"To"},"description":"ISO-8601 end date."}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"anyOf":[{"$ref":"#/components/schemas/SeriesResponse_HeadcountPoint_"},{"$ref":"#/components/schemas/BatchSeriesResponse_HeadcountPoint_"}],"title":"Response Employment Headcount"}}}},"401":{"description":"MISSING_API_KEY","content":{"application/json":{"examples":{"MISSING_API_KEY":{"summary":"MISSING_API_KEY","value":{"error":{"code":"MISSING_API_KEY","message":"API key is required.","request_id":"req_8f14e45fceea167a5a36dedd4bea2543"}}}},"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"403":{"description":"INVALID_API_KEY · API_KEY_EXPIRED · INVALID_KEY_CONFIGURATION · INVALID_SCOPES · INSUFFICIENT_SCOPE · HISTORY_LIMIT_EXCEEDED · BATCH_NOT_INCLUDED · TOO_MANY_TICKERS","content":{"application/json":{"examples":{"INVALID_API_KEY":{"summary":"INVALID_API_KEY","value":{"error":{"code":"INVALID_API_KEY","message":"API key is invalid or inactive.","request_id":"req_8f14e45fceea167a5a36dedd4bea2543"}}},"API_KEY_EXPIRED":{"summary":"API_KEY_EXPIRED","value":{"error":{"code":"API_KEY_EXPIRED","message":"This API key was rotated and its grace window has ended.","request_id":"req_8f14e45fceea167a5a36dedd4bea2543"}}},"INVALID_KEY_CONFIGURATION":{"summary":"INVALID_KEY_CONFIGURATION","value":{"error":{"code":"INVALID_KEY_CONFIGURATION","message":"This API key is misconfigured. Contact support.","request_id":"req_8f14e45fceea167a5a36dedd4bea2543"}}},"INVALID_SCOPES":{"summary":"INVALID_SCOPES","value":{"error":{"code":"INVALID_SCOPES","message":"API key has invalid scopes configuration.","request_id":"req_8f14e45fceea167a5a36dedd4bea2543"}}},"INSUFFICIENT_SCOPE":{"summary":"INSUFFICIENT_SCOPE","value":{"error":{"code":"INSUFFICIENT_SCOPE","message":"This API key's plan does not include this data family.","request_id":"req_8f14e45fceea167a5a36dedd4bea2543"}}},"HISTORY_LIMIT_EXCEEDED":{"summary":"HISTORY_LIMIT_EXCEEDED","value":{"error":{"code":"HISTORY_LIMIT_EXCEEDED","message":"The requested range is older than your plan allows.","request_id":"req_8f14e45fceea167a5a36dedd4bea2543"}}},"BATCH_NOT_INCLUDED":{"summary":"BATCH_NOT_INCLUDED","value":{"error":{"code":"BATCH_NOT_INCLUDED","message":"Your plan allows one ticker per call.","request_id":"req_8f14e45fceea167a5a36dedd4bea2543"}}},"TOO_MANY_TICKERS":{"summary":"TOO_MANY_TICKERS","value":{"error":{"code":"TOO_MANY_TICKERS","message":"More tickers were requested than your plan allows per call.","request_id":"req_8f14e45fceea167a5a36dedd4bea2543"}}}},"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"404":{"description":"TICKER_NOT_FOUND","content":{"application/json":{"examples":{"TICKER_NOT_FOUND":{"summary":"TICKER_NOT_FOUND","value":{"error":{"code":"TICKER_NOT_FOUND","message":"That ticker is not in our covered universe.","request_id":"req_8f14e45fceea167a5a36dedd4bea2543"}}}},"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"413":{"description":"RESULT_TOO_LARGE","content":{"application/json":{"examples":{"RESULT_TOO_LARGE":{"summary":"RESULT_TOO_LARGE","value":{"error":{"code":"RESULT_TOO_LARGE","message":"This range returns more rows than one response carries.","request_id":"req_8f14e45fceea167a5a36dedd4bea2543"}}}},"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"422":{"description":"VALIDATION_ERROR · INVALID_TICKERS · INVALID_DATE_RANGE","content":{"application/json":{"examples":{"VALIDATION_ERROR":{"summary":"VALIDATION_ERROR","value":{"error":{"code":"VALIDATION_ERROR","message":"Request validation failed.","request_id":"req_8f14e45fceea167a5a36dedd4bea2543"}}},"INVALID_TICKERS":{"summary":"INVALID_TICKERS","value":{"error":{"code":"INVALID_TICKERS","message":"`tickers` must name at least one ticker.","request_id":"req_8f14e45fceea167a5a36dedd4bea2543"}}},"INVALID_DATE_RANGE":{"summary":"INVALID_DATE_RANGE","value":{"error":{"code":"INVALID_DATE_RANGE","message":"`from` must be on or before `to`.","request_id":"req_8f14e45fceea167a5a36dedd4bea2543"}}}},"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"429":{"description":"RATE_LIMIT_EXCEEDED","content":{"application/json":{"examples":{"RATE_LIMIT_EXCEEDED":{"summary":"RATE_LIMIT_EXCEEDED","value":{"error":{"code":"RATE_LIMIT_EXCEEDED","message":"Request limit exceeded.","request_id":"req_8f14e45fceea167a5a36dedd4bea2543"}}}},"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"500":{"description":"INTERNAL_ERROR","content":{"application/json":{"examples":{"INTERNAL_ERROR":{"summary":"INTERNAL_ERROR","value":{"error":{"code":"INTERNAL_ERROR","message":"An unexpected error occurred. Please try again.","request_id":"req_8f14e45fceea167a5a36dedd4bea2543"}}}},"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"503":{"description":"DATABASE_UNAVAILABLE","content":{"application/json":{"examples":{"DATABASE_UNAVAILABLE":{"summary":"DATABASE_UNAVAILABLE","value":{"error":{"code":"DATABASE_UNAVAILABLE","message":"Database temporarily unavailable. Please retry.","request_id":"req_8f14e45fceea167a5a36dedd4bea2543"}}}},"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}}}}},"/employment/ratings":{"get":{"tags":["employment"],"summary":"Glassdoor employer ratings, monthly","description":"Glassdoor employer ratings for a company. Each row includes:\n\n- the overall rating, on a 0-100 scale\n- the share of reviewers with a positive business outlook\n- the share of reviewers who would recommend the employer\n- the count of reviews behind these values\n\nA stored 0 on the three rating fields means that AltIndex did not collect the value, and AltIndex returns null for it. A 0 there would read as a one-star employer. `review_count` is the exception: a 0 there genuinely means no reviews yet.\n\nCoverage: 75% of the universe. AltIndex collects this series monthly, not daily. Expect one row each month, dated the 15th. A daily-resolution chart of this series looks almost entirely empty. That is the collection cadence, not a coverage gap.\n\nGive `ticker` for one series. Give `tickers` for a comma-separated batch. Your plan sets the limit on tickers in one request. A batch is one request, whatever the ticker count.\n\nRows are oldest first. A date with no value has no row in the series. AltIndex does not add a row with a 0 in its place.","operationId":"employment_ratings","security":[{"ApiKeyAuth":[]}],"parameters":[{"name":"ticker","in":"query","required":false,"schema":{"anyOf":[{"type":"string","maxLength":20},{"type":"null"}],"description":"One ticker, for example AAPL.","title":"Ticker"},"description":"One ticker, for example AAPL."},{"name":"tickers","in":"query","required":false,"schema":{"anyOf":[{"type":"string","maxLength":2000},{"type":"null"}],"description":"Comma-separated tickers for a batch.","title":"Tickers"},"description":"Comma-separated tickers for a batch."},{"name":"from","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"description":"ISO-8601 start date.","title":"From"},"description":"ISO-8601 start date."},{"name":"to","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"description":"ISO-8601 end date.","title":"To"},"description":"ISO-8601 end date."}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"anyOf":[{"$ref":"#/components/schemas/SeriesResponse_RatingsPoint_"},{"$ref":"#/components/schemas/BatchSeriesResponse_RatingsPoint_"}],"title":"Response Employment Ratings"}}}},"401":{"description":"MISSING_API_KEY","content":{"application/json":{"examples":{"MISSING_API_KEY":{"summary":"MISSING_API_KEY","value":{"error":{"code":"MISSING_API_KEY","message":"API key is required.","request_id":"req_8f14e45fceea167a5a36dedd4bea2543"}}}},"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"403":{"description":"INVALID_API_KEY · API_KEY_EXPIRED · INVALID_KEY_CONFIGURATION · INVALID_SCOPES · INSUFFICIENT_SCOPE · HISTORY_LIMIT_EXCEEDED · BATCH_NOT_INCLUDED · TOO_MANY_TICKERS","content":{"application/json":{"examples":{"INVALID_API_KEY":{"summary":"INVALID_API_KEY","value":{"error":{"code":"INVALID_API_KEY","message":"API key is invalid or inactive.","request_id":"req_8f14e45fceea167a5a36dedd4bea2543"}}},"API_KEY_EXPIRED":{"summary":"API_KEY_EXPIRED","value":{"error":{"code":"API_KEY_EXPIRED","message":"This API key was rotated and its grace window has ended.","request_id":"req_8f14e45fceea167a5a36dedd4bea2543"}}},"INVALID_KEY_CONFIGURATION":{"summary":"INVALID_KEY_CONFIGURATION","value":{"error":{"code":"INVALID_KEY_CONFIGURATION","message":"This API key is misconfigured. Contact support.","request_id":"req_8f14e45fceea167a5a36dedd4bea2543"}}},"INVALID_SCOPES":{"summary":"INVALID_SCOPES","value":{"error":{"code":"INVALID_SCOPES","message":"API key has invalid scopes configuration.","request_id":"req_8f14e45fceea167a5a36dedd4bea2543"}}},"INSUFFICIENT_SCOPE":{"summary":"INSUFFICIENT_SCOPE","value":{"error":{"code":"INSUFFICIENT_SCOPE","message":"This API key's plan does not include this data family.","request_id":"req_8f14e45fceea167a5a36dedd4bea2543"}}},"HISTORY_LIMIT_EXCEEDED":{"summary":"HISTORY_LIMIT_EXCEEDED","value":{"error":{"code":"HISTORY_LIMIT_EXCEEDED","message":"The requested range is older than your plan allows.","request_id":"req_8f14e45fceea167a5a36dedd4bea2543"}}},"BATCH_NOT_INCLUDED":{"summary":"BATCH_NOT_INCLUDED","value":{"error":{"code":"BATCH_NOT_INCLUDED","message":"Your plan allows one ticker per call.","request_id":"req_8f14e45fceea167a5a36dedd4bea2543"}}},"TOO_MANY_TICKERS":{"summary":"TOO_MANY_TICKERS","value":{"error":{"code":"TOO_MANY_TICKERS","message":"More tickers were requested than your plan allows per call.","request_id":"req_8f14e45fceea167a5a36dedd4bea2543"}}}},"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"404":{"description":"TICKER_NOT_FOUND","content":{"application/json":{"examples":{"TICKER_NOT_FOUND":{"summary":"TICKER_NOT_FOUND","value":{"error":{"code":"TICKER_NOT_FOUND","message":"That ticker is not in our covered universe.","request_id":"req_8f14e45fceea167a5a36dedd4bea2543"}}}},"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"413":{"description":"RESULT_TOO_LARGE","content":{"application/json":{"examples":{"RESULT_TOO_LARGE":{"summary":"RESULT_TOO_LARGE","value":{"error":{"code":"RESULT_TOO_LARGE","message":"This range returns more rows than one response carries.","request_id":"req_8f14e45fceea167a5a36dedd4bea2543"}}}},"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"422":{"description":"VALIDATION_ERROR · INVALID_TICKERS · INVALID_DATE_RANGE","content":{"application/json":{"examples":{"VALIDATION_ERROR":{"summary":"VALIDATION_ERROR","value":{"error":{"code":"VALIDATION_ERROR","message":"Request validation failed.","request_id":"req_8f14e45fceea167a5a36dedd4bea2543"}}},"INVALID_TICKERS":{"summary":"INVALID_TICKERS","value":{"error":{"code":"INVALID_TICKERS","message":"`tickers` must name at least one ticker.","request_id":"req_8f14e45fceea167a5a36dedd4bea2543"}}},"INVALID_DATE_RANGE":{"summary":"INVALID_DATE_RANGE","value":{"error":{"code":"INVALID_DATE_RANGE","message":"`from` must be on or before `to`.","request_id":"req_8f14e45fceea167a5a36dedd4bea2543"}}}},"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"429":{"description":"RATE_LIMIT_EXCEEDED","content":{"application/json":{"examples":{"RATE_LIMIT_EXCEEDED":{"summary":"RATE_LIMIT_EXCEEDED","value":{"error":{"code":"RATE_LIMIT_EXCEEDED","message":"Request limit exceeded.","request_id":"req_8f14e45fceea167a5a36dedd4bea2543"}}}},"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"500":{"description":"INTERNAL_ERROR","content":{"application/json":{"examples":{"INTERNAL_ERROR":{"summary":"INTERNAL_ERROR","value":{"error":{"code":"INTERNAL_ERROR","message":"An unexpected error occurred. Please try again.","request_id":"req_8f14e45fceea167a5a36dedd4bea2543"}}}},"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"503":{"description":"DATABASE_UNAVAILABLE","content":{"application/json":{"examples":{"DATABASE_UNAVAILABLE":{"summary":"DATABASE_UNAVAILABLE","value":{"error":{"code":"DATABASE_UNAVAILABLE","message":"Database temporarily unavailable. Please retry.","request_id":"req_8f14e45fceea167a5a36dedd4bea2543"}}}},"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}}}}},"/employment/postings":{"get":{"tags":["employment"],"summary":"Individual job postings, cursor-paginated","description":"Individual job postings that AltIndex collected for a company, newest first. Use the `cursor` parameter to get the next page.\n\nEach row carries `role_family`, a 5-class derived classification from the title (retail, engineering, corporate, operations, unknown). LinkedIn feeds for retail-heavy tickers (AAPL Genius Bar, AMZN warehouse) can drown the engineering signal in the raw feed. Filter to a subset with `?role_family=` (comma-separated); the default returns every family so a caller can see the distribution before narrowing.\n\n`url` is rebuilt to the canonical `linkedin.com/jobs/view/{id}` form for LinkedIn postings — the raw scraped URL carries session tracking parameters bound to the collector, which are useless to any other viewer.\n\nEach row includes the job id of the source. Use it to deduplicate, because a re-listed role can appear under more than one id.\n\n`posted_on` is the date that the source reported for the posting. It is not the day AltIndex collected the posting. The two differ by months on most rows.\n\nA small share of postings have no date from the source at all. Such a posting cannot fall inside a date range, so the endpoint does not return it. AltIndex does not stamp it with the collection date to make it fit.\n\nAltIndex keeps the last 12 months of postings. The source coverage is LinkedIn only today, and the `source` field states that on every row rather than leave it implied.","operationId":"employment_postings","security":[{"ApiKeyAuth":[]}],"parameters":[{"name":"ticker","in":"query","required":false,"schema":{"anyOf":[{"type":"string","maxLength":20},{"type":"null"}],"description":"Ticker, for example AAPL. Give this parameter unless you give `cursor`.","title":"Ticker"},"description":"Ticker, for example AAPL. Give this parameter unless you give `cursor`."},{"name":"from","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"description":"ISO-8601 start date.","title":"From"},"description":"ISO-8601 start date."},{"name":"to","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"description":"ISO-8601 end date.","title":"To"},"description":"ISO-8601 end date."},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":500,"minimum":1,"description":"Rows per page, 1 to 500. With a `role_family` filter a page can hold fewer rows than this, because the filter removes rows after the page is read. Keep requesting pages until `next_cursor` is null.","default":100,"title":"Limit"},"description":"Rows per page, 1 to 500. With a `role_family` filter a page can hold fewer rows than this, because the filter removes rows after the page is read. Keep requesting pages until `next_cursor` is null."},{"name":"cursor","in":"query","required":false,"schema":{"anyOf":[{"type":"string","maxLength":2000},{"type":"null"}],"description":"Opaque token from the `next_cursor` value of a previous response. Omit it to start at the first page. Request pages until `next_cursor` is null.\n\nThe token includes the query that it belongs to. You do not need to repeat `ticker`, `from`, `to` and `role_family` on a later page. You can repeat them if they match the cursor. The endpoint refuses a value that disagrees with the cursor, and does not silently override the cursor. Start a new query to change the date range or the filter.","title":"Cursor"},"description":"Opaque token from the `next_cursor` value of a previous response. Omit it to start at the first page. Request pages until `next_cursor` is null.\n\nThe token includes the query that it belongs to. You do not need to repeat `ticker`, `from`, `to` and `role_family` on a later page. You can repeat them if they match the cursor. The endpoint refuses a value that disagrees with the cursor, and does not silently override the cursor. Start a new query to change the date range or the filter."},{"name":"role_family","in":"query","required":false,"schema":{"anyOf":[{"type":"string","maxLength":200},{"type":"null"}],"description":"Keep only these role families. Separate values with commas. Allowed values: retail, engineering, corporate, operations, unknown. Omit the parameter to return every family. On later pages the cursor carries this filter; you do not need to repeat it.","examples":["retail,engineering"],"title":"Role Family"},"description":"Keep only these role families. Separate values with commas. Allowed values: retail, engineering, corporate, operations, unknown. Omit the parameter to return every family. On later pages the cursor carries this filter; you do not need to repeat it."}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/EventPage_JobPosting_"}}}},"400":{"description":"INVALID_CURSOR","content":{"application/json":{"examples":{"INVALID_CURSOR":{"summary":"INVALID_CURSOR","value":{"error":{"code":"INVALID_CURSOR","message":"The cursor is not valid for this endpoint.","request_id":"req_8f14e45fceea167a5a36dedd4bea2543"}}}},"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"401":{"description":"MISSING_API_KEY","content":{"application/json":{"examples":{"MISSING_API_KEY":{"summary":"MISSING_API_KEY","value":{"error":{"code":"MISSING_API_KEY","message":"API key is required.","request_id":"req_8f14e45fceea167a5a36dedd4bea2543"}}}},"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"403":{"description":"INVALID_API_KEY · API_KEY_EXPIRED · INVALID_KEY_CONFIGURATION · INVALID_SCOPES · INSUFFICIENT_SCOPE · HISTORY_LIMIT_EXCEEDED","content":{"application/json":{"examples":{"INVALID_API_KEY":{"summary":"INVALID_API_KEY","value":{"error":{"code":"INVALID_API_KEY","message":"API key is invalid or inactive.","request_id":"req_8f14e45fceea167a5a36dedd4bea2543"}}},"API_KEY_EXPIRED":{"summary":"API_KEY_EXPIRED","value":{"error":{"code":"API_KEY_EXPIRED","message":"This API key was rotated and its grace window has ended.","request_id":"req_8f14e45fceea167a5a36dedd4bea2543"}}},"INVALID_KEY_CONFIGURATION":{"summary":"INVALID_KEY_CONFIGURATION","value":{"error":{"code":"INVALID_KEY_CONFIGURATION","message":"This API key is misconfigured. Contact support.","request_id":"req_8f14e45fceea167a5a36dedd4bea2543"}}},"INVALID_SCOPES":{"summary":"INVALID_SCOPES","value":{"error":{"code":"INVALID_SCOPES","message":"API key has invalid scopes configuration.","request_id":"req_8f14e45fceea167a5a36dedd4bea2543"}}},"INSUFFICIENT_SCOPE":{"summary":"INSUFFICIENT_SCOPE","value":{"error":{"code":"INSUFFICIENT_SCOPE","message":"This API key's plan does not include this data family.","request_id":"req_8f14e45fceea167a5a36dedd4bea2543"}}},"HISTORY_LIMIT_EXCEEDED":{"summary":"HISTORY_LIMIT_EXCEEDED","value":{"error":{"code":"HISTORY_LIMIT_EXCEEDED","message":"The requested range is older than your plan allows.","request_id":"req_8f14e45fceea167a5a36dedd4bea2543"}}}},"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"404":{"description":"TICKER_NOT_FOUND","content":{"application/json":{"examples":{"TICKER_NOT_FOUND":{"summary":"TICKER_NOT_FOUND","value":{"error":{"code":"TICKER_NOT_FOUND","message":"That ticker is not in our covered universe.","request_id":"req_8f14e45fceea167a5a36dedd4bea2543"}}}},"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"422":{"description":"VALIDATION_ERROR · INVALID_TICKERS · INVALID_DATE_RANGE","content":{"application/json":{"examples":{"VALIDATION_ERROR":{"summary":"VALIDATION_ERROR","value":{"error":{"code":"VALIDATION_ERROR","message":"Request validation failed.","request_id":"req_8f14e45fceea167a5a36dedd4bea2543"}}},"INVALID_TICKERS":{"summary":"INVALID_TICKERS","value":{"error":{"code":"INVALID_TICKERS","message":"`tickers` must name at least one ticker.","request_id":"req_8f14e45fceea167a5a36dedd4bea2543"}}},"INVALID_DATE_RANGE":{"summary":"INVALID_DATE_RANGE","value":{"error":{"code":"INVALID_DATE_RANGE","message":"`from` must be on or before `to`.","request_id":"req_8f14e45fceea167a5a36dedd4bea2543"}}}},"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"429":{"description":"RATE_LIMIT_EXCEEDED","content":{"application/json":{"examples":{"RATE_LIMIT_EXCEEDED":{"summary":"RATE_LIMIT_EXCEEDED","value":{"error":{"code":"RATE_LIMIT_EXCEEDED","message":"Request limit exceeded.","request_id":"req_8f14e45fceea167a5a36dedd4bea2543"}}}},"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"500":{"description":"INTERNAL_ERROR","content":{"application/json":{"examples":{"INTERNAL_ERROR":{"summary":"INTERNAL_ERROR","value":{"error":{"code":"INTERNAL_ERROR","message":"An unexpected error occurred. Please try again.","request_id":"req_8f14e45fceea167a5a36dedd4bea2543"}}}},"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"503":{"description":"DATABASE_UNAVAILABLE","content":{"application/json":{"examples":{"DATABASE_UNAVAILABLE":{"summary":"DATABASE_UNAVAILABLE","value":{"error":{"code":"DATABASE_UNAVAILABLE","message":"Database temporarily unavailable. Please retry.","request_id":"req_8f14e45fceea167a5a36dedd4bea2543"}}}},"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}}}}},"/ownership/insider":{"get":{"tags":["ownership"],"summary":"Insider purchases and sales, cursor-paginated","description":"Open-market purchases and sales by company insiders, from SEC insider transaction filings, newest filing first. Use the `cursor` parameter to get the next page.\n\nGive `ticker` for one company's filings. Omit it for the market-wide feed of recent filings across every company AltIndex covers. A company with no filing in the window returns an empty page. About half of the companies AltIndex covers have no insider filing in a given quarter; that absence is real, not a collection gap.\n\nEach row is one transaction line. `transaction_code` is `P` for an open-market purchase or `S` for an open-market sale, and these are the only two codes the feed carries: grants, option exercises, gifts and tax withholdings are not included. `shares_transacted` is an unsigned count; the code gives the direction. `shares_held_after` is the reporting owner's holding after the transaction. `accession_number` identifies the filing on the SEC site.\n\nRows are ordered by `filing_date`, the day the filing was published, and `from` and `to` filter on it. `transaction_date` can be earlier.\n\nHistory starts in June 2020.\n\nIf you omit `from`, the endpoint returns the last 365 days of filings, not all available history. Give an explicit `from` to go further back.","operationId":"ownership_insider","security":[{"ApiKeyAuth":[]}],"parameters":[{"name":"ticker","in":"query","required":false,"schema":{"anyOf":[{"type":"string","maxLength":20},{"type":"null"}],"description":"Ticker, for example AAPL. Omit this parameter for the market-wide feed.","title":"Ticker"},"description":"Ticker, for example AAPL. Omit this parameter for the market-wide feed."},{"name":"from","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"description":"ISO-8601 start date.","title":"From"},"description":"ISO-8601 start date."},{"name":"to","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"description":"ISO-8601 end date.","title":"To"},"description":"ISO-8601 end date."},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":500,"minimum":1,"description":"Rows per page, 1 to 500.","default":100,"title":"Limit"},"description":"Rows per page, 1 to 500."},{"name":"cursor","in":"query","required":false,"schema":{"anyOf":[{"type":"string","maxLength":2000},{"type":"null"}],"description":"Opaque token from the `next_cursor` value of a previous response. Omit it to start at the first page. Request pages until `next_cursor` is null.\n\nThe token includes the whole query: the date range and every filter. You do not need to repeat them on a later page. You can repeat them if they match the cursor. The endpoint refuses a value that disagrees with the cursor, and does not silently override the cursor. Start a new query to change a filter.","title":"Cursor"},"description":"Opaque token from the `next_cursor` value of a previous response. Omit it to start at the first page. Request pages until `next_cursor` is null.\n\nThe token includes the whole query: the date range and every filter. You do not need to repeat them on a later page. You can repeat them if they match the cursor. The endpoint refuses a value that disagrees with the cursor, and does not silently override the cursor. Start a new query to change a filter."}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/EventPage_InsiderTransaction_"}}}},"400":{"description":"INVALID_CURSOR","content":{"application/json":{"examples":{"INVALID_CURSOR":{"summary":"INVALID_CURSOR","value":{"error":{"code":"INVALID_CURSOR","message":"The cursor is not valid for this endpoint.","request_id":"req_8f14e45fceea167a5a36dedd4bea2543"}}}},"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"401":{"description":"MISSING_API_KEY","content":{"application/json":{"examples":{"MISSING_API_KEY":{"summary":"MISSING_API_KEY","value":{"error":{"code":"MISSING_API_KEY","message":"API key is required.","request_id":"req_8f14e45fceea167a5a36dedd4bea2543"}}}},"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"403":{"description":"INVALID_API_KEY · API_KEY_EXPIRED · INVALID_KEY_CONFIGURATION · INVALID_SCOPES · INSUFFICIENT_SCOPE · HISTORY_LIMIT_EXCEEDED","content":{"application/json":{"examples":{"INVALID_API_KEY":{"summary":"INVALID_API_KEY","value":{"error":{"code":"INVALID_API_KEY","message":"API key is invalid or inactive.","request_id":"req_8f14e45fceea167a5a36dedd4bea2543"}}},"API_KEY_EXPIRED":{"summary":"API_KEY_EXPIRED","value":{"error":{"code":"API_KEY_EXPIRED","message":"This API key was rotated and its grace window has ended.","request_id":"req_8f14e45fceea167a5a36dedd4bea2543"}}},"INVALID_KEY_CONFIGURATION":{"summary":"INVALID_KEY_CONFIGURATION","value":{"error":{"code":"INVALID_KEY_CONFIGURATION","message":"This API key is misconfigured. Contact support.","request_id":"req_8f14e45fceea167a5a36dedd4bea2543"}}},"INVALID_SCOPES":{"summary":"INVALID_SCOPES","value":{"error":{"code":"INVALID_SCOPES","message":"API key has invalid scopes configuration.","request_id":"req_8f14e45fceea167a5a36dedd4bea2543"}}},"INSUFFICIENT_SCOPE":{"summary":"INSUFFICIENT_SCOPE","value":{"error":{"code":"INSUFFICIENT_SCOPE","message":"This API key's plan does not include this data family.","request_id":"req_8f14e45fceea167a5a36dedd4bea2543"}}},"HISTORY_LIMIT_EXCEEDED":{"summary":"HISTORY_LIMIT_EXCEEDED","value":{"error":{"code":"HISTORY_LIMIT_EXCEEDED","message":"The requested range is older than your plan allows.","request_id":"req_8f14e45fceea167a5a36dedd4bea2543"}}}},"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"404":{"description":"TICKER_NOT_FOUND","content":{"application/json":{"examples":{"TICKER_NOT_FOUND":{"summary":"TICKER_NOT_FOUND","value":{"error":{"code":"TICKER_NOT_FOUND","message":"That ticker is not in our covered universe.","request_id":"req_8f14e45fceea167a5a36dedd4bea2543"}}}},"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"422":{"description":"VALIDATION_ERROR · INVALID_DATE_RANGE","content":{"application/json":{"examples":{"VALIDATION_ERROR":{"summary":"VALIDATION_ERROR","value":{"error":{"code":"VALIDATION_ERROR","message":"Request validation failed.","request_id":"req_8f14e45fceea167a5a36dedd4bea2543"}}},"INVALID_DATE_RANGE":{"summary":"INVALID_DATE_RANGE","value":{"error":{"code":"INVALID_DATE_RANGE","message":"`from` must be on or before `to`.","request_id":"req_8f14e45fceea167a5a36dedd4bea2543"}}}},"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"429":{"description":"RATE_LIMIT_EXCEEDED","content":{"application/json":{"examples":{"RATE_LIMIT_EXCEEDED":{"summary":"RATE_LIMIT_EXCEEDED","value":{"error":{"code":"RATE_LIMIT_EXCEEDED","message":"Request limit exceeded.","request_id":"req_8f14e45fceea167a5a36dedd4bea2543"}}}},"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"500":{"description":"INTERNAL_ERROR","content":{"application/json":{"examples":{"INTERNAL_ERROR":{"summary":"INTERNAL_ERROR","value":{"error":{"code":"INTERNAL_ERROR","message":"An unexpected error occurred. Please try again.","request_id":"req_8f14e45fceea167a5a36dedd4bea2543"}}}},"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"503":{"description":"DATABASE_UNAVAILABLE","content":{"application/json":{"examples":{"DATABASE_UNAVAILABLE":{"summary":"DATABASE_UNAVAILABLE","value":{"error":{"code":"DATABASE_UNAVAILABLE","message":"Database temporarily unavailable. Please retry.","request_id":"req_8f14e45fceea167a5a36dedd4bea2543"}}}},"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}}}}},"/ownership/congress":{"get":{"tags":["ownership"],"summary":"Congressional stock trades, cursor-paginated","description":"Stock trades reported by members of the US Congress under the STOCK Act, newest filing first. Use the `cursor` parameter to get the next page.\n\nGive `ticker` for one company's trades. Omit it for the market-wide feed of recent reports. Give `politician` for one member's trades, using the `politician` value from any row. Give `side` to keep only buys or only sells. A company with no reported trade in the window returns an empty page. About one company in six has a reported trade in a given quarter; that absence is real, not a collection gap.\n\nEach row is one transaction line from one report. STOCK Act reports disclose a dollar bracket, not an exact amount. `amount_low` and `amount_high` are that bracket, and `amount_estimate_usd` is the bracket midpoint, or the exact amount on the few reports that state one. `filing_url` links to the report on the House or Senate disclosure site.\n\n`party`, `state` and `chamber` are present on reports filed before mid-2024 and null on later reports. There is no `party` filter for that reason.\n\nRows are ordered by `filing_date`, the day the report was published, and `from` and `to` filter on it. `transaction_date` is usually earlier, and is passed through as filed.\n\nHistory starts in September 2021.\n\nIf you omit `from`, the endpoint returns the last 365 days of filings, not all available history. Give an explicit `from` to go further back.","operationId":"ownership_congress","security":[{"ApiKeyAuth":[]}],"parameters":[{"name":"ticker","in":"query","required":false,"schema":{"anyOf":[{"type":"string","maxLength":20},{"type":"null"}],"description":"Ticker, for example AAPL. Omit this parameter for the market-wide feed.","title":"Ticker"},"description":"Ticker, for example AAPL. Omit this parameter for the market-wide feed."},{"name":"politician","in":"query","required":false,"schema":{"anyOf":[{"type":"string","maxLength":120},{"type":"null"}],"description":"Full name of one member, as the `politician` field of any row gives it. Case does not matter.","title":"Politician"},"description":"Full name of one member, as the `politician` field of any row gives it. Case does not matter."},{"name":"side","in":"query","required":false,"schema":{"anyOf":[{"enum":["buy","sell"],"type":"string"},{"type":"null"}],"description":"Keep only `buy` or only `sell` rows.","title":"Side"},"description":"Keep only `buy` or only `sell` rows."},{"name":"from","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"description":"ISO-8601 start date.","title":"From"},"description":"ISO-8601 start date."},{"name":"to","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"description":"ISO-8601 end date.","title":"To"},"description":"ISO-8601 end date."},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":500,"minimum":1,"description":"Rows per page, 1 to 500.","default":100,"title":"Limit"},"description":"Rows per page, 1 to 500."},{"name":"cursor","in":"query","required":false,"schema":{"anyOf":[{"type":"string","maxLength":2000},{"type":"null"}],"description":"Opaque token from the `next_cursor` value of a previous response. Omit it to start at the first page. Request pages until `next_cursor` is null.\n\nThe token includes the whole query: the date range and every filter. You do not need to repeat them on a later page. You can repeat them if they match the cursor. The endpoint refuses a value that disagrees with the cursor, and does not silently override the cursor. Start a new query to change a filter.","title":"Cursor"},"description":"Opaque token from the `next_cursor` value of a previous response. Omit it to start at the first page. Request pages until `next_cursor` is null.\n\nThe token includes the whole query: the date range and every filter. You do not need to repeat them on a later page. You can repeat them if they match the cursor. The endpoint refuses a value that disagrees with the cursor, and does not silently override the cursor. Start a new query to change a filter."}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/EventPage_CongressTrade_"}}}},"400":{"description":"INVALID_CURSOR","content":{"application/json":{"examples":{"INVALID_CURSOR":{"summary":"INVALID_CURSOR","value":{"error":{"code":"INVALID_CURSOR","message":"The cursor is not valid for this endpoint.","request_id":"req_8f14e45fceea167a5a36dedd4bea2543"}}}},"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"401":{"description":"MISSING_API_KEY","content":{"application/json":{"examples":{"MISSING_API_KEY":{"summary":"MISSING_API_KEY","value":{"error":{"code":"MISSING_API_KEY","message":"API key is required.","request_id":"req_8f14e45fceea167a5a36dedd4bea2543"}}}},"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"403":{"description":"INVALID_API_KEY · API_KEY_EXPIRED · INVALID_KEY_CONFIGURATION · INVALID_SCOPES · INSUFFICIENT_SCOPE · HISTORY_LIMIT_EXCEEDED","content":{"application/json":{"examples":{"INVALID_API_KEY":{"summary":"INVALID_API_KEY","value":{"error":{"code":"INVALID_API_KEY","message":"API key is invalid or inactive.","request_id":"req_8f14e45fceea167a5a36dedd4bea2543"}}},"API_KEY_EXPIRED":{"summary":"API_KEY_EXPIRED","value":{"error":{"code":"API_KEY_EXPIRED","message":"This API key was rotated and its grace window has ended.","request_id":"req_8f14e45fceea167a5a36dedd4bea2543"}}},"INVALID_KEY_CONFIGURATION":{"summary":"INVALID_KEY_CONFIGURATION","value":{"error":{"code":"INVALID_KEY_CONFIGURATION","message":"This API key is misconfigured. Contact support.","request_id":"req_8f14e45fceea167a5a36dedd4bea2543"}}},"INVALID_SCOPES":{"summary":"INVALID_SCOPES","value":{"error":{"code":"INVALID_SCOPES","message":"API key has invalid scopes configuration.","request_id":"req_8f14e45fceea167a5a36dedd4bea2543"}}},"INSUFFICIENT_SCOPE":{"summary":"INSUFFICIENT_SCOPE","value":{"error":{"code":"INSUFFICIENT_SCOPE","message":"This API key's plan does not include this data family.","request_id":"req_8f14e45fceea167a5a36dedd4bea2543"}}},"HISTORY_LIMIT_EXCEEDED":{"summary":"HISTORY_LIMIT_EXCEEDED","value":{"error":{"code":"HISTORY_LIMIT_EXCEEDED","message":"The requested range is older than your plan allows.","request_id":"req_8f14e45fceea167a5a36dedd4bea2543"}}}},"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"404":{"description":"TICKER_NOT_FOUND","content":{"application/json":{"examples":{"TICKER_NOT_FOUND":{"summary":"TICKER_NOT_FOUND","value":{"error":{"code":"TICKER_NOT_FOUND","message":"That ticker is not in our covered universe.","request_id":"req_8f14e45fceea167a5a36dedd4bea2543"}}}},"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"422":{"description":"VALIDATION_ERROR · INVALID_DATE_RANGE","content":{"application/json":{"examples":{"VALIDATION_ERROR":{"summary":"VALIDATION_ERROR","value":{"error":{"code":"VALIDATION_ERROR","message":"Request validation failed.","request_id":"req_8f14e45fceea167a5a36dedd4bea2543"}}},"INVALID_DATE_RANGE":{"summary":"INVALID_DATE_RANGE","value":{"error":{"code":"INVALID_DATE_RANGE","message":"`from` must be on or before `to`.","request_id":"req_8f14e45fceea167a5a36dedd4bea2543"}}}},"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"429":{"description":"RATE_LIMIT_EXCEEDED","content":{"application/json":{"examples":{"RATE_LIMIT_EXCEEDED":{"summary":"RATE_LIMIT_EXCEEDED","value":{"error":{"code":"RATE_LIMIT_EXCEEDED","message":"Request limit exceeded.","request_id":"req_8f14e45fceea167a5a36dedd4bea2543"}}}},"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"500":{"description":"INTERNAL_ERROR","content":{"application/json":{"examples":{"INTERNAL_ERROR":{"summary":"INTERNAL_ERROR","value":{"error":{"code":"INTERNAL_ERROR","message":"An unexpected error occurred. Please try again.","request_id":"req_8f14e45fceea167a5a36dedd4bea2543"}}}},"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"503":{"description":"DATABASE_UNAVAILABLE","content":{"application/json":{"examples":{"DATABASE_UNAVAILABLE":{"summary":"DATABASE_UNAVAILABLE","value":{"error":{"code":"DATABASE_UNAVAILABLE","message":"Database temporarily unavailable. Please retry.","request_id":"req_8f14e45fceea167a5a36dedd4bea2543"}}}},"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}}}}},"/research/analysis":{"get":{"tags":["research"],"summary":"Company analysis from the AltIndex model","description":"Analysis of a company from the AltIndex model, as plain text. The model writes the analysis from the alternative-data signals in this API, so the article reads as an explanation of what the other endpoints show.\n\nArticles arrive in a monthly batch, not at a daily rate. AltIndex writes most of the articles across a few days near the start of each month. On the other days AltIndex writes fewer than 100 articles in total. A request for one day therefore returns rows for few companies.\n\nMonthly coverage of the active universe is high. In July 2026 and in August 2026 AltIndex wrote an article for more than 75% of the 2,967 active companies. Plan for about one article for each company each month. A company that AltIndex covers, with no article in your date range, returns an empty `data` list.\n\nAltIndex stores an article as HTML and converts it to text on the way out. Rows are oldest first. Give `ticker` for one company. Give `tickers` for a batch.","operationId":"research_analysis","security":[{"ApiKeyAuth":[]}],"parameters":[{"name":"ticker","in":"query","required":false,"schema":{"anyOf":[{"type":"string","maxLength":20},{"type":"null"}],"description":"One ticker, for example AAPL.","title":"Ticker"},"description":"One ticker, for example AAPL."},{"name":"tickers","in":"query","required":false,"schema":{"anyOf":[{"type":"string","maxLength":2000},{"type":"null"}],"description":"Comma-separated tickers for a batch.","title":"Tickers"},"description":"Comma-separated tickers for a batch."},{"name":"from","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"description":"ISO-8601 start date.","title":"From"},"description":"ISO-8601 start date."},{"name":"to","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"description":"ISO-8601 end date.","title":"To"},"description":"ISO-8601 end date."}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"anyOf":[{"$ref":"#/components/schemas/SeriesResponse_AnalysisArticle_"},{"$ref":"#/components/schemas/BatchSeriesResponse_AnalysisArticle_"}],"title":"Response Research Analysis"}}}},"401":{"description":"MISSING_API_KEY","content":{"application/json":{"examples":{"MISSING_API_KEY":{"summary":"MISSING_API_KEY","value":{"error":{"code":"MISSING_API_KEY","message":"API key is required.","request_id":"req_8f14e45fceea167a5a36dedd4bea2543"}}}},"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"403":{"description":"INVALID_API_KEY · API_KEY_EXPIRED · INVALID_KEY_CONFIGURATION · INVALID_SCOPES · INSUFFICIENT_SCOPE · HISTORY_LIMIT_EXCEEDED · BATCH_NOT_INCLUDED · TOO_MANY_TICKERS","content":{"application/json":{"examples":{"INVALID_API_KEY":{"summary":"INVALID_API_KEY","value":{"error":{"code":"INVALID_API_KEY","message":"API key is invalid or inactive.","request_id":"req_8f14e45fceea167a5a36dedd4bea2543"}}},"API_KEY_EXPIRED":{"summary":"API_KEY_EXPIRED","value":{"error":{"code":"API_KEY_EXPIRED","message":"This API key was rotated and its grace window has ended.","request_id":"req_8f14e45fceea167a5a36dedd4bea2543"}}},"INVALID_KEY_CONFIGURATION":{"summary":"INVALID_KEY_CONFIGURATION","value":{"error":{"code":"INVALID_KEY_CONFIGURATION","message":"This API key is misconfigured. Contact support.","request_id":"req_8f14e45fceea167a5a36dedd4bea2543"}}},"INVALID_SCOPES":{"summary":"INVALID_SCOPES","value":{"error":{"code":"INVALID_SCOPES","message":"API key has invalid scopes configuration.","request_id":"req_8f14e45fceea167a5a36dedd4bea2543"}}},"INSUFFICIENT_SCOPE":{"summary":"INSUFFICIENT_SCOPE","value":{"error":{"code":"INSUFFICIENT_SCOPE","message":"This API key's plan does not include this data family.","request_id":"req_8f14e45fceea167a5a36dedd4bea2543"}}},"HISTORY_LIMIT_EXCEEDED":{"summary":"HISTORY_LIMIT_EXCEEDED","value":{"error":{"code":"HISTORY_LIMIT_EXCEEDED","message":"The requested range is older than your plan allows.","request_id":"req_8f14e45fceea167a5a36dedd4bea2543"}}},"BATCH_NOT_INCLUDED":{"summary":"BATCH_NOT_INCLUDED","value":{"error":{"code":"BATCH_NOT_INCLUDED","message":"Your plan allows one ticker per call.","request_id":"req_8f14e45fceea167a5a36dedd4bea2543"}}},"TOO_MANY_TICKERS":{"summary":"TOO_MANY_TICKERS","value":{"error":{"code":"TOO_MANY_TICKERS","message":"More tickers were requested than your plan allows per call.","request_id":"req_8f14e45fceea167a5a36dedd4bea2543"}}}},"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"404":{"description":"TICKER_NOT_FOUND","content":{"application/json":{"examples":{"TICKER_NOT_FOUND":{"summary":"TICKER_NOT_FOUND","value":{"error":{"code":"TICKER_NOT_FOUND","message":"That ticker is not in our covered universe.","request_id":"req_8f14e45fceea167a5a36dedd4bea2543"}}}},"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"413":{"description":"RESULT_TOO_LARGE","content":{"application/json":{"examples":{"RESULT_TOO_LARGE":{"summary":"RESULT_TOO_LARGE","value":{"error":{"code":"RESULT_TOO_LARGE","message":"This range returns more rows than one response carries.","request_id":"req_8f14e45fceea167a5a36dedd4bea2543"}}}},"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"422":{"description":"VALIDATION_ERROR · INVALID_TICKERS · INVALID_DATE_RANGE","content":{"application/json":{"examples":{"VALIDATION_ERROR":{"summary":"VALIDATION_ERROR","value":{"error":{"code":"VALIDATION_ERROR","message":"Request validation failed.","request_id":"req_8f14e45fceea167a5a36dedd4bea2543"}}},"INVALID_TICKERS":{"summary":"INVALID_TICKERS","value":{"error":{"code":"INVALID_TICKERS","message":"`tickers` must name at least one ticker.","request_id":"req_8f14e45fceea167a5a36dedd4bea2543"}}},"INVALID_DATE_RANGE":{"summary":"INVALID_DATE_RANGE","value":{"error":{"code":"INVALID_DATE_RANGE","message":"`from` must be on or before `to`.","request_id":"req_8f14e45fceea167a5a36dedd4bea2543"}}}},"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"429":{"description":"RATE_LIMIT_EXCEEDED","content":{"application/json":{"examples":{"RATE_LIMIT_EXCEEDED":{"summary":"RATE_LIMIT_EXCEEDED","value":{"error":{"code":"RATE_LIMIT_EXCEEDED","message":"Request limit exceeded.","request_id":"req_8f14e45fceea167a5a36dedd4bea2543"}}}},"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"500":{"description":"INTERNAL_ERROR","content":{"application/json":{"examples":{"INTERNAL_ERROR":{"summary":"INTERNAL_ERROR","value":{"error":{"code":"INTERNAL_ERROR","message":"An unexpected error occurred. Please try again.","request_id":"req_8f14e45fceea167a5a36dedd4bea2543"}}}},"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"503":{"description":"DATABASE_UNAVAILABLE","content":{"application/json":{"examples":{"DATABASE_UNAVAILABLE":{"summary":"DATABASE_UNAVAILABLE","value":{"error":{"code":"DATABASE_UNAVAILABLE","message":"Database temporarily unavailable. Please retry.","request_id":"req_8f14e45fceea167a5a36dedd4bea2543"}}}},"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}}}}},"/research/events":{"get":{"tags":["research"],"summary":"Detected events and threshold crossings, cursor-paginated","description":"Events that AltIndex detected. An event is a signal that crosses a threshold, or a narrative event. A narrative event is, for example, an acquisition, a legal filing, layoffs, or an insider or congressional transaction. Rows are newest first. Use the `cursor` parameter to get the next page.\n\nThe fields that a row includes depend on `type`. A threshold crossing includes `value`, `change`, `change_percent`, `direction` and `days_over`. A narrative event includes `title`, `article` and `url`. One type (`reddit_realtime`) includes both. Branch on `type`. Do not assume a shape.\n\nThe types are ai_score, reddit_mentions, reddit_realtime, sentiment, djt_realtime, instagram_followers, facebook_ptat, youtube_subscribers, tiktok_followers, twitter_followers, job_posts, event, acquisition, expansion_downsize, layoffs, leadership_changes, legal_issue.\n\nOmit `ticker` for the market-wide series. Some types are market-wide by nature and appear only there. A `djt_realtime` post is not attributable to a company, so it has no ticker, and a per-ticker query never returns it.\n\nAltIndex dates an event to the day, not to the second. `occurred_on` is the day that the event describes. `detected_at` has a timestamp only on the types that AltIndex collects in near-real-time. Rows from the same day are in identifier order, which is stable across pages but is not clock order. Every row includes a stable `id`. Use it to deduplicate.","operationId":"research_events","security":[{"ApiKeyAuth":[]}],"parameters":[{"name":"ticker","in":"query","required":false,"schema":{"anyOf":[{"type":"string","maxLength":20},{"type":"null"}],"description":"Ticker. Omit this parameter for the market-wide series.","title":"Ticker"},"description":"Ticker. Omit this parameter for the market-wide series."},{"name":"type","in":"query","required":false,"schema":{"anyOf":[{"type":"string","enum":["ai_score","reddit_mentions","reddit_realtime","sentiment","djt_realtime","instagram_followers","facebook_ptat","youtube_subscribers","tiktok_followers","twitter_followers","job_posts","event","acquisition","expansion_downsize","layoffs","leadership_changes","legal_issue"]},{"type":"null"}],"description":"Return only this event type. Omit the parameter to return every type.","examples":["ai_score"],"title":"Type"},"description":"Return only this event type. Omit the parameter to return every type."},{"name":"from","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"description":"ISO-8601 start date.","title":"From"},"description":"ISO-8601 start date."},{"name":"to","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"description":"ISO-8601 end date.","title":"To"},"description":"ISO-8601 end date."},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":500,"minimum":1,"description":"Rows per page, 1 to 500.","default":100,"title":"Limit"},"description":"Rows per page, 1 to 500."},{"name":"cursor","in":"query","required":false,"schema":{"anyOf":[{"type":"string","maxLength":2000},{"type":"null"}],"description":"Opaque token from the `next_cursor` value of a previous response. Omit it to start at the first page. Request pages until `next_cursor` is null.\n\nThe token includes the whole query, which is the date range, `ticker` and `type`. You do not need to repeat any of them on a later page. You can repeat them if they match the cursor. The endpoint refuses a value that disagrees with the cursor, and does not silently override the cursor. Start a new query to change the filters.","title":"Cursor"},"description":"Opaque token from the `next_cursor` value of a previous response. Omit it to start at the first page. Request pages until `next_cursor` is null.\n\nThe token includes the whole query, which is the date range, `ticker` and `type`. You do not need to repeat any of them on a later page. You can repeat them if they match the cursor. The endpoint refuses a value that disagrees with the cursor, and does not silently override the cursor. Start a new query to change the filters."}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/EventPage_ResearchEvent_"},"examples":{"threshold_crossing":{"summary":"threshold crossing","value":{"data":[{"id":"evt_6b8f01d4c9e2","ticker":"AAPL","type":"ai_score","occurred_on":"2026-08-26","detected_at":"2026-08-26T14:02:11Z","value":78,"change":6.0,"change_percent":8.33,"direction":"More","days_over":3}]}},"narrative_event":{"summary":"narrative event","value":{"data":[{"id":"evt_1f4a9c27d0b3","ticker":"AAPL","type":"layoffs","occurred_on":"2026-08-21","title":"layoffs","article":"AltIndex detected a layoff announcement. The company confirmed a reduction in its retail workforce.","url":"https://example.com/news/apple-retail-layoffs"}]}},"reddit_realtime_hybrid":{"summary":"reddit realtime hybrid","value":{"data":[{"id":"evt_9c0d3e51ab72","ticker":"AAPL","type":"reddit_realtime","occurred_on":"2026-08-26","detected_at":"2026-08-26T15:40:03Z","value":412,"change":265.0,"change_percent":180.27,"direction":"More","days_over":1,"title":"Reddit mentions of AAPL rose sharply in the last hour."}]}}}}}},"400":{"description":"INVALID_ALERT_TYPE · INVALID_CURSOR","content":{"application/json":{"examples":{"INVALID_ALERT_TYPE":{"summary":"INVALID_ALERT_TYPE","value":{"error":{"code":"INVALID_ALERT_TYPE","message":"This event type is not available on this endpoint.","request_id":"req_8f14e45fceea167a5a36dedd4bea2543"}}},"INVALID_CURSOR":{"summary":"INVALID_CURSOR","value":{"error":{"code":"INVALID_CURSOR","message":"The cursor is not valid for this endpoint.","request_id":"req_8f14e45fceea167a5a36dedd4bea2543"}}}},"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"401":{"description":"MISSING_API_KEY","content":{"application/json":{"examples":{"MISSING_API_KEY":{"summary":"MISSING_API_KEY","value":{"error":{"code":"MISSING_API_KEY","message":"API key is required.","request_id":"req_8f14e45fceea167a5a36dedd4bea2543"}}}},"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"403":{"description":"INVALID_API_KEY · API_KEY_EXPIRED · INVALID_KEY_CONFIGURATION · INVALID_SCOPES · INSUFFICIENT_SCOPE · HISTORY_LIMIT_EXCEEDED","content":{"application/json":{"examples":{"INVALID_API_KEY":{"summary":"INVALID_API_KEY","value":{"error":{"code":"INVALID_API_KEY","message":"API key is invalid or inactive.","request_id":"req_8f14e45fceea167a5a36dedd4bea2543"}}},"API_KEY_EXPIRED":{"summary":"API_KEY_EXPIRED","value":{"error":{"code":"API_KEY_EXPIRED","message":"This API key was rotated and its grace window has ended.","request_id":"req_8f14e45fceea167a5a36dedd4bea2543"}}},"INVALID_KEY_CONFIGURATION":{"summary":"INVALID_KEY_CONFIGURATION","value":{"error":{"code":"INVALID_KEY_CONFIGURATION","message":"This API key is misconfigured. Contact support.","request_id":"req_8f14e45fceea167a5a36dedd4bea2543"}}},"INVALID_SCOPES":{"summary":"INVALID_SCOPES","value":{"error":{"code":"INVALID_SCOPES","message":"API key has invalid scopes configuration.","request_id":"req_8f14e45fceea167a5a36dedd4bea2543"}}},"INSUFFICIENT_SCOPE":{"summary":"INSUFFICIENT_SCOPE","value":{"error":{"code":"INSUFFICIENT_SCOPE","message":"This API key's plan does not include this data family.","request_id":"req_8f14e45fceea167a5a36dedd4bea2543"}}},"HISTORY_LIMIT_EXCEEDED":{"summary":"HISTORY_LIMIT_EXCEEDED","value":{"error":{"code":"HISTORY_LIMIT_EXCEEDED","message":"The requested range is older than your plan allows.","request_id":"req_8f14e45fceea167a5a36dedd4bea2543"}}}},"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"404":{"description":"TICKER_NOT_FOUND","content":{"application/json":{"examples":{"TICKER_NOT_FOUND":{"summary":"TICKER_NOT_FOUND","value":{"error":{"code":"TICKER_NOT_FOUND","message":"That ticker is not in our covered universe.","request_id":"req_8f14e45fceea167a5a36dedd4bea2543"}}}},"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"422":{"description":"VALIDATION_ERROR · INVALID_DATE_RANGE","content":{"application/json":{"examples":{"VALIDATION_ERROR":{"summary":"VALIDATION_ERROR","value":{"error":{"code":"VALIDATION_ERROR","message":"Request validation failed.","request_id":"req_8f14e45fceea167a5a36dedd4bea2543"}}},"INVALID_DATE_RANGE":{"summary":"INVALID_DATE_RANGE","value":{"error":{"code":"INVALID_DATE_RANGE","message":"`from` must be on or before `to`.","request_id":"req_8f14e45fceea167a5a36dedd4bea2543"}}}},"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"429":{"description":"RATE_LIMIT_EXCEEDED","content":{"application/json":{"examples":{"RATE_LIMIT_EXCEEDED":{"summary":"RATE_LIMIT_EXCEEDED","value":{"error":{"code":"RATE_LIMIT_EXCEEDED","message":"Request limit exceeded.","request_id":"req_8f14e45fceea167a5a36dedd4bea2543"}}}},"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"500":{"description":"INTERNAL_ERROR","content":{"application/json":{"examples":{"INTERNAL_ERROR":{"summary":"INTERNAL_ERROR","value":{"error":{"code":"INTERNAL_ERROR","message":"An unexpected error occurred. Please try again.","request_id":"req_8f14e45fceea167a5a36dedd4bea2543"}}}},"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"503":{"description":"DATABASE_UNAVAILABLE","content":{"application/json":{"examples":{"DATABASE_UNAVAILABLE":{"summary":"DATABASE_UNAVAILABLE","value":{"error":{"code":"DATABASE_UNAVAILABLE","message":"Database temporarily unavailable. Please retry.","request_id":"req_8f14e45fceea167a5a36dedd4bea2543"}}}},"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}}}}},"/research/latest":{"get":{"tags":["research"],"summary":"Most recent events per ticker, batch-capable","description":"The most recent events for each of several tickers, in one request. Give a comma-separated `tickers` list. Your plan sets the limit on tickers in one request. A batch is one request, whatever the ticker count.\n\nA ticker that does not resolve returns one row in `errors` and does not fail the request. A ticker that AltIndex covers with no recent events returns an empty `events` list. The endpoint looks back 180 days, or the history limit of your plan if that limit is shorter. The row shape varies by `type`, exactly as on /research/events.","operationId":"research_latest","security":[{"ApiKeyAuth":[]}],"parameters":[{"name":"tickers","in":"query","required":true,"schema":{"type":"string","maxLength":2000,"description":"Comma-separated tickers, for example AAPL,MSFT,NVDA.","title":"Tickers"},"description":"Comma-separated tickers, for example AAPL,MSFT,NVDA."},{"name":"type","in":"query","required":false,"schema":{"anyOf":[{"type":"string","enum":["ai_score","reddit_mentions","reddit_realtime","sentiment","djt_realtime","instagram_followers","facebook_ptat","youtube_subscribers","tiktok_followers","twitter_followers","job_posts","event","acquisition","expansion_downsize","layoffs","leadership_changes","legal_issue"]},{"type":"null"}],"description":"Return only this event type. Omit the parameter to return every type.","examples":["ai_score"],"title":"Type"},"description":"Return only this event type. Omit the parameter to return every type."},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":50,"minimum":1,"description":"Events per ticker, 1 to 50.","default":5,"title":"Limit"},"description":"Events per ticker, 1 to 50."}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SnapshotBatchResponse_ResearchEventGroup_"}}}},"400":{"description":"INVALID_ALERT_TYPE","content":{"application/json":{"examples":{"INVALID_ALERT_TYPE":{"summary":"INVALID_ALERT_TYPE","value":{"error":{"code":"INVALID_ALERT_TYPE","message":"This event type is not available on this endpoint.","request_id":"req_8f14e45fceea167a5a36dedd4bea2543"}}}},"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"401":{"description":"MISSING_API_KEY","content":{"application/json":{"examples":{"MISSING_API_KEY":{"summary":"MISSING_API_KEY","value":{"error":{"code":"MISSING_API_KEY","message":"API key is required.","request_id":"req_8f14e45fceea167a5a36dedd4bea2543"}}}},"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"403":{"description":"INVALID_API_KEY · API_KEY_EXPIRED · INVALID_KEY_CONFIGURATION · INVALID_SCOPES · INSUFFICIENT_SCOPE · BATCH_NOT_INCLUDED · TOO_MANY_TICKERS","content":{"application/json":{"examples":{"INVALID_API_KEY":{"summary":"INVALID_API_KEY","value":{"error":{"code":"INVALID_API_KEY","message":"API key is invalid or inactive.","request_id":"req_8f14e45fceea167a5a36dedd4bea2543"}}},"API_KEY_EXPIRED":{"summary":"API_KEY_EXPIRED","value":{"error":{"code":"API_KEY_EXPIRED","message":"This API key was rotated and its grace window has ended.","request_id":"req_8f14e45fceea167a5a36dedd4bea2543"}}},"INVALID_KEY_CONFIGURATION":{"summary":"INVALID_KEY_CONFIGURATION","value":{"error":{"code":"INVALID_KEY_CONFIGURATION","message":"This API key is misconfigured. Contact support.","request_id":"req_8f14e45fceea167a5a36dedd4bea2543"}}},"INVALID_SCOPES":{"summary":"INVALID_SCOPES","value":{"error":{"code":"INVALID_SCOPES","message":"API key has invalid scopes configuration.","request_id":"req_8f14e45fceea167a5a36dedd4bea2543"}}},"INSUFFICIENT_SCOPE":{"summary":"INSUFFICIENT_SCOPE","value":{"error":{"code":"INSUFFICIENT_SCOPE","message":"This API key's plan does not include this data family.","request_id":"req_8f14e45fceea167a5a36dedd4bea2543"}}},"BATCH_NOT_INCLUDED":{"summary":"BATCH_NOT_INCLUDED","value":{"error":{"code":"BATCH_NOT_INCLUDED","message":"Your plan allows one ticker per call.","request_id":"req_8f14e45fceea167a5a36dedd4bea2543"}}},"TOO_MANY_TICKERS":{"summary":"TOO_MANY_TICKERS","value":{"error":{"code":"TOO_MANY_TICKERS","message":"More tickers were requested than your plan allows per call.","request_id":"req_8f14e45fceea167a5a36dedd4bea2543"}}}},"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"422":{"description":"VALIDATION_ERROR · INVALID_TICKERS","content":{"application/json":{"examples":{"VALIDATION_ERROR":{"summary":"VALIDATION_ERROR","value":{"error":{"code":"VALIDATION_ERROR","message":"Request validation failed.","request_id":"req_8f14e45fceea167a5a36dedd4bea2543"}}},"INVALID_TICKERS":{"summary":"INVALID_TICKERS","value":{"error":{"code":"INVALID_TICKERS","message":"`tickers` must name at least one ticker.","request_id":"req_8f14e45fceea167a5a36dedd4bea2543"}}}},"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"429":{"description":"RATE_LIMIT_EXCEEDED","content":{"application/json":{"examples":{"RATE_LIMIT_EXCEEDED":{"summary":"RATE_LIMIT_EXCEEDED","value":{"error":{"code":"RATE_LIMIT_EXCEEDED","message":"Request limit exceeded.","request_id":"req_8f14e45fceea167a5a36dedd4bea2543"}}}},"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"500":{"description":"INTERNAL_ERROR","content":{"application/json":{"examples":{"INTERNAL_ERROR":{"summary":"INTERNAL_ERROR","value":{"error":{"code":"INTERNAL_ERROR","message":"An unexpected error occurred. Please try again.","request_id":"req_8f14e45fceea167a5a36dedd4bea2543"}}}},"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}},"503":{"description":"DATABASE_UNAVAILABLE","content":{"application/json":{"examples":{"DATABASE_UNAVAILABLE":{"summary":"DATABASE_UNAVAILABLE","value":{"error":{"code":"DATABASE_UNAVAILABLE","message":"Database temporarily unavailable. Please retry.","request_id":"req_8f14e45fceea167a5a36dedd4bea2543"}}}},"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}}}}},"/health":{"get":{"tags":["health"],"summary":"Health Check","operationId":"health","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}}},"components":{"schemas":{"AnalysisArticle":{"properties":{"date":{"type":"string","format":"date","title":"Date"},"article":{"type":"string","title":"Article","description":"The analysis, as plain text. AltIndex stores it as HTML and converts it on the way out, so headings and paragraphs survive as line breaks."}},"type":"object","required":["date","article"],"title":"AnalysisArticle","description":"One analysis article from the AltIndex model, for one ticker.","example":{"article":"1. Company Overview\n\nApple (AAPL) is one of the world's dominant consumer technology companies...","date":"2026-08-12"}},"BatchError":{"properties":{"ticker":{"type":"string","title":"Ticker"},"code":{"type":"string","title":"Code"},"message":{"type":"string","title":"Message"}},"type":"object","required":["ticker","code","message"],"title":"BatchError","description":"One row in the `errors` list of a batch.\n\nAltIndex returns one such row for each bad ticker in a batch request.\nThe good tickers still return in `results`. `code` is the same code\nthat a single-ticker request returns, for example `TICKER_NOT_FOUND`.\nA caller can therefore treat a batch error in the same way as a\nsingle-ticker failure."},"BatchSeriesResponse_AnalysisArticle_":{"properties":{"from":{"type":"string","format":"date","title":"From"},"to":{"type":"string","format":"date","title":"To"},"results":{"items":{"$ref":"#/components/schemas/BatchSeriesRow_AnalysisArticle_"},"type":"array","title":"Results"},"errors":{"items":{"$ref":"#/components/schemas/BatchError"},"type":"array","title":"Errors"}},"type":"object","required":["from","to","results","errors"],"title":"BatchSeriesResponse[AnalysisArticle]"},"BatchSeriesResponse_HeadcountPoint_":{"properties":{"from":{"type":"string","format":"date","title":"From"},"to":{"type":"string","format":"date","title":"To"},"results":{"items":{"$ref":"#/components/schemas/BatchSeriesRow_HeadcountPoint_"},"type":"array","title":"Results"},"errors":{"items":{"$ref":"#/components/schemas/BatchError"},"type":"array","title":"Errors"}},"type":"object","required":["from","to","results","errors"],"title":"BatchSeriesResponse[HeadcountPoint]"},"BatchSeriesResponse_JobsPoint_":{"properties":{"from":{"type":"string","format":"date","title":"From"},"to":{"type":"string","format":"date","title":"To"},"results":{"items":{"$ref":"#/components/schemas/BatchSeriesRow_JobsPoint_"},"type":"array","title":"Results"},"errors":{"items":{"$ref":"#/components/schemas/BatchError"},"type":"array","title":"Errors"}},"type":"object","required":["from","to","results","errors"],"title":"BatchSeriesResponse[JobsPoint]"},"BatchSeriesResponse_NewsVolumePoint_":{"properties":{"from":{"type":"string","format":"date","title":"From"},"to":{"type":"string","format":"date","title":"To"},"results":{"items":{"$ref":"#/components/schemas/BatchSeriesRow_NewsVolumePoint_"},"type":"array","title":"Results"},"errors":{"items":{"$ref":"#/components/schemas/BatchError"},"type":"array","title":"Errors"}},"type":"object","required":["from","to","results","errors"],"title":"BatchSeriesResponse[NewsVolumePoint]"},"BatchSeriesResponse_RatingsPoint_":{"properties":{"from":{"type":"string","format":"date","title":"From"},"to":{"type":"string","format":"date","title":"To"},"results":{"items":{"$ref":"#/components/schemas/BatchSeriesRow_RatingsPoint_"},"type":"array","title":"Results"},"errors":{"items":{"$ref":"#/components/schemas/BatchError"},"type":"array","title":"Errors"}},"type":"object","required":["from","to","results","errors"],"title":"BatchSeriesResponse[RatingsPoint]"},"BatchSeriesResponse_ScoreCompositePoint_":{"properties":{"from":{"type":"string","format":"date","title":"From"},"to":{"type":"string","format":"date","title":"To"},"results":{"items":{"$ref":"#/components/schemas/BatchSeriesRow_ScoreCompositePoint_"},"type":"array","title":"Results"},"errors":{"items":{"$ref":"#/components/schemas/BatchError"},"type":"array","title":"Errors"}},"type":"object","required":["from","to","results","errors"],"title":"BatchSeriesResponse[ScoreCompositePoint]"},"BatchSeriesResponse_ScoreForecastPoint_":{"properties":{"from":{"type":"string","format":"date","title":"From"},"to":{"type":"string","format":"date","title":"To"},"results":{"items":{"$ref":"#/components/schemas/BatchSeriesRow_ScoreForecastPoint_"},"type":"array","title":"Results"},"errors":{"items":{"$ref":"#/components/schemas/BatchError"},"type":"array","title":"Errors"}},"type":"object","required":["from","to","results","errors"],"title":"BatchSeriesResponse[ScoreForecastPoint]"},"BatchSeriesResponse_SocialAudiencePoint_":{"properties":{"from":{"type":"string","format":"date","title":"From"},"to":{"type":"string","format":"date","title":"To"},"results":{"items":{"$ref":"#/components/schemas/BatchSeriesRow_SocialAudiencePoint_"},"type":"array","title":"Results"},"errors":{"items":{"$ref":"#/components/schemas/BatchError"},"type":"array","title":"Errors"}},"type":"object","required":["from","to","results","errors"],"title":"BatchSeriesResponse[SocialAudiencePoint]"},"BatchSeriesResponse_SocialMentionsPoint_":{"properties":{"from":{"type":"string","format":"date","title":"From"},"to":{"type":"string","format":"date","title":"To"},"results":{"items":{"$ref":"#/components/schemas/BatchSeriesRow_SocialMentionsPoint_"},"type":"array","title":"Results"},"errors":{"items":{"$ref":"#/components/schemas/BatchError"},"type":"array","title":"Errors"}},"type":"object","required":["from","to","results","errors"],"title":"BatchSeriesResponse[SocialMentionsPoint]"},"BatchSeriesResponse_SocialSentimentPoint_":{"properties":{"from":{"type":"string","format":"date","title":"From"},"to":{"type":"string","format":"date","title":"To"},"results":{"items":{"$ref":"#/components/schemas/BatchSeriesRow_SocialSentimentPoint_"},"type":"array","title":"Results"},"errors":{"items":{"$ref":"#/components/schemas/BatchError"},"type":"array","title":"Errors"}},"type":"object","required":["from","to","results","errors"],"title":"BatchSeriesResponse[SocialSentimentPoint]"},"BatchSeriesRow_AnalysisArticle_":{"properties":{"ticker":{"type":"string","title":"Ticker"},"data":{"items":{"$ref":"#/components/schemas/AnalysisArticle"},"type":"array","title":"Data"}},"type":"object","required":["ticker","data"],"title":"BatchSeriesRow[AnalysisArticle]"},"BatchSeriesRow_HeadcountPoint_":{"properties":{"ticker":{"type":"string","title":"Ticker"},"data":{"items":{"$ref":"#/components/schemas/HeadcountPoint"},"type":"array","title":"Data"}},"type":"object","required":["ticker","data"],"title":"BatchSeriesRow[HeadcountPoint]"},"BatchSeriesRow_JobsPoint_":{"properties":{"ticker":{"type":"string","title":"Ticker"},"data":{"items":{"$ref":"#/components/schemas/JobsPoint"},"type":"array","title":"Data"}},"type":"object","required":["ticker","data"],"title":"BatchSeriesRow[JobsPoint]"},"BatchSeriesRow_NewsVolumePoint_":{"properties":{"ticker":{"type":"string","title":"Ticker"},"data":{"items":{"$ref":"#/components/schemas/NewsVolumePoint"},"type":"array","title":"Data"}},"type":"object","required":["ticker","data"],"title":"BatchSeriesRow[NewsVolumePoint]"},"BatchSeriesRow_RatingsPoint_":{"properties":{"ticker":{"type":"string","title":"Ticker"},"data":{"items":{"$ref":"#/components/schemas/RatingsPoint"},"type":"array","title":"Data"}},"type":"object","required":["ticker","data"],"title":"BatchSeriesRow[RatingsPoint]"},"BatchSeriesRow_ScoreCompositePoint_":{"properties":{"ticker":{"type":"string","title":"Ticker"},"data":{"items":{"$ref":"#/components/schemas/ScoreCompositePoint"},"type":"array","title":"Data"}},"type":"object","required":["ticker","data"],"title":"BatchSeriesRow[ScoreCompositePoint]"},"BatchSeriesRow_ScoreForecastPoint_":{"properties":{"ticker":{"type":"string","title":"Ticker"},"data":{"items":{"$ref":"#/components/schemas/ScoreForecastPoint"},"type":"array","title":"Data"}},"type":"object","required":["ticker","data"],"title":"BatchSeriesRow[ScoreForecastPoint]"},"BatchSeriesRow_SocialAudiencePoint_":{"properties":{"ticker":{"type":"string","title":"Ticker"},"data":{"items":{"$ref":"#/components/schemas/SocialAudiencePoint"},"type":"array","title":"Data"}},"type":"object","required":["ticker","data"],"title":"BatchSeriesRow[SocialAudiencePoint]"},"BatchSeriesRow_SocialMentionsPoint_":{"properties":{"ticker":{"type":"string","title":"Ticker"},"data":{"items":{"$ref":"#/components/schemas/SocialMentionsPoint"},"type":"array","title":"Data"}},"type":"object","required":["ticker","data"],"title":"BatchSeriesRow[SocialMentionsPoint]"},"BatchSeriesRow_SocialSentimentPoint_":{"properties":{"ticker":{"type":"string","title":"Ticker"},"data":{"items":{"$ref":"#/components/schemas/SocialSentimentPoint"},"type":"array","title":"Data"}},"type":"object","required":["ticker","data"],"title":"BatchSeriesRow[SocialSentimentPoint]"},"CongressTrade":{"properties":{"id":{"type":"string","title":"Id","description":"Opaque id, stable across pages and reruns. Dedupe on it."},"ticker":{"type":"string","title":"Ticker"},"politician":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Politician","description":"Full name, `politician_first` and `politician_last` joined. Pass this value back as `?politician=` to get one person's history."},"politician_first":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Politician First"},"politician_last":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Politician Last"},"party":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Party","description":"`democrat`, `republican` or `other`. Present on filings before mid-2024. Null on later filings."},"state":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"State","description":"Two-letter state code, lower case. Present on filings before mid-2024."},"chamber":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Chamber","description":"`house` or `senate`. Present on filings before mid-2024."},"side":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Side","description":"`buy` or `sell`. A small number of filings before mid-2024 carry `exchange` or `receive`. Null where the filing states none."},"amount_low":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Amount Low","description":"Lower bound of the disclosed dollar bracket. Null where none applies."},"amount_high":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Amount High","description":"Upper bound of the disclosed dollar bracket. Null on the open top bracket (over $50,000,000) and where none applies."},"amount_estimate_usd":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Amount Estimate Usd","description":"The dollar figure the source gives for this line: the bracket midpoint on most filings, or the exact amount where the filing disclosed one."},"transaction_date":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Transaction Date","description":"The day the trade took place, as filed. Passed through as filed, including the rare filing that states a future date."},"filing_date":{"type":"string","format":"date","title":"Filing Date","description":"The day the report was published. The feed orders on this date, and `from` and `to` filter on it."},"filing_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Filing Url","description":"Link to the report on the House or Senate disclosure site."}},"type":"object","required":["id","ticker","filing_date"],"title":"CongressTrade","description":"One transaction line from a STOCK Act periodic transaction report.","example":{"amount_estimate_usd":8000,"amount_high":15000,"amount_low":1001,"filing_date":"2026-08-04","filing_url":"https://disclosures-clerk.house.gov/public_disc/ptr-pdfs/2026/20030001.pdf","id":"cng_4a7d1e9c2b60f3e8d1c5a7b9","politician":"April Delaney","politician_first":"April","politician_last":"Delaney","side":"buy","ticker":"CHRW","transaction_date":"2026-07-24"}},"DjtPost":{"properties":{"id":{"type":"string","title":"Id"},"created":{"type":"string","format":"date-time","title":"Created"},"content":{"type":"string","title":"Content"},"permalink":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Permalink"},"market_impact":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Market Impact","description":"True when the AltIndex model classified the post as likely to move the stock market. Null only when the model did not classify the post."},"ai_narrative":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Ai Narrative","description":"The explanation by the AltIndex model of how the post could affect the market. Present only on a post where `market_impact` is true. The model never gives a narrative to a post that it classifies as not market-moving."},"replies_count":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Replies Count"},"favourites_count":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Favourites Count"}},"type":"object","required":["id","created","content"],"title":"DjtPost","description":"One Truth Social post from the sitting US President.\n\nThis data is market-wide. The table has no ticker or company link, so a\npost is not attributable to a company here. `market_impact` and\n`ai_narrative` come from AltIndex, not from the platform.","example":{"ai_narrative":"Donald Trump just posted about raising steel tariffs, which could lift domestic steel producers and pressure manufacturers that import.","content":"Tariffs on imported steel will be raised effective immediately.","created":"2026-08-26T18:04:11Z","favourites_count":31544,"id":"117168898896435158","market_impact":true,"permalink":"https://truthsocial.com/@realDonaldTrump/117168898896435158","replies_count":4821}},"EntityDetail":{"properties":{"ticker":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Ticker"},"name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Name"},"industry":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Industry"},"domain":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Domain"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description"},"next_earnings_date":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Next Earnings Date","description":"Next reported earnings date, when the company has one on file. A calendar signal for overlaying against social and news volume runups. Absent when AltIndex has not sourced a date for this company or the last-known date has already passed."},"social_handles":{"$ref":"#/components/schemas/SocialHandles"}},"type":"object","required":["social_handles"],"title":"EntityDetail"},"EntityListResponse":{"properties":{"items":{"items":{"$ref":"#/components/schemas/EntitySummary"},"type":"array","title":"Items"},"limit":{"type":"integer","title":"Limit"},"offset":{"type":"integer","title":"Offset"},"total":{"type":"integer","title":"Total"}},"type":"object","required":["items","limit","offset","total"],"title":"EntityListResponse"},"EntitySummary":{"properties":{"ticker":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Ticker"},"name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Name"},"industry":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Industry"},"domain":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Domain"}},"type":"object","title":"EntitySummary"},"ErrorCode":{"type":"string","enum":["MISSING_API_KEY","INVALID_API_KEY","API_KEY_EXPIRED","INVALID_KEY_CONFIGURATION","INVALID_SCOPES","INSUFFICIENT_SCOPE","HISTORY_LIMIT_EXCEEDED","BATCH_NOT_INCLUDED","TOO_MANY_TICKERS","INVALID_TICKERS","INVALID_DATE_RANGE","INVALID_CURSOR","INVALID_PLATFORM","INVALID_METRIC","INVALID_ALERT_TYPE","VALIDATION_ERROR","TICKER_NOT_FOUND","NOT_FOUND","METHOD_NOT_ALLOWED","RESULT_TOO_LARGE","RATE_LIMIT_EXCEEDED","DATABASE_BUSY","DATABASE_UNAVAILABLE","INTERNAL_ERROR"],"title":"ErrorCode","description":"Every machine-readable error code that the developer API can return.\n\nAltIndex groups the codes by what a client must *do* about each one.\nThis is the only useful way to group them when you write a retry policy."},"ErrorDetail":{"properties":{"code":{"$ref":"#/components/schemas/ErrorCode","description":"Machine-readable code. Branch on this, not on `message`."},"message":{"type":"string","title":"Message","description":"Human-readable explanation. The wording can change. The code does not change."},"request_id":{"type":"string","title":"Request Id","description":"AltIndex also returns this value in the `X-Request-ID` header. Quote it in a support ticket and AltIndex support can find the exact request."},"upgrade_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Upgrade Url","description":"Present when a plan limit caused the failure."},"details":{"anyOf":[{},{"type":"null"}],"title":"Details","description":"Present on a validation failure. It includes one row for each parameter that the API refused."}},"type":"object","required":["code","message","request_id"],"title":"ErrorDetail","description":"The `error` object that every failure includes.","example":{"code":"HISTORY_LIMIT_EXCEEDED","message":"Your plan allows 30 days of history. Earliest allowed date: 2026-07-28.","request_id":"req_8f14e45fceea167a5a36dedd4bea2543","upgrade_url":"https://altindex.com/pricing"}},"ErrorEnvelope":{"properties":{"error":{"$ref":"#/components/schemas/ErrorDetail"}},"type":"object","required":["error"],"title":"ErrorEnvelope","description":"Every non-2xx response on this API. This includes 404 and 500.","example":{"error":{"code":"TICKER_NOT_FOUND","message":"No covered company matches ticker NOTREAL.","request_id":"req_8f14e45fceea167a5a36dedd4bea2543"}}},"EventPage_CongressTrade_":{"properties":{"data":{"items":{"$ref":"#/components/schemas/CongressTrade"},"type":"array","title":"Data"},"next_cursor":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Next Cursor"}},"type":"object","required":["data"],"title":"EventPage[CongressTrade]"},"EventPage_DjtPost_":{"properties":{"data":{"items":{"$ref":"#/components/schemas/DjtPost"},"type":"array","title":"Data"},"next_cursor":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Next Cursor"}},"type":"object","required":["data"],"title":"EventPage[DjtPost]"},"EventPage_InsiderTransaction_":{"properties":{"data":{"items":{"$ref":"#/components/schemas/InsiderTransaction"},"type":"array","title":"Data"},"next_cursor":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Next Cursor"}},"type":"object","required":["data"],"title":"EventPage[InsiderTransaction]"},"EventPage_JobPosting_":{"properties":{"data":{"items":{"$ref":"#/components/schemas/JobPosting"},"type":"array","title":"Data"},"next_cursor":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Next Cursor"}},"type":"object","required":["data"],"title":"EventPage[JobPosting]"},"EventPage_NewsArticle_":{"properties":{"data":{"items":{"$ref":"#/components/schemas/NewsArticle"},"type":"array","title":"Data"},"next_cursor":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Next Cursor"}},"type":"object","required":["data"],"title":"EventPage[NewsArticle]"},"EventPage_ResearchEvent_":{"properties":{"data":{"items":{"$ref":"#/components/schemas/ResearchEvent"},"type":"array","title":"Data"},"next_cursor":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Next Cursor"}},"type":"object","required":["data"],"title":"EventPage[ResearchEvent]"},"HeadcountPoint":{"properties":{"date":{"type":"string","format":"date","title":"Date"},"linkedin_employer_count":{"type":"integer","title":"Linkedin Employer Count","description":"LinkedIn's public 'employees' figure — the count of profiles listing this company as current employer. A directional signal for hiring trend, not audited headcount. Monthly, dated the 15th."}},"type":"object","required":["date","linkedin_employer_count"],"title":"HeadcountPoint","description":"One monthly headcount row for one ticker.\n\nThe field is named `linkedin_employer_count` rather than `employees`\n(ENG-645). The upstream signal is LinkedIn's public \"company page\"\nfigure — the count of profiles listing this company as current\nemployer — not audited headcount. It grows with LinkedIn adoption in\naddition to actual hiring, so it reads directionally but should not be\npresented as headcount. Naming the source in the field prevents the\nmisread at the wire boundary.","example":{"date":"2026-08-15","linkedin_employer_count":208163}},"InsiderTransaction":{"properties":{"id":{"type":"string","title":"Id","description":"Opaque id, stable across pages and reruns. Dedupe on it."},"ticker":{"type":"string","title":"Ticker"},"insider_name":{"type":"string","title":"Insider Name","description":"The reporting owner, as named on the filing."},"transaction_code":{"type":"string","title":"Transaction Code","description":"SEC transaction code. `P` is an open-market purchase and `S` is an open-market sale. These are the only two codes this feed carries."},"shares_transacted":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Shares Transacted","description":"Number of shares in this transaction, unsigned. `transaction_code` gives the direction."},"shares_held_after":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Shares Held After","description":"The reporting owner's holding after this transaction, as filed."},"price":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Price","description":"Price per share, as filed. Null where the filing has none."},"transaction_date":{"type":"string","format":"date","title":"Transaction Date","description":"The day the transaction took place."},"filing_date":{"type":"string","format":"date","title":"Filing Date","description":"The day the filing was published. The feed orders on this date, and `from` and `to` filter on it."},"accession_number":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Accession Number","description":"SEC accession number of the filing this line belongs to."}},"type":"object","required":["id","ticker","insider_name","transaction_code","transaction_date","filing_date"],"title":"InsiderTransaction","description":"One open-market insider purchase or sale, as filed with the SEC.","example":{"accession_number":"0001437749-26-025384","filing_date":"2026-08-03","id":"ins_9f3b2c1d8e07a4b6c2d8e0f1","insider_name":"HORIZON KINETICS ASSET MANAGEMENT LLC","price":400.09,"shares_held_after":3263688,"shares_transacted":1,"ticker":"TPL","transaction_code":"P","transaction_date":"2026-07-31"}},"JobPosting":{"properties":{"id":{"type":"string","title":"Id","description":"Stable identifier for this posting. Use it to deduplicate."},"ticker":{"type":"string","title":"Ticker"},"posted_on":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Posted On","description":"The date that the source reported for this posting."},"title":{"type":"string","title":"Title"},"location":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Location"},"url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Url"},"role_family":{"type":"string","title":"Role Family","description":"Derived class of the role, one of: retail, engineering, corporate, operations, unknown. See the endpoint description for the classifier."},"source":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Source","description":"The source that supplied this posting."}},"type":"object","required":["id","ticker","title","role_family"],"title":"JobPosting","description":"One job posting that AltIndex collected.\n\n`posted_on` is the date of the posting as the source reported it. `from`\nand `to` filter on it, and the cursor pages through it. It is never the\nAltIndex collection date, which is a different and much later day for\nmost rows.\n\nA small share of rows (5.4% measured) have no date from the source. Such\na row cannot satisfy a date range, so it does not appear in results.\nThat is why `posted_on` is nullable here rather than required. The field\nalso absorbs a value that the source supplies in a shape AltIndex cannot\nparse. AltIndex returns such a row with `posted_on` null, rather than\nremove it or stamp it with the collection date.\n\n`role_family` is a 5-class derived classification from the title\n(`retail | engineering | corporate | operations | unknown`). LinkedIn\npostings for retail-heavy names (AAPL Genius Bar, AMZN warehouse) can\noverwhelm engineering signal in the raw feed; the classifier lets a\ncaller filter with `?role_family=` on the endpoint.\n\n`url` is rebuilt to the canonical `linkedin.com/jobs/view/{id}` form\nfrom `linkedin_job_id`, dropping the tracking parameters the raw\nscraped URL carries.","example":{"id":"4021884471","location":"Cupertino, CA","posted_on":"2026-08-07","role_family":"engineering","source":"linkedin","ticker":"AAPL","title":"Senior Machine Learning Engineer","url":"https://www.linkedin.com/jobs/view/4021884471"}},"JobsPoint":{"properties":{"date":{"type":"string","format":"date","title":"Date"},"linkedin_open_postings":{"type":"integer","title":"Linkedin Open Postings","description":"Open job postings on LinkedIn for this date — the single definition of job postings that every AltIndex surface publishes. A day without a LinkedIn observation does not appear in the series: it is a collection gap, and AltIndex does not substitute another source or serve zero for it."}},"type":"object","required":["date","linkedin_open_postings"],"title":"JobsPoint","description":"One day of the count of open job postings for one ticker.\n\nA point exists only for a day with a usable LinkedIn reading, so\n`linkedin_open_postings` is always a real count. The field name says\nwhere the number comes from. A missing day is a collection gap, not\nzero postings.","example":{"date":"2026-08-26","linkedin_open_postings":1180}},"NewsArticle":{"properties":{"article_id":{"type":"string","title":"Article Id"},"ticker":{"type":"string","title":"Ticker"},"published":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Published","description":"The publisher timestamp, as the upstream source supplied it."},"title":{"type":"string","title":"Title"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description"},"source":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Source","description":"Publication name, for example 'Reuters'."},"url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Url"},"image_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Image Url"},"relevance":{"type":"number","title":"Relevance","description":"Coarse in-endpoint relevance score, 0.3-1.0. Filter with `?min_relevance=`; the default cutoff is 0.5."}},"type":"object","required":["article_id","ticker","title","relevance"],"title":"NewsArticle","description":"One news article that AltIndex collected for one ticker.\n\n`article_id` is an opaque identifier stable across pagination and\nreruns — callers dedupe alert pipelines on it, and it does not encode\nthe upstream `data_key` or any dated source field. `published` is the\ntimestamp string of the upstream source, passed through verbatim. It\nis a `varchar(20)` in the source, and prod is not consistent in the\ncase of the zone suffix, both `...Z` and `...z`. AltIndex types it as\na string rather than reinterpret it as a datetime.\n\n`relevance` is a 0.3-1.0 coarse score of how prominently the ticker\nor company name appears in the article's own text — 1.0 when the\ncanonical name matches on a word boundary in `title`, 0.8 when the\nticker matches, 0.5 when the name appears in the first ~200 chars of\n`description`, 0.3 as the honest baseline for an article that passed\nthe upstream `company_id` join but has no textual evidence in the\nfields AltIndex serves. Filter with `?min_relevance=` on the endpoint.","example":{"article_id":"art_2a1c9b7e8f04","description":"The company said the agreement covers additional capacity.","published":"2026-08-26T14:42:50Z","relevance":1.0,"source":"9to5Mac","ticker":"AAPL","title":"Apple expands manufacturing partnership","url":"https://example.com/article"}},"NewsVolumePoint":{"properties":{"date":{"type":"string","format":"date","title":"Date"},"mentions":{"type":"integer","title":"Mentions","description":"The number of news mentions that AltIndex collected for this ticker on this date."}},"type":"object","required":["date","mentions"],"title":"NewsVolumePoint","description":"One day of news coverage volume for one ticker.\n\nThis is a breadth-of-coverage count across the news sources that AltIndex\nmonitors. It is NOT a count of the rows that `/news/articles` returns for\nthe same day. See the description of the /news/volume endpoint.","example":{"date":"2026-08-26","mentions":919}},"RatingsPoint":{"properties":{"date":{"type":"string","format":"date","title":"Date"},"overall_rating":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Overall Rating","description":"Overall employer rating on a 0-100 scale (Glassdoor's native 1-5 rescaled). See `overall_rating_scale`."},"overall_rating_scale":{"type":"string","title":"Overall Rating Scale","description":"The scale `overall_rating` is on. Constant '0-100' — a caller comparing to a Glassdoor page divides by 20.","default":"0-100"},"business_outlook":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Business Outlook","description":"Share of reviewers with a positive six-month business outlook, 0-100."},"recommend_to_friend":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Recommend To Friend","description":"Share of reviewers who would recommend the employer to a friend, 0-100."},"review_count":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Review Count","description":"Reviews behind these values. A 0 here is real: the employer has no reviews yet."}},"type":"object","required":["date"],"title":"RatingsPoint","description":"One monthly set of Glassdoor employer ratings for one ticker.\n\nEvery field is optional. AltIndex collects the four together, but does\nnot populate all four for every company. A stored 0 on the two rating\ncolumns is a no-data sentinel, and AltIndex returns null for it.\n\n`overall_rating` ships on a 0-100 scale, not Glassdoor's native 1-5\n(ENG-645). The endpoint carries `overall_rating_scale: \"0-100\"` on\neach row so a caller comparing to a Glassdoor page can rescale\nwithout reading docs.","example":{"business_outlook":62.0,"date":"2026-08-15","overall_rating":82.0,"overall_rating_scale":"0-100","recommend_to_friend":74.0,"review_count":15342}},"ResearchEvent":{"properties":{"id":{"type":"string","title":"Id","description":"Stable identifier for this event. Use it to deduplicate rows across queries that overlap, or across pages that you request again."},"ticker":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Ticker","description":"Null on market-wide events, which are not attributable to a company. `djt_realtime` is always market-wide."},"type":{"type":"string","title":"Type"},"occurred_on":{"type":"string","format":"date","title":"Occurred On","description":"The day the event describes."},"detected_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Detected At","description":"The time when AltIndex collected the event, on the types that it collects in near-real-time. Absent on batch-collected types, where AltIndex has only the day."},"value":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Value","description":"The value that crossed the threshold."},"change":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Change","description":"Absolute change from the previous value."},"change_percent":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Change Percent","description":"Percentage change."},"direction":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Direction","description":"Which way the value moved: 'More' or 'Less'."},"days_over":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Days Over","description":"The number of consecutive days that the value stayed past the threshold."},"title":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Title","description":"Short description. On an `event` row this is the event subtype, for example `layoffs`. On a narrative type it is a sentence."},"article":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Article","description":"Longer narrative, where one exists."},"url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Url","description":"Source link, where one exists."}},"type":"object","required":["id","type","occurred_on"],"title":"ResearchEvent","description":"One threshold crossing or one detected event.\n\nThe fields that a row includes depend on `type`. See the description of\nthe /research/events endpoint.","example":{"change":6.0,"change_percent":8.33,"days_over":3,"detected_at":"2026-08-26T14:02:11Z","direction":"More","id":"evt_6b8f01d4c9e2","occurred_on":"2026-08-26","ticker":"AAPL","type":"ai_score","value":78}},"ResearchEventGroup":{"properties":{"ticker":{"type":"string","title":"Ticker"},"events":{"items":{"$ref":"#/components/schemas/ResearchEvent"},"type":"array","title":"Events"}},"type":"object","required":["ticker","events"],"title":"ResearchEventGroup","description":"One ticker's most recent events, for the batch snapshot.","example":{"events":[{"id":"evt_6b8f01d4c9e2","occurred_on":"2026-08-26","ticker":"AAPL","type":"ai_score","value":78}],"ticker":"AAPL"}},"ScoreCompositePoint":{"properties":{"date":{"type":"string","format":"date","title":"Date"},"composite":{"type":"integer","title":"Composite","description":"AltIndex composite score, 0-100."},"audience":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Audience","description":"Audience pillar, 0-100. Null when the pillar had no input that day."},"employment":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Employment","description":"Employment pillar, 0-100. Null when the pillar had no input that day."},"customer":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Customer","description":"Customer pillar, 0-100. Null when the pillar had no input that day."},"fundamental":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Fundamental","description":"Fundamental pillar, 0-100. Null when the pillar had no input that day."},"confidence":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Confidence","description":"Model confidence in the day's score, 0-100."}},"type":"object","required":["date","composite"],"title":"ScoreCompositePoint","description":"One day of the composite score and its four pillars.\n\n`composite` is `data_recommendations_all.ai_score`. This is the 0-100\nheadline AltIndex score, the same number that the app renders and the\nMCP tools return. It is deliberately not the `score` column of that\ntable, which is a momentum value on an unrelated scale.","example":{"audience":71,"composite":78,"confidence":82,"date":"2026-08-26","employment":64,"fundamental":55}},"ScoreForecastPoint":{"properties":{"date":{"type":"string","format":"date","title":"Date"},"ai_price":{"type":"number","title":"Ai Price","description":"Model-implied price forecast for this date."},"anchor_price":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Anchor Price","description":"The reference price the model priced against on the day the forecast was stamped. Null when AltIndex has no reference price for that day."}},"type":"object","required":["date","ai_price"],"title":"ScoreForecastPoint","description":"One day of the price forecast of the model.\n\n`ai_price` is the implied price of the AltIndex model. It is not a\nmirror of a third-party source and not an analyst consensus.\n\n`anchor_price` is the reference price the model was priced against\nwhen it stamped this forecast. It is not today's spot price — the\nupstream writer restamps the same anchor on days the model was not\nrerun, so identical anchors across a run of days mean the forecast is\ncoasting from an earlier repricing, not that the market did not move.\nA caller computing an implied return uses `(ai_price - anchor_price)\n/ anchor_price`, not `(ai_price - <today's close>) / <today's close>`.","example":{"ai_price":331.64,"anchor_price":318.22,"date":"2026-08-26"}},"ScoreSnapshot":{"properties":{"ticker":{"type":"string","title":"Ticker"},"date":{"type":"string","format":"date","title":"Date"},"composite":{"type":"integer","title":"Composite"},"audience":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Audience"},"employment":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Employment"},"customer":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Customer"},"fundamental":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Fundamental"},"confidence":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Confidence"},"ai_price":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Ai Price"},"anchor_price":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Anchor Price"}},"type":"object","required":["ticker","date","composite"],"title":"ScoreSnapshot","description":"Most recent scored day for one ticker.\n\nThe row includes its own `ticker`, so a batch response is a flat list\nof snapshots rather than a list of wrappers.","example":{"ai_price":331.64,"anchor_price":318.22,"audience":71,"composite":78,"confidence":82,"date":"2026-08-26","employment":64,"fundamental":55,"ticker":"AAPL"}},"SeriesResponse_AnalysisArticle_":{"properties":{"ticker":{"type":"string","title":"Ticker"},"from":{"type":"string","format":"date","title":"From"},"to":{"type":"string","format":"date","title":"To"},"data":{"items":{"$ref":"#/components/schemas/AnalysisArticle"},"type":"array","title":"Data"}},"type":"object","required":["ticker","from","to","data"],"title":"SeriesResponse[AnalysisArticle]"},"SeriesResponse_HeadcountPoint_":{"properties":{"ticker":{"type":"string","title":"Ticker"},"from":{"type":"string","format":"date","title":"From"},"to":{"type":"string","format":"date","title":"To"},"data":{"items":{"$ref":"#/components/schemas/HeadcountPoint"},"type":"array","title":"Data"}},"type":"object","required":["ticker","from","to","data"],"title":"SeriesResponse[HeadcountPoint]"},"SeriesResponse_JobsPoint_":{"properties":{"ticker":{"type":"string","title":"Ticker"},"from":{"type":"string","format":"date","title":"From"},"to":{"type":"string","format":"date","title":"To"},"data":{"items":{"$ref":"#/components/schemas/JobsPoint"},"type":"array","title":"Data"}},"type":"object","required":["ticker","from","to","data"],"title":"SeriesResponse[JobsPoint]"},"SeriesResponse_NewsVolumePoint_":{"properties":{"ticker":{"type":"string","title":"Ticker"},"from":{"type":"string","format":"date","title":"From"},"to":{"type":"string","format":"date","title":"To"},"data":{"items":{"$ref":"#/components/schemas/NewsVolumePoint"},"type":"array","title":"Data"}},"type":"object","required":["ticker","from","to","data"],"title":"SeriesResponse[NewsVolumePoint]"},"SeriesResponse_RatingsPoint_":{"properties":{"ticker":{"type":"string","title":"Ticker"},"from":{"type":"string","format":"date","title":"From"},"to":{"type":"string","format":"date","title":"To"},"data":{"items":{"$ref":"#/components/schemas/RatingsPoint"},"type":"array","title":"Data"}},"type":"object","required":["ticker","from","to","data"],"title":"SeriesResponse[RatingsPoint]"},"SeriesResponse_ScoreCompositePoint_":{"properties":{"ticker":{"type":"string","title":"Ticker"},"from":{"type":"string","format":"date","title":"From"},"to":{"type":"string","format":"date","title":"To"},"data":{"items":{"$ref":"#/components/schemas/ScoreCompositePoint"},"type":"array","title":"Data"}},"type":"object","required":["ticker","from","to","data"],"title":"SeriesResponse[ScoreCompositePoint]"},"SeriesResponse_ScoreForecastPoint_":{"properties":{"ticker":{"type":"string","title":"Ticker"},"from":{"type":"string","format":"date","title":"From"},"to":{"type":"string","format":"date","title":"To"},"data":{"items":{"$ref":"#/components/schemas/ScoreForecastPoint"},"type":"array","title":"Data"}},"type":"object","required":["ticker","from","to","data"],"title":"SeriesResponse[ScoreForecastPoint]"},"SeriesResponse_SocialAudiencePoint_":{"properties":{"ticker":{"type":"string","title":"Ticker"},"from":{"type":"string","format":"date","title":"From"},"to":{"type":"string","format":"date","title":"To"},"data":{"items":{"$ref":"#/components/schemas/SocialAudiencePoint"},"type":"array","title":"Data"}},"type":"object","required":["ticker","from","to","data"],"title":"SeriesResponse[SocialAudiencePoint]"},"SeriesResponse_SocialMentionsPoint_":{"properties":{"ticker":{"type":"string","title":"Ticker"},"from":{"type":"string","format":"date","title":"From"},"to":{"type":"string","format":"date","title":"To"},"data":{"items":{"$ref":"#/components/schemas/SocialMentionsPoint"},"type":"array","title":"Data"}},"type":"object","required":["ticker","from","to","data"],"title":"SeriesResponse[SocialMentionsPoint]"},"SeriesResponse_SocialSentimentPoint_":{"properties":{"ticker":{"type":"string","title":"Ticker"},"from":{"type":"string","format":"date","title":"From"},"to":{"type":"string","format":"date","title":"To"},"data":{"items":{"$ref":"#/components/schemas/SocialSentimentPoint"},"type":"array","title":"Data"}},"type":"object","required":["ticker","from","to","data"],"title":"SeriesResponse[SocialSentimentPoint]"},"SnapshotBatchResponse_ResearchEventGroup_":{"properties":{"as_of":{"type":"string","format":"date-time","title":"As Of"},"results":{"items":{"$ref":"#/components/schemas/ResearchEventGroup"},"type":"array","title":"Results"},"errors":{"items":{"$ref":"#/components/schemas/BatchError"},"type":"array","title":"Errors"}},"type":"object","required":["as_of","results","errors"],"title":"SnapshotBatchResponse[ResearchEventGroup]"},"SnapshotBatchResponse_ScoreSnapshot_":{"properties":{"as_of":{"type":"string","format":"date-time","title":"As Of"},"results":{"items":{"$ref":"#/components/schemas/ScoreSnapshot"},"type":"array","title":"Results"},"errors":{"items":{"$ref":"#/components/schemas/BatchError"},"type":"array","title":"Errors"}},"type":"object","required":["as_of","results","errors"],"title":"SnapshotBatchResponse[ScoreSnapshot]"},"SocialAudiencePoint":{"properties":{"date":{"type":"string","format":"date","title":"Date"},"followers":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Followers","description":"Followers or subscribers, whichever the platform counts."},"fans":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Fans","description":"Facebook page fans. Facebook only."},"ptat":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Ptat","description":"Facebook people-talking-about-this, their engagement measure. Facebook only."},"likes":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Likes","description":"Cumulative likes across the account's posts. TikTok only."}},"type":"object","required":["date"],"title":"SocialAudiencePoint","description":"One day of audience values for one ticker on one platform.\n\nA row includes only the fields that the requested platform reports. See\nthe endpoint description for which platform reports which field.","example":{"date":"2026-08-26","followers":1200}},"SocialHandles":{"properties":{"x":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X","description":"The X (Twitter) account handle. Mention coverage and sentiment coverage do not depend on it. Both come from keyword collection, so AltIndex has them for an entity with no mapped account."},"instagram":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Instagram"},"threads":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Threads"},"tiktok":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Tiktok"},"pinterest":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Pinterest"},"linkedin":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Linkedin","description":"The LinkedIn company vanity slug (the trailing segment of `linkedin.com/company/<slug>`). Populated where AltIndex has mapped it. `linkedin_page` carries the alternate page slug where the company runs both."},"linkedin_page":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Linkedin Page"},"reddit":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Reddit","description":"The dedicated subreddit for this entity, if AltIndex maps one. This is the only thing the field indicates. Reddit coverage is keyword-based, not subreddit-based, so AltIndex has mentions and sentiment for an entity with no subreddit here. Only the subscriber count needs a mapped subreddit."}},"type":"object","title":"SocialHandles","description":"Human-readable handles for the platforms AltIndex maps per entity.\n\nFacebook and YouTube are not exposed here (ENG-645). Both are stored\nupstream as source identifiers — a numeric page id for Facebook and a\nchannel id for YouTube — not human handles a caller can use directly.\nTheir audience series are still queryable via\n`/social/audience?platform=facebook|youtube&ticker=`."},"SocialLeaderboardResponse":{"properties":{"platform":{"type":"string","title":"Platform"},"metric":{"type":"string","title":"Metric"},"as_of":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"As Of","description":"Timestamp of the snapshot these rows came from, ISO 8601 with the trailing `Z`. Null when no snapshot has landed yet — a fabricated request-time timestamp on an empty response would mislead callers cache-keying on this field. Two requests minutes apart can legitimately disagree because AltIndex rebuilds the source about every half hour."},"data":{"items":{"$ref":"#/components/schemas/SocialLeaderboardRow"},"type":"array","title":"Data"}},"type":"object","required":["platform","metric","data"],"title":"SocialLeaderboardResponse","description":"A snapshot social leaderboard.\n\nThe response includes `as_of`, because this is a snapshot, not a\nseries. AltIndex rebuilds the source about every half hour and returns\nonly the most recent build. Two requests minutes apart can legitimately\ndisagree."},"SocialLeaderboardRow":{"properties":{"rank":{"type":"integer","title":"Rank","description":"Position in this snapshot, 1 is highest."},"ticker":{"type":"string","title":"Ticker"},"name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Name"},"mentions":{"type":"integer","title":"Mentions","description":"Mentions counted in this snapshot."},"previous_mentions":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Previous Mentions","description":"The same count in the previous snapshot. Use it for direction."},"mentions_change_pct":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Mentions Change Pct","description":"Percent change in `mentions` versus the previous snapshot, rounded to 1 decimal. Positive when mentions rose; null when `previous_mentions` is null or zero (the ticker is new to the leaderboard, or the previous window had none)."},"sentiment":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Sentiment","description":"Sentiment on a 0-100 scale. Not every row has a value: about half of the wallstreetbets rows have none."},"composite":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Composite","description":"The ticker's AltIndex composite score, 0-100."}},"type":"object","required":["rank","ticker","mentions"],"title":"SocialLeaderboardRow","description":"One ranked ticker on a social leaderboard.","example":{"composite":78,"mentions":2582,"mentions_change_pct":58.6,"name":"NVIDIA Corporation","previous_mentions":1628,"rank":1,"sentiment":58.0,"ticker":"NVDA"}},"SocialMentionsPoint":{"properties":{"date":{"type":"string","format":"date","title":"Date"},"mentions":{"type":"integer","title":"Mentions","description":"Mentions that AltIndex collected on this date. A 0 is a real value on a platform that reports one. A date that is absent from the series is a date that AltIndex did not collect. AltIndex never writes a genuine 0 for the x platform: there, an absent date can mean 0 mentions or no collection."}},"type":"object","required":["date","mentions"],"title":"SocialMentionsPoint","description":"One day's mention count for one ticker on one platform.","example":{"date":"2026-08-26","mentions":34}},"SocialSentimentPoint":{"properties":{"date":{"type":"string","format":"date","title":"Date"},"sentiment":{"type":"number","title":"Sentiment","description":"Sentiment on a 0-100 scale, where 50 is neutral. AltIndex normalizes the value when it returns the row, so every platform reports the same scale."}},"type":"object","required":["date","sentiment"],"title":"SocialSentimentPoint","description":"One day of the sentiment value for one ticker on one platform.","example":{"date":"2026-08-26","sentiment":61.0}}},"securitySchemes":{"ApiKeyAuth":{"type":"apiKey","description":"Your AltIndex API key. One key works across both REST and MCP.","in":"header","name":"X-API-Key"}}},"tags":[{"name":"entities","description":"The companies that AltIndex collects data for, and how AltIndex identifies each one.\n\nSearch returns the covered companies. Detail returns one company and the account that AltIndex maps to it on each social platform. A null handle means AltIndex maps no dedicated account on that platform. It does not mean no data. Reddit mentions are collected by keyword for every company. X mentions are collected the same way for most of the universe, with a shorter history. Every other family keys on the tickers this family returns.\n\nHow AltIndex builds and corrects these mappings: [knowledge graph](https://developers.altindex.com/data-dictionary/knowledge-graph)."},{"name":"score","description":"The AltIndex composite score, its four pillars, and the AltIndex price forecast.\n\nThe composite is a daily value from 0 to 100 for one company. AltIndex scores each signal it collects for the company from -1 to +1 by fixed rules. The rules read the signal's level, its change over one month, and its change over a longer window. The composite is the average of those component scores, mapped to 0 to 100. A pillar is the same average over its own signals. The four pillars are audience, employment, customer and fundamental.\n\nThe composite is not a rating, not a price target, and not an analyst consensus. A pillar is null on a day when it had no input; AltIndex never returns 0 in its place. AltIndex scores the covered universe daily, but not every company on every day. The forecast is the output of the AltIndex model and has no fixed horizon."},{"name":"social","description":"Mentions, sentiment and audience across platforms.\n\nEach row is one company, one platform, one day. Mentions is the count of posts that name the ticker. Sentiment is a value from 0 to 100, where 50 is neutral, normalized so every platform reports the same scale. Audience is a level snapshot of followers, or the count a platform reports in its place.\n\nRead mentions as a within-platform signal over time; do not compare raw counts across platforms. A day where AltIndex collected nothing has no row, and AltIndex does not report 0 in its place.\n\nHow AltIndex collects and scores these: [mentions and sentiment](https://developers.altindex.com/data-dictionary/social-mentions-sentiment), [followers](https://developers.altindex.com/data-dictionary/social-followers)."},{"name":"news","description":"Daily news coverage volume, the news articles that AltIndex collects, and Truth Social posts with the AltIndex market-impact tag.\n\nVolume is a breadth-of-coverage count for one company on one day. Articles are the individual pieces, newest first, each with a relevance score that says how the article names the company. Volume and articles do not reconcile; AltIndex collects them in different ways. Truth Social posts are market-wide and never linked to a company.\n\nTreat the earliest article for a ticker as the start of AltIndex coverage, not the start of that company's news history."},{"name":"employment","description":"Job counts, postings, headcount and employer ratings.\n\nJobs is the daily count of open postings on LinkedIn for one company. Postings are the individual listings behind that count, each classified into a role family. Headcount is a monthly LinkedIn-derived measure of workforce size. Ratings are monthly Glassdoor figures on a 0 to 100 scale.\n\nRead headcount as a directional measure, not a filing value. A missing day is a collection gap, not a hiring freeze; AltIndex does not serve 0 for a day it did not collect."},{"name":"ownership","description":"Insider transactions from SEC filings and congressional trades from STOCK Act reports.\n\nEach row is one transaction line, dated by its filing date. Insider rows carry open-market purchases and sales only. Congress rows carry a reported amount bracket and a midpoint estimate.\n\nAbsence is usually real here. About half of covered companies have no insider filing in a given quarter. About one company in six has a reported congressional trade in a given quarter."},{"name":"research","description":"Analysis articles from the AltIndex model, and events that the AltIndex model detects when a signal crosses a threshold. Article coverage is thin.\n\nAn article explains what the other families show for one company; articles arrive in a monthly batch. An event is one row that says a signal crossed a threshold, or that AltIndex detected a named event such as layoffs. The fields on an event row depend on its `type`. The endpoint publishes one example per shape; branch on `type`."}]}