Currents Errors Explorer API
Query and filter errors from the Error Explorer. Returns aggregated error metrics for a project within a date range, with optional filters for error target, message, category, action, tags, branches, authors, and groups.
Query and filter errors from the Error Explorer. Returns aggregated error metrics for a project within a date range, with optional filters for error target, message, category, action, tags, branches, authors, and groups.
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/currents-dev:currents-dev-errors-explorer-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: Currents Dev Errors Explorer API
version: 1.0.0
contact:
name: Currents Support
url: https://currents.dev
description: 'Operations tagged Errors Explorer across 2 of this provider''s published API definitions: currents-dev-openapi.json, currents-dev-openapi.yml. Each path carries the servers of the definition it was published in.'
servers:
- url: https://api.currents.dev/v1
description: Production API
- url: https://api-staging.currents.dev/v1
description: Staging API
- url: http://localhost:4000/v1
description: Local development
security:
- BearerAuth: []
tags:
- name: Errors Explorer
description: 'Query and filter errors from the Error Explorer.
Returns aggregated error metrics for a project within a date range, with optional filters
for error target, message, category, action, tags, branches, authors, and groups.'
paths:
/errors/{projectId}:
get:
summary: Get errors explorer
description: Get aggregated error metrics for a project within a date range. Supports filtering by error_target, error_message, error_category, error_action, test_title, tags, branches, authors, and groups.
operationId: getErrorsExplorer
security:
- BearerAuth: []
- OAuth2:
- analytics:read
tags:
- Errors Explorer
parameters:
- $ref: '#/components/parameters/ProjectIdPath'
- $ref: '#/components/parameters/DateStartQuery'
- $ref: '#/components/parameters/DateEndQuery'
- $ref: '#/components/parameters/PageQuery'
- name: limit
in: query
required: false
description: Maximum number of results (1-100)
schema:
type: integer
minimum: 1
maximum: 100
default: 50
- $ref: '#/components/parameters/TagsQuery'
- name: tags_logical_operator
in: query
required: false
description: 'Logical operator for tags filter: OR (match any) or AND (match all). Default: OR.'
schema:
type: string
enum:
- OR
- AND
default: OR
- $ref: '#/components/parameters/BranchesQuery'
- $ref: '#/components/parameters/GroupsQuery'
- $ref: '#/components/parameters/AuthorsQuery'
- name: error_target
in: query
required: false
description: Filter by error target (e.g. CSS selector, URL)
schema:
type: string
- name: error_message
in: query
required: false
description: Filter by error message (case-insensitive partial match)
schema:
type: string
- name: error_category
in: query
required: false
description: Filter by error category
schema:
type: string
- name: error_action
in: query
required: false
description: Filter by error action
schema:
type: string
- name: test_title
in: query
required: false
description: Filter by test title (case-insensitive partial match)
schema:
type: string
- name: order_by
in: query
required: false
description: Field to order results by
schema:
type: string
enum:
- count
- tests
- branches
- error
default: count
- $ref: '#/components/parameters/SortDirectionQuery'
- name: group_by[]
in: query
required: false
description: 'Group results by dimension (can be specified multiple times using bracket notation, e.g., group_by[]=target&group_by[]=message). Order matters: the first value is the primary grouping and filters out nulls for that dimension; subsequent values are applied in order. Grouping by `test` additionally returns `signature`, `title`, and `spec` on each item.'
schema:
type: array
items:
type: string
enum:
- target
- action
- category
- message
- test
style: form
explode: true
example:
- target
- name: metric
in: query
required: false
description: Metric used for timeline ranking (occurrence, test, or branch)
schema:
type: string
enum:
- occurrence
- test
- branch
default: occurrence
- name: top_n
in: query
required: false
description: 'Maximum number of top errors per timeline bucket (1-50). Default: 5.'
schema:
type: integer
minimum: 1
maximum: 50
default: 5
responses:
'200':
description: Successful response
content:
application/json:
schema:
$ref: '#/components/schemas/ErrorsExplorerResponse'
'400':
$ref: '#/components/responses/BadRequest'
'401':
$ref: '#/components/responses/Unauthorized'
'403':
$ref: '#/components/responses/Forbidden'
'404':
$ref: '#/components/responses/NotFound'
servers:
- url: https://api.currents.dev/v1
description: Production API
- url: https://api-staging.currents.dev/v1
description: Staging API
- url: http://localhost:4000/v1
description: Local development
components:
parameters:
ProjectIdPath:
name: projectId
in: path
required: true
description: The project ID
schema:
type: string
example: proj_abc123
GroupsQuery:
name: groups[]
in: query
required: false
description: Filter by groups (can be specified multiple times using bracket notation, e.g., groups[]=group1&groups[]=group2)
schema:
type: array
items:
type: string
style: form
explode: true
example:
- group1
- group2
DateEndQuery:
name: date_end
in: query
required: true
description: End date in ISO 8601 format
schema:
type: string
format: date-time
example: '2024-01-31T23:59:59.999Z'
PageQuery:
name: page
in: query
required: false
description: Page number (0-indexed)
schema:
type: integer
minimum: 0
default: 0
TagsQuery:
name: tags[]
in: query
required: false
description: Filter by tags (can be specified multiple times using bracket notation, e.g., tags[]=value1&tags[]=value2)
schema:
type: array
items:
type: string
style: form
explode: true
example:
- tag1
- tag2
BranchesQuery:
name: branches[]
in: query
required: false
description: Filter by git branch. Use trailing `*` for prefix match (e.g. `release/*`). Max 250 characters per value.
schema:
type: array
items:
$ref: '#/components/schemas/BranchFilterQueryValue'
style: form
explode: true
example:
- main
- release/*
AuthorsQuery:
name: authors[]
in: query
required: false
description: Filter by git authors (can be specified multiple times using bracket notation, e.g., authors[]=author1&authors[]=author2)
schema:
type: array
items:
type: string
style: form
explode: true
example:
- author1
- author2
DateStartQuery:
name: date_start
in: query
required: true
description: Start date in ISO 8601 format
schema:
type: string
format: date-time
example: '2024-01-01T00:00:00.000Z'
SortDirectionQuery:
name: dir
in: query
required: false
description: 'Sort direction: `desc` (default) or `asc`.'
schema:
type: string
enum:
- asc
- desc
default: desc
schemas:
ErrorResponse:
type: object
required:
- status
- error
properties:
status:
type: string
enum:
- FAILED
error:
type: string
description: Error message
code:
type: string
description: Stable machine-readable discriminator, present on refusals a client is expected to branch on (for example `AI_CONSENT_REQUIRED`). The `error` text is free-form; branch on `code`.
candidates:
type: array
description: 'With `code: ambiguous_target`: the runs, spec files or tests the request matched. Send one of their IDs.'
items:
type: object
properties:
runId:
type: string
ciBuildId:
type: string
instanceId:
type: string
groupId:
type: string
spec:
type: string
machineId:
type:
- string
- 'null'
testId:
type: string
title:
type: array
items:
type: string
ErrorsExplorerTimelineItem:
type: object
properties:
date:
type: string
count:
type: integer
items:
type: array
items:
$ref: '#/components/schemas/ErrorsExplorerItem'
ErrorsExplorerResponse:
type: object
required:
- status
- data
properties:
status:
type: string
enum:
- OK
data:
type: object
properties:
list:
type: array
items:
$ref: '#/components/schemas/ErrorsExplorerItem'
description: Error items for the current page
timeline:
type: array
items:
$ref: '#/components/schemas/ErrorsExplorerTimelineItem'
description: Time-bucketed top errors (date, count, items per bucket)
count:
type: integer
description: Number of items in the current page
total:
type: integer
description: Total number of errors matching the filter
nextPage:
oneOf:
- type: integer
- type: boolean
description: Next page number (0-indexed) or false if no more pages
ErrorsExplorerItem:
type: object
properties:
message:
type:
- string
- 'null'
error_category:
type:
- string
- 'null'
error_action:
type:
- string
- 'null'
error_target:
type:
- string
- 'null'
signature:
type:
- string
- 'null'
description: Test signature. Present only when group_by includes `test`.
title:
type:
- string
- 'null'
description: Test title. Present only when group_by includes `test`.
spec:
type:
- string
- 'null'
description: Spec file path. Present only when group_by includes `test`.
count:
type: integer
details:
type: object
properties:
tests:
type: object
properties:
count:
type: integer
branches:
type: object
properties:
count:
type: integer
BranchFilterQueryValue:
description: 'Branch filter value: an exact branch name, or a trailing `*` for prefix match (e.g. `release/*`). Max 250 characters.'
oneOf:
- type: string
description: Exact branch name (must not contain `*` or spaces).
pattern: ^[!-)+-~]+$
maxLength: 250
- type: string
description: 'Prefix match: branch prefix followed by `*`.'
pattern: ^[!-)+-~]+\*$
maxLength: 250
responses:
BadRequest:
description: Invalid request parameters
content:
application/json:
schema:
$ref: '#/components/schemas/ErrorResponse'
example:
status: FAILED
error: 'Invalid request body: name is required'
NotFound:
description: Resource not found
content:
application/json:
schema:
$ref: '#/components/schemas/ErrorResponse'
example:
status: FAILED
error: Not found
Forbidden:
description: 'The credential authenticated but is not permitted to use this endpoint. Five refusals share the status: a `read` API key on an endpoint that writes, an OAuth token that was not granted the scope the endpoint needs (`insufficient_scope`), an OAuth token that was granted it but whose holder no longer has a role permitting it (`insufficient_role`), an OAuth token on an endpoint that accepts an API key and nothing else (`api_key_required`), and an API key on an endpoint that answers for a user (`user_credential_required`). Discriminate on `code` rather than on the message, which is free-form. The first refusal predates the codes and sets none. Only `insufficient_scope` carries the challenge header, because it is the only one a client can act on by re-authorizing.'
headers:
WWW-Authenticate:
description: 'Present on the `insufficient_scope` refusal only, naming the scope to re-authorize for (RFC 6750 3.1): `Bearer error="insufficient_scope", scope="webhooks:read"`. Absent on `insufficient_role`, where the scope is already granted, and on `api_key_required` and `user_credential_required`, where no scope would help.'
schema:
type: string
content:
application/json:
schema:
$ref: '#/components/schemas/ErrorResponse'
examples:
apiKeyIsReadOnly:
summary: A read API key on an endpoint that writes
value:
status: FAILED
error: 'Insufficient permissions: write access required'
scopeNotGranted:
summary: An OAuth token missing the endpoint's scope
value:
status: FAILED
error: 'Insufficient permissions: this endpoint requires the webhooks:read scope'
code: insufficient_scope
scopeAboveRole:
summary: An OAuth token holding the scope, whose holder was since demoted
value:
status: FAILED
error: 'Insufficient permissions: the webhooks:write scope requires the admin role in this organization'
code: insufficient_role
apiKeyRequired:
summary: An OAuth token on an endpoint that takes an API key
value:
status: FAILED
error: This endpoint accepts an API key, not an OAuth access token
code: api_key_required
userCredentialRequired:
summary: An API key on an endpoint that answers for a user
value:
status: FAILED
error: This endpoint requires an OAuth access token or a personal access token; an API key belongs to an organization, not a user
code: user_credential_required
Unauthorized:
description: Authentication failed
content:
application/json:
schema:
$ref: '#/components/schemas/ErrorResponse'
example:
status: FAILED
error: Invalid authentication credentials
securitySchemes:
RecordKey:
type: apiKey
in: header
name: x-currents-key
description: An organization's record key, the one a reporter sends. Accepted only by the two attachment routes under `/runs`, `POST /runs/{runId}/context-links`, `POST /sessions`, `POST /sessions/{sessionId}/attachments` and, for a session, `POST /share`, so a CI job can attach files, link its failed and flaky tests, record a session and share it with the key it already has.
BearerAuth:
type: http
scheme: bearer
description: 'An organization API key, sent as `Authorization: Bearer <key>`. A key carries one scope for the whole API: a `read` key reaches the GET endpoints, a `write` key reaches all of them. A `crnts_pat_` personal access token is accepted as a Bearer while its owner remains an eligible administrator in its active organization. Each operation requires the corresponding scope stored on that token.'
OAuth2:
type: oauth2
description: 'An access token from the Currents authorization server, for an application acting as a user in one organization. Unlike an API key it is confined per endpoint: the operation lists the scope it needs, and a token that was not granted that scope gets 403.
**The endpoints below are production''s.** They are written out so this specification can be exercised against production, and they are wrong for every other deployment — a token minted by `id.currents.dev` is refused by a staging or on-premise API, whose `OAUTH_ISSUER` and `OAUTH_API_AUDIENCE` are its own. Against anything but production, and in a client generated from this document, discover them instead: `GET {api origin}/.well-known/oauth-protected-resource`, then the `authorization_servers[0]` document.
**The audience named here is the REST API''s.** `POST /mcp` is a second resource server on the same origin, identified by `{api origin}/mcp` and described by its own document at `/.well-known/oauth-protected-resource/mcp`. Every operation below refuses a token minted for it, and it refuses every token minted for these, so a client of this specification wants the audience above and not that one.'
flows:
authorizationCode:
authorizationUrl: https://id.currents.dev/api/auth/oauth2/authorize
tokenUrl: https://id.currents.dev/api/auth/oauth2/token
refreshUrl: https://id.currents.dev/api/auth/oauth2/token
scopes:
projects:read: See which projects exist and their names
projects:write: Change project configuration, including a project's tags
results:read: See runs, specs and failure detail — errors, stacks and artifacts
analytics:read: 'See aggregate metrics: flake and failure rates, error counts, durations and trends'
actions:read: See quarantine and skip rules, and the tests they affect
actions:write: Create, edit, enable, disable and archive quarantine and skip rules
issues:write: Create and link issues in a connected issue tracker, and list its projects and issue types
runs:write: Cancel and reset runs, and permanently delete runs and their artifacts
webhooks:read: See webhook configuration, including destination URLs and headers
webhooks:write: Create, edit and delete webhooks
shares:write: Create public links to test results that anyone with the link can open until they expire
x-refined-from:
- currents-dev-openapi.json
- currents-dev-openapi.yml