{"openapi":"3.1.0","info":{"title":"probe402","version":"1","description":"The Machine Commerce Observatory: independent readings of x402 and MPP endpoints — alive right now, quoting what, and how fast? Probed on a published schedule under one published rubric, every reading traceable to a retained capture. Blocked and rate-limited are told apart from unreachable at capture time, so a defended endpoint is never reported as dead. Call before paying an unfamiliar endpoint, or to check whether one you use has repriced or rotated its payTo."},"servers":[{"url":"https://probe402.com"}],"paths":{"/v1/history/30/{endpoint_id}":{"get":{"operationId":"history_depth_30","summary":"Probe history, 30 days","description":"The Machine Commerce Observatory: independent readings of x402 and MPP endpoints — alive right now, quoting what, and how fast? Probed on a published schedule under one published rubric, every reading traceable to a retained capture. Blocked and rate-limited are told apart from unreachable at capture time, so a defended endpoint is never reported as dead. Call before paying an unfamiliar endpoint, or to check whether one you use has repriced or rotated its payTo. Delivery: the recent window comes back inline in the answer. Deeper history is delivered as addresses — the answer's `delivery.bulk` block lists sealed-day manifests you fetch yourself from /chain/{date}, each with the chain digest to verify it. History is bulk by design: a graded answer sits on an agent's decision path, and that path cannot afford an inline archive fold. Tier depth and price are unchanged.","parameters":[{"name":"endpoint_id","in":"path","required":true,"schema":{"type":"string","pattern":"^ep_[0-9a-f]{16}$"}}],"x-payment-info":{"x402Version":2,"accepts":[{"scheme":"exact","network":"eip155:8453","price_usd":0.005,"amount":"5000","asset":"USDC on the network above; the contract address is accepts[0].asset in the live PAYMENT-REQUIRED header","maxTimeoutSeconds":300,"payTo":"0x93cF736F908C0C8765C534F096652dE20560Db3a"}]},"responses":{"200":{"description":"The answer: 30 days of rows, or insufficient-history with what is held","content":{"application/json":{"schema":{"type":"object","properties":{"kind":{"type":"string","enum":["covered","insufficient-history","not-covered","host","current-reading"]}},"required":["kind"]}}}},"402":{"description":"Payment required: the x402 v2 challenge is in the PAYMENT-REQUIRED header; the body echoes its error","headers":{"PAYMENT-REQUIRED":{"description":"base64 of a JSON x402 v2 PaymentRequired: x402Version, error, resource, accepts[], extensions","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"},"note":{"type":"string"},"says":{"type":"string"},"free_grade":{"type":"string"}},"required":["error"]}}}},"404":{"description":"The id is not on the seed list: the not-covered object, answered before any payment is asked for","content":{"application/json":{"schema":{"type":"object","properties":{"kind":{"type":"string","enum":["covered","insufficient-history","not-covered","host","current-reading"]}},"required":["kind"]}}}}}}},"/v1/history/180/{endpoint_id}":{"get":{"operationId":"history_depth_180","summary":"Probe history, 180 days","description":"The Machine Commerce Observatory: independent readings of x402 and MPP endpoints — alive right now, quoting what, and how fast? Probed on a published schedule under one published rubric, every reading traceable to a retained capture. Blocked and rate-limited are told apart from unreachable at capture time, so a defended endpoint is never reported as dead. Call before paying an unfamiliar endpoint, or to check whether one you use has repriced or rotated its payTo. Delivery: the recent window comes back inline in the answer. Deeper history is delivered as addresses — the answer's `delivery.bulk` block lists sealed-day manifests you fetch yourself from /chain/{date}, each with the chain digest to verify it. History is bulk by design: a graded answer sits on an agent's decision path, and that path cannot afford an inline archive fold. Tier depth and price are unchanged.","parameters":[{"name":"endpoint_id","in":"path","required":true,"schema":{"type":"string","pattern":"^ep_[0-9a-f]{16}$"}}],"x-payment-info":{"x402Version":2,"accepts":[{"scheme":"exact","network":"eip155:8453","price_usd":0.02,"amount":"20000","asset":"USDC on the network above; the contract address is accepts[0].asset in the live PAYMENT-REQUIRED header","maxTimeoutSeconds":300,"payTo":"0x93cF736F908C0C8765C534F096652dE20560Db3a"}]},"responses":{"200":{"description":"The answer: 180 days of rows, or insufficient-history with what is held","content":{"application/json":{"schema":{"type":"object","properties":{"kind":{"type":"string","enum":["covered","insufficient-history","not-covered","host","current-reading"]}},"required":["kind"]}}}},"402":{"description":"Payment required: the x402 v2 challenge is in the PAYMENT-REQUIRED header; the body echoes its error","headers":{"PAYMENT-REQUIRED":{"description":"base64 of a JSON x402 v2 PaymentRequired: x402Version, error, resource, accepts[], extensions","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"},"note":{"type":"string"},"says":{"type":"string"},"free_grade":{"type":"string"}},"required":["error"]}}}},"404":{"description":"The id is not on the seed list: the not-covered object, answered before any payment is asked for","content":{"application/json":{"schema":{"type":"object","properties":{"kind":{"type":"string","enum":["covered","insufficient-history","not-covered","host","current-reading"]}},"required":["kind"]}}}}}}},"/v1/history/full/{endpoint_id}":{"get":{"operationId":"history_depth_full","summary":"Probe history, full archive","description":"The Machine Commerce Observatory: independent readings of x402 and MPP endpoints — alive right now, quoting what, and how fast? Probed on a published schedule under one published rubric, every reading traceable to a retained capture. Blocked and rate-limited are told apart from unreachable at capture time, so a defended endpoint is never reported as dead. Call before paying an unfamiliar endpoint, or to check whether one you use has repriced or rotated its payTo. Delivery: the recent window comes back inline in the answer. Deeper history is delivered as addresses — the answer's `delivery.bulk` block lists sealed-day manifests you fetch yourself from /chain/{date}, each with the chain digest to verify it. History is bulk by design: a graded answer sits on an agent's decision path, and that path cannot afford an inline archive fold. Tier depth and price are unchanged.","parameters":[{"name":"endpoint_id","in":"path","required":true,"schema":{"type":"string","pattern":"^ep_[0-9a-f]{16}$"}}],"x-payment-info":{"x402Version":2,"accepts":[{"scheme":"exact","network":"eip155:8453","price_usd":0.05,"amount":"50000","asset":"USDC on the network above; the contract address is accepts[0].asset in the live PAYMENT-REQUIRED header","maxTimeoutSeconds":300,"payTo":"0x93cF736F908C0C8765C534F096652dE20560Db3a"}]},"responses":{"200":{"description":"The answer: the full archive of rows, or insufficient-history with what is held","content":{"application/json":{"schema":{"type":"object","properties":{"kind":{"type":"string","enum":["covered","insufficient-history","not-covered","host","current-reading"]}},"required":["kind"]}}}},"402":{"description":"Payment required: the x402 v2 challenge is in the PAYMENT-REQUIRED header; the body echoes its error","headers":{"PAYMENT-REQUIRED":{"description":"base64 of a JSON x402 v2 PaymentRequired: x402Version, error, resource, accepts[], extensions","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"},"note":{"type":"string"},"says":{"type":"string"},"free_grade":{"type":"string"}},"required":["error"]}}}},"404":{"description":"The id is not on the seed list: the not-covered object, answered before any payment is asked for","content":{"application/json":{"schema":{"type":"object","properties":{"kind":{"type":"string","enum":["covered","insufficient-history","not-covered","host","current-reading"]}},"required":["kind"]}}}}}}},"/grade/{endpoint_id}":{"get":{"operationId":"grade_free","summary":"Free grade: the current observation plus recent counts","parameters":[{"name":"endpoint_id","in":"path","required":true,"schema":{"type":"string","pattern":"^ep_[0-9a-f]{16}$"}}],"responses":{"200":{"description":"The answer: covered, insufficient-history or not-covered, each saying so in `kind`","content":{"application/json":{"schema":{"type":"object","properties":{"kind":{"type":"string","enum":["covered","insufficient-history","not-covered","host","current-reading"]}},"required":["kind"]}}}}}}},"/grade/{endpoint_id}/now":{"get":{"operationId":"current_reading","summary":"The current reading alone, from the last collector tick, in one object read","parameters":[{"name":"endpoint_id","in":"path","required":true,"schema":{"type":"string","pattern":"^ep_[0-9a-f]{16}$"}}],"responses":{"200":{"description":"The newest row held: an observation, or the absence we filed when that is newer (current.outcome `Not probed`, the observation in last_observation)"}}}},"/grade":{"get":{"operationId":"grade_by_url","summary":"the same grade looked up by the URL an agent is about to pay; a host URL lists that host's routes","parameters":[{"name":"url","in":"query","required":true,"schema":{"type":"string","format":"uri"}}],"responses":{"200":{"description":"The answer: covered, insufficient-history, host (a host URL: its routes) or not-covered, each saying so in `kind`","content":{"application/json":{"schema":{"type":"object","properties":{"kind":{"type":"string","enum":["covered","insufficient-history","not-covered","host","current-reading"]}},"required":["kind"]}}}}}}},"/coverage":{"get":{"operationId":"coverage","summary":"Every endpoint on the seed list, its seed fields and what each probe policy means; no reading","responses":{"200":{"description":"The coverage record"}}}},"/networks":{"get":{"operationId":"networks","summary":"The facilitators: settlement counts, volume, the networks each serves, and what in-band declarations say","responses":{"200":{"description":"The facilitator record"}}}},"/chain":{"get":{"operationId":"chain","summary":"The published day heads and the recipe to recompute one","responses":{"200":{"description":"The chain record"}}}},"/chain/{date}":{"get":{"operationId":"day_manifest","summary":"One sealed day's manifest, hashed to its published head","parameters":[{"name":"date","in":"path","required":true,"schema":{"type":"string","format":"date"}}],"responses":{"200":{"description":"The day manifest"}}}},"/rubric":{"get":{"operationId":"rubric","summary":"Every rule that can decide an answer, versioned","responses":{"200":{"description":"The rubric"}}}},"/badge/{endpoint_id}":{"get":{"operationId":"badge","summary":"One endpoint's latest outcome as SVG","parameters":[{"name":"endpoint_id","in":"path","required":true,"schema":{"type":"string","pattern":"^ep_[0-9a-f]{16}$"}}],"responses":{"200":{"description":"SVG","content":{"image/svg+xml":{}}}}}},"/mcp":{"post":{"operationId":"mcp","summary":"MCP, streamable HTTP: probe402_endpoint_grade (free; endpoint_id or url) and probe402_endpoint_history (30 days, $0.005 per call over x402)","responses":{"200":{"description":"JSON-RPC over text/event-stream; initialize, then send the session id on every call"}}}}},"x-discovery":{"ownershipProofs":["0x93cF736F908C0C8765C534F096652dE20560Db3a"],"skillUrl":"https://probe402.com/skill.md"},"x-probe402":{"mcp":{"tool":"probe402_endpoint_history","bazaar":{"bazaar":{"info":{"input":{"type":"mcp","toolName":"probe402_endpoint_history","description":"The Machine Commerce Observatory: independent readings of x402 and MPP endpoints — alive right now, quoting what, and how fast? Probed on a published schedule under one published rubric, every reading traceable to a retained capture. Blocked and rate-limited are told apart from unreachable at capture time, so a defended endpoint is never reported as dead. Call before paying an unfamiliar endpoint, or to check whether one you use has repriced or rotated its payTo.","transport":"streamable-http","inputSchema":{"type":"object","properties":{"endpoint_id":{"type":"string","pattern":"^ep_[0-9a-f]{16}$"}},"required":["endpoint_id"]},"example":{"endpoint_id":"ep_0123456789abcdef"}},"output":{"type":"json","example":{"kind":"covered","endpoint":{"endpoint_id":"ep_0123456789abcdef","label":"A1","probe_url":"https://api.example.com/v1/quote"},"current":{"observed_at":"2026-08-20T14:00:00.000Z","outcome":"Quoted","rule_id":"R14a","latency_total_ms":210},"counts":{"observations":720,"by_outcome":{"Quoted":715,"Blocked or challenged":5},"not_probed":0},"series_breaks":[],"tier":{"name":"depth-30","days":30,"price_usd":0.005}}}},"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"input":{"type":"object","properties":{"type":{"type":"string","const":"mcp"},"toolName":{"type":"string"},"description":{"type":"string"},"transport":{"type":"string","enum":["streamable-http"]},"inputSchema":{"type":"object"},"example":{"type":"object"}},"required":["type","toolName","inputSchema"],"additionalProperties":false},"output":{"type":"object","properties":{"type":{"type":"string"},"example":{"type":"object"}},"required":["type"]}},"required":["input"]}}}}}}