Operations 4
2 of 4 operations are conformant: apis.io called them with no credentials and the responses matched this contract. Checked 2026-11-12. how this works · status file
2 of 4 operations are conformant: apis.io called them with no credentials and the responses matched this contract. Checked 2026-11-12. how this works · status file
Every API here is available over the APIs.io API and to AI agents over MCP.
One button, every client — Claude, Cursor, VS Code and the rest.
https://apis.io/mcp
find_apisBrowse and filter every API in the catalog.get_api_artifactsOne API's artifacts, grouped by type.get_openapiThe primary OpenAPI for this API.find_similar_apisAPIs that look like this one.apis_io_searchSTART HERE — APIs, providers and tags for one query, each with its total.resolveTurn a domain, URL or GitHub org into the provider it belongs to.find_cohortsEvery scored population of providers in the catalog.curl "https://apis.io/api/v1/apis/curlship-com:curlship-com-listings-api"
curl "https://apis.io/api/v1/apis?limit=25"
Calls without X-API-Key need no key. Calls with it need a paid plan — get a key.
Free tier, no form to fill in. Signing in shares your email address with us — we store it to create your key and to recognise you if you sign in with another provider. See our Privacy Policy and Terms.
A second provider on the same verified email joins the account you already have.
openapi: 3.2.0
info:
title: Curlship Com Listings API
version: 1.0.0
contact:
name: CurlShip Support
email: support@curlship.com
url: https://curlship.com
license:
name: Proprietary
description: 'Operations tagged Listings across 2 of this provider''s published API definitions: curlship-com-openapi.json, curlship-com-openapi.yml. Each path carries the servers of the definition it was published in.'
servers:
- url: https://curlship.com
description: Production
tags:
- name: Listings
description: Create and read directory listings.
paths:
/api/submit:
post:
tags:
- Listings
summary: Submit a product listing
description: 'Add a product to the directory. Goes live instantly — no review queue. One listing per root domain. Rate limit: 10 submissions/hour per IP.
Free tier gets a `nofollow` link; add the badge for `dofollow`. Pass `tier` to start a paid checkout instead: the listing is created (free until paid) and the response carries a `checkout_url`. `tier: "featured"` bids on the auction spot above Platinum — `amount_usd` optionally sets the bid, defaulting to the current minimum. If the payment system is unavailable the listing still lands as free and the response says so with `checkout_url: null`. An already-listed URL with a paid tier gets an upgrade checkout instead of a dead end.'
operationId: submitListing
requestBody:
required: true
content:
application/json:
schema:
type: object
required:
- url
- email
properties:
url:
type: string
format: uri
example: https://yourapp.com
email:
type: string
format: email
example: you@email.com
tier:
type: string
enum:
- bronze
- bronze_lifetime
- silver
- gold
- platinum
- featured
description: Optional. Omit for the free tier. "featured" bids on the auction spot.
amount_usd:
type: number
example: 51
description: Featured only — the bid in USD, defaulting to the current minimum. Same rules as POST /api/feature.
example:
url: https://yourapp.com
email: you@email.com
responses:
'201':
description: Listing created
content:
application/json:
schema:
type: object
properties:
ok:
type: boolean
example: true
message:
type: string
listing:
type: object
properties:
id:
type: integer
example: 2076
url:
type: string
format: uri
example: https://yourapp.com/
link:
type: string
format: uri
example: https://yourapp.com/?ref=curlship
description: The URL a visitor is actually sent to — url plus tracking params. Free listings carry ?ref=curlship; paid ones carry the owner's utm_*/ref params (set via POST /api/edit-request tracking).
tier:
type: string
enum:
- free
- bronze
- silver
- gold
- platinum
title:
type:
- string
- 'null'
example: YourApp — ship faster
description:
type:
- string
- 'null'
image:
type:
- string
- 'null'
format: uri
has_badge:
type: boolean
description: True if a dofollow link back to curlship.com was found on the site.
created_at:
type:
- string
- 'null'
format: date-time
example: '2026-10-12T09:04:05Z'
description: When the listing was created, UTC.
category:
oneOf:
- type: object
properties:
slug:
type: string
example: developer-tools
description: The leaf slug when classified that deep, else the group.
name:
type: string
example: Developer tools
group:
type: string
example: developer-tools
description: The top-level group this listing belongs to.
- type: 'null'
description: The listing's category, or null while it is unclassified. Set by the off-server classifier — submitters cannot choose one.
badge_html:
type: string
description: Ready-to-paste badge snippet.
badge_guide:
type: string
format: uri
'200':
description: Already listed (idempotent)
content:
application/json:
schema:
type: object
'400':
description: Invalid input
content:
application/json:
schema:
$ref: '#/components/schemas/Error'
'403':
description: URL on a blocklist (adult/phishing/malware)
content:
application/json:
schema:
$ref: '#/components/schemas/Error'
'409':
description: A listing for this domain already exists
content:
application/json:
schema:
$ref: '#/components/schemas/Error'
'429':
description: 'Rate limit exceeded. Retry-After is the wait in seconds. RateLimit-Policy names the window that was hit. RateLimit repeats that name with r=0 and t equal to Retry-After. Windows: submit 10 per 3600s, verify 30 per 3600s, checkout 30 per 3600s, edit 5 per 3600s per IP, edit-listing 3 per 86400s per listing.'
headers:
Retry-After:
description: Seconds to wait before retrying.
schema:
type: integer
minimum: 1
RateLimit-Policy:
description: 'The window that was hit. Example: "submit";q=10;w=3600.'
schema:
type: string
RateLimit:
description: 'Remaining quota. Example: "submit";r=0;t=120.'
schema:
type: string
content:
application/json:
schema:
$ref: '#/components/schemas/Error'
servers:
- url: https://curlship.com
description: Production
/api/listings:
get:
tags:
- Listings
summary: List active listings
description: 'With no query string, returns every active listing as JSON, in the same order as before. Optional query parameters narrow that list and do not add a new response envelope.
`limit` and `offset` page the directory (default limit 50). `q` is a substring of the title, description, or URL (default limit 100). `since` is an ISO timestamp; only listings created at or after that moment are returned. `category` filters to one category — a group slug or a promoted leaf, from GET /api/categories. Each listing includes `created_at` and `category`.'
operationId: listListings
parameters:
- name: limit
in: query
required: false
description: Maximum number of listings. Defaults to 50 with offset, and to 100 with q.
schema:
type: integer
minimum: 0
example: 50
- name: offset
in: query
required: false
description: How many matching listings to skip.
schema:
type: integer
minimum: 0
example: 0
- name: q
in: query
required: false
description: Substring matched against title, description, and URL. LIKE wildcards are literal.
schema:
type: string
example: makiroll
- name: since
in: query
required: false
description: ISO timestamp. Keep listings created at or after this moment.
schema:
type: string
format: date-time
example: '2026-10-01T00:00:00Z'
- name: category
in: query
required: false
description: A category slug from GET /api/categories — a group or a promoted leaf. An unknown slug is a 400.
schema:
type: string
example: developer-tools
responses:
'200':
description: Active listings
content:
application/json:
schema:
type: object
properties:
ok:
type: boolean
example: true
listings:
type: array
items:
type: object
properties:
id:
type: integer
example: 2076
url:
type: string
format: uri
example: https://yourapp.com/
link:
type: string
format: uri
example: https://yourapp.com/?ref=curlship
description: The URL a visitor is actually sent to — url plus tracking params. Free listings carry ?ref=curlship; paid ones carry the owner's utm_*/ref params (set via POST /api/edit-request tracking).
tier:
type: string
enum:
- free
- bronze
- silver
- gold
- platinum
title:
type:
- string
- 'null'
example: YourApp — ship faster
description:
type:
- string
- 'null'
image:
type:
- string
- 'null'
format: uri
has_badge:
type: boolean
description: True if a dofollow link back to curlship.com was found on the site.
created_at:
type:
- string
- 'null'
format: date-time
example: '2026-10-12T09:04:05Z'
description: When the listing was created, UTC.
category:
oneOf:
- type: object
properties:
slug:
type: string
example: developer-tools
description: The leaf slug when classified that deep, else the group.
name:
type: string
example: Developer tools
group:
type: string
example: developer-tools
description: The top-level group this listing belongs to.
- type: 'null'
description: The listing's category, or null while it is unclassified. Set by the off-server classifier — submitters cannot choose one.
'400':
description: limit or offset is not a non-negative integer, since is not an ISO timestamp, or category is not a known slug
content:
application/json:
schema:
$ref: '#/components/schemas/Error'
servers:
- url: https://curlship.com
description: Production
/api/categories:
get:
tags:
- Listings
summary: List categories
description: The category tree with a listing count per category — the closed groups in taxonomy order plus any promoted leaf categories under them. `slug` is what /api/listings takes as `category` and what every listing's `category` field carries; `url` is the browsable page. `indexable` says the page passes the thin-content gate and sits in the sitemap. Only categories with at least one listing are returned.
operationId: listCategories
responses:
'200':
description: Categories with counts
content:
application/json:
schema:
type: object
properties:
ok:
type: boolean
example: true
categories:
type: array
items:
type: object
properties:
slug:
type: string
example: developer-tools
name:
type: string
example: Developer tools
kind:
type: string
enum:
- group
- leaf
example: group
group:
type:
- string
- 'null'
example: developer-tools
description: The leaf's parent group; on a group entry it equals slug.
count:
type: integer
example: 87
indexable:
type: boolean
example: true
url:
type: string
format: uri
example: https://curlship.com/category/developer-tools
servers:
- url: https://curlship.com
description: Production
/api/listing/{id}:
get:
tags:
- Listings
summary: Fetch a single listing by id
description: Returns one active listing as JSON. The id is the one shown in the submit response and in /l/ URLs.
operationId: getListing
parameters:
- name: id
in: path
required: true
description: Listing id
schema:
type: integer
example: 2142
responses:
'200':
description: The listing
content:
application/json:
schema:
type: object
properties:
ok:
type: boolean
example: true
listing:
type: object
properties:
id:
type: integer
example: 2076
url:
type: string
format: uri
example: https://yourapp.com/
link:
type: string
format: uri
example: https://yourapp.com/?ref=curlship
description: The URL a visitor is actually sent to — url plus tracking params. Free listings carry ?ref=curlship; paid ones carry the owner's utm_*/ref params (set via POST /api/edit-request tracking).
tier:
type: string
enum:
- free
- bronze
- silver
- gold
- platinum
title:
type:
- string
- 'null'
example: YourApp — ship faster
description:
type:
- string
- 'null'
image:
type:
- string
- 'null'
format: uri
has_badge:
type: boolean
description: True if a dofollow link back to curlship.com was found on the site.
created_at:
type:
- string
- 'null'
format: date-time
example: '2026-10-12T09:04:05Z'
description: When the listing was created, UTC.
category:
oneOf:
- type: object
properties:
slug:
type: string
example: developer-tools
description: The leaf slug when classified that deep, else the group.
name:
type: string
example: Developer tools
group:
type: string
example: developer-tools
description: The top-level group this listing belongs to.
- type: 'null'
description: The listing's category, or null while it is unclassified. Set by the off-server classifier — submitters cannot choose one.
'400':
description: Id is not an integer
content:
application/json:
schema:
$ref: '#/components/schemas/Error'
'404':
description: No active listing with that id
content:
application/json:
schema:
$ref: '#/components/schemas/Error'
servers:
- url: https://curlship.com
description: Production
components:
schemas:
Error:
type: object
properties:
ok:
type: boolean
example: false
error:
type: string
example: url is required and must start with http
required:
- ok
- error
externalDocs:
description: Badge guide & instant verify
url: https://curlship.com/badge
x-refined-from:
- curlship-com-openapi.json
- curlship-com-openapi.yml