Actions
Manage test actions (rules) that automatically modify test behavior.
Actions allow you to:
Skip tests that match certain conditions
Quarantine flaky tests so their failures don't fail the run
Tag tests with custom labels for organization
Each action has a matcher that defines which tests it applies to, based on conditions like test title, file path, tags, git branch, etc.
Get all actions for a project with optional filtering
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.
The project ID
proj_abc123Search actions by name
flaky testSuccessful response
Invalid request parameters
Authentication failed
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.
Resource not found
GET /v1/actions?projectId=text HTTP/1.1
Host: api.currents.dev
Authorization: Bearer YOUR_SECRET_TOKEN
Accept: */*
{
"status": "OK",
"data": [
{
"actionId": "text",
"name": "text",
"description": "text",
"action": [
{
"op": "skip"
}
],
"matcher": {
"op": "AND",
"cond": [
{
"type": "title",
"op": "in",
"value": [
"flaky"
]
},
{
"type": "project",
"op": "eq",
"value": "chromium"
}
]
},
"status": "active",
"createdAt": "2026-01-01T00:00:00.000Z",
"createdBy": "text",
"updatedAt": "2026-01-01T00:00:00.000Z",
"updatedBy": "text",
"disabledAt": "2026-01-01T00:00:00.000Z",
"disabledBy": "text",
"archivedAt": "2026-01-01T00:00:00.000Z",
"archivedBy": "text",
"expiresAfter": "2026-01-01T00:00:00.000Z"
}
]
}Create a new action for a project
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.
The project ID
proj_abc123Action created successfully
Invalid request parameters
Authentication failed
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.
Resource not found
POST /v1/actions?projectId=text HTTP/1.1
Host: api.currents.dev
Authorization: Bearer YOUR_SECRET_TOKEN
Content-Type: application/json
Accept: */*
Content-Length: 228
{
"name": "text",
"description": "text",
"action": [
{
"op": "skip"
}
],
"matcher": {
"op": "AND",
"cond": [
{
"type": "title",
"op": "in",
"value": [
"flaky"
]
},
{
"type": "project",
"op": "eq",
"value": "chromium"
}
]
},
"expiresAfter": "2026-01-01T00:00:00.000Z"
}{
"status": "OK",
"data": {
"actionId": "text",
"name": "text",
"description": "text",
"action": [
{
"op": "skip"
}
],
"matcher": {
"op": "AND",
"cond": [
{
"type": "title",
"op": "in",
"value": [
"flaky"
]
},
{
"type": "project",
"op": "eq",
"value": "chromium"
}
]
},
"status": "active",
"createdAt": "2026-01-01T00:00:00.000Z",
"createdBy": "text",
"updatedAt": "2026-01-01T00:00:00.000Z",
"updatedBy": "text",
"disabledAt": "2026-01-01T00:00:00.000Z",
"disabledBy": "text",
"archivedAt": "2026-01-01T00:00:00.000Z",
"archivedBy": "text",
"expiresAfter": "2026-01-01T00:00:00.000Z"
}
}Get a single action by ID. The actionId is globally unique, so projectId is not required.
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.
The action ID
507f1f77bcf86cd799439011Successful response
Invalid request parameters
Authentication failed
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.
Resource not found
GET /v1/actions/{actionId} HTTP/1.1
Host: api.currents.dev
Authorization: Bearer YOUR_SECRET_TOKEN
Accept: */*
{
"status": "OK",
"data": {
"actionId": "text",
"name": "text",
"description": "text",
"action": [
{
"op": "skip"
}
],
"matcher": {
"op": "AND",
"cond": [
{
"type": "title",
"op": "in",
"value": [
"flaky"
]
},
{
"type": "project",
"op": "eq",
"value": "chromium"
}
]
},
"status": "active",
"createdAt": "2026-01-01T00:00:00.000Z",
"createdBy": "text",
"updatedAt": "2026-01-01T00:00:00.000Z",
"updatedBy": "text",
"disabledAt": "2026-01-01T00:00:00.000Z",
"disabledBy": "text",
"archivedAt": "2026-01-01T00:00:00.000Z",
"archivedBy": "text",
"expiresAfter": "2026-01-01T00:00:00.000Z"
}
}Update an existing action. The actionId is globally unique, so projectId is not required.
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.
The action ID
507f1f77bcf86cd799439011Action updated successfully
Invalid request parameters
Authentication failed
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.
Resource not found
PUT /v1/actions/{actionId} HTTP/1.1
Host: api.currents.dev
Authorization: Bearer YOUR_SECRET_TOKEN
Content-Type: application/json
Accept: */*
Content-Length: 228
{
"name": "text",
"description": "text",
"action": [
{
"op": "skip"
}
],
"matcher": {
"op": "AND",
"cond": [
{
"type": "title",
"op": "in",
"value": [
"flaky"
]
},
{
"type": "project",
"op": "eq",
"value": "chromium"
}
]
},
"expiresAfter": "2026-01-01T00:00:00.000Z"
}{
"status": "OK",
"data": {
"actionId": "text",
"name": "text",
"description": "text",
"action": [
{
"op": "skip"
}
],
"matcher": {
"op": "AND",
"cond": [
{
"type": "title",
"op": "in",
"value": [
"flaky"
]
},
{
"type": "project",
"op": "eq",
"value": "chromium"
}
]
},
"status": "active",
"createdAt": "2026-01-01T00:00:00.000Z",
"createdBy": "text",
"updatedAt": "2026-01-01T00:00:00.000Z",
"updatedBy": "text",
"disabledAt": "2026-01-01T00:00:00.000Z",
"disabledBy": "text",
"archivedAt": "2026-01-01T00:00:00.000Z",
"archivedBy": "text",
"expiresAfter": "2026-01-01T00:00:00.000Z"
}
}Archive an action (soft delete). The actionId is globally unique, so projectId is not required.
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.
The action ID
507f1f77bcf86cd799439011Action archived successfully
Invalid request parameters
Authentication failed
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.
Resource not found
DELETE /v1/actions/{actionId} HTTP/1.1
Host: api.currents.dev
Authorization: Bearer YOUR_SECRET_TOKEN
Accept: */*
{
"status": "OK",
"data": {
"actionId": "text",
"archived": true
}
}Enable a disabled action. The actionId is globally unique, so projectId is not required.
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.
The action ID
507f1f77bcf86cd799439011Action enabled successfully
Invalid request parameters
Authentication failed
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.
Resource not found
PUT /v1/actions/{actionId}/enable HTTP/1.1
Host: api.currents.dev
Authorization: Bearer YOUR_SECRET_TOKEN
Accept: */*
{
"status": "OK",
"data": {
"actionId": "text",
"name": "text",
"description": "text",
"action": [
{
"op": "skip"
}
],
"matcher": {
"op": "AND",
"cond": [
{
"type": "title",
"op": "in",
"value": [
"flaky"
]
},
{
"type": "project",
"op": "eq",
"value": "chromium"
}
]
},
"status": "active",
"createdAt": "2026-01-01T00:00:00.000Z",
"createdBy": "text",
"updatedAt": "2026-01-01T00:00:00.000Z",
"updatedBy": "text",
"disabledAt": "2026-01-01T00:00:00.000Z",
"disabledBy": "text",
"archivedAt": "2026-01-01T00:00:00.000Z",
"archivedBy": "text",
"expiresAfter": "2026-01-01T00:00:00.000Z"
}
}Disable an active action. The actionId is globally unique, so projectId is not required.
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.
The action ID
507f1f77bcf86cd799439011Action disabled successfully
Invalid request parameters
Authentication failed
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.
Resource not found
PUT /v1/actions/{actionId}/disable HTTP/1.1
Host: api.currents.dev
Authorization: Bearer YOUR_SECRET_TOKEN
Accept: */*
{
"status": "OK",
"data": {
"actionId": "text",
"name": "text",
"description": "text",
"action": [
{
"op": "skip"
}
],
"matcher": {
"op": "AND",
"cond": [
{
"type": "title",
"op": "in",
"value": [
"flaky"
]
},
{
"type": "project",
"op": "eq",
"value": "chromium"
}
]
},
"status": "active",
"createdAt": "2026-01-01T00:00:00.000Z",
"createdBy": "text",
"updatedAt": "2026-01-01T00:00:00.000Z",
"updatedBy": "text",
"disabledAt": "2026-01-01T00:00:00.000Z",
"disabledBy": "text",
"archivedAt": "2026-01-01T00:00:00.000Z",
"archivedBy": "text",
"expiresAfter": "2026-01-01T00:00:00.000Z"
}
}Get tests affected by actions (quarantine, skip, tag) for a project within a date range. Returns aggregated data grouped by test signature.
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.
The project ID
proj_abc123Start date in ISO 8601 format
2024-01-01T00:00:00.000ZEnd date in ISO 8601 format
2024-01-31T23:59:59.999ZPage number (0-indexed)
0Maximum number of results (1-100)
25Search by spec file path, test title, or action name (case-insensitive)
Filter by specific action ID (action_id)
Sort direction: desc (default) or asc.
descPossible values: Successful response
Invalid request parameters
Authentication failed
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.
Resource not found
GET /v1/actions/tests?projectId=text&date_start=2026-01-01T00%3A00%3A00.000Z&date_end=2026-01-01T00%3A00%3A00.000Z HTTP/1.1
Host: api.currents.dev
Authorization: Bearer YOUR_SECRET_TOKEN
Accept: */*
{
"status": "OK",
"data": {
"list": [
{
"signature": "text",
"title": "text",
"specFile": "text",
"actions": [
{
"types": [
"quarantine"
],
"name": "text",
"id": "text",
"status": "active",
"expiresAt": "2026-01-01T00:00:00.000Z",
"tags": [
"text"
],
"lastSeen": "2026-01-01T00:00:00.000Z",
"recordingCount": 1
}
],
"lastSeen": "2026-01-01T00:00:00.000Z",
"recordingCount": 1
}
],
"count": 1,
"total": 1,
"nextPage": 1
}
}Get execution details for a specific affected test (by signature) within a date range. Returns individual test execution records with action info. Results are paginated with cursor-based pagination using the starting_after and ending_before query parameters. To list executions for a single rule across all tests, use GET /actions/{actionId}/tests instead of the removed action_id query parameter.
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.
Test signature hash
The project ID
proj_abc123Start date in ISO 8601 format
2024-01-01T00:00:00.000ZEnd date in ISO 8601 format
2024-01-31T23:59:59.999ZMaximum number of executions (1-50)
25Cursor for pagination. Returns items after this cursor value.
Cursor for pagination. Returns items before this cursor value.
Search by action name (case-insensitive)
Successful response
Invalid request parameters
Authentication failed
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.
Resource not found
GET /v1/actions/tests/{signature}?projectId=text&date_start=2026-01-01T00%3A00%3A00.000Z&date_end=2026-01-01T00%3A00%3A00.000Z HTTP/1.1
Host: api.currents.dev
Authorization: Bearer YOUR_SECRET_TOKEN
Accept: */*
{
"status": "OK",
"data": {
"executions": [
{
"cursor": "text",
"runId": "text",
"instanceId": "text",
"testId": "text",
"specFile": "text",
"title": "text",
"signature": "text",
"branch": "text",
"commitSha": "text",
"prTitle": "text",
"prId": "text",
"commitMessage": "text",
"groupId": "text",
"state": "passed",
"isFlaky": true,
"executedAt": "2026-01-01T00:00:00.000Z"
}
],
"has_more": true
}
}List test executions where this rule/action was applied, within a date range. Same cursor pagination and filters as GET /actions/tests/{signature} except projectId is taken from the rule (after org ownership checks).
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.
The action ID
507f1f77bcf86cd799439011Start date in ISO 8601 format
2024-01-01T00:00:00.000ZEnd date in ISO 8601 format
2024-01-31T23:59:59.999ZMaximum number of executions (1-50)
25Cursor for pagination. Returns items after this cursor value.
Cursor for pagination. Returns items before this cursor value.
Search by action name (case-insensitive)
Successful response
Invalid request parameters
Authentication failed
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.
Resource not found
GET /v1/actions/{actionId}/tests?date_start=2026-01-01T00%3A00%3A00.000Z&date_end=2026-01-01T00%3A00%3A00.000Z HTTP/1.1
Host: api.currents.dev
Authorization: Bearer YOUR_SECRET_TOKEN
Accept: */*
{
"status": "OK",
"data": {
"executions": [
{
"cursor": "text",
"runId": "text",
"instanceId": "text",
"testId": "text",
"specFile": "text",
"title": "text",
"signature": "text",
"branch": "text",
"commitSha": "text",
"prTitle": "text",
"prId": "text",
"commitMessage": "text",
"groupId": "text",
"state": "passed",
"isFlaky": true,
"executedAt": "2026-01-01T00:00:00.000Z"
}
],
"has_more": true
}
}Last updated
Was this helpful?