Test collections
Collections gather test cases that belong together across folders, such as a smoke pack or an API suite, and can reference requirements too. Membership is its own resource: add a test case to a collection by creating a collection-test-case row, remove it by deleting that row.
List test collections
/api/v1/test_collectionsLists test collection resources as a JSON:API collection document. Narrow the set with filter, order it with sort, embed related resources with include, select attributes with fields[<type>], and page with page[size] plus page[number] (offset) or page[after] (cursor, taken from the previous response's links.next).
Query parameters
filterstring- A FiltrQL expression, url-encoded. Combine conditions with AND / OR and parentheses. The fields you can filter on, and the operators each accepts, are listed under Filterable fields.
collectionKey = "A-COL-1"sortstring- Comma-separated sort fields; prefix a field with "-" for descending order (e.g. "-createdAt,title"). Permitted fields: id, organizationId, projectId, collectionKey, name, folderId, purpose, createdBy, lastExecuted, updatedAt, deletedAt, collectionKeyNumeric, filterId.
-collectionKeyincludestring- Comma-separated relation names to include; dot-notation for nested includes (up to 3 levels deep). Permitted top-level relations: createdByUser, testCollectionFolder, organization, project, updatedByUser, defaultRuleAssigneeUser, savedFilter.
createdByUserfields[test_collections]string[]- Sparse fieldset for resource type "test_collections" - comma-separated subset of its exposed fields: id, organizationId, projectId, collectionKey, name, description, folderId, purpose, createdBy, updatedBy, lastExecuted, createdAt, updatedAt, deletedAt, collectionKeyNumeric, filterId, defaultRuleAssigneeId, occVersion, createdByUser, updatedByUser, defaultRuleAssigneeUser, testCollectionFolder, organization, project, savedFilter, customFields.
collectionKey,name,descriptionpage[size]integer- Number of resources per page (applies to both offset and cursor pagination). Minimum 1, maximum 100, default 25 when omitted.
25page[number]integer- 1-indexed page number for offset-based pagination. Mutually exclusive with "page[after]" - supplying both is rejected with a 400 (CONFLICTING_PAGINATION).
2page[after]string- Opaque cursor for cursor-based pagination - always taken verbatim from a previous response's "links.next" value, never client-constructed or decoded. Mutually exclusive with "page[number]" - supplying both is rejected with a 400 (CONFLICTING_PAGINATION).
withDeletedboolean- Include soft-deleted rows in the collection. Only present on soft-delete-enabled entities. Default false (soft-deleted rows excluded) when omitted.
Headers
Authorizationstringrequired- Your API token as a bearer credential.
Bearer $BESTEST_TOKENAcceptstring- Send application/vnd.api+json, or leave it out. Asking for application/json returns 406 Not Acceptable.
application/vnd.api+json
Filterable fields18
Show fields and operators
| Field | Type | Operators |
|---|---|---|
id | uuid | = != in (…) not in (…) is null is not null |
organizationId | uuid | = != in (…) not in (…) is null is not null |
projectId | uuid | = != in (…) not in (…) is null is not null |
collectionKey | string | = != in (…) not in (…) ~ is null is not null |
name | string | ~ is null is not null is empty is not empty |
description | string | ~ is null is not null is empty is not empty |
folderId | uuid | = != in (…) not in (…) is null is not null |
purpose | enum | = != in (…) not in (…) is null is not nullREGRESSION, SMOKE, FUNCTIONAL, PERFORMANCE, SECURITY, API, UI, INTEGRATION, CUSTOM |
createdBy | uuid | = != in (…) not in (…) is null is not null |
updatedBy | uuid | = != in (…) not in (…) is null is not null |
lastExecuted | datetime | = != < <= > >= is null is not null |
createdAt | datetime | = != < <= > >= is null is not null |
updatedAt | datetime | = != < <= > >= is null is not null |
deletedAt | datetime | = != < <= > >= is null is not null |
collectionKeyNumeric | int | = != < <= > >= in (…) not in (…) is null is not null |
filterId | uuid | = != in (…) not in (…) is null is not null |
defaultRuleAssigneeId | uuid | = != in (…) not in (…) is null is not null |
occVersion | int | = != < <= > >= in (…) not in (…) is null is not null |
Filter through a relation with ANY, ALL or NONE, for example testCaseExecutions ANY (id = "…"). Relations: testCaseExecutions, testCollectionRequirements, testCollectionTestCases, createdByUser, testCollectionFolder, organization, project, updatedByUser, defaultRuleAssigneeUser, savedFilter.
Returns the same attributes as Get a test collection.
Responses
- 200Success.
11 error responses
- 400The request is malformed: an unknown field, a filter that does not parse, or conflicting paging parameters.
INVALID_TYPED_JSON_FILTERUNKNOWN_SORT_FIELDINCLUDE_DEPTH_EXCEEDEDUNKNOWN_RELATIONINCLUDE_RESOURCES_EXCEEDEDUNKNOWN_TYPEUNKNOWN_FIELDCONFLICTING_PAGINATIONINVALID_PAGE_SIZEPAGE_SIZE_EXCEEDEDINVALID_PAGE_NUMBERINPUT_DEPTH_EXCEEDEDGRAPHQL_PARSE_FAILEDGRAPHQL_VALIDATION_FAILEDBAD_USER_INPUT - 401The token has expired or could not be authenticated.
TOKEN_EXPIREDUNAUTHENTICATED - 403The token is missing or not recognised, belongs to another region, or is read-only and this is a write.
FORBIDDEN - 404No such resource, or it is outside the Space your token reaches.
NOT_FOUND - 406The Accept header asked for something other than application/vnd.api+json.
NOT_ACCEPTABLE - 409The write conflicts with existing data, for example a duplicate or a reference to something that does not exist.
UNIQUE_VIOLATIONFOREIGN_KEY_VIOLATIONCONFLICT - 415The Content-Type was not application/vnd.api+json.
PARAMETERIZED_ACCEPT - 422The body is well-formed but a value is invalid, such as an enum outside its list or a missing required attribute.
VALIDATION_FAILEDCHECK_VIOLATIONMISSING_REQUIREDATMOST_EXCEEDEDHOOK_ABORT - 429Rate limited (RATE_LIMITED). Limits are per person and shared with MCP. Back off a few seconds and retry.
RATE_LIMITEDQUOTA_EXCEEDED - 500Server error. Safe to retry a read; check before retrying a write.
INTERNAL_ERROR - 503Temporarily unavailable. Retry with backoff.
UNAVAILABLE
curl
curl "https://prod-eu.getbestest.com/api/v1/test_collections?page%5Bsize%5D=25" \
-H "Authorization: Bearer $BESTEST_TOKEN" \
-H "Accept: application/vnd.api+json"application/vnd.api+json
{
"data": [
{
"type": "test_collections",
"id": "3f2b9c14-8d5e-4a71-9f60-2c1e7b4a8d33",
"attributes": {
"name": "Checkout smoke pack",
"updatedAt": "2026-10-05T09:30:00Z"
},
"links": {
"self": "/test_collections/3f2b9c14-8d5e-4a71-9f60-2c1e7b4a8d33"
}
}
],
"links": {
"self": "/test_collections?page[size]=25",
"first": "/test_collections?page[size]=25&page[number]=1",
"prev": null,
"next": "/test_collections?page[size]=25&page[number]=2",
"last": "/test_collections?page[size]=25&page[number]=6"
},
"meta": {
"totalCount": 128
},
"jsonapi": {
"version": "1.1"
}
}Show an error response
every 4xx and 5xx has this shape
{
"errors": [
{
"status": "400",
"title": "Bad Request",
"code": "UNKNOWN_FIELD",
"detail": "Unknown field \"displayName\" on resource type \"users\". Valid fields: id, externalId, role, ...",
"source": {
"parameter": "fields[users]"
}
}
]
}Create a test collection
/api/v1/test_collectionsCreates a test collection from a JSON:API resource object - data.type names the resource type and data.attributes carries the writable attributes - and returns the created resource.
Needs a read-and-write token. A read-only token gets 403.
Headers
Authorizationstringrequired- Your API token as a bearer credential.
Bearer $BESTEST_TOKENAcceptstring- Send application/vnd.api+json, or leave it out. Asking for application/json returns 406 Not Acceptable.
application/vnd.api+jsonContent-Typestringrequired- Must be application/vnd.api+json on any request with a body. Anything else returns 415 Unsupported Media Type.
application/vnd.api+json
Attributes you can send8
namestringrequiredprojectIduuidrequiredpurposestringrequiredREGRESSIONSMOKEFUNCTIONALPERFORMANCESECURITYAPIUIINTEGRATIONCUSTOMcustomFieldsobjectdefaultRuleAssigneeIduuid | nulldescriptionstring | nullmax 5000 charsfilterIduuid | nullfolderIduuid | null
Returns the same attributes as Get a test collection.
Responses
- 201Created.
11 error responses
- 400The request is malformed: an unknown field, a filter that does not parse, or conflicting paging parameters.
INPUT_DEPTH_EXCEEDEDGRAPHQL_PARSE_FAILEDGRAPHQL_VALIDATION_FAILEDBAD_USER_INPUT - 401The token has expired or could not be authenticated.
TOKEN_EXPIREDUNAUTHENTICATED - 403The token is missing or not recognised, belongs to another region, or is read-only and this is a write.
FORBIDDEN - 404No such resource, or it is outside the Space your token reaches.
NOT_FOUND - 406The Accept header asked for something other than application/vnd.api+json.
NOT_ACCEPTABLE - 409The write conflicts with existing data, for example a duplicate or a reference to something that does not exist.
UNIQUE_VIOLATIONFOREIGN_KEY_VIOLATIONCONFLICT - 415The Content-Type was not application/vnd.api+json.
MISSING_CONTENT_TYPEINVALID_CONTENT_TYPEINVALID_CONTENT_TYPE_PARAMSPARAMETERIZED_ACCEPT - 422The body is well-formed but a value is invalid, such as an enum outside its list or a missing required attribute.
INVALID_INPUTVALIDATION_FAILEDCHECK_VIOLATIONMISSING_REQUIREDATMOST_EXCEEDEDHOOK_ABORT - 429Rate limited (RATE_LIMITED). Limits are per person and shared with MCP. Back off a few seconds and retry.
RATE_LIMITEDQUOTA_EXCEEDED - 500Server error. Safe to retry a read; check before retrying a write.
INTERNAL_ERROR - 503Temporarily unavailable. Retry with backoff.
UNAVAILABLE
curl
curl "https://prod-eu.getbestest.com/api/v1/test_collections" \
-X POST \
-H "Authorization: Bearer $BESTEST_TOKEN" \
-H "Accept: application/vnd.api+json" \
-H "Content-Type: application/vnd.api+json" \
-d '{
"data": {
"type": "test_collections",
"attributes": {
"name": "Checkout smoke pack",
"projectId": "03ff802c-4fcb-4718-8eb8-12ecc999f758",
"purpose": "FUNCTIONAL"
}
}
}'application/vnd.api+json
{
"data": [
{
"type": "test_collections",
"id": "3f2b9c14-8d5e-4a71-9f60-2c1e7b4a8d33",
"attributes": {
"name": "Checkout smoke pack",
"updatedAt": "2026-10-05T09:30:00Z"
},
"links": {
"self": "/test_collections/3f2b9c14-8d5e-4a71-9f60-2c1e7b4a8d33"
}
}
],
"links": {
"self": "/test_collections?page[size]=25",
"first": "/test_collections?page[size]=25&page[number]=1",
"prev": null,
"next": "/test_collections?page[size]=25&page[number]=2",
"last": "/test_collections?page[size]=25&page[number]=6"
},
"meta": {
"totalCount": 128
},
"jsonapi": {
"version": "1.1"
}
}Show an error response
every 4xx and 5xx has this shape
{
"errors": [
{
"status": "400",
"title": "Bad Request",
"code": "UNKNOWN_FIELD",
"detail": "Unknown field \"displayName\" on resource type \"users\". Valid fields: id, externalId, role, ...",
"source": {
"parameter": "fields[users]"
}
}
]
}Count and aggregate test collections
/api/v1/test_collections/aggregateAggregates test collection resources - a count and per-column aggregations, optionally grouped - over the same filter the collection route accepts.
Query parameters
aggregations[count]boolean- Include the row count in the aggregate result. When no aggregation is requested at all, the runtime defaults to count.
aggregations[sum][]string[]- Column(s) to sum - repeat the bracketed key per column (aggregations[sum][]=a&aggregations[sum][]=b). Permitted columns: collectionKeyNumeric, occVersion.
aggregations[avg][]string[]- Column(s) to average - repeat the bracketed key per column (aggregations[avg][]=a&aggregations[avg][]=b). Permitted columns: collectionKeyNumeric, occVersion.
aggregations[min][]string[]- Column(s) to take the minimum of - repeat the bracketed key per column (aggregations[min][]=a&aggregations[min][]=b). Permitted columns: collectionKey, name, description, lastExecuted, createdAt, updatedAt, deletedAt, collectionKeyNumeric, occVersion.
aggregations[max][]string[]- Column(s) to take the maximum of - repeat the bracketed key per column (aggregations[max][]=a&aggregations[max][]=b). Permitted columns: collectionKey, name, description, lastExecuted, createdAt, updatedAt, deletedAt, collectionKeyNumeric, occVersion.
aggregations[groupBy][]string[]- Column(s) to group by - repeating the bracketed key switches the response to the grouped shape (aggregations[groupBy][]=a&aggregations[groupBy][]=b). Permitted columns: id, organizationId, projectId, collectionKey, name, folderId, purpose, createdBy, lastExecuted, updatedAt, deletedAt, collectionKeyNumeric, filterId.
filterstring- A FiltrQL expression, url-encoded. Combine conditions with AND / OR and parentheses. The fields you can filter on, and the operators each accepts, are listed under Filterable fields.
collectionKey = "A-COL-1"
Headers
Authorizationstringrequired- Your API token as a bearer credential.
Bearer $BESTEST_TOKENAcceptstring- Send application/vnd.api+json, or leave it out. Asking for application/json returns 406 Not Acceptable.
application/vnd.api+json
Filterable fields18
Show fields and operators
| Field | Type | Operators |
|---|---|---|
id | uuid | = != in (…) not in (…) is null is not null |
organizationId | uuid | = != in (…) not in (…) is null is not null |
projectId | uuid | = != in (…) not in (…) is null is not null |
collectionKey | string | = != in (…) not in (…) ~ is null is not null |
name | string | ~ is null is not null is empty is not empty |
description | string | ~ is null is not null is empty is not empty |
folderId | uuid | = != in (…) not in (…) is null is not null |
purpose | enum | = != in (…) not in (…) is null is not nullREGRESSION, SMOKE, FUNCTIONAL, PERFORMANCE, SECURITY, API, UI, INTEGRATION, CUSTOM |
createdBy | uuid | = != in (…) not in (…) is null is not null |
updatedBy | uuid | = != in (…) not in (…) is null is not null |
lastExecuted | datetime | = != < <= > >= is null is not null |
createdAt | datetime | = != < <= > >= is null is not null |
updatedAt | datetime | = != < <= > >= is null is not null |
deletedAt | datetime | = != < <= > >= is null is not null |
collectionKeyNumeric | int | = != < <= > >= in (…) not in (…) is null is not null |
filterId | uuid | = != in (…) not in (…) is null is not null |
defaultRuleAssigneeId | uuid | = != in (…) not in (…) is null is not null |
occVersion | int | = != < <= > >= in (…) not in (…) is null is not null |
Filter through a relation with ANY, ALL or NONE, for example testCaseExecutions ANY (id = "…"). Relations: testCaseExecutions, testCollectionRequirements, testCollectionTestCases, createdByUser, testCollectionFolder, organization, project, updatedByUser, defaultRuleAssigneeUser, savedFilter.
Responses
- 200Success.
11 error responses
- 400The request is malformed: an unknown field, a filter that does not parse, or conflicting paging parameters.
INPUT_DEPTH_EXCEEDEDGRAPHQL_PARSE_FAILEDGRAPHQL_VALIDATION_FAILEDBAD_USER_INPUT - 401The token has expired or could not be authenticated.
TOKEN_EXPIREDUNAUTHENTICATED - 403The token is missing or not recognised, belongs to another region, or is read-only and this is a write.
FORBIDDEN - 404No such resource, or it is outside the Space your token reaches.
NOT_FOUND - 406The Accept header asked for something other than application/vnd.api+json.
NOT_ACCEPTABLE - 409The write conflicts with existing data, for example a duplicate or a reference to something that does not exist.
UNIQUE_VIOLATIONFOREIGN_KEY_VIOLATIONCONFLICT - 415The Content-Type was not application/vnd.api+json.
PARAMETERIZED_ACCEPT - 422The body is well-formed but a value is invalid, such as an enum outside its list or a missing required attribute.
VALIDATION_FAILEDCHECK_VIOLATIONMISSING_REQUIREDATMOST_EXCEEDEDHOOK_ABORT - 429Rate limited (RATE_LIMITED). Limits are per person and shared with MCP. Back off a few seconds and retry.
RATE_LIMITEDQUOTA_EXCEEDED - 500Server error. Safe to retry a read; check before retrying a write.
INTERNAL_ERROR - 503Temporarily unavailable. Retry with backoff.
UNAVAILABLE
curl
curl "https://prod-eu.getbestest.com/api/v1/test_collections/aggregate?aggregations%5Bcount%5D=true" \
-H "Authorization: Bearer $BESTEST_TOKEN" \
-H "Accept: application/vnd.api+json"application/vnd.api+json
{
"data": {
"type": "testCollections_aggregate",
"id": "(aggregate)",
"attributes": {
"count": 128
}
},
"jsonapi": {
"version": "1.1"
}
}Show an error response
every 4xx and 5xx has this shape
{
"errors": [
{
"status": "400",
"title": "Bad Request",
"code": "UNKNOWN_FIELD",
"detail": "Unknown field \"displayName\" on resource type \"users\". Valid fields: id, externalId, role, ...",
"source": {
"parameter": "fields[users]"
}
}
]
}Get a test collection
/api/v1/test_collections/{id}Returns the test collection with this id as a JSON:API resource document; include embeds related resources and fields[<type>] selects the attributes returned.
Path parameters
iduuidrequired- The resource id (a UUID).
Query parameters
includestring- Comma-separated relation names to include; dot-notation for nested includes (up to 3 levels deep). Permitted top-level relations: createdByUser, testCollectionFolder, organization, project, updatedByUser, defaultRuleAssigneeUser, savedFilter.
createdByUserfields[test_collections]string[]- Sparse fieldset for resource type "test_collections" - comma-separated subset of its exposed fields: id, organizationId, projectId, collectionKey, name, description, folderId, purpose, createdBy, updatedBy, lastExecuted, createdAt, updatedAt, deletedAt, collectionKeyNumeric, filterId, defaultRuleAssigneeId, occVersion, createdByUser, updatedByUser, defaultRuleAssigneeUser, testCollectionFolder, organization, project, savedFilter, customFields.
collectionKey,name,description
Headers
Authorizationstringrequired- Your API token as a bearer credential.
Bearer $BESTEST_TOKENAcceptstring- Send application/vnd.api+json, or leave it out. Asking for application/json returns 406 Not Acceptable.
application/vnd.api+json
Attributes returned19
collectionKeystringread-onlycollectionKeyNumericinteger | nullread-onlycreatedAtdate-timeread-onlycreatedByuuid | nullread-onlycustomFieldsobjectdefaultRuleAssigneeIduuid | nulldeletedAtdate-time | nullread-onlydescriptionstring | nullmax 5000 chars
Show the remaining 11
filterIduuid | nullfolderIduuid | nulliduuidread-onlylastExecuteddate-time | nullread-onlynamestringoccVersionintegerread-onlydefault1organizationIduuidread-onlyprojectIduuidpurposestringREGRESSIONSMOKEFUNCTIONALPERFORMANCESECURITYAPIUIINTEGRATIONCUSTOMupdatedAtdate-timeread-onlyupdatedByuuid | nullread-only
Responses
- 200Success.
12 error responses
- 400The request is malformed: an unknown field, a filter that does not parse, or conflicting paging parameters.
UNKNOWN_TYPEUNKNOWN_FIELDINCLUDE_DEPTH_EXCEEDEDUNKNOWN_RELATIONINCLUDE_RESOURCES_EXCEEDEDINPUT_DEPTH_EXCEEDEDGRAPHQL_PARSE_FAILEDGRAPHQL_VALIDATION_FAILEDBAD_USER_INPUT - 401The token has expired or could not be authenticated.
TOKEN_EXPIREDUNAUTHENTICATED - 403The token is missing or not recognised, belongs to another region, or is read-only and this is a write.
FORBIDDEN - 404No such resource, or it is outside the Space your token reaches.
NOT_FOUND - 406The Accept header asked for something other than application/vnd.api+json.
NOT_ACCEPTABLE - 409The write conflicts with existing data, for example a duplicate or a reference to something that does not exist.
UNIQUE_VIOLATIONFOREIGN_KEY_VIOLATIONCONFLICT - 410Gone.
GONE - 415The Content-Type was not application/vnd.api+json.
PARAMETERIZED_ACCEPT - 422The body is well-formed but a value is invalid, such as an enum outside its list or a missing required attribute.
VALIDATION_FAILEDCHECK_VIOLATIONMISSING_REQUIREDATMOST_EXCEEDEDHOOK_ABORT - 429Rate limited (RATE_LIMITED). Limits are per person and shared with MCP. Back off a few seconds and retry.
RATE_LIMITEDQUOTA_EXCEEDED - 500Server error. Safe to retry a read; check before retrying a write.
INTERNAL_ERROR - 503Temporarily unavailable. Retry with backoff.
UNAVAILABLE
curl
curl "https://prod-eu.getbestest.com/api/v1/test_collections/3f2b9c14-8d5e-4a71-9f60-2c1e7b4a8d33" \
-H "Authorization: Bearer $BESTEST_TOKEN" \
-H "Accept: application/vnd.api+json"application/vnd.api+json
{
"data": {
"type": "test_collections",
"id": "3f2b9c14-8d5e-4a71-9f60-2c1e7b4a8d33",
"attributes": {
"name": "Checkout smoke pack",
"updatedAt": "2026-10-05T09:30:00Z"
},
"links": {
"self": "/test_collections/3f2b9c14-8d5e-4a71-9f60-2c1e7b4a8d33"
}
},
"jsonapi": {
"version": "1.1"
}
}Show an error response
every 4xx and 5xx has this shape
{
"errors": [
{
"status": "400",
"title": "Bad Request",
"code": "UNKNOWN_FIELD",
"detail": "Unknown field \"displayName\" on resource type \"users\". Valid fields: id, externalId, role, ...",
"source": {
"parameter": "fields[users]"
}
}
]
}Update a test collection
/api/v1/test_collections/{id}Updates the test collection with this id from a JSON:API resource object carrying only the attributes to change, and returns the updated resource. A resource that carries an ETag requires it back as If-Match.
Needs a read-and-write token. A read-only token gets 403.
Version-locked: send the ETag from your last read as If-Match.
Path parameters
iduuidrequired- The resource id (a UUID).
Headers
Authorizationstringrequired- Your API token as a bearer credential.
Bearer $BESTEST_TOKENAcceptstring- Send application/vnd.api+json, or leave it out. Asking for application/json returns 406 Not Acceptable.
application/vnd.api+jsonContent-Typestringrequired- Must be application/vnd.api+json on any request with a body. Anything else returns 415 Unsupported Media Type.
application/vnd.api+jsonIf-Matchstringrequired- The ETag from your last read of this resource, sent back verbatim. Missing returns 428 Precondition Required; stale (someone changed it since you read it) returns 412 Precondition Failed. Read it again and retry.
W/"3"
Attributes you can send8
customFieldsobjectdefaultRuleAssigneeIduuid | nulldescriptionstring | nullmax 5000 charsfilterIduuid | nullfolderIduuid | nullnamestringprojectIduuidpurposestringREGRESSIONSMOKEFUNCTIONALPERFORMANCESECURITYAPIUIINTEGRATIONCUSTOM
Returns the same attributes as Get a test collection.
Responses
- 200Success.
13 error responses
- 400The request is malformed: an unknown field, a filter that does not parse, or conflicting paging parameters.
INPUT_DEPTH_EXCEEDEDGRAPHQL_PARSE_FAILEDGRAPHQL_VALIDATION_FAILEDBAD_USER_INPUT - 401The token has expired or could not be authenticated.
TOKEN_EXPIREDUNAUTHENTICATED - 403The token is missing or not recognised, belongs to another region, or is read-only and this is a write.
FORBIDDEN - 404No such resource, or it is outside the Space your token reaches.
NOT_FOUND - 406The Accept header asked for something other than application/vnd.api+json.
NOT_ACCEPTABLE - 409The write conflicts with existing data, for example a duplicate or a reference to something that does not exist.
UNIQUE_VIOLATIONFOREIGN_KEY_VIOLATIONCONFLICT - 412The If-Match ETag is stale: the resource changed since you read it. Read it again and retry.
STALE_OBJECT - 415The Content-Type was not application/vnd.api+json.
MISSING_CONTENT_TYPEINVALID_CONTENT_TYPEINVALID_CONTENT_TYPE_PARAMSPARAMETERIZED_ACCEPT - 422The body is well-formed but a value is invalid, such as an enum outside its list or a missing required attribute.
VALIDATION_ERRORVALIDATION_FAILEDCHECK_VIOLATIONMISSING_REQUIREDATMOST_EXCEEDEDHOOK_ABORT - 428This resource is version-locked: send its ETag in an If-Match header.
MISSING_IF_MATCH - 429Rate limited (RATE_LIMITED). Limits are per person and shared with MCP. Back off a few seconds and retry.
RATE_LIMITEDQUOTA_EXCEEDED - 500Server error. Safe to retry a read; check before retrying a write.
INTERNAL_ERROR - 503Temporarily unavailable. Retry with backoff.
UNAVAILABLE
curl
curl "https://prod-eu.getbestest.com/api/v1/test_collections/3f2b9c14-8d5e-4a71-9f60-2c1e7b4a8d33" \
-X PATCH \
-H "Authorization: Bearer $BESTEST_TOKEN" \
-H "Accept: application/vnd.api+json" \
-H 'If-Match: W/"3"' \
-H "Content-Type: application/vnd.api+json" \
-d '{
"data": {
"type": "test_collections",
"id": "3f2b9c14-8d5e-4a71-9f60-2c1e7b4a8d33",
"attributes": {
"name": "Checkout smoke pack"
}
}
}'application/vnd.api+json
{
"data": {
"type": "test_collections",
"id": "3f2b9c14-8d5e-4a71-9f60-2c1e7b4a8d33",
"attributes": {
"name": "Checkout smoke pack",
"updatedAt": "2026-10-05T09:30:00Z"
},
"links": {
"self": "/test_collections/3f2b9c14-8d5e-4a71-9f60-2c1e7b4a8d33"
}
},
"jsonapi": {
"version": "1.1"
}
}Show an error response
every 4xx and 5xx has this shape
{
"errors": [
{
"status": "400",
"title": "Bad Request",
"code": "UNKNOWN_FIELD",
"detail": "Unknown field \"displayName\" on resource type \"users\". Valid fields: id, externalId, role, ...",
"source": {
"parameter": "fields[users]"
}
}
]
}Delete a test collection
/api/v1/test_collections/{id}Deletes the test collection with this id.
Needs a read-and-write token. A read-only token gets 403.
Version-locked: send the ETag from your last read as If-Match.
Path parameters
iduuidrequired- The resource id (a UUID).
Headers
Authorizationstringrequired- Your API token as a bearer credential.
Bearer $BESTEST_TOKENAcceptstring- Send application/vnd.api+json, or leave it out. Asking for application/json returns 406 Not Acceptable.
application/vnd.api+jsonIf-Matchstringrequired- The ETag from your last read of this resource, sent back verbatim. Missing returns 428 Precondition Required; stale (someone changed it since you read it) returns 412 Precondition Failed. Read it again and retry.
W/"3"
Returns the same attributes as Get a test collection.
Responses
- 200Success.
13 error responses
- 400The request is malformed: an unknown field, a filter that does not parse, or conflicting paging parameters.
INPUT_DEPTH_EXCEEDEDGRAPHQL_PARSE_FAILEDGRAPHQL_VALIDATION_FAILEDBAD_USER_INPUT - 401The token has expired or could not be authenticated.
TOKEN_EXPIREDUNAUTHENTICATED - 403The token is missing or not recognised, belongs to another region, or is read-only and this is a write.
FORBIDDEN - 404No such resource, or it is outside the Space your token reaches.
NOT_FOUND - 406The Accept header asked for something other than application/vnd.api+json.
NOT_ACCEPTABLE - 409The write conflicts with existing data, for example a duplicate or a reference to something that does not exist.
UNIQUE_VIOLATIONFOREIGN_KEY_VIOLATIONCONFLICT - 412The If-Match ETag is stale: the resource changed since you read it. Read it again and retry.
STALE_OBJECT - 415The Content-Type was not application/vnd.api+json.
PARAMETERIZED_ACCEPT - 422The body is well-formed but a value is invalid, such as an enum outside its list or a missing required attribute.
VALIDATION_FAILEDCHECK_VIOLATIONMISSING_REQUIREDATMOST_EXCEEDEDHOOK_ABORT - 428This resource is version-locked: send its ETag in an If-Match header.
MISSING_IF_MATCH - 429Rate limited (RATE_LIMITED). Limits are per person and shared with MCP. Back off a few seconds and retry.
RATE_LIMITEDQUOTA_EXCEEDED - 500Server error. Safe to retry a read; check before retrying a write.
INTERNAL_ERROR - 503Temporarily unavailable. Retry with backoff.
UNAVAILABLE
curl
curl "https://prod-eu.getbestest.com/api/v1/test_collections/3f2b9c14-8d5e-4a71-9f60-2c1e7b4a8d33" \
-X DELETE \
-H "Authorization: Bearer $BESTEST_TOKEN" \
-H "Accept: application/vnd.api+json" \
-H 'If-Match: W/"3"'application/vnd.api+json
{
"data": {
"type": "test_collections",
"id": "3f2b9c14-8d5e-4a71-9f60-2c1e7b4a8d33",
"attributes": {
"name": "Checkout smoke pack",
"updatedAt": "2026-10-05T09:30:00Z"
},
"links": {
"self": "/test_collections/3f2b9c14-8d5e-4a71-9f60-2c1e7b4a8d33"
}
},
"jsonapi": {
"version": "1.1"
}
}Show an error response
every 4xx and 5xx has this shape
{
"errors": [
{
"status": "400",
"title": "Bad Request",
"code": "UNKNOWN_FIELD",
"detail": "Unknown field \"displayName\" on resource type \"users\". Valid fields: id, externalId, role, ...",
"source": {
"parameter": "fields[users]"
}
}
]
}Restore a test collection
/api/v1/test_collections/{id}/actions/restoreRestores the soft-deleted test collection with this id and returns it.
Needs a read-and-write token. A read-only token gets 403.
Version-locked: send the ETag from your last read as If-Match.
Path parameters
iduuidrequired- The resource id (a UUID).
Headers
Authorizationstringrequired- Your API token as a bearer credential.
Bearer $BESTEST_TOKENAcceptstring- Send application/vnd.api+json, or leave it out. Asking for application/json returns 406 Not Acceptable.
application/vnd.api+jsonIf-Matchstringrequired- The ETag from your last read of this resource, sent back verbatim. Missing returns 428 Precondition Required; stale (someone changed it since you read it) returns 412 Precondition Failed. Read it again and retry.
W/"3"
Returns the same attributes as Get a test collection.
Responses
- 200Success.
13 error responses
- 400The request is malformed: an unknown field, a filter that does not parse, or conflicting paging parameters.
INPUT_DEPTH_EXCEEDEDGRAPHQL_PARSE_FAILEDGRAPHQL_VALIDATION_FAILEDBAD_USER_INPUT - 401The token has expired or could not be authenticated.
TOKEN_EXPIREDUNAUTHENTICATED - 403The token is missing or not recognised, belongs to another region, or is read-only and this is a write.
FORBIDDEN - 404No such resource, or it is outside the Space your token reaches.
NOT_FOUND - 406The Accept header asked for something other than application/vnd.api+json.
NOT_ACCEPTABLE - 409The write conflicts with existing data, for example a duplicate or a reference to something that does not exist.
UNIQUE_VIOLATIONFOREIGN_KEY_VIOLATIONCONFLICT - 412The If-Match ETag is stale: the resource changed since you read it. Read it again and retry.
STALE_OBJECT - 415The Content-Type was not application/vnd.api+json.
PARAMETERIZED_ACCEPT - 422The body is well-formed but a value is invalid, such as an enum outside its list or a missing required attribute.
VALIDATION_FAILEDCHECK_VIOLATIONMISSING_REQUIREDATMOST_EXCEEDEDHOOK_ABORT - 428This resource is version-locked: send its ETag in an If-Match header.
MISSING_IF_MATCH - 429Rate limited (RATE_LIMITED). Limits are per person and shared with MCP. Back off a few seconds and retry.
RATE_LIMITEDQUOTA_EXCEEDED - 500Server error. Safe to retry a read; check before retrying a write.
INTERNAL_ERROR - 503Temporarily unavailable. Retry with backoff.
UNAVAILABLE
curl
curl "https://prod-eu.getbestest.com/api/v1/test_collections/3f2b9c14-8d5e-4a71-9f60-2c1e7b4a8d33/actions/restore" \
-X POST \
-H "Authorization: Bearer $BESTEST_TOKEN" \
-H "Accept: application/vnd.api+json" \
-H 'If-Match: W/"3"'application/vnd.api+json
{
"data": {
"type": "test_collections",
"id": "3f2b9c14-8d5e-4a71-9f60-2c1e7b4a8d33",
"attributes": {
"name": "Checkout smoke pack",
"updatedAt": "2026-10-05T09:30:00Z"
},
"links": {
"self": "/test_collections/3f2b9c14-8d5e-4a71-9f60-2c1e7b4a8d33"
}
},
"jsonapi": {
"version": "1.1"
}
}Show an error response
every 4xx and 5xx has this shape
{
"errors": [
{
"status": "400",
"title": "Bad Request",
"code": "UNKNOWN_FIELD",
"detail": "Unknown field \"displayName\" on resource type \"users\". Valid fields: id, externalId, role, ...",
"source": {
"parameter": "fields[users]"
}
}
]
}List test collection folders
/api/v1/test_collection_foldersLists test collection folder resources as a JSON:API collection document. Narrow the set with filter, order it with sort, embed related resources with include, select attributes with fields[<type>], and page with page[size] plus page[number] (offset) or page[after] (cursor, taken from the previous response's links.next).
Query parameters
filterstring- A FiltrQL expression, url-encoded. Combine conditions with AND / OR and parentheses. The fields you can filter on, and the operators each accepts, are listed under Filterable fields.
name = "example"sortstring- Comma-separated sort fields; prefix a field with "-" for descending order (e.g. "-createdAt,title"). Permitted fields: id, organizationId, projectId, parentFolderId, rank.
-rankincludestring- Comma-separated relation names to include; dot-notation for nested includes (up to 3 levels deep). Permitted top-level relations: createdByUser, organization, testCollectionFolder, project, updatedByUser.
createdByUserfields[test_collection_folders]string[]- Sparse fieldset for resource type "test_collection_folders" - comma-separated subset of its exposed fields: id, organizationId, projectId, name, description, parentFolderId, rank, createdAt, updatedAt, createdBy, updatedBy, createdByUser, updatedByUser, organization, testCollectionFolder, project.
name,description,rankpage[size]integer- Number of resources per page (applies to both offset and cursor pagination). Minimum 1, maximum 100, default 25 when omitted.
25page[number]integer- 1-indexed page number for offset-based pagination. Mutually exclusive with "page[after]" - supplying both is rejected with a 400 (CONFLICTING_PAGINATION).
2page[after]string- Opaque cursor for cursor-based pagination - always taken verbatim from a previous response's "links.next" value, never client-constructed or decoded. Mutually exclusive with "page[number]" - supplying both is rejected with a 400 (CONFLICTING_PAGINATION).
Headers
Authorizationstringrequired- Your API token as a bearer credential.
Bearer $BESTEST_TOKENAcceptstring- Send application/vnd.api+json, or leave it out. Asking for application/json returns 406 Not Acceptable.
application/vnd.api+json
Filterable fields11
Show fields and operators
| Field | Type | Operators |
|---|---|---|
id | uuid | = != in (…) not in (…) is null is not null |
organizationId | uuid | = != in (…) not in (…) is null is not null |
projectId | uuid | = != in (…) not in (…) is null is not null |
name | string | = != in (…) not in (…) is null is not null |
description | string | ~ is null is not null is empty is not empty |
parentFolderId | uuid | = != in (…) not in (…) is null is not null |
rank | int | = != < <= > >= in (…) not in (…) is null is not null |
createdAt | datetime | = != < <= > >= is null is not null |
updatedAt | datetime | = != < <= > >= is null is not null |
createdBy | uuid | = != in (…) not in (…) is null is not null |
updatedBy | uuid | = != in (…) not in (…) is null is not null |
Filter through a relation with ANY, ALL or NONE, for example createdByUser ANY (id = "…"). Relations: createdByUser, organization, testCollectionFolder, testCollectionFolders, project, updatedByUser, testCollections.
Returns the same attributes as Get a test collection folder.
Responses
- 200Success.
11 error responses
- 400The request is malformed: an unknown field, a filter that does not parse, or conflicting paging parameters.
INVALID_TYPED_JSON_FILTERUNKNOWN_SORT_FIELDINCLUDE_DEPTH_EXCEEDEDUNKNOWN_RELATIONINCLUDE_RESOURCES_EXCEEDEDUNKNOWN_TYPEUNKNOWN_FIELDCONFLICTING_PAGINATIONINVALID_PAGE_SIZEPAGE_SIZE_EXCEEDEDINVALID_PAGE_NUMBERINPUT_DEPTH_EXCEEDEDGRAPHQL_PARSE_FAILEDGRAPHQL_VALIDATION_FAILEDBAD_USER_INPUT - 401The token has expired or could not be authenticated.
TOKEN_EXPIREDUNAUTHENTICATED - 403The token is missing or not recognised, belongs to another region, or is read-only and this is a write.
FORBIDDEN - 404No such resource, or it is outside the Space your token reaches.
NOT_FOUND - 406The Accept header asked for something other than application/vnd.api+json.
NOT_ACCEPTABLE - 409The write conflicts with existing data, for example a duplicate or a reference to something that does not exist.
UNIQUE_VIOLATIONFOREIGN_KEY_VIOLATIONCONFLICT - 415The Content-Type was not application/vnd.api+json.
PARAMETERIZED_ACCEPT - 422The body is well-formed but a value is invalid, such as an enum outside its list or a missing required attribute.
VALIDATION_FAILEDCHECK_VIOLATIONMISSING_REQUIREDATMOST_EXCEEDEDHOOK_ABORT - 429Rate limited (RATE_LIMITED). Limits are per person and shared with MCP. Back off a few seconds and retry.
RATE_LIMITEDQUOTA_EXCEEDED - 500Server error. Safe to retry a read; check before retrying a write.
INTERNAL_ERROR - 503Temporarily unavailable. Retry with backoff.
UNAVAILABLE
curl
curl "https://prod-eu.getbestest.com/api/v1/test_collection_folders?page%5Bsize%5D=25" \
-H "Authorization: Bearer $BESTEST_TOKEN" \
-H "Accept: application/vnd.api+json"application/vnd.api+json
{
"data": [
{
"type": "test_collection_folders",
"id": "3f2b9c14-8d5e-4a71-9f60-2c1e7b4a8d33",
"attributes": {
"name": "Checkout",
"updatedAt": "2026-10-05T09:30:00Z"
},
"links": {
"self": "/test_collection_folders/3f2b9c14-8d5e-4a71-9f60-2c1e7b4a8d33"
}
}
],
"links": {
"self": "/test_collection_folders?page[size]=25",
"first": "/test_collection_folders?page[size]=25&page[number]=1",
"prev": null,
"next": "/test_collection_folders?page[size]=25&page[number]=2",
"last": "/test_collection_folders?page[size]=25&page[number]=6"
},
"meta": {
"totalCount": 128
},
"jsonapi": {
"version": "1.1"
}
}Show an error response
every 4xx and 5xx has this shape
{
"errors": [
{
"status": "400",
"title": "Bad Request",
"code": "UNKNOWN_FIELD",
"detail": "Unknown field \"displayName\" on resource type \"users\". Valid fields: id, externalId, role, ...",
"source": {
"parameter": "fields[users]"
}
}
]
}Create a test collection folder
/api/v1/test_collection_foldersCreates a test collection folder from a JSON:API resource object - data.type names the resource type and data.attributes carries the writable attributes - and returns the created resource.
Needs a read-and-write token. A read-only token gets 403.
Headers
Authorizationstringrequired- Your API token as a bearer credential.
Bearer $BESTEST_TOKENAcceptstring- Send application/vnd.api+json, or leave it out. Asking for application/json returns 406 Not Acceptable.
application/vnd.api+jsonContent-Typestringrequired- Must be application/vnd.api+json on any request with a body. Anything else returns 415 Unsupported Media Type.
application/vnd.api+json
Attributes you can send5
namestringrequiredprojectIduuidrequiredrankintegerrequireddescriptionstring | nullparentFolderIduuid | null
Returns the same attributes as Get a test collection folder.
Responses
- 201Created.
11 error responses
- 400The request is malformed: an unknown field, a filter that does not parse, or conflicting paging parameters.
INPUT_DEPTH_EXCEEDEDGRAPHQL_PARSE_FAILEDGRAPHQL_VALIDATION_FAILEDBAD_USER_INPUT - 401The token has expired or could not be authenticated.
TOKEN_EXPIREDUNAUTHENTICATED - 403The token is missing or not recognised, belongs to another region, or is read-only and this is a write.
FORBIDDEN - 404No such resource, or it is outside the Space your token reaches.
NOT_FOUND - 406The Accept header asked for something other than application/vnd.api+json.
NOT_ACCEPTABLE - 409The write conflicts with existing data, for example a duplicate or a reference to something that does not exist.
UNIQUE_VIOLATIONFOREIGN_KEY_VIOLATIONCONFLICT - 415The Content-Type was not application/vnd.api+json.
MISSING_CONTENT_TYPEINVALID_CONTENT_TYPEINVALID_CONTENT_TYPE_PARAMSPARAMETERIZED_ACCEPT - 422The body is well-formed but a value is invalid, such as an enum outside its list or a missing required attribute.
INVALID_INPUTVALIDATION_FAILEDCHECK_VIOLATIONMISSING_REQUIREDATMOST_EXCEEDEDHOOK_ABORT - 429Rate limited (RATE_LIMITED). Limits are per person and shared with MCP. Back off a few seconds and retry.
RATE_LIMITEDQUOTA_EXCEEDED - 500Server error. Safe to retry a read; check before retrying a write.
INTERNAL_ERROR - 503Temporarily unavailable. Retry with backoff.
UNAVAILABLE
curl
curl "https://prod-eu.getbestest.com/api/v1/test_collection_folders" \
-X POST \
-H "Authorization: Bearer $BESTEST_TOKEN" \
-H "Accept: application/vnd.api+json" \
-H "Content-Type: application/vnd.api+json" \
-d '{
"data": {
"type": "test_collection_folders",
"attributes": {
"name": "Checkout",
"projectId": "03ff802c-4fcb-4718-8eb8-12ecc999f758",
"rank": 1
}
}
}'application/vnd.api+json
{
"data": [
{
"type": "test_collection_folders",
"id": "3f2b9c14-8d5e-4a71-9f60-2c1e7b4a8d33",
"attributes": {
"name": "Checkout",
"updatedAt": "2026-10-05T09:30:00Z"
},
"links": {
"self": "/test_collection_folders/3f2b9c14-8d5e-4a71-9f60-2c1e7b4a8d33"
}
}
],
"links": {
"self": "/test_collection_folders?page[size]=25",
"first": "/test_collection_folders?page[size]=25&page[number]=1",
"prev": null,
"next": "/test_collection_folders?page[size]=25&page[number]=2",
"last": "/test_collection_folders?page[size]=25&page[number]=6"
},
"meta": {
"totalCount": 128
},
"jsonapi": {
"version": "1.1"
}
}Show an error response
every 4xx and 5xx has this shape
{
"errors": [
{
"status": "400",
"title": "Bad Request",
"code": "UNKNOWN_FIELD",
"detail": "Unknown field \"displayName\" on resource type \"users\". Valid fields: id, externalId, role, ...",
"source": {
"parameter": "fields[users]"
}
}
]
}Count and aggregate test collection folders
/api/v1/test_collection_folders/aggregateAggregates test collection folder resources - a count and per-column aggregations, optionally grouped - over the same filter the collection route accepts.
Query parameters
aggregations[count]boolean- Include the row count in the aggregate result. When no aggregation is requested at all, the runtime defaults to count.
aggregations[sum][]string[]- Column(s) to sum - repeat the bracketed key per column (aggregations[sum][]=a&aggregations[sum][]=b). Permitted columns: rank.
aggregations[avg][]string[]- Column(s) to average - repeat the bracketed key per column (aggregations[avg][]=a&aggregations[avg][]=b). Permitted columns: rank.
aggregations[min][]string[]- Column(s) to take the minimum of - repeat the bracketed key per column (aggregations[min][]=a&aggregations[min][]=b). Permitted columns: name, description, rank, createdAt, updatedAt.
aggregations[max][]string[]- Column(s) to take the maximum of - repeat the bracketed key per column (aggregations[max][]=a&aggregations[max][]=b). Permitted columns: name, description, rank, createdAt, updatedAt.
aggregations[groupBy][]string[]- Column(s) to group by - repeating the bracketed key switches the response to the grouped shape (aggregations[groupBy][]=a&aggregations[groupBy][]=b). Permitted columns: id, organizationId, projectId, parentFolderId, rank.
filterstring- A FiltrQL expression, url-encoded. Combine conditions with AND / OR and parentheses. The fields you can filter on, and the operators each accepts, are listed under Filterable fields.
name = "example"
Headers
Authorizationstringrequired- Your API token as a bearer credential.
Bearer $BESTEST_TOKENAcceptstring- Send application/vnd.api+json, or leave it out. Asking for application/json returns 406 Not Acceptable.
application/vnd.api+json
Filterable fields11
Show fields and operators
| Field | Type | Operators |
|---|---|---|
id | uuid | = != in (…) not in (…) is null is not null |
organizationId | uuid | = != in (…) not in (…) is null is not null |
projectId | uuid | = != in (…) not in (…) is null is not null |
name | string | = != in (…) not in (…) is null is not null |
description | string | ~ is null is not null is empty is not empty |
parentFolderId | uuid | = != in (…) not in (…) is null is not null |
rank | int | = != < <= > >= in (…) not in (…) is null is not null |
createdAt | datetime | = != < <= > >= is null is not null |
updatedAt | datetime | = != < <= > >= is null is not null |
createdBy | uuid | = != in (…) not in (…) is null is not null |
updatedBy | uuid | = != in (…) not in (…) is null is not null |
Filter through a relation with ANY, ALL or NONE, for example createdByUser ANY (id = "…"). Relations: createdByUser, organization, testCollectionFolder, testCollectionFolders, project, updatedByUser, testCollections.
Responses
- 200Success.
11 error responses
- 400The request is malformed: an unknown field, a filter that does not parse, or conflicting paging parameters.
INPUT_DEPTH_EXCEEDEDGRAPHQL_PARSE_FAILEDGRAPHQL_VALIDATION_FAILEDBAD_USER_INPUT - 401The token has expired or could not be authenticated.
TOKEN_EXPIREDUNAUTHENTICATED - 403The token is missing or not recognised, belongs to another region, or is read-only and this is a write.
FORBIDDEN - 404No such resource, or it is outside the Space your token reaches.
NOT_FOUND - 406The Accept header asked for something other than application/vnd.api+json.
NOT_ACCEPTABLE - 409The write conflicts with existing data, for example a duplicate or a reference to something that does not exist.
UNIQUE_VIOLATIONFOREIGN_KEY_VIOLATIONCONFLICT - 415The Content-Type was not application/vnd.api+json.
PARAMETERIZED_ACCEPT - 422The body is well-formed but a value is invalid, such as an enum outside its list or a missing required attribute.
VALIDATION_FAILEDCHECK_VIOLATIONMISSING_REQUIREDATMOST_EXCEEDEDHOOK_ABORT - 429Rate limited (RATE_LIMITED). Limits are per person and shared with MCP. Back off a few seconds and retry.
RATE_LIMITEDQUOTA_EXCEEDED - 500Server error. Safe to retry a read; check before retrying a write.
INTERNAL_ERROR - 503Temporarily unavailable. Retry with backoff.
UNAVAILABLE
curl
curl "https://prod-eu.getbestest.com/api/v1/test_collection_folders/aggregate?aggregations%5Bcount%5D=true" \
-H "Authorization: Bearer $BESTEST_TOKEN" \
-H "Accept: application/vnd.api+json"application/vnd.api+json
{
"data": {
"type": "testCollectionFolders_aggregate",
"id": "(aggregate)",
"attributes": {
"count": 128
}
},
"jsonapi": {
"version": "1.1"
}
}Show an error response
every 4xx and 5xx has this shape
{
"errors": [
{
"status": "400",
"title": "Bad Request",
"code": "UNKNOWN_FIELD",
"detail": "Unknown field \"displayName\" on resource type \"users\". Valid fields: id, externalId, role, ...",
"source": {
"parameter": "fields[users]"
}
}
]
}Get a test collection folder
/api/v1/test_collection_folders/{id}Returns the test collection folder with this id as a JSON:API resource document; include embeds related resources and fields[<type>] selects the attributes returned.
Path parameters
iduuidrequired- The resource id (a UUID).
Query parameters
includestring- Comma-separated relation names to include; dot-notation for nested includes (up to 3 levels deep). Permitted top-level relations: createdByUser, organization, testCollectionFolder, project, updatedByUser.
createdByUserfields[test_collection_folders]string[]- Sparse fieldset for resource type "test_collection_folders" - comma-separated subset of its exposed fields: id, organizationId, projectId, name, description, parentFolderId, rank, createdAt, updatedAt, createdBy, updatedBy, createdByUser, updatedByUser, organization, testCollectionFolder, project.
name,description,rank
Headers
Authorizationstringrequired- Your API token as a bearer credential.
Bearer $BESTEST_TOKENAcceptstring- Send application/vnd.api+json, or leave it out. Asking for application/json returns 406 Not Acceptable.
application/vnd.api+json
Attributes returned11
createdAtdate-timeread-onlycreatedByuuid | nullread-onlydescriptionstring | nulliduuidread-onlynamestringorganizationIduuidread-onlyparentFolderIduuid | nullprojectIduuid
Show the remaining 3
rankintegerupdatedAtdate-timeread-onlyupdatedByuuid | nullread-only
Responses
- 200Success.
12 error responses
- 400The request is malformed: an unknown field, a filter that does not parse, or conflicting paging parameters.
UNKNOWN_TYPEUNKNOWN_FIELDINCLUDE_DEPTH_EXCEEDEDUNKNOWN_RELATIONINCLUDE_RESOURCES_EXCEEDEDINPUT_DEPTH_EXCEEDEDGRAPHQL_PARSE_FAILEDGRAPHQL_VALIDATION_FAILEDBAD_USER_INPUT - 401The token has expired or could not be authenticated.
TOKEN_EXPIREDUNAUTHENTICATED - 403The token is missing or not recognised, belongs to another region, or is read-only and this is a write.
FORBIDDEN - 404No such resource, or it is outside the Space your token reaches.
NOT_FOUND - 406The Accept header asked for something other than application/vnd.api+json.
NOT_ACCEPTABLE - 409The write conflicts with existing data, for example a duplicate or a reference to something that does not exist.
UNIQUE_VIOLATIONFOREIGN_KEY_VIOLATIONCONFLICT - 410Gone.
GONE - 415The Content-Type was not application/vnd.api+json.
PARAMETERIZED_ACCEPT - 422The body is well-formed but a value is invalid, such as an enum outside its list or a missing required attribute.
VALIDATION_FAILEDCHECK_VIOLATIONMISSING_REQUIREDATMOST_EXCEEDEDHOOK_ABORT - 429Rate limited (RATE_LIMITED). Limits are per person and shared with MCP. Back off a few seconds and retry.
RATE_LIMITEDQUOTA_EXCEEDED - 500Server error. Safe to retry a read; check before retrying a write.
INTERNAL_ERROR - 503Temporarily unavailable. Retry with backoff.
UNAVAILABLE
curl
curl "https://prod-eu.getbestest.com/api/v1/test_collection_folders/3f2b9c14-8d5e-4a71-9f60-2c1e7b4a8d33" \
-H "Authorization: Bearer $BESTEST_TOKEN" \
-H "Accept: application/vnd.api+json"application/vnd.api+json
{
"data": {
"type": "test_collection_folders",
"id": "3f2b9c14-8d5e-4a71-9f60-2c1e7b4a8d33",
"attributes": {
"name": "Checkout",
"updatedAt": "2026-10-05T09:30:00Z"
},
"links": {
"self": "/test_collection_folders/3f2b9c14-8d5e-4a71-9f60-2c1e7b4a8d33"
}
},
"jsonapi": {
"version": "1.1"
}
}Show an error response
every 4xx and 5xx has this shape
{
"errors": [
{
"status": "400",
"title": "Bad Request",
"code": "UNKNOWN_FIELD",
"detail": "Unknown field \"displayName\" on resource type \"users\". Valid fields: id, externalId, role, ...",
"source": {
"parameter": "fields[users]"
}
}
]
}Update a test collection folder
/api/v1/test_collection_folders/{id}Updates the test collection folder with this id from a JSON:API resource object carrying only the attributes to change, and returns the updated resource. A resource that carries an ETag requires it back as If-Match.
Needs a read-and-write token. A read-only token gets 403.
Version-locked: send the ETag from your last read as If-Match.
Path parameters
iduuidrequired- The resource id (a UUID).
Headers
Authorizationstringrequired- Your API token as a bearer credential.
Bearer $BESTEST_TOKENAcceptstring- Send application/vnd.api+json, or leave it out. Asking for application/json returns 406 Not Acceptable.
application/vnd.api+jsonContent-Typestringrequired- Must be application/vnd.api+json on any request with a body. Anything else returns 415 Unsupported Media Type.
application/vnd.api+jsonIf-Matchstringrequired- The ETag from your last read of this resource, sent back verbatim. Missing returns 428 Precondition Required; stale (someone changed it since you read it) returns 412 Precondition Failed. Read it again and retry.
W/"3"
Attributes you can send5
descriptionstring | nullnamestringparentFolderIduuid | nullprojectIduuidrankinteger
Returns the same attributes as Get a test collection folder.
Responses
- 200Success.
13 error responses
- 400The request is malformed: an unknown field, a filter that does not parse, or conflicting paging parameters.
INPUT_DEPTH_EXCEEDEDGRAPHQL_PARSE_FAILEDGRAPHQL_VALIDATION_FAILEDBAD_USER_INPUT - 401The token has expired or could not be authenticated.
TOKEN_EXPIREDUNAUTHENTICATED - 403The token is missing or not recognised, belongs to another region, or is read-only and this is a write.
FORBIDDEN - 404No such resource, or it is outside the Space your token reaches.
NOT_FOUND - 406The Accept header asked for something other than application/vnd.api+json.
NOT_ACCEPTABLE - 409The write conflicts with existing data, for example a duplicate or a reference to something that does not exist.
UNIQUE_VIOLATIONFOREIGN_KEY_VIOLATIONCONFLICT - 412The If-Match ETag is stale: the resource changed since you read it. Read it again and retry.
STALE_OBJECT - 415The Content-Type was not application/vnd.api+json.
MISSING_CONTENT_TYPEINVALID_CONTENT_TYPEINVALID_CONTENT_TYPE_PARAMSPARAMETERIZED_ACCEPT - 422The body is well-formed but a value is invalid, such as an enum outside its list or a missing required attribute.
VALIDATION_ERRORVALIDATION_FAILEDCHECK_VIOLATIONMISSING_REQUIREDATMOST_EXCEEDEDHOOK_ABORT - 428This resource is version-locked: send its ETag in an If-Match header.
MISSING_IF_MATCH - 429Rate limited (RATE_LIMITED). Limits are per person and shared with MCP. Back off a few seconds and retry.
RATE_LIMITEDQUOTA_EXCEEDED - 500Server error. Safe to retry a read; check before retrying a write.
INTERNAL_ERROR - 503Temporarily unavailable. Retry with backoff.
UNAVAILABLE
curl
curl "https://prod-eu.getbestest.com/api/v1/test_collection_folders/3f2b9c14-8d5e-4a71-9f60-2c1e7b4a8d33" \
-X PATCH \
-H "Authorization: Bearer $BESTEST_TOKEN" \
-H "Accept: application/vnd.api+json" \
-H 'If-Match: W/"3"' \
-H "Content-Type: application/vnd.api+json" \
-d '{
"data": {
"type": "test_collection_folders",
"id": "3f2b9c14-8d5e-4a71-9f60-2c1e7b4a8d33",
"attributes": {
"name": "Checkout"
}
}
}'application/vnd.api+json
{
"data": {
"type": "test_collection_folders",
"id": "3f2b9c14-8d5e-4a71-9f60-2c1e7b4a8d33",
"attributes": {
"name": "Checkout",
"updatedAt": "2026-10-05T09:30:00Z"
},
"links": {
"self": "/test_collection_folders/3f2b9c14-8d5e-4a71-9f60-2c1e7b4a8d33"
}
},
"jsonapi": {
"version": "1.1"
}
}Show an error response
every 4xx and 5xx has this shape
{
"errors": [
{
"status": "400",
"title": "Bad Request",
"code": "UNKNOWN_FIELD",
"detail": "Unknown field \"displayName\" on resource type \"users\". Valid fields: id, externalId, role, ...",
"source": {
"parameter": "fields[users]"
}
}
]
}Create a test collection test case
/api/v1/test_collection_test_casesCreates a test collection test case from a JSON:API resource object - data.type names the resource type and data.attributes carries the writable attributes - and returns the created resource.
Needs a read-and-write token. A read-only token gets 403.
Headers
Authorizationstringrequired- Your API token as a bearer credential.
Bearer $BESTEST_TOKENAcceptstring- Send application/vnd.api+json, or leave it out. Asking for application/json returns 406 Not Acceptable.
application/vnd.api+jsonContent-Typestringrequired- Must be application/vnd.api+json on any request with a body. Anything else returns 415 Unsupported Media Type.
application/vnd.api+json
Attributes you can send5
collectionIduuidrequiredprojectIduuidrequiredtestCaseIduuidrequireddefaultAssigneeIduuid | nullpositionOrderintegerdefault0
Responses
- 201Created.
11 error responses
- 400The request is malformed: an unknown field, a filter that does not parse, or conflicting paging parameters.
INPUT_DEPTH_EXCEEDEDGRAPHQL_PARSE_FAILEDGRAPHQL_VALIDATION_FAILEDBAD_USER_INPUT - 401The token has expired or could not be authenticated.
TOKEN_EXPIREDUNAUTHENTICATED - 403The token is missing or not recognised, belongs to another region, or is read-only and this is a write.
FORBIDDEN - 404No such resource, or it is outside the Space your token reaches.
NOT_FOUND - 406The Accept header asked for something other than application/vnd.api+json.
NOT_ACCEPTABLE - 409The write conflicts with existing data, for example a duplicate or a reference to something that does not exist.
UNIQUE_VIOLATIONFOREIGN_KEY_VIOLATIONCONFLICT - 415The Content-Type was not application/vnd.api+json.
MISSING_CONTENT_TYPEINVALID_CONTENT_TYPEINVALID_CONTENT_TYPE_PARAMSPARAMETERIZED_ACCEPT - 422The body is well-formed but a value is invalid, such as an enum outside its list or a missing required attribute.
INVALID_INPUTVALIDATION_FAILEDCHECK_VIOLATIONMISSING_REQUIREDATMOST_EXCEEDEDHOOK_ABORT - 429Rate limited (RATE_LIMITED). Limits are per person and shared with MCP. Back off a few seconds and retry.
RATE_LIMITEDQUOTA_EXCEEDED - 500Server error. Safe to retry a read; check before retrying a write.
INTERNAL_ERROR - 503Temporarily unavailable. Retry with backoff.
UNAVAILABLE
curl
curl "https://prod-eu.getbestest.com/api/v1/test_collection_test_cases" \
-X POST \
-H "Authorization: Bearer $BESTEST_TOKEN" \
-H "Accept: application/vnd.api+json" \
-H "Content-Type: application/vnd.api+json" \
-d '{
"data": {
"type": "test_collection_test_cases",
"attributes": {
"collectionId": "3f2b9c14-8d5e-4a71-9f60-2c1e7b4a8d33",
"projectId": "03ff802c-4fcb-4718-8eb8-12ecc999f758",
"testCaseId": "3f2b9c14-8d5e-4a71-9f60-2c1e7b4a8d33"
}
}
}'application/vnd.api+json
{
"data": [
{
"type": "test_collection_test_cases",
"id": "3f2b9c14-8d5e-4a71-9f60-2c1e7b4a8d33",
"attributes": {},
"links": {
"self": "/test_collection_test_cases/3f2b9c14-8d5e-4a71-9f60-2c1e7b4a8d33"
}
}
],
"links": {
"self": "/test_collection_test_cases?page[size]=25",
"first": "/test_collection_test_cases?page[size]=25&page[number]=1",
"prev": null,
"next": "/test_collection_test_cases?page[size]=25&page[number]=2",
"last": "/test_collection_test_cases?page[size]=25&page[number]=6"
},
"meta": {
"totalCount": 128
},
"jsonapi": {
"version": "1.1"
}
}Show an error response
every 4xx and 5xx has this shape
{
"errors": [
{
"status": "400",
"title": "Bad Request",
"code": "UNKNOWN_FIELD",
"detail": "Unknown field \"displayName\" on resource type \"users\". Valid fields: id, externalId, role, ...",
"source": {
"parameter": "fields[users]"
}
}
]
}Delete a test collection test case
/api/v1/test_collection_test_cases/{id}Deletes the test collection test case with this id.
Needs a read-and-write token. A read-only token gets 403.
Version-locked: send the ETag from your last read as If-Match.
Path parameters
iduuidrequired- The resource id (a UUID).
Headers
Authorizationstringrequired- Your API token as a bearer credential.
Bearer $BESTEST_TOKENAcceptstring- Send application/vnd.api+json, or leave it out. Asking for application/json returns 406 Not Acceptable.
application/vnd.api+jsonIf-Matchstringrequired- The ETag from your last read of this resource, sent back verbatim. Missing returns 428 Precondition Required; stale (someone changed it since you read it) returns 412 Precondition Failed. Read it again and retry.
W/"3"
Responses
- 204Done. No body.
13 error responses
- 400The request is malformed: an unknown field, a filter that does not parse, or conflicting paging parameters.
INPUT_DEPTH_EXCEEDEDGRAPHQL_PARSE_FAILEDGRAPHQL_VALIDATION_FAILEDBAD_USER_INPUT - 401The token has expired or could not be authenticated.
TOKEN_EXPIREDUNAUTHENTICATED - 403The token is missing or not recognised, belongs to another region, or is read-only and this is a write.
FORBIDDEN - 404No such resource, or it is outside the Space your token reaches.
NOT_FOUND - 406The Accept header asked for something other than application/vnd.api+json.
NOT_ACCEPTABLE - 409The write conflicts with existing data, for example a duplicate or a reference to something that does not exist.
UNIQUE_VIOLATIONFOREIGN_KEY_VIOLATIONCONFLICT - 412The If-Match ETag is stale: the resource changed since you read it. Read it again and retry.
STALE_OBJECT - 415The Content-Type was not application/vnd.api+json.
PARAMETERIZED_ACCEPT - 422The body is well-formed but a value is invalid, such as an enum outside its list or a missing required attribute.
VALIDATION_FAILEDCHECK_VIOLATIONMISSING_REQUIREDATMOST_EXCEEDEDHOOK_ABORT - 428This resource is version-locked: send its ETag in an If-Match header.
MISSING_IF_MATCH - 429Rate limited (RATE_LIMITED). Limits are per person and shared with MCP. Back off a few seconds and retry.
RATE_LIMITEDQUOTA_EXCEEDED - 500Server error. Safe to retry a read; check before retrying a write.
INTERNAL_ERROR - 503Temporarily unavailable. Retry with backoff.
UNAVAILABLE
curl
curl "https://prod-eu.getbestest.com/api/v1/test_collection_test_cases/3f2b9c14-8d5e-4a71-9f60-2c1e7b4a8d33" \
-X DELETE \
-H "Authorization: Bearer $BESTEST_TOKEN" \
-H "Accept: application/vnd.api+json" \
-H 'If-Match: W/"3"'Show an error response
every 4xx and 5xx has this shape
{
"errors": [
{
"status": "400",
"title": "Bad Request",
"code": "UNKNOWN_FIELD",
"detail": "Unknown field \"displayName\" on resource type \"users\". Valid fields: id, externalId, role, ...",
"source": {
"parameter": "fields[users]"
}
}
]
}Create a test collection requirement
/api/v1/test_collection_requirementsCreates a test collection requirement from a JSON:API resource object - data.type names the resource type and data.attributes carries the writable attributes - and returns the created resource.
Needs a read-and-write token. A read-only token gets 403.
Headers
Authorizationstringrequired- Your API token as a bearer credential.
Bearer $BESTEST_TOKENAcceptstring- Send application/vnd.api+json, or leave it out. Asking for application/json returns 406 Not Acceptable.
application/vnd.api+jsonContent-Typestringrequired- Must be application/vnd.api+json on any request with a body. Anything else returns 415 Unsupported Media Type.
application/vnd.api+json
Attributes you can send4
collectionIduuidrequiredprojectIduuidrequiredrequirementIduuidrequiredpositionOrderintegerdefault0
Responses
- 201Created.
11 error responses
- 400The request is malformed: an unknown field, a filter that does not parse, or conflicting paging parameters.
INPUT_DEPTH_EXCEEDEDGRAPHQL_PARSE_FAILEDGRAPHQL_VALIDATION_FAILEDBAD_USER_INPUT - 401The token has expired or could not be authenticated.
TOKEN_EXPIREDUNAUTHENTICATED - 403The token is missing or not recognised, belongs to another region, or is read-only and this is a write.
FORBIDDEN - 404No such resource, or it is outside the Space your token reaches.
NOT_FOUND - 406The Accept header asked for something other than application/vnd.api+json.
NOT_ACCEPTABLE - 409The write conflicts with existing data, for example a duplicate or a reference to something that does not exist.
UNIQUE_VIOLATIONFOREIGN_KEY_VIOLATIONCONFLICT - 415The Content-Type was not application/vnd.api+json.
MISSING_CONTENT_TYPEINVALID_CONTENT_TYPEINVALID_CONTENT_TYPE_PARAMSPARAMETERIZED_ACCEPT - 422The body is well-formed but a value is invalid, such as an enum outside its list or a missing required attribute.
INVALID_INPUTVALIDATION_FAILEDCHECK_VIOLATIONMISSING_REQUIREDATMOST_EXCEEDEDHOOK_ABORT - 429Rate limited (RATE_LIMITED). Limits are per person and shared with MCP. Back off a few seconds and retry.
RATE_LIMITEDQUOTA_EXCEEDED - 500Server error. Safe to retry a read; check before retrying a write.
INTERNAL_ERROR - 503Temporarily unavailable. Retry with backoff.
UNAVAILABLE
curl
curl "https://prod-eu.getbestest.com/api/v1/test_collection_requirements" \
-X POST \
-H "Authorization: Bearer $BESTEST_TOKEN" \
-H "Accept: application/vnd.api+json" \
-H "Content-Type: application/vnd.api+json" \
-d '{
"data": {
"type": "test_collection_requirements",
"attributes": {
"collectionId": "3f2b9c14-8d5e-4a71-9f60-2c1e7b4a8d33",
"projectId": "03ff802c-4fcb-4718-8eb8-12ecc999f758",
"requirementId": "3f2b9c14-8d5e-4a71-9f60-2c1e7b4a8d33"
}
}
}'application/vnd.api+json
{
"data": [
{
"type": "test_collection_requirements",
"id": "3f2b9c14-8d5e-4a71-9f60-2c1e7b4a8d33",
"attributes": {},
"links": {
"self": "/test_collection_requirements/3f2b9c14-8d5e-4a71-9f60-2c1e7b4a8d33"
}
}
],
"links": {
"self": "/test_collection_requirements?page[size]=25",
"first": "/test_collection_requirements?page[size]=25&page[number]=1",
"prev": null,
"next": "/test_collection_requirements?page[size]=25&page[number]=2",
"last": "/test_collection_requirements?page[size]=25&page[number]=6"
},
"meta": {
"totalCount": 128
},
"jsonapi": {
"version": "1.1"
}
}Show an error response
every 4xx and 5xx has this shape
{
"errors": [
{
"status": "400",
"title": "Bad Request",
"code": "UNKNOWN_FIELD",
"detail": "Unknown field \"displayName\" on resource type \"users\". Valid fields: id, externalId, role, ...",
"source": {
"parameter": "fields[users]"
}
}
]
}Delete a test collection requirement
/api/v1/test_collection_requirements/{id}Deletes the test collection requirement with this id.
Needs a read-and-write token. A read-only token gets 403.
Version-locked: send the ETag from your last read as If-Match.
Path parameters
iduuidrequired- The resource id (a UUID).
Headers
Authorizationstringrequired- Your API token as a bearer credential.
Bearer $BESTEST_TOKENAcceptstring- Send application/vnd.api+json, or leave it out. Asking for application/json returns 406 Not Acceptable.
application/vnd.api+jsonIf-Matchstringrequired- The ETag from your last read of this resource, sent back verbatim. Missing returns 428 Precondition Required; stale (someone changed it since you read it) returns 412 Precondition Failed. Read it again and retry.
W/"3"
Responses
- 204Done. No body.
13 error responses
- 400The request is malformed: an unknown field, a filter that does not parse, or conflicting paging parameters.
INPUT_DEPTH_EXCEEDEDGRAPHQL_PARSE_FAILEDGRAPHQL_VALIDATION_FAILEDBAD_USER_INPUT - 401The token has expired or could not be authenticated.
TOKEN_EXPIREDUNAUTHENTICATED - 403The token is missing or not recognised, belongs to another region, or is read-only and this is a write.
FORBIDDEN - 404No such resource, or it is outside the Space your token reaches.
NOT_FOUND - 406The Accept header asked for something other than application/vnd.api+json.
NOT_ACCEPTABLE - 409The write conflicts with existing data, for example a duplicate or a reference to something that does not exist.
UNIQUE_VIOLATIONFOREIGN_KEY_VIOLATIONCONFLICT - 412The If-Match ETag is stale: the resource changed since you read it. Read it again and retry.
STALE_OBJECT - 415The Content-Type was not application/vnd.api+json.
PARAMETERIZED_ACCEPT - 422The body is well-formed but a value is invalid, such as an enum outside its list or a missing required attribute.
VALIDATION_FAILEDCHECK_VIOLATIONMISSING_REQUIREDATMOST_EXCEEDEDHOOK_ABORT - 428This resource is version-locked: send its ETag in an If-Match header.
MISSING_IF_MATCH - 429Rate limited (RATE_LIMITED). Limits are per person and shared with MCP. Back off a few seconds and retry.
RATE_LIMITEDQUOTA_EXCEEDED - 500Server error. Safe to retry a read; check before retrying a write.
INTERNAL_ERROR - 503Temporarily unavailable. Retry with backoff.
UNAVAILABLE
curl
curl "https://prod-eu.getbestest.com/api/v1/test_collection_requirements/3f2b9c14-8d5e-4a71-9f60-2c1e7b4a8d33" \
-X DELETE \
-H "Authorization: Bearer $BESTEST_TOKEN" \
-H "Accept: application/vnd.api+json" \
-H 'If-Match: W/"3"'Show an error response
every 4xx and 5xx has this shape
{
"errors": [
{
"status": "400",
"title": "Bad Request",
"code": "UNKNOWN_FIELD",
"detail": "Unknown field \"displayName\" on resource type \"users\". Valid fields: id, externalId, role, ...",
"source": {
"parameter": "fields[users]"
}
}
]
}Related-resource endpoints
Each to-many relation has its own URL, such as a test case's steps or a cycle's executions. They return a paginated collection of the related resource and take that resource's own filter, sort, paging and fields parameters, so they are listed rather than documented one by one. For to-one relations, use ?include= on the parent request instead: one round trip instead of two.
Show all 5
- GET
/api/v1/test_collections/{id}/testCaseExecutions - GET
/api/v1/test_collections/{id}/testCollectionRequirements - GET
/api/v1/test_collections/{id}/testCollectionTestCases - GET
/api/v1/test_collection_folders/{id}/testCollectionFolders - GET
/api/v1/test_collection_folders/{id}/testCollections
