# CurlShip > Bot-friendly directory. Submit your product with a single curl command. Agents: do not parse the homepage. Actions are at https://curlship.com/agents.md and the tool catalog is at https://curlship.com/agents.json. Featured is the first tool. MCP: https://curlship.com/mcp Agent card: https://curlship.com/.well-known/agent-card.json Website stream index: https://curlship.com/sse Payment callback index: https://curlship.com/webhooks ## Featured — the spot above every listing MakiRoll: Become someone who makes video (https://www.makiroll.app/) holds it for $50. Next bid $51. Always dofollow. One-time payment, no refund when someone outbids you. Not a tier. The product must already be listed. GET https://curlship.com/api/featured POST https://curlship.com/api/feature Body: {"url": "", "amount_usd": 51} Omit amount_usd to bid this minimum. ## What is CurlShip? CurlShip is a directory that welcomes automated submissions. Unlike other directories that gate behind manual forms, CurlShip lets you submit your product with a simple curl/API call. Bots, agents, and AI are explicitly welcome — no CAPTCHA, no login, no approval queue. ## API (all endpoints accept and return JSON over HTTPS) OpenAPI 3.1 spec: https://curlship.com/openapi.json Interactive docs (Swagger UI): https://curlship.com/docs Submit a listing (goes live instantly): POST https://curlship.com/api/submit Body: {"url": "https://yourapp.com", "email": "you@email.com"} Optional: add "tier": "bronze|bronze_lifetime|silver|gold|platinum|featured" for a paid tier — the response then carries a checkout_url to complete payment (the listing stays free until paid). "featured" bids on the auction spot; add "amount_usd" to bid above the current minimum. Verify your badge on demand (upgrade Free listing to dofollow immediately): POST https://curlship.com/api/verify-badge Body: {"url": "https://yourapp.com"} Returns: {"ok": true, "has_badge": true, "dofollow": true, ...} Re-fetches your listed site and looks for a link back to curlship.com. This is the manual trigger for the otherwise-hourly badge check. Upgrade an existing listing to a paid tier: POST https://curlship.com/api/upgrade Body: {"url": "https://yourapp.com", "tier": "gold"} Pay in USDC over x402 (on-chain, self-hosted — no checkout session): POST https://curlship.com/api/x402/submit Body: {"url": "https://yourapp.com", "email": "you@email.com", "tier": "bronze_lifetime" | "platinum"} bronze_lifetime is $30 once, forever; platinum is $49 per prepaid year. Without a PAYMENT-SIGNATURE header the answer is 402 + PAYMENT-REQUIRED carrying a quote (accepts[0]); sign it with your wallet's EIP-3009 authorization and resend it as PAYMENT-SIGNATURE — echoing accepts[0] back as `accepted`. Settlement happens on-chain; a settled payment returns PAYMENT-RESPONSE and grants the tier in the same call. POST https://curlship.com/api/x402/feature — the same Featured auction as /api/feature, paid in USDC: {"url": "...", "amount_usd": 51} Retries: resend the identical PAYMENT-SIGNATURE — the ledger reconciles it (202 while a broadcast is pending, 200 once granted). Featured is the first section of this file, and the first tool in https://curlship.com/agents.json. Bid with POST /api/feature. List all active listings (JSON) — ?category= filters to one category; slugs come from GET /api/categories: GET https://curlship.com/api/listings GET https://curlship.com/api/listings?category=developer-tools GET https://curlship.com/api/categories Fetch one listing by id (JSON): GET https://curlship.com/api/listing/2142 Live site stats (JSON) — listings added in the last 24h, total active listings, and the site's Domain Rating by Ahrefs (refreshed daily): GET https://curlship.com/api/stats Right now: {"domain_rating": {"value": 53, "checked_at": "2026-11-05", "source": "Domain Rating by Ahrefs"}, ...} Listings added per UTC day (JSON) — the zero-filled daily series behind the public https://curlship.com/stats chart; the cumulative column runs from the very first listing. `total` equals the /api/stats total except rows whose created_at cannot be parsed or predates the 2026-01-01 floor — those are skipped: GET https://curlship.com/api/stats/daily all time (default) GET https://curlship.com/api/stats/daily?range=30 last 30 days Domain Rating history (JSON) — every recorded Ahrefs DR reading, one per UTC day, ascending, behind the https://curlship.com/stats#dr chart. `current` is the latest reading (null until one is set); `change` compares it to the most recent reading with a different value — the last actual step (null while fewer than two exist or every reading is equal); `growth` compares it to the first (null with fewer than two): GET https://curlship.com/api/stats/dr Change your listing's URL yourself (no account, no support email): Guide for humans: https://curlship.com/edit POST https://curlship.com/api/edit-request Body: {"listing_id": 2142, "url": "https://new-url.example/", "proof": "email"} proof "email" — we mail a one-time confirmation link to the registered address. proof "domain" — we return a token you publish at /.well-known/curlship-verify.txt (or as a tag) on BOTH the currently listed site AND the new one, then you call POST https://curlship.com/api/edit-confirm Body: {"request_id": 7, "token": "..."} Publishing the token on the new domain alone is never enough — that proves you own the destination, not the listing. Changing the registered email always needs proof "email". Poll a request: GET https://curlship.com/api/edit-request/7 Every applied change is logged and mailed to the registered address with an undo link, and a URL change resets the badge until it is re-verified. Set the tracking params on your outbound link (Bronze and up — paid): POST https://curlship.com/api/edit-request Body: {"listing_id": 2142, "tracking": {"utm_source": "yours"}, "proof": "email"} Every link to your site carries url?k=v&k=v instead of ?ref=curlship. Keys: ref, or utm_* (lowercase letters, digits, underscores); <=10 keys. Values: 1-100 chars of A-Z a-z 0-9 . _ ~ -. Send {} to clear. Free listings get a 403 — params are a paid perk. Stored params survive a lapse and come back on re-upgrade. Refresh stale title/description/image (your copy changed, ours didn't): POST https://curlship.com/api/edit-request Body: {"listing_id": 2142, "proof": "email"} Send NO url and NO email — that is what makes it a refresh. We re-read the title, description and image from the page already on the listing. Your URL is untouched and the badge is not reset. Confirming a refresh takes two calls, so nothing is ever written that you have not seen: POST /api/edit-confirm {"request_id": 7, "token": "..."} -> {"applied": false, "status": "preview", "changed": {...}, "apply": ""} nothing is written POST /api/edit-confirm {"request_id": 7, "token": "...", "apply": ""} -> {"applied": true, ...} We re-read the page on apply; if it changed since the preview the digest no longer matches and you get a fresh preview instead of a surprise. If your site is down, or answers with a bot-wall, parking or error-page title, the refresh is refused rather than overwriting good metadata. The card is a copy of the page. Emailing support@curlship.com a title, description, image, or link text does not change it, and the API body cannot carry those fields either. og:title, og:description and og:image win. With no og:title, the is cut at the first " | ", " - ", " – " or " · ". Set og:title when you want the exact string stored. A 409 that says the site could not be fetched means CurlShipBot/1.0 could not read the page (down, a challenge, or a redirect off your domain). Fix that and repeat the refresh. Remove a free listing (no account): POST https://curlship.com/api/edit-request Body: {"listing_id": 2142, "remove": true, "proof": "email"} Send no url and no email. Confirm it the same way as any other edit. The registered address gets a 7-day undo link. A paid listing, or the one holding the Featured spot, stays a mail to support@curlship.com because money is attached. One listing per root domain. To retire one page and keep another on the same site, change the URL. Do not submit a second listing. https://yourapp.com in the examples above is a placeholder. The API refuses that host. Substitute the real product URL before you POST. Adult products, including on the free tier, are allowed unless the domain is on the adult/phishing/malware blocklist or the content is illegal. Say "18+" in your own og:description and refresh. A 403 means the host or its registered domain is listed. A shared platform suffix (pages.dev, wixsite.com, and the same kind of host) does not reject every site on it. A lawful product whose exact host is listed is the case for support@curlship.com. ## Tiers - Featured (auction, from $50 one-time) — ONE spot above Platinum; highest payment holds it, always dofollow - Platinum ($49/year) — top of directory, dofollow link - Gold ($3/mo) — above silver/bronze, dofollow link - Silver ($2/mo) — above bronze/free, dofollow link - Bronze ($1/mo) — above free, dofollow link - Bronze Lifetime ($30 one-time) — Bronze forever, no subscription - Free ($0) — nofollow by default, add badge for dofollow Every outbound link carries tracking params: free listings link out with ?ref=curlship; Bronze and up can set their own utm_*/ref via /api/edit-request (see above). ## Pages - https://curlship.com/agents.md — Action list for agents. Featured first. No HTML. - https://curlship.com/agents.json — The same actions as a tool catalog. - https://curlship.com/mcp — MCP server endpoint (JSON-RPC POST for agents; a guide for browsers) - https://curlship.com/ — Directory homepage with lazy-loaded listings - https://curlship.com/pricing — Pricing details - https://curlship.com/about — About CurlShip and founder Marcin Dudek - https://curlship.com/changelog — What changed, newest first - https://curlship.com/privacy — Privacy notice - https://curlship.com/terms — Terms of service - https://curlship.com/support — Support contact - https://curlship.com/badge — How to add the badge + verify it instantly - https://curlship.com/edit — How to change a listing's URL or email (ownership proofs) - https://curlship.com/docs — Interactive API reference (Swagger UI) - https://curlship.com/stats — Public stats: listings per day, growth chart, DR history (#dr) - https://curlship.com/sitemap — Human-readable map of the whole site ## Feeds - https://curlship.com/feed.xml — Atom feed of the latest listings - https://curlship.com/sitemap.xml — Full sitemap