CurlShip Listings API

Create and read directory listings.

GitHub OpenAPI

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

POST /api/submit Submit a product listing #
GET /api/listings List active listings #
GET /api/categories List categories conformant #
GET /api/listing/{id} Fetch a single listing by id conformant #

Work with this as data

Every API here is available over the APIs.io API and to AI agents over MCP.

MCP server

One button, every client — Claude, Cursor, VS Code and the rest.

https://apis.io/mcp

Tools for apis

7 MCP tools reach this
  • 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.
All 92 tools →

Call it yourself

curl for this page
This API
curl "https://apis.io/api/v1/apis/curlship-com:curlship-com-listings-api"
All apis
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.

Get an API 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 Specification

curlship-com-listings-api-openapi.yml Raw ↑
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