{"openapi":"3.1.0","info":{"title":"Scoopkit API","description":"Countless headlines in, one event out. Structured AI-industry news events (not raw articles) with taxonomy labels, tier gating, semantic search, webhooks, and an MCP server for AI agents at /mcp. Start here: https://scoopkit.dev/start\n\n**Rate limits.** Every authenticated response includes both the standard `RateLimit-Limit` / `RateLimit-Remaining` / `RateLimit-Reset` headers ([IETF draft](https://datatracker.ietf.org/doc/draft-ietf-httpapi-ratelimit-headers/)) and the equivalent `X-RateLimit-*` headers kept for backward compatibility. `RateLimit-Reset` is a delta in seconds until the daily quota resets (same convention as `Retry-After`); `X-RateLimit-Reset` is the absolute Unix timestamp. A 429 response also includes `Retry-After`.","contact":{"name":"Scoopkit","url":"https://scoopkit.dev/"},"version":"0.1.0"},"paths":{"/v1/auth/magic-link":{"post":{"tags":["auth"],"summary":"Request a free API key by email","description":"Step 1 of self-serve signup — no key required. Sends a one-time link to `email`; always returns 202 with the same accepted:true body whether or not that address already has a key (prevents account enumeration).\n\n**For agents helping a human get set up:** this endpoint is the only step you can call directly. The next step — opening the emailed link and clicking \"Reveal my key\" on `GET /v1/auth/verify` — **requires a real human click and cannot be automated or done on the human's behalf.** This is intentional: it's what stops email security scanners (e.g. Microsoft Safe Links) from silently consuming the link before the person ever sees it. Tell the human: check your email, open the link, click the button, then paste the key back here.\n\n**Not a pollable async job.** This 202 has no `Location`/`job_id` to poll — the next step is a human clicking an emailed link, not a machine checking a status endpoint.","operationId":"post_magic_link_v1_auth_magic_link_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/MagicLinkRequest"}}},"required":true},"responses":{"202":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MagicLinkAccepted"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[]}},"/v1/auth/verify":{"get":{"tags":["auth"],"summary":"Show the human confirm page for a magic-link token (HTML, not JSON)","description":"Step 2 — a human opens this from their email. Read-only, does NOT consume the token, safe for email-scanner prefetch. Renders an HTML page with a \"Reveal my key\" button; the actual key is only minted when that button is clicked, which calls POST /v1/auth/verify/confirm. **An agent cannot complete this step for a human** — there is no JSON equivalent that mints the key from the GET alone, by design.","operationId":"get_verify_v1_auth_verify_get","parameters":[{"name":"token","in":"query","required":true,"schema":{"type":"string","title":"Token"}}],"responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[]}},"/v1/auth/verify/confirm":{"post":{"tags":["auth"],"summary":"Mint the key — only fires from a real human click, never a prefetch","description":"Step 3 — the actual mint. Only reachable via GET /verify's confirm-page JS, triggered by a real button click; a scanner's automatic prefetch of the emailed link never reaches this endpoint, so it can't burn the token before the human sees it. `plaintext_key` is returned exactly once here and never again — nothing else in the API can retrieve it after this response.","operationId":"post_verify_confirm_v1_auth_verify_confirm_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/VerifyConfirmRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/VerifyConfirmResult"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[]}},"/v1/auth/me":{"get":{"tags":["auth"],"summary":"Metadata for the calling API key","description":"Confirms your tier, archive window, and which email the key belongs to — useful for an agent to sanity-check a key a human just pasted in.","operationId":"get_me_v1_auth_me_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MeResponse"}}}}},"security":[{"APIKeyHeader":[]}]}},"/v1/events":{"get":{"tags":["events"],"summary":"List events, newest first","description":"The primary resource — one structured event per underlying story, already deduplicated from many source articles. Cursor-paginated (`next_cursor`/`has_more`), newest `reported_at` first. Free tier omits paid-only fields by omission (never null) and excludes paid-primary subcategories entirely; archive depth is 45 days on free, 365 on Pro.","operationId":"list_events_route_v1_events_get","security":[{"APIKeyHeader":[]}],"parameters":[{"name":"cursor","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Opaque cursor from a previous response's next_cursor","title":"Cursor"},"description":"Opaque cursor from a previous response's next_cursor"},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":50,"title":"Limit"}},{"name":"category","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Exact primary_category id, e.g. MODEL_RELEASE","title":"Category"},"description":"Exact primary_category id, e.g. MODEL_RELEASE"},{"name":"subcategory","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Exact subcategory id, e.g. MODEL_RELEASE.NEW_MODEL_RELEASE","title":"Subcategory"},"description":"Exact subcategory id, e.g. MODEL_RELEASE.NEW_MODEL_RELEASE"},{"name":"since","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"description":"Only events reported_at >= this ISO 8601 timestamp","title":"Since"},"description":"Only events reported_at >= this ISO 8601 timestamp"},{"name":"until","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"description":"Only events reported_at <= this ISO 8601 timestamp","title":"Until"},"description":"Only events reported_at <= this ISO 8601 timestamp"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/EventListResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/events/{event_id}":{"get":{"tags":["events"],"summary":"Get a single event by ID","description":"404s if the event doesn't exist, is unpublished, is beyond your tier's archive window, or was soft-deleted — never distinguishes which, to avoid leaking data existence beyond what the tier allows.","operationId":"get_event_route_v1_events__event_id__get","security":[{"APIKeyHeader":[]}],"parameters":[{"name":"event_id","in":"path","required":true,"schema":{"type":"string","title":"Event Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/EventResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/search":{"get":{"tags":["search"],"summary":"Semantic search over events (Pro+)","description":"Natural-language query embedded and ranked by cosine similarity against published events — not a keyword/text match. Each result is a normal event object plus `relevance_score` (0-1). Requires Pro tier or above; free-tier keys get 403 with an upgrade_url.","operationId":"search_v1_search_get","security":[{"APIKeyHeader":[]}],"parameters":[{"name":"q","in":"query","required":true,"schema":{"type":"string","minLength":1,"description":"Natural-language search query","title":"Q"},"description":"Natural-language search query"},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":20,"title":"Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SearchListResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/taxonomy":{"get":{"tags":["taxonomy"],"summary":"Get Taxonomy","description":"Public taxonomy — no API key required.","operationId":"get_taxonomy_v1_taxonomy_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Get Taxonomy V1 Taxonomy Get"}}}}},"security":[]}},"/v1/webhooks":{"get":{"tags":["webhooks"],"summary":"List your webhook subscriptions (Pro+)","description":"Never includes `secret` — that's only ever returned once, at creation.","operationId":"list_webhooks_v1_webhooks_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/WebhookListResponse"}}}}},"security":[{"APIKeyHeader":[]}]},"post":{"tags":["webhooks"],"summary":"Create a webhook subscription (Pro+)","description":"On each matching published event, POSTs {data: [event], meta} to your `url` (a one-item list, Pro-tier field set regardless of your own tier) with an HMAC-SHA256 signature. `secret` is returned exactly once, in this response only — save it for verifying delivery signatures; it cannot be retrieved again afterward.","operationId":"create_webhook_v1_webhooks_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/WebhookCreate"}}},"required":true},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/WebhookResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"APIKeyHeader":[]}]}},"/v1/webhooks/{webhook_id}":{"delete":{"tags":["webhooks"],"summary":"Delete Webhook","operationId":"delete_webhook_v1_webhooks__webhook_id__delete","security":[{"APIKeyHeader":[]}],"parameters":[{"name":"webhook_id","in":"path","required":true,"schema":{"type":"string","title":"Webhook Id"}}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/health/live":{"get":{"tags":["health"],"summary":"Health Live","description":"Process up (no dependency checks).","operationId":"health_live_health_live_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":{"type":"string"},"type":"object","title":"Response Health Live Health Live Get"}}}}},"security":[]}},"/health":{"get":{"tags":["health"],"summary":"Health","description":"Dependency health for load balancers / Railway.","operationId":"health_health_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[]}}},"components":{"schemas":{"ApiTier":{"type":"string","enum":["free","pro","enterprise"],"title":"ApiTier"},"ConfirmationStatus":{"type":"string","enum":["confirmed","unconfirmed","speculative","unclear"],"title":"ConfirmationStatus"},"Event":{"properties":{"event_id":{"type":"string","title":"Event Id"},"schema_version":{"type":"string","title":"Schema Version"},"taxonomy_version":{"type":"string","title":"Taxonomy Version"},"primary_category":{"type":"string","title":"Primary Category"},"subcategory":{"type":"string","title":"Subcategory"},"categories":{"items":{"type":"string"},"type":"array","title":"Categories"},"type_confidence":{"type":"number","enum":[0.9,0.6,0.3],"title":"Type Confidence"},"headline":{"type":"string","title":"Headline"},"summary":{"type":"string","title":"Summary"},"occurred_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Occurred At"},"reported_at":{"type":"string","format":"date-time","title":"Reported At"},"orgs":{"items":{"type":"string"},"type":"array","title":"Orgs"},"models":{"items":{"type":"string"},"type":"array","title":"Models"},"source_url":{"type":"string","title":"Source Url"},"article_count":{"type":"integer","minimum":0.0,"title":"Article Count"},"people":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"People"},"regions":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Regions"},"confirmation_status":{"anyOf":[{"$ref":"#/components/schemas/ConfirmationStatus"},{"type":"null"}]},"confirmation_confidence":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Confirmation Confidence"},"source_tier":{"anyOf":[{"$ref":"#/components/schemas/SourceTier"},{"type":"null"}]},"source_credibility":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Source Credibility"},"sentiment":{"anyOf":[{"$ref":"#/components/schemas/Sentiment"},{"type":"null"}]},"impact_score":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Impact Score"},"tags":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Tags"},"related_event_ids":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Related Event Ids"},"correction_history":{"anyOf":[{"items":{"additionalProperties":true,"type":"object"},"type":"array"},{"type":"null"}],"title":"Correction History"},"details":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Details"},"article_cluster":{"anyOf":[{"items":{"additionalProperties":true,"type":"object"},"type":"array"},{"type":"null"}],"title":"Article Cluster"}},"additionalProperties":false,"type":"object","required":["event_id","schema_version","taxonomy_version","primary_category","subcategory","categories","type_confidence","headline","summary","reported_at","orgs","models","source_url","article_count"],"title":"Event","description":"Full event; paid fields optional (omitted on free via gating, never null-for-tier)."},"EventListResponse":{"properties":{"data":{"items":{"$ref":"#/components/schemas/Event"},"type":"array","title":"Data"},"pagination":{"$ref":"#/components/schemas/Pagination"},"meta":{"$ref":"#/components/schemas/Meta"}},"additionalProperties":false,"type":"object","required":["data","pagination","meta"],"title":"EventListResponse"},"EventResponse":{"properties":{"data":{"$ref":"#/components/schemas/Event"},"meta":{"$ref":"#/components/schemas/Meta"}},"additionalProperties":false,"type":"object","required":["data","meta"],"title":"EventResponse"},"HTTPValidationError":{"properties":{"detail":{"items":{"$ref":"#/components/schemas/ValidationError"},"type":"array","title":"Detail"}},"type":"object","title":"HTTPValidationError"},"MagicLinkAccepted":{"properties":{"accepted":{"type":"boolean","title":"Accepted"},"detail":{"type":"string","title":"Detail"},"verify_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Verify Url"}},"additionalProperties":false,"type":"object","required":["accepted","detail"],"title":"MagicLinkAccepted","description":"Always this shape regardless of whether the email is real — the API never\nreveals whether an address already has a key, to avoid account enumeration."},"MagicLinkRequest":{"properties":{"email":{"type":"string","format":"email","title":"Email","description":"Email to receive the magic link"}},"additionalProperties":false,"type":"object","required":["email"],"title":"MagicLinkRequest"},"MeData":{"properties":{"key_id":{"type":"string","title":"Key Id"},"tier":{"$ref":"#/components/schemas/ApiTier"},"email":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Email"},"archive_days":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Archive Days"}},"additionalProperties":false,"type":"object","required":["key_id","tier"],"title":"MeData"},"MeMeta":{"properties":{"request_id":{"type":"string","title":"Request Id"},"tier":{"$ref":"#/components/schemas/ApiTier"}},"additionalProperties":false,"type":"object","required":["request_id","tier"],"title":"MeMeta"},"MeResponse":{"properties":{"data":{"$ref":"#/components/schemas/MeData"},"meta":{"$ref":"#/components/schemas/MeMeta"}},"additionalProperties":false,"type":"object","required":["data","meta"],"title":"MeResponse"},"Meta":{"properties":{"request_id":{"type":"string","title":"Request Id"},"taxonomy_version":{"type":"string","title":"Taxonomy Version"},"tier":{"$ref":"#/components/schemas/ApiTier"}},"additionalProperties":false,"type":"object","required":["request_id","taxonomy_version","tier"],"title":"Meta"},"Pagination":{"properties":{"next_cursor":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Next Cursor"},"has_more":{"type":"boolean","title":"Has More"},"count":{"type":"integer","minimum":0.0,"title":"Count"}},"additionalProperties":false,"type":"object","required":["has_more","count"],"title":"Pagination"},"SearchListResponse":{"properties":{"data":{"items":{"$ref":"#/components/schemas/SearchResult"},"type":"array","title":"Data"},"pagination":{"$ref":"#/components/schemas/Pagination"},"meta":{"$ref":"#/components/schemas/Meta"}},"additionalProperties":false,"type":"object","required":["data","pagination","meta"],"title":"SearchListResponse"},"SearchResult":{"properties":{"event_id":{"type":"string","title":"Event Id"},"schema_version":{"type":"string","title":"Schema Version"},"taxonomy_version":{"type":"string","title":"Taxonomy Version"},"primary_category":{"type":"string","title":"Primary Category"},"subcategory":{"type":"string","title":"Subcategory"},"categories":{"items":{"type":"string"},"type":"array","title":"Categories"},"type_confidence":{"type":"number","enum":[0.9,0.6,0.3],"title":"Type Confidence"},"headline":{"type":"string","title":"Headline"},"summary":{"type":"string","title":"Summary"},"occurred_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Occurred At"},"reported_at":{"type":"string","format":"date-time","title":"Reported At"},"orgs":{"items":{"type":"string"},"type":"array","title":"Orgs"},"models":{"items":{"type":"string"},"type":"array","title":"Models"},"source_url":{"type":"string","title":"Source Url"},"article_count":{"type":"integer","minimum":0.0,"title":"Article Count"},"people":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"People"},"regions":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Regions"},"confirmation_status":{"anyOf":[{"$ref":"#/components/schemas/ConfirmationStatus"},{"type":"null"}]},"confirmation_confidence":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Confirmation Confidence"},"source_tier":{"anyOf":[{"$ref":"#/components/schemas/SourceTier"},{"type":"null"}]},"source_credibility":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Source Credibility"},"sentiment":{"anyOf":[{"$ref":"#/components/schemas/Sentiment"},{"type":"null"}]},"impact_score":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Impact Score"},"tags":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Tags"},"related_event_ids":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Related Event Ids"},"correction_history":{"anyOf":[{"items":{"additionalProperties":true,"type":"object"},"type":"array"},{"type":"null"}],"title":"Correction History"},"details":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Details"},"article_cluster":{"anyOf":[{"items":{"additionalProperties":true,"type":"object"},"type":"array"},{"type":"null"}],"title":"Article Cluster"},"relevance_score":{"type":"number","maximum":1.0,"minimum":0.0,"title":"Relevance Score","description":"Cosine similarity to the query, 0-1, higher is more relevant."}},"additionalProperties":false,"type":"object","required":["event_id","schema_version","taxonomy_version","primary_category","subcategory","categories","type_confidence","headline","summary","reported_at","orgs","models","source_url","article_count","relevance_score"],"title":"SearchResult","description":"An event plus its relevance to the query (Pro+)."},"Sentiment":{"type":"string","enum":["positive","negative","neutral","mixed"],"title":"Sentiment"},"SourceTier":{"type":"string","enum":["PRIMARY","TIER1_PRESS","SECONDARY","SOCIAL"],"title":"SourceTier"},"ValidationError":{"properties":{"loc":{"items":{"anyOf":[{"type":"string"},{"type":"integer"}]},"type":"array","title":"Location"},"msg":{"type":"string","title":"Message"},"type":{"type":"string","title":"Error Type"},"input":{"title":"Input"},"ctx":{"type":"object","title":"Context"}},"type":"object","required":["loc","msg","type"],"title":"ValidationError"},"VerifyConfirmRequest":{"properties":{"token":{"type":"string","title":"Token","description":"Magic-link token from the emailed verify URL"}},"additionalProperties":false,"type":"object","required":["token"],"title":"VerifyConfirmRequest"},"VerifyConfirmResult":{"properties":{"status":{"type":"string","enum":["minted","already_issued","invalid","used","expired"],"title":"Status"},"plaintext_key":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Plaintext Key"},"email":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Email"},"key_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Key Id"},"key_hint":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Key Hint"}},"additionalProperties":false,"type":"object","required":["status"],"title":"VerifyConfirmResult","description":"Result of actually consuming a magic-link token (POST /v1/auth/verify/confirm).\n\n`status` drives which other fields are populated:\n- \"minted\": plaintext_key + email are set. The key is shown exactly once — no\n  endpoint can ever retrieve it again after this response.\n- \"already_issued\": email + key_hint are set (plaintext_key is never re-shown).\n- \"invalid\" | \"used\" | \"expired\": no other fields are set."},"WebhookCreate":{"properties":{"url":{"type":"string","maxLength":2083,"minLength":1,"format":"uri","title":"Url"},"filter":{"additionalProperties":true,"type":"object","title":"Filter"}},"additionalProperties":false,"type":"object","required":["url"],"title":"WebhookCreate"},"WebhookListResponse":{"properties":{"data":{"items":{"$ref":"#/components/schemas/WebhookSubscription"},"type":"array","title":"Data"},"meta":{"$ref":"#/components/schemas/Meta"}},"additionalProperties":false,"type":"object","required":["data","meta"],"title":"WebhookListResponse"},"WebhookResponse":{"properties":{"data":{"$ref":"#/components/schemas/WebhookSubscription"},"meta":{"$ref":"#/components/schemas/Meta"}},"additionalProperties":false,"type":"object","required":["data","meta"],"title":"WebhookResponse"},"WebhookSubscription":{"properties":{"id":{"type":"string","title":"Id"},"url":{"type":"string","title":"Url"},"filter":{"additionalProperties":true,"type":"object","title":"Filter"},"is_active":{"type":"boolean","title":"Is Active"},"created_at":{"type":"string","format":"date-time","title":"Created At"},"secret":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Secret"}},"additionalProperties":false,"type":"object","required":["id","url","filter","is_active","created_at"],"title":"WebhookSubscription"}},"securitySchemes":{"APIKeyHeader":{"type":"apiKey","in":"header","name":"X-Api-Key"},"ApiKeyAuth":{"type":"apiKey","in":"header","name":"X-Api-Key","description":"API key issued via seed/CLI or magic-link (free)."}}},"servers":[{"url":"http://localhost:8000","description":"Local"},{"url":"https://api.scoopkit.dev","description":"Production"}],"tags":[{"name":"events","description":"List and fetch published events"},{"name":"search","description":"Semantic search (Pro+)"},{"name":"webhooks","description":"Webhook subscriptions (Pro+)"},{"name":"taxonomy","description":"Public taxonomy (no API key)"},{"name":"auth","description":"Magic-link self-serve keys"},{"name":"health","description":"Liveness and dependency checks"}],"security":[{"ApiKeyAuth":[]}]}