Defici Public Browse API

Read-only public endpoints — no authentication required.

Operations 9

GET /api/ads Contact fields (phone, email, whatsapp, website) are omitted from anonymous… #
GET /api/ads/{id} GET /api/ads/{id} #
GET /api/public/metrics Live DB-grounded platform proof metrics #
GET /api/mcp Model Context Protocol 2025-03-26 SSE endpoint advertisement for HTTP+SSE… #
POST /api/mcp MCP Streamable HTTP — JSON-RPC 2.0 request #
GET /api/news ai_generated = true means the article text was produced by Defici's AI… #
GET /api/news/latest GET /api/news/latest #
GET /feed.json Machine-readable feed of OUR OWN active listings, refreshed every 6 h by cron #
GET /feed.csv The CSV twin of /feed.json, RFC 4180 #

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/defici-com:defici-com-public-browse-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

defici-com-public-browse-api-openapi.yml Raw ↑
openapi: 3.2.0
info:
  title: Defici Com Public Browse API
  version: live
  description: 'Operations tagged Public Browse across 2 of this provider''s published API definitions: defici-com-openapi.json, defici-com-openapi.yml. Each path carries the servers of the definition it was published in.'
servers:
- url: https://defici.com
security:
- bearerAuth: []
tags:
- name: Public Browse
  description: Read-only public endpoints — no authentication required.
paths:
  /api/ads:
    get:
      tags:
      - Public Browse
      summary: Contact fields (phone, email, whatsapp, website) are omitted from anonymous…
      description: 'Contact fields (phone, email, whatsapp, website) are omitted from anonymous responses. Every listing price is in USD (converted at ingest from the seller''s currency via daily FX rates), so priceMin/priceMax are USD too. An empty `ads` array on a 200 means the catalogue really has no match — a server-side read failure is a 503, and a search query the backend rejects (e.g. text blocked at the edge) is a 400 invalid_query; neither is ever an empty 200. Do not treat `total: null` as zero: it means the count is unavailable while the rows are real.


        Rate limit: No per-endpoint limit on this public browse route — no 429 and no RateLimit-* headers are emitted here; throttling is edge/cluster-level only (≈60 req/min across the 2-instance cluster). The plan-dependent 30 req/min figure in the preamble applies to authenticated agent-API endpoints, not this route.


        Auth: public'
      operationId: get_ads
      responses:
        '200':
          description: Success
          content:
            application/json:
              example:
                ads:
                - id: uuid
                  title: string
                  description: string
                  category: string
                  price: number|null — USD
                  currency: '''USD'''
                  city: string|null
                  market: string
                  is_promo: false
                  created_at: ISO8601
                  currency_original: string — the currency the seller priced in (provenance)
                  price_original: number|null — the seller's original amount
                total: number|null (null = count unavailable, NOT zero)
                page: number
                totalPages: number|null (null whenever total is null)
                limit: number — the page size actually applied
                limitRequested: number — present ONLY when your `limit` exceeded the max and was capped; the short page is not the end of the results
      security: []
      parameters:
      - name: optional
        in: query
        required: false
        schema:
          type: string
        description: '["q","category","market","priceMin","priceMax","page","limit"]'
      - name: types
        in: query
        required: false
        schema:
          type: string
        description: '{"q":"string — full-text search (PostgreSQL websearch syntax)","category":"string — category slug or alias","market":"string","priceMin":"number — minimum price, in USD (every listing price is stored in USD)","priceMax":"number — maximum price, in USD","page":"number (default 1)","limit":"number (default 30, max 30)"}'
    servers:
    - url: https://defici.com
  /api/ads/{id}:
    get:
      tags:
      - Public Browse
      summary: GET /api/ads/{id}
      description: 'The endpoint itself is keyless; contact fields are omitted from the response unless the caller is signed in. A keyless call succeeds — it simply returns fewer fields.


        Auth: public (contact fields gated behind login)'
      operationId: get_ads_id
      responses:
        '200':
          description: Success
          content:
            application/json:
              example: '{ full listing row minus private contact fields for anonymous requests }'
      security: []
      parameters:
      - name: id
        in: path
        required: true
        schema:
          type: string
        description: uuid
    servers:
    - url: https://defici.com
  /api/public/metrics:
    get:
      tags:
      - Public Browse
      summary: Live DB-grounded platform proof metrics
      description: 'Live DB-grounded platform proof metrics. Each metric is an object with its own value and query timestamp — there is no single top-level query time for the whole response. A metric with no real data behind it is absent rather than shown as zero or guessed, so do not read a missing key as a zero.


        Auth: public'
      operationId: get_public_metrics
      responses:
        '200':
          description: Success
          content:
            application/json:
              example:
                available: true
                total_listings:
                  value: number
                  computed_at: ISO8601
                  source: string (plain-language description of what this value represents)
                active_listings:
                  value: number
                  computed_at: ISO8601
                  source: string (plain-language description of what this value represents)
                markets_count:
                  value: number (count of actively served/pickable markets — PICKABLE_MARKET_COUNT)
                  computed_at: ISO8601
                  source: string (plain-language description of what this value represents)
                active_contests:
                  value: number
                  computed_at: ISO8601
                  source: string (plain-language description of what this value represents)
      security: []
    servers:
    - url: https://defici.com
  /api/mcp:
    get:
      tags:
      - Public Browse
      summary: Model Context Protocol 2025-03-26 SSE endpoint advertisement for HTTP+SSE…
      description: 'Model Context Protocol 2025-03-26 SSE endpoint advertisement for HTTP+SSE clients.


        Auth: public'
      operationId: get_mcp
      responses:
        '200':
          description: Success
          content:
            application/json:
              example: SSE stream advertising MCP tools.
      security: []
    post:
      tags:
      - Public Browse
      summary: MCP Streamable HTTP — JSON-RPC 2.0 request
      description: 'MCP Streamable HTTP — JSON-RPC 2.0 request. Tools: search_listings, get_listing, list_categories, get_regions.


        Auth: public'
      operationId: post_mcp
      responses:
        '200':
          description: Success
          content:
            application/json:
              example: '{ jsonrpc: "2.0", id: 1, result: { content: [...] } }'
      security: []
      requestBody:
        content:
          application/json:
            schema:
              type: object
            example:
              example:
                jsonrpc: '2.0'
                id: 1
                method: tools/call
                params:
                  name: search_listings
                  arguments:
                    q: laptop
                    limit: 5
    servers:
    - url: https://defici.com
  /api/news:
    get:
      tags:
      - Public Browse
      summary: ai_generated = true means the article text was produced by Defici's AI…
      description: 'ai_generated = true means the article text was produced by Defici''s AI editorial system (EU AI Act Art.50 machine-readable disclosure). Read this field, not the author name, to determine authorship type.


        Auth: public'
      operationId: get_news
      responses:
        '200':
          description: Success
          content:
            application/json:
              example:
                articles:
                - id: uuid
                  slug: string
                  title: string
                  excerpt: string
                  category: string
                  market: string
                  author: string
                  published_at: ISO8601
                  is_archived: boolean
                  ai_generated: boolean
                count: number
                limit: number
                archived: boolean
      security: []
      parameters:
      - name: optional
        in: query
        required: false
        schema:
          type: string
        description: '["n","limit","category","archived"]'
      - name: types
        in: query
        required: false
        schema:
          type: string
        description: '{"n":"number (default 10, max 50)","category":"string","archived":"true|false"}'
    servers:
    - url: https://defici.com
  /api/news/latest:
    get:
      tags:
      - Public Browse
      summary: GET /api/news/latest
      description: 'Auth: public'
      operationId: get_news_latest
      responses:
        '200':
          description: Success
          content:
            application/json:
              example:
                status: ok|stalled|no_articles
                latest:
                  id: uuid
                  title: string
                  created_at: ISO8601
                  published_at: ISO8601
                  ai_generated: boolean
                hours_since_latest: number
      security: []
    servers:
    - url: https://defici.com
  /feed.json:
    get:
      tags:
      - Public Browse
      summary: Machine-readable feed of OUR OWN active listings, refreshed every 6 h by cron
      description: 'Machine-readable feed of OUR OWN active listings, refreshed every 6 h by cron. NOT the full catalogue and NOT a bulk download of it: scraped third-party listings are excluded by design. The envelope declares population, record_count, total and partial, and the same statement is repeated in X-Feed-* response headers. Listing fields: id, title, price, currency, region, country, images, seller_type, availability, updated_at, category.


        Auth: public'
      operationId: get__feed_json
      responses:
        '200':
          description: Success
          content:
            application/json:
              example: 'JSON object: { generated_at, record_count, total, partial, pagination, population, source, feed_url, csv_url, listings: [...] }.'
        '503':
          description: Feed not yet generated - the generator runs every 6 hours
      security: []
    servers:
    - url: https://defici.com
  /feed.csv:
    get:
      tags:
      - Public Browse
      summary: The CSV twin of /feed.json, RFC 4180
      description: 'The CSV twin of /feed.json, RFC 4180. Same data, same 6 h cron. This is NOT a bulk-read surface for the full ads catalogue - there is no such surface; use the search endpoints to reach the catalogue. A CSV carries no envelope, so population, record_count, total and partial arrive in the X-Feed-* response headers. Columns (double-quoted): id, title, price, currency, region, country, images (JSON-encoded array), seller_type, availability, updated_at, category.


        Auth: public'
      operationId: get__feed_csv
      responses:
        '200':
          description: Success
          content:
            application/json:
              example: text/csv stream with headers, plus X-Feed-Population / X-Feed-Record-Count / X-Feed-Total / X-Feed-Partial / X-Feed-Pagination / X-Feed-Generated-At.
        '503':
          description: Feed not yet generated - the generator runs every 6 hours
      security: []
    servers:
    - url: https://defici.com
components:
  securitySchemes:
    bearerAuth:
      type: http
      scheme: bearer
      description: ak_ key from POST /api/v1/agent/challenge → /verify. Also accepted as X-API-Key.
x-refined-from:
- defici-com-openapi.json
- defici-com-openapi.yml