{"service":"orstyde-compliance-truth-layer","service_aliases":["oracle-compliance-truth-layer"],"product":"ORSTYDE","provider":{"legal_entity":"Perpetua Group LLC"},"api_version":"1.0.0","app_version":"0.8.6-rc1","dataset_version":"ds-20260923-133503-02577dcc","description":"Product -> regulatory requirements -> tests -> officially qualified labs, every row with a truth status and a provenance chain. Human-usable, enterprise-ready, agent-native.","interfaces":{"rest":{"openapi":"https://orstyde.com/v1/openapi.json"},"mcp":{"url":"https://orstyde.com/mcp","transport":"streamable-http (POST, JSON responses; no SSE stream)","protocol_versions":["2025-11-25","2025-06-18","2025-03-26"]}},"authentication":{"type":"bearer","header":"Authorization: Bearer <api_key>","how_to_obtain":"service accounts are issued by the operator during the private beta","service_account_features":["scopes","monthly spend limit","revocation"]},"idempotency":{"required_for":["analyze_product","price_analysis","purchase_analysis","get_requirements","find_qualified_labs","register_webhook","request_quotes","book_lab"],"rest":"Idempotency-Key header","mcp":"idempotency_key argument","semantics":"same key + same arguments -> same response replayed (Idempotent-Replayed: true); same key + different arguments -> 409 idempotency_conflict"},"operations":[{"name":"get_catalog","status":"available","rest":"GET /v1/agent/catalog","mcp_tool":"get_catalog","scope":"lookup:read","idempotency_required":false,"summary":"Valid feature ids and market ids for analyze_product (start here). Unmodelled features are listed too: they are accepted and come back as explicit unknowns."},{"name":"analyze_product","status":"available","rest":"POST /v1/agent/analyses","mcp_tool":"analyze_product","scope":"analysis:write","idempotency_required":true,"summary":"Submit a product; returns a free preview and a machine-readable price quote for the full analysis."},{"name":"price_analysis","status":"available","rest":"POST /v1/agent/analyses/{analysis_id}/quotes","mcp_tool":"price_analysis","scope":"analysis:write","idempotency_required":true,"summary":"Issue a fresh price quote for an analysis (quotes expire)."},{"name":"purchase_analysis","status":"available","rest":"POST /v1/agent/orders","mcp_tool":"purchase_analysis","scope":"orders:write","idempotency_required":true,"summary":"Buy the full analysis: creates an order, pays it, executes the analysis and delivers the result."},{"name":"get_order","status":"available","rest":"GET /v1/agent/orders/{order_id}","mcp_tool":"get_order","scope":"results:read","idempotency_required":false,"summary":"Order state, transition history and next action."},{"name":"get_result","status":"available","rest":"GET /v1/agent/orders/{order_id}/result","mcp_tool":"get_result","scope":"results:read","idempotency_required":false,"summary":"Delivered analysis (pinned to a dataset_version, with sha256)."},{"name":"get_ledger","status":"available","rest":"GET /v1/agent/ledger","mcp_tool":"get_ledger","scope":"results:read","idempotency_required":false,"summary":"Hash-chained commercial event ledger of the caller (with chain verification)."},{"name":"get_requirements","status":"available","rest":"POST /v1/agent/requirements","mcp_tool":"get_requirements","scope":"lookup:read","idempotency_required":true,"summary":"Metered lookup: applicable requirements with certainty and verified legal basis."},{"name":"find_qualified_labs","status":"available","rest":"POST /v1/agent/labs/search","mcp_tool":"find_qualified_labs","scope":"lookup:read","idempotency_required":true,"summary":"Metered lookup: tests and officially qualified labs (official recognition/accreditation scopes)."},{"name":"list_review_queue","status":"available","rest":"GET /v1/operator/review/queue","mcp_tool":"list_review_queue","scope":"knowledge:review","idempotency_required":false,"summary":"Operator: candidates awaiting verification and open issues (expiry, contradiction, source change, identity conflict)."},{"name":"verify_observation","status":"available","rest":"POST /v1/operator/review/verify","mcp_tool":"verify_observation","scope":"knowledge:review","idempotency_required":false,"summary":"Operator: accept or reject a candidate observation. Accepting promotes it and supersedes the previous belief; an LLM-extracted candidate cannot become active by any other route."},{"name":"get_supplier_profile","status":"available","rest":"GET /v1/agent/suppliers/profile","mcp_tool":"get_supplier_profile","scope":"lookup:read","idempotency_required":false,"summary":"Supplier profile: legal identity, sites, capabilities, credentials, evidence, commercial observations and performance. Sections with no observed data say so; look-alike names are never merged."},{"name":"get_assertion_history","status":"available","rest":"GET /v1/agent/assertions/history","mcp_tool":"get_assertion_history","scope":"lookup:read","idempotency_required":false,"summary":"History of one economic assertion: every observation, with origin, truth status, source and date; optionally the state as of a past date. Nothing is ever overwritten."},{"name":"get_evidence","status":"available","rest":"GET /v1/agent/evidence","mcp_tool":"get_evidence","scope":"lookup:read","idempotency_required":false,"summary":"Provenance: claim -> evidence (locator, excerpt when allowed) -> document (url, version, sha256)."},{"name":"register_webhook","status":"available","rest":"POST /v1/agent/webhooks","mcp_tool":"register_webhook","scope":"webhooks:manage","idempotency_required":true,"summary":"Register a signed webhook endpoint for order events (secret returned once)."},{"name":"request_quotes","status":"available","rest":"POST /v1/agent/lab-quotes","mcp_tool":"request_quotes","scope":"labs:quote","idempotency_required":true,"summary":"Open a request for quotes: requirements -> tests -> officially qualified suppliers, each recipient kept with the reason and the evidence that justified selecting it. ORSTYDE never contacts a supplier by itself: a human sends the request and records the dispatch."},{"name":"compare_quotes","status":"available","rest":"POST /v1/agent/lab-quotes/compare","mcp_tool":"compare_quotes","scope":"labs:quote","idempotency_required":false,"summary":"Compare the quotes received for one RFQ: price, priced coverage, declared turnaround, exclusions, validity. Named prices are visible to the operator and to the buyer of that RFQ only."},{"name":"get_rfq","status":"available","rest":"GET /v1/agent/lab-quotes/{rfq_id}","mcp_tool":"get_rfq","scope":"labs:quote","idempotency_required":false,"summary":"One RFQ: product, requested tests, recipients with their selection evidence, dispatches and answers."},{"name":"list_rfqs","status":"available","rest":"GET /v1/agent/lab-quotes","mcp_tool":"list_rfqs","scope":"labs:quote","idempotency_required":false,"summary":"Your RFQs (the operator sees all of them)."},{"name":"record_rfq_dispatch","status":"available","rest":"POST /v1/operator/rfq/dispatch","mcp_tool":"record_rfq_dispatch","scope":"quotes:operate","idempotency_required":false,"summary":"Operator: record a dispatch that a human really performed. A dry-run RFQ can never be dispatched."},{"name":"record_supplier_quote","status":"available","rest":"POST /v1/operator/rfq/quotes","mcp_tool":"record_supplier_quote","scope":"quotes:operate","idempotency_required":false,"summary":"Operator: record a supplier answer and turn it into proprietary observations. Price, turnaround and availability are recorded as what the supplier DECLARED (observed because we hold the artifact), never as facts about its future performance."},{"name":"record_supplier_response","status":"available","rest":"POST /v1/operator/rfq/responses","mcp_tool":"record_supplier_response","scope":"quotes:operate","idempotency_required":false,"summary":"Operator: record a decline, a silence or a bounce."},{"name":"decide_quote","status":"available","rest":"POST /v1/operator/rfq/decide","mcp_tool":"decide_quote","scope":"quotes:operate","idempotency_required":false,"summary":"Operator: accept or reject a supplier quote. An acceptance is recorded as a transaction observation."},{"name":"get_peo_metrics","status":"available","rest":"GET /v1/operator/metrics/peo","mcp_tool":"get_peo_metrics","scope":"metrics:read","idempotency_required":false,"summary":"Proprietary Economic Observations: total, by type, predicate, supplier and vertical, freshness, enrichment ratios with their denominators. Values derived from PEOs are reported separately and never counted as PEOs."},{"name":"book_lab","status":"available","rest":"POST /v1/agent/lab-bookings","mcp_tool":"book_lab","scope":"labs:book","idempotency_required":true,"summary":"Open an engagement on an accepted quote. ORSTYDE has NO ordering channel with laboratories: the engagement starts in awaiting_order and nothing is ordered until a human places the order and an operator records it."},{"name":"track_order","status":"available","rest":"GET /v1/agent/lab-bookings/{engagement_id}","mcp_tool":"track_order","scope":"labs:book","idempotency_required":false,"summary":"State of one engagement: the events an operator recorded, the prices (quoted / accepted / final) and the schedule (promised vs observed). ORSTYDE reports what was recorded and never infers a laboratory's progress."},{"name":"list_engagements","status":"available","rest":"GET /v1/agent/lab-bookings","mcp_tool":"list_engagements","scope":"labs:book","idempotency_required":false,"summary":"Your engagements (the operator sees all of them)."},{"name":"record_engagement_order","status":"available","rest":"POST /v1/operator/engagements/order","mcp_tool":"record_engagement_order","scope":"quotes:operate","idempotency_required":false,"summary":"Operator: record an order a human really placed, with its purchase order or confirmation."},{"name":"record_engagement_event","status":"available","rest":"POST /v1/operator/engagements/events","mcp_tool":"record_engagement_event","scope":"quotes:operate","idempotency_required":false,"summary":"Operator: journalise what really happened (work started, sample received, price or deadline changed). An announced price change never rewrites the accepted price."},{"name":"record_engagement_completion","status":"available","rest":"POST /v1/operator/engagements/completion","mcp_tool":"record_engagement_completion","scope":"quotes:operate","idempotency_required":false,"summary":"Operator: record the completion. This is where the declared turnaround finally gets its observed counterpart and the final price its transaction observation."},{"name":"close_engagement","status":"available","rest":"POST /v1/operator/engagements/close","mcp_tool":"close_engagement","scope":"quotes:operate","idempotency_required":false,"summary":"Operator: an engagement that ended without delivery. A failure after a real order is recorded as proprietary knowledge about that supplier."},{"name":"store_artifact","status":"available","rest":"POST /v1/operator/artifacts","mcp_tool":"store_artifact","scope":"quotes:operate","idempotency_required":false,"summary":"Operator: store a real document (quote, e-mail, purchase order, report, invoice). Returns an immutable artifact id to pass as {\"artifact\": {\"artifact_id\": …}} when recording a quote, an order or a completion. Size and media type are checked, and the declared type must match the bytes."},{"name":"list_artifacts","status":"available","rest":"GET /v1/operator/artifacts","mcp_tool":"list_artifacts","scope":"labs:quote","idempotency_required":false,"summary":"Operator: the documents held, with their counters (real, simulated, purged, missing)."},{"name":"get_artifact","status":"available","rest":"GET /v1/operator/artifacts/{artifact_id}","mcp_tool":"get_artifact","scope":"labs:quote","idempotency_required":false,"summary":"Metadata of one document: hash, size, media type, provenance, links, status. Visible to the operator and to the buyer of the request it belongs to; anyone else gets 404."},{"name":"download_artifact","status":"available","rest":"GET /v1/operator/artifacts/{artifact_id}/content","mcp_tool":"download_artifact","scope":"labs:quote","idempotency_required":false,"summary":"The document itself, base64 encoded, to an authenticated and authorised caller. The bytes are verified against the recorded sha256 before being returned. No public and no signed URL exists."},{"name":"purge_artifact","status":"available","rest":"POST /v1/operator/artifacts/purge","mcp_tool":"purge_artifact","scope":"quotes:operate","idempotency_required":false,"summary":"Operator: delete the BYTES of a document, keeping its identity, hash, provenance and links. Refused when an active observation relies on it unless the override is used and explained."},{"name":"get_performance_metrics","status":"available","rest":"GET /v1/operator/metrics/performance","mcp_tool":"get_performance_metrics","scope":"metrics:read","idempotency_required":false,"summary":"Observed performance: quoted vs accepted vs final price, promised vs actual turnaround, on-time completion, supplier response, completion / cancellation / failure. Any statistic with fewer than three real cases returns insufficient_data instead of a number."}],"pricing":{"product":"compliance_analysis_report","status":"beta","status_note":"BETA price hypothesis, not market-validated; may change before general availability.","price_version":"2026-09-beta-1","currency":"EUR","base_minor":4900,"included_markets":1,"per_additional_market_minor":1000,"quote_valid_seconds":86400,"tax":"prices exclude VAT; B2B reverse charge may apply","formula":"base_minor + max(0, markets_modelled - included_markets) * per_additional_market_minor","free":["analyze_product preview","price_analysis"],"metered_units":{"get_requirements":1,"find_qualified_labs":1,"get_evidence":1,"get_assertion_history":1,"get_supplier_profile":1,"request_quotes":1},"authoritative":"the quote returned by analyze_product / price_analysis"},"payment":{"provider":"disabled","enabled":false,"mode":null,"live_charges":false,"payment_methods":[]},"order_state_machine":{"states":["created","payment_pending","payment_failed","paid","executing","delivered","execution_failed","canceled"],"transitions":{"created":["canceled","payment_pending"],"payment_pending":["canceled","paid","payment_failed"],"payment_failed":["canceled","payment_pending"],"paid":["executing"],"executing":["delivered","execution_failed"],"delivered":[],"execution_failed":[],"canceled":[]},"terminal":["canceled","delivered","execution_failed"],"refunds":"not_implemented"},"webhooks":{"events":["order.payment_pending","order.payment_succeeded","order.payment_failed","order.executing","order.delivered","order.execution_failed","order.canceled"],"signature":"Oracle-Signature: t=<unix>,v1=<hex HMAC-SHA256(secret, '<t>.<raw body>')>","replay_tolerance_seconds":300,"retries":8},"workflow":["discover (this document)","analyze_product -> preview + quote","get_evidence (any claim_id)","purchase_analysis (idempotent) -> order payment_pending","payment (provider) -> paid","analysis execution -> executing","delivered: get_result / order.delivered webhook","get_ledger"],"mcp_instructions":"ORSTYDE answers: which regulatory requirements apply to a product in given markets, which tests they\nimply, and which laboratories are OFFICIALLY qualified for those tests. Every row carries a truth status\n(official_fact | derived_fact | inference | unknown) and a provenance chain to an archived official document.\nUnknowns are reported as unknowns, never guessed.\n\nTypical workflow (all tools, no browser needed):\n0. get_catalog -> valid feature ids and market ids.\n1. analyze_product {product:{name?,features[]}, markets[], idempotency_key} -> free preview + machine-readable quote.\n   Feature and market ids: see the tool schema descriptions; unknown ids come back as explicit unknowns.\n2. get_evidence {claim_id} on any result row -> official source, version, sha256, locator.\n3. Price: the quote in step 1 (amount_minor, currency, price_version, expires_at); price_analysis re-quotes.\n4. purchase_analysis {quote_id, payment_method, idempotency_key}. The payment methods of this deployment are listed in\n   /.well-known/oracle-capabilities.json -> payment.payment_methods (test mode: no money moves).\n5. get_result {order_id} -> full analysis pinned to a dataset_version with a sha256.\nget_requirements / find_qualified_labs are metered lookups (no purchase). get_ledger shows your commercial events.\nEvery commercial tool needs a fresh idempotency_key (8-128 chars) per intended action; reuse it only to retry.\nSupplier quotes (Pack 8.4): request_quotes {product, markets, idempotency_key} opens a request for quotes and returns\nthe suppliers ORSTYDE selected, each with the reason and the evidence behind it. ORSTYDE contacts NO supplier by\nitself: a human sends the request and an operator records the dispatch and every answer, with its artifact. Use\nget_rfq / compare_quotes to follow it. A supplier's price, turnaround and availability are recorded as what that\nsupplier DECLARED, never as facts about its future performance. Named prices are private to the operator and to the\nbuyer of that RFQ.\nExecution (Pack 8.5): book_lab {quote_id} opens an engagement in awaiting_order. ORSTYDE has NO ordering channel with\nlaboratories and orders NOTHING: a human places the order and an operator records it, then each step and the\ncompletion, each with its document. track_order {engagement_id} returns the events that were recorded — it never\ninfers a laboratory's progress. After a completion, what the supplier PROMISED (Pack 8.4) and what ORSTYDE OBSERVED\nare two separate assertions you can compare; a statistic backed by fewer than three real cases is returned as\ninsufficient_data rather than a number.","truth_statuses":["official_fact","derived_fact","inference","unknown"],"not_available":[],"rate_limit_per_minute":120}
