{"openapi":"3.1.0","info":{"title":"Bixel API","version":"1.0.0-alpha","description":"Verified private company and market data with receipts: dated, provenance-tagged facts. Every value carries `provenance` (observed | company_stated), `as_of`, and its source. Open tier: current state, per-entity, no key. Free key: values on recent history (last 90 days), claims, evidence. Pro: the full archive (history depth). Docs: https://bixel.com/docs/ (rendered from this document; the contract itself is served at https://api.bixel.com/v1/openapi.json)\n\nThis document is the normative contract (unified-api-mcp-spec.md is the rationale). The route handlers, MCP tool set, and docs pages validate against it. OperationIds and summaries are written agent-first: they mirror MCP tool names and descriptions."},"servers":[{"url":"https://api.bixel.com"}],"paths":{"/v1/search":{"get":{"operationId":"search","summary":"Search companies","description":"Resolve a free-text name to canonical identifiers: top-10 matching companies (by domain, slug, or name) and categories. The entry point when you don't know the apex domain yet.","parameters":[{"name":"q","in":"query","required":true,"description":"Free text: a company name, domain fragment, or category name.","schema":{"type":"string","maxLength":100,"examples":["pinecone","vector"]}}],"responses":{"200":{"description":"Ranked matches, capped at 10 combined.","content":{"application/json":{"schema":{"type":"object","required":["data","meta"],"properties":{"data":{"$ref":"#/components/schemas/SearchResults"},"meta":{"$ref":"#/components/schemas/Meta"}}}}}},"400":{"$ref":"#/components/responses/Problem"},"429":{"$ref":"#/components/responses/Problem"}}}},"/v1/categories":{"get":{"operationId":"list_categories","summary":"List categories","description":"List every category: slug, name, description, comparison criteria, and member count. The directory — start here to discover what Bixel tracks.","responses":{"200":{"description":"The category directory.","content":{"application/json":{"schema":{"type":"object","required":["data","meta"],"properties":{"data":{"type":"object","required":["categories"],"properties":{"categories":{"type":"array","items":{"$ref":"#/components/schemas/Category"}}}},"meta":{"$ref":"#/components/schemas/Meta"}}}}}},"429":{"$ref":"#/components/responses/Problem"}}}},"/v1/categories/{slug}":{"get":{"operationId":"get_category","summary":"Get a category","description":"Get one category's membership with a per-member rollup: per-dimension fact counts, last capture date, and active-posting count for every company in the category.","parameters":[{"name":"slug","in":"path","required":true,"description":"Category slug from /v1/categories, e.g. `vector-databases`.","schema":{"type":"string","examples":["vector-databases"]}}],"responses":{"200":{"description":"The category with members.","content":{"application/json":{"schema":{"type":"object","required":["data","meta"],"properties":{"data":{"$ref":"#/components/schemas/CategoryDetail"},"meta":{"$ref":"#/components/schemas/Meta"}}}}}},"400":{"$ref":"#/components/responses/Problem"},"404":{"$ref":"#/components/responses/Problem"},"429":{"$ref":"#/components/responses/Problem"}}}},"/v1/companies/{company}":{"get":{"operationId":"get_company","summary":"Get a company record","description":"Get a company's full current state: facts across all dimensions (pricing, features, security, positioning, stack, hiring, reliability, funding, location, legal), each with provenance, as_of date, and source URL. Identify companies by apex domain, e.g. pinecone.io.","parameters":[{"$ref":"#/components/parameters/CompanyPath"}],"responses":{"200":{"description":"The company record.","content":{"application/json":{"schema":{"type":"object","required":["data","meta"],"properties":{"data":{"$ref":"#/components/schemas/CompanyRecord"},"meta":{"$ref":"#/components/schemas/Meta"}}}}}},"400":{"$ref":"#/components/responses/Problem"},"404":{"$ref":"#/components/responses/Problem"},"429":{"$ref":"#/components/responses/Problem"}}}},"/v1/companies/{company}/facts":{"get":{"operationId":"get_company_facts","summary":"Get current facts","description":"Get a company's current facts as a filterable flat list. Filter by dimension, provenance, or key prefix; paginate with limit/cursor. Same rows as get_company, ungrouped.","parameters":[{"$ref":"#/components/parameters/CompanyPath"},{"name":"dimension","in":"query","description":"One of the 10 dimensions.","schema":{"type":"string","enum":["pricing","features","security","positioning","stack","hiring","reliability","funding","location","legal"]}},{"name":"provenance","in":"query","schema":{"type":"string","enum":["observed","company_stated"]}},{"name":"key_prefix","in":"query","description":"Return only facts whose key starts with this prefix, e.g. `pricing.tier.`","schema":{"type":"string"}},{"name":"as_of","in":"query","description":"RESERVED (point-in-time replay; requires a key when it ships). Currently answers 501 `not_yet_available`.","schema":{"type":"string","format":"date"}},{"$ref":"#/components/parameters/Limit"},{"$ref":"#/components/parameters/Cursor"}],"responses":{"200":{"description":"The filtered facts, dimension-ordered.","content":{"application/json":{"schema":{"type":"object","required":["data","meta"],"properties":{"data":{"type":"object","required":["company","facts"],"properties":{"company":{"$ref":"#/components/schemas/CompanyRef"},"facts":{"type":"array","items":{"$ref":"#/components/schemas/FlatFact"}}}},"meta":{"$ref":"#/components/schemas/Meta"}}}}}},"400":{"$ref":"#/components/responses/Problem"},"404":{"$ref":"#/components/responses/Problem"},"429":{"$ref":"#/components/responses/Problem"},"501":{"$ref":"#/components/responses/Problem"}}}},"/v1/companies/{company}/jobs":{"get":{"operationId":"get_company_jobs","summary":"Get live job postings","description":"Get a company's live job postings with the compensation breakout: base ranges where stated, equity/bonus statedness — honest `not_stated`, never guessed. Newest first.","parameters":[{"$ref":"#/components/parameters/CompanyPath"},{"name":"include_closed","in":"query","description":"Includes closed postings (the velocity history). Requires a free key; keyless calls answer 401 key_required.","schema":{"type":"boolean"}},{"$ref":"#/components/parameters/Limit"},{"$ref":"#/components/parameters/Cursor"}],"responses":{"200":{"description":"Active postings, newest first.","content":{"application/json":{"schema":{"type":"object","required":["data","meta"],"properties":{"data":{"type":"object","required":["company","postings"],"properties":{"company":{"$ref":"#/components/schemas/CompanyRef"},"postings":{"type":"array","items":{"$ref":"#/components/schemas/JobPosting"}}}},"meta":{"$ref":"#/components/schemas/Meta"}}}}}},"400":{"$ref":"#/components/responses/Problem"},"401":{"$ref":"#/components/responses/Problem"},"404":{"$ref":"#/components/responses/Problem"},"429":{"$ref":"#/components/responses/Problem"}},"security":[{},{"bearerKey":[]},{"apiKeyHeader":[]}]}},"/v1/companies/{company}/facts/{key}/proof":{"get":{"operationId":"get_fact_proof","summary":"Get a fact's proof bundle","description":"Get the cryptographic proof bundle for one fact: the capture behind it (content-addressed sha256), its merkle inclusion path in a hash-chained manifest, and the OpenTimestamps proof anchoring the batch in the Bitcoin blockchain. Verify offline with bixel-verify — zero trust in Bixel required. Attests observation-at-time, never extraction correctness.","parameters":[{"$ref":"#/components/parameters/CompanyPath"},{"name":"key","in":"path","required":true,"description":"The fact key, e.g. `pricing.tier.standard.monthly_usd`.","schema":{"type":"string"}},{"name":"provenance","in":"query","description":"Selects between provenance twins of the same key; default prefers observed.","schema":{"type":"string","enum":["observed","company_stated"]}}],"responses":{"200":{"description":"The proof bundle.","content":{"application/json":{"schema":{"type":"object","required":["data","meta"],"properties":{"data":{"$ref":"#/components/schemas/ProofBundle"},"meta":{"$ref":"#/components/schemas/Meta"}}}}}},"400":{"$ref":"#/components/responses/Problem"},"404":{"$ref":"#/components/responses/Problem"},"429":{"$ref":"#/components/responses/Problem"},"503":{"$ref":"#/components/responses/Problem"}}}},"/v1/openapi.json":{"get":{"operationId":"get_openapi","summary":"Get this OpenAPI contract","description":"This contract, as served by the deployed API.","responses":{"200":{"description":"The OpenAPI 3.1 document."}}}},"/v1/changes":{"get":{"operationId":"query_changes","summary":"Query the change feed","description":"The cross-company change feed: dated events labeled by derivation. confirmed events are 2-capture-debounced live changes (they cannot flap); historical events are web-archive generation diffs, dated by the later generation. The default feed serves those two; baseline/legacy/orphaned are inspectable via ?derivation=. Access ladder: keyless callers get the masked view (that + when, last 90 days / 50 events, no cursors); a free key unmasks values and summaries with working cursors inside the same 90-day window; Pro unlocks the full archive.","security":[{},{"bearerKey":[]},{"apiKeyHeader":[]}],"parameters":[{"name":"category","in":"query","description":"Company category slug, e.g. vector-databases.","schema":{"type":"string"}},{"name":"company","in":"query","description":"Apex domain or slug.","schema":{"type":"string"}},{"name":"dimension","in":"query","schema":{"type":"string","enum":["pricing","features","security","positioning","stack","hiring","reliability","funding","location","legal"]}},{"name":"type","in":"query","description":"Event type, e.g. pricing_changed.","schema":{"type":"string"}},{"name":"since","in":"query","schema":{"type":"string","format":"date"}},{"name":"until","in":"query","schema":{"type":"string","format":"date"}},{"name":"min_significance","in":"query","schema":{"type":"string","enum":["normal","high"]}},{"name":"derivation","in":"query","description":"Filter to one derivation class. Unset serves the default feed: confirmed + historical. baseline/legacy/orphaned are inspectable but never pose as live change.","schema":{"type":"string","enum":["confirmed","historical","baseline","legacy","orphaned"]}},{"$ref":"#/components/parameters/Limit"},{"$ref":"#/components/parameters/Cursor"}],"responses":{"200":{"description":"The feed page.","content":{"application/json":{"schema":{"type":"object","required":["data","meta"],"properties":{"data":{"type":"object","required":["events"],"properties":{"events":{"type":"array","items":{"$ref":"#/components/schemas/ChangeEvent"}}}},"meta":{"$ref":"#/components/schemas/Meta"}}}}}},"400":{"$ref":"#/components/responses/Problem"},"404":{"$ref":"#/components/responses/Problem"},"429":{"$ref":"#/components/responses/Problem"}}}},"/v1/companies/{company}/history":{"get":{"operationId":"get_company_history","summary":"Get a company's change history","description":"One company's dated change log, filterable by dimension, date range, exact fact_key, or derivation class (default serves confirmed + historical). Access ladder: keyless = masked (90 days / 50 events); free key = values within the last 90 days, with cursors; Pro = full depth back to the earliest event (2020 for the deepest members).","security":[{},{"bearerKey":[]},{"apiKeyHeader":[]}],"parameters":[{"$ref":"#/components/parameters/CompanyPath"},{"name":"dimension","in":"query","schema":{"type":"string","enum":["pricing","features","security","positioning","stack","hiring","reliability","funding","location","legal"]}},{"name":"since","in":"query","schema":{"type":"string","format":"date"}},{"name":"until","in":"query","schema":{"type":"string","format":"date"}},{"name":"fact_key","in":"query","schema":{"type":"string"}},{"name":"derivation","in":"query","description":"Filter to one derivation class. Unset serves the default feed: confirmed + historical. baseline/legacy/orphaned are inspectable but never pose as live change.","schema":{"type":"string","enum":["confirmed","historical","baseline","legacy","orphaned"]}},{"$ref":"#/components/parameters/Limit"},{"$ref":"#/components/parameters/Cursor"}],"responses":{"200":{"description":"The company's events.","content":{"application/json":{"schema":{"type":"object","required":["data","meta"],"properties":{"data":{"type":"object","required":["company","events"],"properties":{"company":{"$ref":"#/components/schemas/CompanyRef"},"events":{"type":"array","items":{"$ref":"#/components/schemas/ChangeEvent"}}}},"meta":{"$ref":"#/components/schemas/Meta"}}}}}},"400":{"$ref":"#/components/responses/Problem"},"404":{"$ref":"#/components/responses/Problem"},"429":{"$ref":"#/components/responses/Problem"}}}},"/v1/companies/{company}/claims":{"get":{"operationId":"check_company_claims","summary":"Check claimed vs observed","description":"Claimed-vs-observed for a company's facts: what they state vs what Bixel independently measured. Five honest states; a missing observation reads unverified, never a guess. Requires a free key.","security":[{"bearerKey":[]},{"apiKeyHeader":[]}],"parameters":[{"$ref":"#/components/parameters/CompanyPath"},{"name":"keys","in":"query","description":"Comma-separated exact keys (max 200); absent keys report state=absent. Default: every key with a side.","schema":{"type":"string"}}],"responses":{"200":{"description":"The claim checks.","content":{"application/json":{"schema":{"type":"object","required":["data","meta"],"properties":{"data":{"type":"object","required":["company","claims"],"properties":{"company":{"$ref":"#/components/schemas/CompanyRef"},"claims":{"type":"array","items":{"$ref":"#/components/schemas/ClaimCheck"}}}},"meta":{"$ref":"#/components/schemas/Meta"}}}}}},"400":{"$ref":"#/components/responses/Problem"},"401":{"$ref":"#/components/responses/Problem"},"404":{"$ref":"#/components/responses/Problem"},"429":{"$ref":"#/components/responses/Problem"}}}},"/v1/companies/{company}/trajectory":{"get":{"operationId":"get_company_trajectory","summary":"Get a company's trajectory","description":"Direction over a window (30d/90d/365d): per-dimension event counts, add/remove/change classes, net surface growth — arithmetic from the debounced change log, never narrative. Requires a free key. The 365d window requires Pro; 30d/90d work with any key (a silently floored year window would return confidently wrong numbers — the API refuses with upgrade_required instead).","security":[{"bearerKey":[]},{"apiKeyHeader":[]}],"parameters":[{"$ref":"#/components/parameters/CompanyPath"},{"name":"window","in":"query","schema":{"type":"string","enum":["30d","90d","365d"],"default":"90d"}}],"responses":{"200":{"description":"The trajectory.","content":{"application/json":{"schema":{"type":"object","required":["data","meta"],"properties":{"data":{"type":"object"},"meta":{"$ref":"#/components/schemas/Meta"}}}}}},"400":{"$ref":"#/components/responses/Problem"},"401":{"$ref":"#/components/responses/Problem"},"404":{"$ref":"#/components/responses/Problem"},"429":{"$ref":"#/components/responses/Problem"}}}},"/v1/companies/{company}/evidence":{"get":{"operationId":"get_fact_evidence","summary":"Get a fact's evidence trail","description":"The provenance trail for one (company, key): each side's fact, source URL, capture reference, and the proof-endpoint URL for the cryptographic bundle. Requires a free key.","security":[{"bearerKey":[]},{"apiKeyHeader":[]}],"parameters":[{"$ref":"#/components/parameters/CompanyPath"},{"name":"key","in":"query","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"The evidence.","content":{"application/json":{"schema":{"type":"object","required":["data","meta"],"properties":{"data":{"type":"object"},"meta":{"$ref":"#/components/schemas/Meta"}}}}}},"400":{"$ref":"#/components/responses/Problem"},"401":{"$ref":"#/components/responses/Problem"},"404":{"$ref":"#/components/responses/Problem"},"429":{"$ref":"#/components/responses/Problem"}}}}},"components":{"parameters":{"CompanyPath":{"name":"company","in":"path","required":true,"description":"Apex domain (canonical, e.g. `pinecone.io`). Bare values are resolved as legacy slugs. Unknown names: resolve via /v1/search first.","schema":{"type":"string","examples":["pinecone.io"]}},"Limit":{"name":"limit","in":"query","description":"Page size, default 50, max 200.","schema":{"type":"integer","minimum":1,"maximum":200,"default":50}},"Cursor":{"name":"cursor","in":"query","description":"Opaque keyset cursor from meta.next_cursor; pass back exactly as received.","schema":{"type":"string"}}},"responses":{"Problem":{"description":"RFC 9457 problem document. `code` is a stable machine string; keyed-capability errors include how to get a key.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}},"schemas":{"Fact":{"type":"object","description":"One dimensioned, dated, sourced, provenance-tagged value. Identity is (company, key); fact row ids are internal and unstable by design.","required":["key","value","provenance","as_of"],"properties":{"key":{"type":"string","examples":["pricing.model","stack.tech.nextjs"]},"value":{},"unit":{"type":["string","null"],"examples":["usd_per_month","pct"]},"provenance":{"type":"string","enum":["observed","company_stated"]},"confidence":{"type":["number","null"],"minimum":0,"maximum":1},"as_of":{"type":"string","format":"date"},"source_url":{"type":["string","null"]},"capture_id":{"type":["string","null"],"description":"Set when a stored capture row backs this fact; evidence is source_url-first."},"product":{"type":["string","null"],"description":"Product scope for multi-product companies; null = company-level."}}},"FlatFact":{"allOf":[{"$ref":"#/components/schemas/Fact"},{"type":"object","required":["dimension"],"properties":{"dimension":{"type":"string","enum":["pricing","features","security","positioning","stack","hiring","reliability","funding","location","legal"]}}}]},"CompanyRef":{"type":"object","required":["name","domain","slug"],"properties":{"name":{"type":"string"},"domain":{"type":"string"},"slug":{"type":["string","null"]}}},"SearchResults":{"type":"object","required":["query","companies","categories"],"properties":{"query":{"type":"string"},"companies":{"type":"array","items":{"$ref":"#/components/schemas/CompanyRef"}},"categories":{"type":"array","items":{"type":"object","required":["slug","name"],"properties":{"slug":{"type":"string"},"name":{"type":"string"}}}}}},"Category":{"type":"object","required":["slug","name","description","criteria","company_count"],"properties":{"slug":{"type":"string","examples":["vector-databases"]},"name":{"type":"string"},"description":{"type":["string","null"]},"criteria":{"type":"array","description":"Dimensions/keys members are compared on.","items":{"type":"string"}},"company_count":{"type":"integer"}}},"CategoryDetail":{"allOf":[{"$ref":"#/components/schemas/Category"},{"type":"object","required":["companies"],"properties":{"companies":{"type":"array","items":{"type":"object","required":["name","domain","slug","last_captured_at","jobs","dimensions","coverage"],"properties":{"name":{"type":"string"},"domain":{"type":"string"},"slug":{"type":["string","null"]},"last_captured_at":{"type":["string","null"],"format":"date"},"jobs":{"$ref":"#/components/schemas/JobsBlock"},"dimensions":{"type":"object","description":"Per-dimension fact counts; zero-count dimensions omitted.","additionalProperties":{"type":"integer"}},"coverage":{"$ref":"#/components/schemas/CoverageSummary"}}}}}}]},"JobPosting":{"type":"object","required":["title","url","comp","first_seen_at","last_seen_at","active","provider"],"properties":{"title":{"type":"string"},"level":{"type":["string","null"],"examples":["senior"]},"department":{"type":["string","null"]},"location":{"type":["string","null"]},"remote":{"type":["boolean","null"]},"employment_type":{"type":["string","null"]},"url":{"type":"string"},"comp":{"type":"object","description":"Honest absence: fields are null + \"not_stated\" when the posting doesn't state them — never guessed.","required":["base_min","base_max","currency","equity","bonus","source"],"properties":{"base_min":{"type":["number","null"]},"base_max":{"type":["number","null"]},"currency":{"type":["string","null"]},"equity":{"type":"string","enum":["stated","not_stated"]},"equity_note":{"type":["string","null"]},"bonus":{"type":"string","enum":["stated","not_stated"]},"bonus_note":{"type":["string","null"]},"source":{"type":"string","enum":["ats_structured","description_extracted","not_stated"]}}},"posted_at":{"type":["string","null"],"format":"date"},"first_seen_at":{"type":"string","format":"date-time"},"last_seen_at":{"type":"string","format":"date-time"},"closed_at":{"type":["string","null"],"format":"date-time"},"active":{"type":"boolean"},"provider":{"type":"string","examples":["ashby","greenhouse"]}}},"DimensionBlock":{"type":"object","required":["count","last_changed_at","facts"],"properties":{"count":{"type":"integer"},"last_changed_at":{"type":["string","null"],"description":"Latest dated change event in this dimension (the open tier's 'something changed here, when')."},"facts":{"type":"array","items":{"$ref":"#/components/schemas/Fact"}}}},"CompanyRecord":{"type":"object","required":["company","last_captured_at","jobs","dimensions","coverage"],"properties":{"company":{"type":"object","required":["name","domain","slug","categories"],"properties":{"name":{"type":"string"},"domain":{"type":"string"},"slug":{"type":["string","null"]},"categories":{"type":"array","items":{"type":"string"}}}},"last_captured_at":{"type":["string","null"],"format":"date"},"jobs":{"$ref":"#/components/schemas/JobsBlock"},"dimensions":{"type":"object","description":"Keyed by dimension (pricing, features, security, positioning, stack, hiring, reliability, funding, location, legal); dimensions with no facts are omitted.","additionalProperties":{"$ref":"#/components/schemas/DimensionBlock"}},"coverage":{"$ref":"#/components/schemas/CoverageSummary"}}},"ProofBundle":{"type":"object","description":"Everything needed to verify a fact's chain of custody offline (steps 2-4 of the bixel-verify contract embed; step 1 needs the raw bytes the bundle points at). A passing verification proves the raw content was observed at the recorded time and anchored in Bitcoin — it does NOT prove the extraction is correct.","required":["fact","capture","inclusion_proof","anchor","attests","verify_with"],"properties":{"fact":{"allOf":[{"$ref":"#/components/schemas/FlatFact"},{"type":"object","required":["extractor_version"],"properties":{"extractor_version":{"type":"string"}}}]},"capture":{"type":"object","required":["kind","id","captured_at","sha256","raw"],"properties":{"kind":{"type":"string","enum":["page_capture","crawl_snapshot","ats_capture"]},"id":{"type":"string","description":"Capture row id — stable (append-only table); usable as a citation anchor."},"captured_at":{"type":"string","format":"date-time"},"source_url":{"type":["string","null"]},"sha256":{"type":"string","description":"Content hash of the captured raw; also embedded in the raw key (content addressing)."},"raw":{"type":"object","required":["key","hash_rule"],"properties":{"key":{"type":"string","description":"Content-addressed storage key of the raw bytes."},"hash_rule":{"type":"string","description":"How to re-hash the raw object to reproduce sha256."}}}}},"inclusion_proof":{"type":"object","required":["merkle_spec","manifest_key","manifest_sha256","leaf","leaf_index","path","merkle_root"],"properties":{"merkle_spec":{"type":"string","description":"Names the exact construction, e.g. rfc6962-sha256/csv-data-rows-v1."},"manifest_key":{"type":"string"},"manifest_sha256":{"type":"string"},"leaf":{"type":"string","description":"The exact manifest CSV row — the leaf preimage, verbatim."},"leaf_index":{"type":"integer"},"path":{"type":"array","items":{"type":"object","required":["sibling","side"],"properties":{"sibling":{"type":"string"},"side":{"type":"string","enum":["left","right"]}}}},"merkle_root":{"type":"string"}}},"anchor":{"type":"object","required":["meta_key","meta_b64","ots_key","ots_b64","anchored_at","previous_meta_key"],"properties":{"meta_key":{"type":"string"},"meta_b64":{"type":"string","description":"The meta document's exact bytes (base64) — what the .ots proof commits to; carries merkle roots + the chain link."},"ots_key":{"type":["string","null"]},"ots_b64":{"type":["string","null"],"description":"The OpenTimestamps proof (base64). Proofs are born pending and upgrade to Bitcoin-attested as calendars aggregate."},"anchored_at":{"type":"string","format":"date-time"},"previous_meta_key":{"type":["string","null"],"description":"The hash chain walks back to the genesis record."}}},"attests":{"type":"string","description":"The honesty boundary, verbatim."},"verify_with":{"type":"string","format":"uri"}}},"Meta":{"type":"object","properties":{"generated_at":{"type":"string","format":"date-time"},"count":{"type":"integer","description":"Items in this page."},"total":{"type":"integer","description":"Items matching before pagination."},"next_cursor":{"type":["string","null"]},"notice":{"type":["string","null"]}}},"Problem":{"type":"object","required":["type","title","status","code"],"properties":{"type":{"type":"string","format":"uri"},"title":{"type":"string"},"status":{"type":"integer"},"code":{"type":"string","examples":["company_not_found","key_required","invalid_parameter","invalid_cursor","not_yet_available"]},"detail":{"type":"string"},"hint":{"type":"string"},"docs_url":{"type":"string","format":"uri"}}},"ChangeEvent":{"type":"object","description":"One dated change event, labeled by derivation: confirmed events are 2-capture-debounced (they cannot flap); historical events are web-archive generation diffs. Masked (open tier): values and summary omitted, masked=true. detected_at = first observation (the semantic date).","required":["id","dimension","type","significance","detected_at"],"properties":{"id":{"type":"string","description":"Stable row id (append-only) — usable as a citation anchor."},"company":{"type":["string","null"],"description":"Apex domain (feed route)."},"dimension":{"type":["string","null"]},"fact_key":{"type":["string","null"]},"type":{"type":"string","examples":["pricing_changed","feature_added"]},"significance":{"type":"string","enum":["normal","high"]},"detected_at":{"type":"string","format":"date"},"derivation":{"type":"string","enum":["confirmed","historical","baseline","legacy","orphaned"],"description":"How the event was derived. confirmed = 2-capture-debounced live change (cannot flap); historical = web-archive generation diff, dated by the later generation; baseline = first observation / pipeline initialization (not a company change); legacy = pre-spine writer; orphaned = a chain suffix the current record no longer corroborates. The default feed serves confirmed + historical only."},"masked":{"type":"boolean","description":"Present+true on the open tier."},"old_value":{"description":"Keyed only."},"new_value":{"description":"Keyed only."},"summary":{"type":["string","null"],"description":"Keyed only."}}},"ClaimCheck":{"type":"object","description":"Claimed-vs-observed for one key. Claim-only keys are unverified, never false — a missing observation is never synthesized (the fabrication guard is structural).","required":["key","state","match","claimed","observed"],"properties":{"key":{"type":"string"},"state":{"type":"string","enum":["verified","conflict","unverified","observed_only","absent"]},"match":{"description":"true | false | \"unverified\""},"claimed":{"type":["object","null"],"properties":{"value":{},"as_of":{"type":"string","format":"date"},"source_url":{"type":["string","null"]}}},"observed":{"type":["object","null"],"properties":{"value":{},"as_of":{"type":"string","format":"date"},"source_url":{"type":["string","null"]}}}}},"CoverageSummary":{"type":"object","description":"Explicit depth summary. Coverage varies by company STRUCTURALLY (category-by-category growth trails thin coverage behind a dense core) — read depth from this block, never infer it from fact counts. thin = fewer than 3 dimensions captured.","required":["dimensions_captured","dimensions_total","per_dimension","thin"],"properties":{"dimensions_captured":{"type":"integer","description":"Dimensions with at least one fact."},"dimensions_total":{"type":"integer"},"per_dimension":{"type":"object","additionalProperties":{"type":"integer"},"description":"Zero-filled per-dimension fact counts — absence is explicit, never by omission."},"thin":{"type":"boolean","description":"This record trails the dense core."}}},"JobsBlock":{"type":"object","description":"Labeled so honest dual measurement never reads as a contradiction: active_postings counts a detected ATS board (ats_tracked=true); hiring.open_roles is what the careers page STATES. A company can honestly show 0 tracked postings and a stated count.","required":["active_postings","ats_tracked"],"properties":{"active_postings":{"type":"integer"},"ats_tracked":{"type":"boolean"},"note":{"type":"string","description":"Present only when NOT tracked — the coverage note, in-band."}}}},"securitySchemes":{"bearerKey":{"type":"http","scheme":"bearer","description":"bx_-prefixed API key. Free keys: https://bixel.com/account/"},"apiKeyHeader":{"type":"apiKey","in":"header","name":"x-api-key"}}}}