{"openapi":"3.1.0","info":{"title":"fraqtum","version":"1","description":"A directory of paid HTTP endpoints for agents, x402 and MPP. Read-only and public. fraqtum takes no payment and holds no key: an agent pays the provider itself. See /llms.txt."},"components":{"schemas":{"Page":{"type":"object","properties":{"items":{"type":"array","items":{"$ref":"#/components/schemas/Item"}},"next_cursor":{"type":["string","null"],"description":"Pass as `cursor` for the next page; null on the last page."}},"required":["items","next_cursor"]},"Item":{"type":"object","properties":{"id":{"type":"string","example":"Hk3T0mJ8tX0qVJxv3d5o9Q","description":"Stable and opaque."},"resource":{"type":"string","description":"The paid URL."},"method":{"type":["string","null"]},"host":{"type":"string"},"rails":{"type":"array","items":{"type":"string"}},"listings":{"type":"array","items":{"$ref":"#/components/schemas/Listing"},"description":"One per source that lists it, live ones first."},"usage":{"anyOf":[{"$ref":"#/components/schemas/Usage"},{"type":"null"}]}},"required":["id","resource","method","host","rails","listings","usage"]},"Listing":{"type":"object","properties":{"source":{"type":"string","description":"`cdp_bazaar`, `payai` or `mpp`."},"rail":{"type":"string","description":"`x402` or `mpp`."},"network":{"type":["string","null"]},"asset":{"type":["string","null"]},"amount_atomic":{"type":["string","null"],"description":"The price in the asset's smallest unit, as the source gave it."},"decimals":{"type":["integer","null"]},"price_usd":{"type":["string","null"],"example":"0.01","description":"A decimal string; set only for a known USD stablecoin."},"pay_to":{"type":["string","null"]},"service_name":{"type":["string","null"]},"description":{"type":["string","null"]},"tags":{"type":"array","items":{"type":"string"}},"listed_at":{"type":["string","null"],"format":"date-time","description":"When the source says it last changed the listing."},"first_seen_at":{"type":"string","format":"date-time"},"last_seen_at":{"type":"string","format":"date-time"},"gone_at":{"type":["string","null"],"format":"date-time","description":"Set once the source stopped listing it."}},"required":["source","rail","network","asset","amount_atomic","decimals","price_usd","pay_to","service_name","description","tags","listed_at","first_seen_at","last_seen_at","gone_at"]},"Usage":{"type":"object","properties":{"day":{"type":"string","format":"date","description":"The UTC day the source reported this on."},"calls_30d":{"type":["integer","null"],"description":"Paid calls in the 30 days before."},"payers_30d":{"type":["integer","null"],"description":"Distinct payers in those 30 days."},"last_called_at":{"type":["string","null"],"format":"date-time"}},"required":["day","calls_30d","payers_30d","last_called_at"]},"Error":{"type":"object","properties":{"error":{"type":"string","enum":["bad_request","not_found","rate_limited","unavailable","busy","internal_error"]},"message":{"type":"string"},"httpRequestId":{"type":"string"}},"required":["error","message"]},"ItemDetail":{"allOf":[{"$ref":"#/components/schemas/Item"},{"type":"object","properties":{"usage_history":{"type":"array","items":{"$ref":"#/components/schemas/Usage"},"description":"One row per UTC day, newest first, the last 90 days."}},"required":["usage_history"]}]}},"parameters":{}},"paths":{"/health":{"get":{"summary":"Liveness","description":"Answers while the process runs. Never cached; it does not check the database.","responses":{"200":{"description":"The process runs.","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","enum":[true]}},"required":["ok"]}}}}}}},"/endpoints":{"get":{"summary":"Search the directory","description":"A page of items: one per paid resource and method, with one listing per source that lists it. fraqtum takes no payment: an agent pays the provider itself, over the rail a listing names.","parameters":[{"schema":{"type":"string","minLength":1,"maxLength":200,"example":"weather","description":"Text search over the resource, host, service name, description and tags. Web search syntax: `\"a phrase\"`, `or`, `-word`."},"required":false,"description":"Text search over the resource, host, service name, description and tags. Web search syntax: `\"a phrase\"`, `or`, `-word`.","name":"q","in":"query"},{"schema":{"type":"string","enum":["x402","mpp"],"description":"The payment protocol."},"required":false,"description":"The payment protocol.","name":"rail","in":"query"},{"schema":{"type":"string","minLength":1,"maxLength":200,"example":"eip155:8453","description":"The network, exactly as the source names it, such as `eip155:8453`."},"required":false,"description":"The network, exactly as the source names it, such as `eip155:8453`.","name":"network","in":"query"},{"schema":{"type":"string","minLength":1,"maxLength":253,"example":"api.exa.ai","description":"The host, exactly."},"required":false,"description":"The host, exactly.","name":"host","in":"query"},{"schema":{"anyOf":[{"type":"string","minLength":1,"maxLength":100},{"type":"array","items":{"type":"string","minLength":1,"maxLength":100},"maxItems":10}],"example":"weather-data","description":"A tag, repeatable up to 10 times: an item matches when one listing carries every one."},"required":false,"description":"A tag, repeatable up to 10 times: an item matches when one listing carries every one.","name":"tag","in":"query"},{"schema":{"type":"string","pattern":"^\\d{1,12}(\\.\\d{1,18})?$","example":"0.01","description":"Only items with a listing priced at or under this many USD."},"required":false,"description":"Only items with a listing priced at or under this many USD.","name":"max_price_usd","in":"query"},{"schema":{"type":"string","enum":["relevance","usage","newest","price"],"description":"`relevance` (the default with `q`, and only with `q`), `usage`: 30-day calls, items without usage last (the default without `q`), `newest`: first sighting, `price`: lowest USD price first, items without one last. Every order ends in `id`."},"required":false,"description":"`relevance` (the default with `q`, and only with `q`), `usage`: 30-day calls, items without usage last (the default without `q`), `newest`: first sighting, `price`: lowest USD price first, items without one last. Every order ends in `id`.","name":"sort","in":"query"},{"schema":{"type":"string","enum":["true","false"],"description":"`true` also lists items no source lists any more."},"required":false,"description":"`true` also lists items no source lists any more.","name":"include_gone","in":"query"},{"schema":{"type":"integer","minimum":1,"maximum":100,"example":25,"description":"Items per page, 1 to 100."},"required":false,"description":"Items per page, 1 to 100.","name":"limit","in":"query"},{"schema":{"type":"string","maxLength":500,"description":"The `next_cursor` of the previous page, as it was given."},"required":false,"description":"The `next_cursor` of the previous page, as it was given.","name":"cursor","in":"query"}],"responses":{"200":{"description":"A page of items, filtered and sorted.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Page"}}}},"400":{"description":"A parameter is bad; the message names it.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"`rate_limited`: too many requests from your IP, answered by the edge; /llms.txt states the limit. Wait `Retry-After` seconds when it is sent, else the seconds the message names, then retry.","headers":{"Retry-After":{"description":"Seconds to wait before a retry, when the edge sends it.","schema":{"type":"integer","minimum":1}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"503":{"description":"`unavailable`: the directory's database cannot be reached. `busy`: too many reads wait for it. Wait `Retry-After` seconds, then retry.","headers":{"Retry-After":{"description":"Seconds to wait before a retry.","schema":{"type":"integer","minimum":1}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/endpoints/{id}":{"get":{"summary":"One item, with its usage history","parameters":[{"schema":{"type":"string","pattern":"^[A-Za-z0-9_-]{22}$","example":"Hk3T0mJ8tX0qVJxv3d5o9Q","description":"An item's id, as a page of items gives it."},"required":true,"description":"An item's id, as a page of items gives it.","name":"id","in":"path"}],"responses":{"200":{"description":"The item, with one usage row per UTC day, newest first.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ItemDetail"}}}},"400":{"description":"A parameter is bad; the message names it.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"No item has this id.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"`rate_limited`: too many requests from your IP, answered by the edge; /llms.txt states the limit. Wait `Retry-After` seconds when it is sent, else the seconds the message names, then retry.","headers":{"Retry-After":{"description":"Seconds to wait before a retry, when the edge sends it.","schema":{"type":"integer","minimum":1}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"503":{"description":"`unavailable`: the directory's database cannot be reached. `busy`: too many reads wait for it. Wait `Retry-After` seconds, then retry.","headers":{"Retry-After":{"description":"Seconds to wait before a retry.","schema":{"type":"integer","minimum":1}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/llms.txt":{"get":{"summary":"How an agent uses this API, in plain text","responses":{"200":{"description":"The guide.","content":{"text/plain":{"schema":{"type":"string"}}}}}}},"/openapi.json":{"get":{"summary":"This document","responses":{"200":{"description":"The OpenAPI 3.1 document.","content":{"application/json":{"schema":{"type":"object","additionalProperties":{}}}}}}}}},"webhooks":{}}