# fraqtum > A directory of paid HTTP endpoints for agents, over x402 and MPP. It reads the public directories (the Coinbase x402 Bazaar, PayAI and the MPP services list) once a day and serves what they list over a read-only JSON API. fraqtum takes no payment and holds no key: you pay the provider yourself, over the rail a listing names. ## Find an endpoint GET /endpoints answers a page of items. An item is one paid URL and HTTP method, with one listing per source that lists it: its rail, network, asset, price and pay-to address, as that source gives them. Query parameters, all optional: - q: text search over the resource, host, service name, description and tags. Web search syntax: "a phrase", or, -word. - rail: x402 or mpp. - network: exactly as the source names it, such as eip155:8453. - host: exactly, such as api.exa.ai. - tag: repeatable; an item matches when one listing carries every tag given. - max_price_usd: items with a listing priced at or under this many USD, such as 0.01. - sort: relevance (the default with q, and only with q), usage (30-day paid calls, the default without q), newest (first sighting) or price (lowest USD price first). Items without usage or a USD price come last. - include_gone: true also lists items no source lists any more. - limit: 1 to 100, default 25. - cursor: the next_cursor of the previous page, with the same other parameters. A page is {"items": [...], "next_cursor": "..."}; next_cursor is null on the last page. ## One endpoint GET /endpoints/{id} answers one item, the same as in a page, plus usage_history: one row per UTC day, newest first, the last 90 days. An id is stable across crawls. An item: {"id", "resource", "method", "host", "rails", "listings": [...], "usage"}. - A listing: source, rail, network, asset, amount_atomic (the price in the asset's smallest unit), decimals, price_usd (a decimal string, set only for a known USD stablecoin), pay_to, service_name, description, tags, listed_at, first_seen_at, last_seen_at, gone_at (set once the source stopped listing it). - usage: {"day", "calls_30d", "payers_30d", "last_called_at"} from the Bazaar, the only source that reports usage, or null. A payer count overstates demand: graders and catalogue sweepers pay every route once. ## Connect over MCP POST /mcp is an MCP server over Streamable HTTP, stateless: no session, no login, nothing to stream, so GET and DELETE answer 405. Point your MCP client at /mcp on this host, such as https://api.fraqtum.com/mcp. It serves the 2026-07-28 protocol and 2025-era clients that send initialize, one JSON-RPC message per request: a batch is refused. - search_endpoints: the query parameters above, as JSON arguments; include_gone is a boolean and tag a string or an array. Returns the same page as GET /endpoints, as structured content and as JSON text. - get_endpoint: {"id"}. Returns the same item as GET /endpoints/{id}. A bad argument (the message names it), an unknown id, a database that is down or a directory that is busy comes back as a tool result with isError set. ## Pay for it fraqtum only lists. Call the resource itself: an unpaid request answers 402 with the provider's current payment terms, which win over the listing's. Pay over that rail (x402 or MPP) from your own wallet, then retry. fraqtum never sees the payment. ## Limits Each IP has two budgets on api.fraqtum.com, counted at the edge: - Reads: GET /endpoints and GET /endpoints/{id} together, 20 requests per 10 seconds. Reads the edge answers from its cache count too. - MCP: POST /mcp, 10 requests per 10 seconds. - Past either, that IP is blocked from it for 60 seconds. /openapi.json, /llms.txt and /health are not counted. - A blocked request gets 429, always as JSON. A read gets {"error": "rate_limited", "message"}; POST /mcp gets a JSON-RPC error, code -32000. After a 429, wait the Retry-After seconds when it comes, else 60 seconds, then retry. - When too many reads already wait for the database, the API refuses the next at once: 503 {"error": "busy", "message"} with Retry-After: 5, or over MCP a tool result with isError set that says the directory is busy. After a 503, wait the Retry-After seconds, then retry. ## Errors and caching - 400 {"error": "bad_request", "message"}: the message names the parameter. - 404 {"error": "not_found", "message"}: no item has that id. - 429 {"error": "rate_limited", "message"}: the rate limit above; the message names the wait. - 503 {"error": "unavailable", "message"}: the database cannot be reached; retry after the Retry-After seconds. - 503 {"error": "busy", "message"}: too many reads wait for the database; retry after the Retry-After seconds. - The data changes once a day. Reads are cached at the edge for up to an hour. ## Docs - GET /openapi.json: the OpenAPI 3.1 document of every route. - GET /llms.txt: this text.