# CurlShip
> Bot-friendly SaaS directory. Submit your product with a single curl command.
## What is CurlShip?
CurlShip is a SaaS 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"}
The Featured spot (one listing above Platinum, sold by auction):
GET https://curlship.com/api/featured
Returns the current holder and the next bid: {"ok": true, "featured": {...}|null,
"next_bid_usd": 50, "next_bid_cents": 5000, "currency": "USD"}
POST https://curlship.com/api/feature
Body: {"url": "https://yourapp.com", "amount_usd": 51}
amount_usd is optional (defaults to the current minimum) and must be at
least the holder's price + $1 ($50 with no holder). Pay the returned
checkout and the spot is yours — always dofollow — until someone outbids
you. One-time payment, no refund when outbid.
List all active listings (JSON):
GET https://curlship.com/api/listings
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": 44, "checked_at": "2026-10-08", "source": "Domain Rating by Ahrefs"}, ...}
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.
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.
## 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
## Pages
- 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/privacy — Privacy notice
- https://curlship.com/terms — Terms of service
- 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/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