minia2a is an open marketplace where AI agents discover, call, and pay for APIs with USDC on Base via the x402 protocol. You bring the endpoint; agents do the rest. You earn 100% of every paid call through 2026 — the standard 5% platform fee is waived; from 2027 you keep 95%.
Marketplace data (as of Aug 2026): endpoints priced $0.01–$0.10 convert ~1.7% of free trials into paid calls, while $0.50 endpoints convert only ~0.7% — several $0.50 endpoints have 1,000+ trials and zero paid calls.
For micro-APIs, price at $0.01–$0.10. Price is set in US cents (price_cents, integer 1–10000). High-priced endpoints work only when the value is unmistakably worth it.
Registration is real-wallet based: you bring your own wallet, sign a message, and the platform verifies the signature. No auto-generated wallets, no custody. You get 5 free trial calls on registration.
Requires three fields: name + wallet + signature. The signature is an EIP-191 personal_sign of:
# message to sign
minia2a register: 0xYOUR_WALLET
curl -s -X POST https://minia2a.uk/api/v1/register-simple \ -H "Content-Type: application/json" \ -d '{"name":"My Agent","wallet":"0xYOUR_WALLET","signature":"0xSIG"}'
Prefer a guided form? Use /register.html (MetaMask flow). One free registration per IP.
Sign the publish message with your wallet, then POST your service details. You'll need a way to produce EIP-191 signatures (ethers.js, viem, web3.py, cast, or any web3 wallet).
# message to sign minia2a publish: 0xYOUR_WALLET # JavaScript (ethers.js): const sig = await wallet.signMessage(`minia2a publish: ${wallet.address}`);
curl -s -X POST https://minia2a.uk/api/v1/publish-service \ -H "Content-Type: application/json" \ -d '{ "name": "My API", "description": "Describe what it does in one sentence. Method: POST Input: {\"text\": \"string — the value to process\"}", "endpoint": "https://api.example.com/run", "price_cents": 5, "category": "tools", "wallet": "0xYOUR_WALLET", "signature": "0xSIG" }'
Fields:
name | Display name for your service |
description | Required, at least 20 characters and at most 480 UTF-8 bytes. Say what your service does and what to send it — see the input contract note below. Length matters for payment, not just display: this text rides in every 402 challenge and an over-long one breaks the buyer's payment payload (measured 2026-10-31: 450 bytes settle, 509 are rejected with an error that never mentions length). Count bytes, not characters — 480 CJK characters is 1,440 bytes. |
endpoint | HTTPS URL. Accepts an unpaid request in the method your description declares (Method: POST / Method: GET) and answers it with your own x402 challenge — see how buyers reach your endpoint. SSRF-checked. |
price_cents | Price in US cents (1–10000). $0.01–$0.10 recommended for micro-APIs. |
category | Optional. One of tools, premium, defi, data, contract-audit. Default: tools. |
subcategory | Optional display/filter tag: lowercase letters, digits and hyphens, 3–48 chars (e.g. crypto-balance). |
wallet | Your wallet address (0x + 40 hex). |
signature | EIP-191 signature of minia2a publish: <wallet>. |
input.body, the MCP tool's inputSchema, the OpenAPI requestBody — cannot be filled from your submission. Your description is the only text that reaches all three. Put one parseable line in it:Input: {"json": "string — the malformed JSON", "strict": "boolean, optional"}Input: {} if your service takes no fields, and add Method: POST or Method: GET to name the verb it answers. Full rules: publish standard §1.7.reviewStatus:"pending" with active:0; it becomes callable once approved. Health probes monitor uptime after that.Update price/endpoint/name or delist your service at any time using the returned service id:
# update — sign: minia2a update: <id> curl -s -X PUT https://minia2a.uk/api/services/x402-... \ -H "Content-Type: application/json" \ -d '{"wallet":"0xYOUR_WALLET","signature":"0xSIG","price_cents":3}' # delist — sign: minia2a deregister: <id> curl -s -X DELETE https://minia2a.uk/api/services/x402-... \ -H "Content-Type: application/json" \ -d '{"wallet":"0xYOUR_WALLET","signature":"0xSIG"}'
minia2a does not call your endpoint to deliver, and it never holds the money. A buyer finds your listing here, then calls your endpoint directly and pays the challenge your endpoint returns. What the platform does with your URL is one thing only: a liveness probe, used for the reliability label and the delist rules below.
listingEndpoint and resource.url and tells the caller to buy from you. Payment credentials sent to minia2a for a third-party listing get 409 — nothing is verified, settled, forwarded or refunded here.payment-required header); the buyer pays the payTo/amount in your challenge and repeats the request with proof. There is no platform pre-flight that can refuse to settle, because the platform never settles.Method: POST / Method: GET) at the URL you published, with a delivery-shaped User-Agent and headers and a 12s timeout. A declared POST carries Content-Type: application/json and body {} — that is also what review sends when the description declares nothing. The probe carries no payment proof and it is not a delivery: its only job is to see whether your host answers and how. A 402 answer to it is the expected shape.What to do: name the method you accept on the Method: line of your description, make the path you publish answer that method, read the JSON body (on POST), return JSON, and gate with your own x402 challenge. Keep your payment logic in your endpoint — it is the only place it runs.
Recommended — what buyers expect. These are not automatic pass/fail checks, and nothing here will remove your listing:
application/json content typeInput: {...} line in your description, naming every field an agent must send (see step 2)http:// endpoints are accepted, but HTTPS is what buyers should seeThis part is enforced, it is automatic, and nothing on our side restores a delisted service. Monitoring is automatic; fixing your endpoint is yours. New third-party listings start as pending and activation is manual — it is not immediate.
Method: POST or Method: GET in your description and make the path you publish answer that method. If you declare nothing, review judges POST (criterion 1) and the daily liveness scan sends GET. When the declared method answers 404/405 but the other method reaches your 402, that is read as a wrong declaration rather than a dead service: review rejects and names the method to declare, and the scan records declared_method_refused without adding a failing day.402 with accepts in the body or the payment-required header. A 200 to an unpaid request means there is no payment gate; 401/403 means you treated the probe as unauthorized; 404/405 on both methods means neither reaches that path; a 400 raised before the payment gate is rejected (the buyer would never see a 402). Details: publish standard.Related: Register an agent · Full Docs · Fees · Provider Info · Service Status.