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.
Call it yourself
curl for this page
This API
curl "https://apis.io/api/v1/apis/debriefing-io:debriefing-io-signals-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
openapi: 3.2.0
info:
title: Debriefing Read Signals 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: Signals
description: Evidence-backed competitor moves.
paths:
/api/v1/signals:
get:
tags:
- Signals
operationId: listSignals
summary: List open signals
description: 'Returns open signals for competitors this workspace tracks, newest first. Every signal
includes its evidence. Default page size is 50. Maximum page size is 50.'
parameters:
- name: competitor_id
in: query
schema:
type: integer
description: Limit to one tracked competitor.
- name: severity
in: query
schema:
type: string
enum:
- low
- medium
- high
- name: since
in: query
schema:
type: string
format: date-time
description: Include signals whose first seen time is on or after this ISO 8601 time.
- name: q
in: query
schema:
type: string
description: Case-insensitive match on title or summary.
- $ref: '#/components/parameters/Page'
- $ref: '#/components/parameters/PerPage'
responses:
'200':
description: A page of open signals.
content:
application/json:
schema:
type: object
required:
- data
- page
- per_page
properties:
data:
type: array
items:
$ref: '#/components/schemas/Signal'
page:
type: integer
minimum: 1
per_page:
type: integer
minimum: 1
maximum: 50
'400':
$ref: '#/components/responses/BadRequest'
'401':
$ref: '#/components/responses/Unauthorized'
'402':
$ref: '#/components/responses/PaymentRequired'
'429':
$ref: '#/components/responses/TooManyRequests'
'500':
$ref: '#/components/responses/InternalError'
/api/v1/signals/{id}:
get:
tags:
- Signals
operationId: getSignal
summary: Get one signal
description: 'Returns one signal for a competitor this workspace tracks. Unlike the list, this route
can return a closed signal when you know the id.'
parameters:
- name: id
in: path
required: true
schema:
type: integer
responses:
'200':
description: One signal with its evidence.
content:
application/json:
schema:
type: object
required:
- data
properties:
data:
$ref: '#/components/schemas/Signal'
'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:
schemas:
EvidenceItem:
type: object
properties:
text:
type: string
source_title:
type: string
source_url:
type: string
format: uri
observed_at:
type: string
format: date-time
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'
Signal:
type: object
required:
- id
- title
- evidence
- url
properties:
id:
type: integer
competitor_id:
type: integer
competitor_name:
type: string
title:
type: string
summary:
type: string
category:
type: string
type:
type: string
severity:
type: string
enum:
- low
- medium
- high
status:
type: string
first_seen_at:
type: string
format: date-time
last_seen_at:
type: string
format: date-time
confidence:
type: number
topics:
type: array
items:
type: string
evidence:
type: array
items:
$ref: '#/components/schemas/EvidenceItem'
url:
type: string
format: uri
description: Link to the signal page in the app.
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.
BadRequest:
description: A parameter is not valid. For example, `since` is not an ISO 8601 time.
content:
application/problem+json:
schema:
$ref: '#/components/schemas/Problem'
example:
type: https://debriefing.io/developers#errors-invalid_request
title: Invalid request
status: 400
detail: since must be an ISO 8601 time.
code: invalid_request
hint: Correct the parameter that the detail names. Then send the request again.
instance: /api/v1/signals
request_id: 5f1c2b7e-9a41-4c1e-8d0e-2b1f3a6c7d80
error: since must be an ISO 8601 time.
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.
parameters:
Page:
name: page
in: query
schema:
type: integer
minimum: 1
default: 1
PerPage:
name: per_page
in: query
schema:
type: integer
minimum: 1
maximum: 50
default: 50
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.