Debriefing Battlecards API

Generated battlecards for this workspace.

Operations 2

GET /api/v1/battlecards List generated battlecards #
GET /api/v1/battlecards/{id} Get one battlecard #

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/debriefing-io:debriefing-io-battlecards-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

debriefing-io-battlecards-api-openapi.yml Raw ↑
openapi: 3.2.0
info:
  title: Debriefing Read Battlecards API
  version: 1.0.0
  summary: Read competitors, signals, digests, and battlecards for one workspace.
  description: 'A JSON API for one organization. Create an API key in Settings → Integrations.

    The same key authenticates the MCP endpoint at `POST /mcp`.


    Every key reads. A key writes only through a scope ticked when the key is made. The one

    scope today is `watchlist:add`, which lets `POST /api/v1/competitors` add a competitor and

    nothing else. Existing keys have no scopes and stay read-only.


    Clients may name themselves in the `X-Debriefing-Source` header, a short lowercase slug

    such as `google-sheets-addon`. A competitor added through the API records it.


    Every request is scoped to the organization that owns the key. The free week that unlocks

    the dashboard does not unlock this API. A paid subscription is required.


    Blank fields are omitted from response objects. Empty summary domains are omitted from a

    competitor dossier.


    Every error is RFC 9457 problem details, sent as `application/problem+json`, with a

    machine-readable `code` and a `hint`. See the `Problem` schema and

    https://debriefing.io/developers#errors.


    This file is also served as JSON at `/openapi.json`.'
  contact:
    name: Debriefing
    url: https://debriefing.io
servers:
- url: https://debriefing.io
  description: Production
security:
- bearerAuth: []
- apiKeyHeader: []
tags:
- name: Battlecards
  description: Generated battlecards for this workspace.
paths:
  /api/v1/battlecards:
    get:
      tags:
      - Battlecards
      operationId: listBattlecards
      summary: List generated battlecards
      description: Returns generated battlecards for this workspace, ordered by competitor id. Not paginated.
      responses:
        '200':
          description: The battlecards for this workspace.
          content:
            application/json:
              schema:
                type: object
                required:
                - data
                properties:
                  data:
                    type: array
                    items:
                      $ref: '#/components/schemas/Battlecard'
        '401':
          $ref: '#/components/responses/Unauthorized'
        '402':
          $ref: '#/components/responses/PaymentRequired'
        '429':
          $ref: '#/components/responses/TooManyRequests'
        '500':
          $ref: '#/components/responses/InternalError'
  /api/v1/battlecards/{id}:
    get:
      tags:
      - Battlecards
      operationId: getBattlecard
      summary: Get one battlecard
      description: Looks up a generated battlecard by battlecard id first, then by competitor id.
      parameters:
      - name: id
        in: path
        required: true
        schema:
          type: integer
        description: Battlecard id or competitor id.
      responses:
        '200':
          description: One battlecard.
          content:
            application/json:
              schema:
                type: object
                required:
                - data
                properties:
                  data:
                    $ref: '#/components/schemas/Battlecard'
        '401':
          $ref: '#/components/responses/Unauthorized'
        '402':
          $ref: '#/components/responses/PaymentRequired'
        '404':
          $ref: '#/components/responses/NotFound'
        '429':
          $ref: '#/components/responses/TooManyRequests'
        '500':
          $ref: '#/components/responses/InternalError'
components:
  responses:
    InternalError:
      description: An error occurred on the server. The body holds no internal detail.
      content:
        application/problem+json:
          schema:
            $ref: '#/components/schemas/Problem'
          example:
            type: https://debriefing.io/developers#errors-internal_error
            title: Internal error
            status: 500
            detail: An error occurred on the server.
            code: internal_error
            hint: Send the request again later. If the error continues, email team@debriefing.io with the request_id.
            instance: /api/v1/signals
            request_id: 5f1c2b7e-9a41-4c1e-8d0e-2b1f3a6c7d80
            error: An error occurred on the server.
    NotFound:
      description: No matching record in this workspace.
      content:
        application/problem+json:
          schema:
            $ref: '#/components/schemas/Problem'
          example:
            type: https://debriefing.io/developers#errors-not_found
            title: Not found
            status: 404
            detail: No such competitor.
            code: not_found
            hint: Check the path and the id. The list routes, such as /api/v1/competitors, give the ids that this key can read.
            instance: /api/v1/competitors/999
            request_id: 5f1c2b7e-9a41-4c1e-8d0e-2b1f3a6c7d80
            error: No such competitor.
    Unauthorized:
      description: Missing, wrong, or revoked API key.
      headers:
        WWW-Authenticate:
          schema:
            type: string
          example: Bearer realm="Debriefing API"
      content:
        application/problem+json:
          schema:
            $ref: '#/components/schemas/Problem'
          example:
            type: https://debriefing.io/developers#errors-invalid_api_key
            title: API key missing or not valid
            status: 401
            detail: A valid API key is required.
            code: invalid_api_key
            hint: 'Send a valid key as Authorization: Bearer dbk_… or as X-API-Key. A workspace admin creates keys in Organization settings, under Integrations.'
            instance: /api/v1/competitors
            request_id: 5f1c2b7e-9a41-4c1e-8d0e-2b1f3a6c7d80
            error: A valid API key is required.
    PaymentRequired:
      description: The key's organization does not have a paid subscription.
      content:
        application/problem+json:
          schema:
            $ref: '#/components/schemas/Problem'
          example:
            type: https://debriefing.io/developers#errors-paid_plan_required
            title: Paid plan required
            status: 402
            detail: Choose a paid plan to use this feature.
            code: paid_plan_required
            hint: Choose a paid plan for this workspace on /pricing. The free week does not include the API.
            instance: /api/v1/competitors
            request_id: 5f1c2b7e-9a41-4c1e-8d0e-2b1f3a6c7d80
            error: Choose a paid plan to use this feature.
    TooManyRequests:
      description: This address sent more than 600 requests in one minute.
      headers:
        Retry-After:
          description: Seconds to wait before the next request.
          schema:
            type: integer
          example: 60
      content:
        application/problem+json:
          schema:
            $ref: '#/components/schemas/Problem'
          example:
            type: https://debriefing.io/developers#errors-rate_limited
            title: Too many requests
            status: 429
            detail: This address sent more than 600 requests in one minute.
            code: rate_limited
            hint: Wait for the number of seconds in the Retry-After header. Then send the request again.
            instance: /api/v1/signals
            request_id: 5f1c2b7e-9a41-4c1e-8d0e-2b1f3a6c7d80
            error: This address sent more than 600 requests in one minute.
  schemas:
    CompetitorSlots:
      type: object
      required:
      - limit
      - used
      - remaining
      properties:
        limit:
          type: integer
        used:
          type: integer
        remaining:
          type: integer
    Problem:
      type: object
      description: 'RFC 9457 problem details, sent as `application/problem+json`. Every 4xx and 5xx

        response of the read API has this shape. Branch on `code`, not on `detail` or `title`.

        The `type` URL points at the row for the code on /developers.

        '
      required:
      - type
      - title
      - status
      - detail
      - code
      - hint
      properties:
        type:
          type: string
          format: uri
          description: Documentation URL for this code, `https://debriefing.io/developers#errors-<code>`.
        title:
          type: string
          description: Short summary of the code. The same for every problem with this code.
        status:
          type: integer
          description: The HTTP status code.
        detail:
          type: string
          description: What went wrong with this request.
        code:
          type: string
          description: Machine-readable error code. Stable.
          enum:
          - invalid_request
          - invalid_api_key
          - paid_plan_required
          - plan_limit_reached
          - forbidden
          - insufficient_scope
          - not_found
          - unprocessable_content
          - rate_limited
          - internal_error
        hint:
          type: string
          description: What the client can do next.
        instance:
          type: string
          description: The request path.
        request_id:
          type: string
          description: The request id. Send it to support when you report an error.
        error:
          type: string
          deprecated: true
          description: The same text as `detail`. Kept for clients that read the old `{ "error" }` body.
        upgrade_url:
          type: string
          format: uri
          description: With `plan_limit_reached`. Where an admin chooses a larger plan.
        competitor_slots:
          $ref: '#/components/schemas/CompetitorSlots'
    Battlecard:
      type: object
      required:
      - id
      - competitor_id
      - status
      - url
      properties:
        id:
          type: integer
        competitor_id:
          type: integer
        competitor_name:
          type: string
        status:
          type: string
          example: generated
        generated_at:
          type: string
          format: date-time
        sections:
          type: object
          additionalProperties: true
        evidence:
          type: object
          additionalProperties: true
        url:
          type: string
          format: uri
          description: Link to the battlecard page in the app.
  securitySchemes:
    bearerAuth:
      type: http
      scheme: bearer
      bearerFormat: dbk_
      description: 'Send `Authorization: Bearer dbk_…`. The plain token is shown once when the key is

        created. Only a SHA-256 digest is stored.

        '
    apiKeyHeader:
      type: apiKey
      in: header
      name: X-API-Key
      description: Alternative to Bearer. Send the same `dbk_…` token.