Antithesis API
The Antithesis API enables programmatic access to the Antithesis autonomous testing environments. List runs, inspect run details, and retrieve logs.
Authentication
Pass the API key in the Authorization header as Authorization: Bearer <api_key>. To obtain an API key, please email us at support@antithesis.com or talk to your forward deployed engineer.
Versioning
All endpoints are versioned via a path prefix:
/api/v0/...Preview. APIs accessed from thev0route are in preview. They may change or be removed./api/v1/...Stable. The first version with a compatibility commitment.
In the future only breaking changes trigger a new major version (e.g., v2). When that happens the previous version (v1) remains available, and preview APIs restart under v0.
Base URL
https://{tenant}.antithesis.com
-
{tenant}- Your organization's tenant name. (default:demo)
Errors
Every endpoint can return the same set of error responses (4xx and 5xx). To keep the per-endpoint sections concise, these are documented once in Error responses at the bottom of this page.
Test runs
Operations on test runs.
List all test runs
GET /api/v0/runs
List all test runs
/api/v0/runs Returns a paginated list of test runs. Results are ordered by creation time, newest first.
limit query integer Default: 50Min: 1 · Max: 100 after query string next_cursor value (as well as any filter parameters) from a previous response to fetch the next page.status query stringAvailable values: starting, in_progress, completed, cancelled, incomplete, unknown created_after query string <date-time> created_before query string <date-time> launcher query string Content type: application/json
data requiredarray<object>Items of data
run_id requiredstringExample:
9325f006ffd3a399a8497bc888878b97-50-1status requiredstringAvailable values: starting, in_progress, completed, cancelled, incomplete, unknownstarting: the run is being set up. in_progress: the run is actively running. completed: the run finished successfully. cancelled: the run was cancelled before completion. incomplete: the run did not complete successfully. unknown: the status of the run is unknown.created_at requiredstring <date-time>started_atstring <date-time> (nullable)completed_atstring <date-time> (nullable)creatorobject (nullable)Properties of creator
namestringExample:
demotypestringExample:
cilauncher requiredstringExample:
Payments Nightlydescriptionstring (nullable)Example:
basic_test on mainparametersobject (nullable)Properties of parameters
antithesis.config_imagestringantithesis.images parameter.Example:
my-config:latestantithesis.descriptionstringExample:
basic_test on mainantithesis.durationstringExample:
30antithesis.imagesstring[REGISTRY/]NAME(:TAG|@DIGEST). In most cases, images are parsed from the orchestration configuration (e.g. docker-compose.yaml or /manifests) and do not need to be specified here. It is recommended to use a digest over a tag. Images specified by digest will be tagged as latest within the Antithesis environment. The default registry is us-central1-docker.pkg.dev/molten-verve-216720/$TENANT_NAME-repository/. When images mentioned in the config are also passed via this parameter, the value here overwrites the config. We recommend only using this parameter for images not already mentioned in the config files.Example:
registry/container_1:tag1; registry/container_2:latestantithesis.is_ephemeralstring (nullable)Available values: true, false"true" or "false") that indicates whether or not the run's results should be reflected in future reports as a historic result. Set to "true" when kicking off one-off, exploratory runs. Defaults to "false".antithesis.report.recipientsstringExample:
user1@example.com; user2@example.comantithesis.sourcestringExample:
mainAdditional properties: string — Additional parameters including tooling integration parameters (e.g. antithesis.integrations.<type>.callback_url, antithesis.integrations.<type>.token where type is github, discord, or slack).
linksobject (nullable)Properties of links
triage_reportstring <uri>next_cursorstring (nullable)after query parameter to fetch the next page. Null if no more pages.Example response
{ "data": [ { "run_id": "9043254f65c9c65d63fe043a0abfc7fc-53-1", "status": "completed", "created_at": "2026-04-28T13:49:49Z", "launcher": "Research Nightly", "started_at": "2026-04-28T13:49:49Z", "completed_at": "2026-04-28T14:14:07Z", "creator": { "name": "abc.xyz", "type": "user" }, "parameters": { "antithesis.description": "Placeholder description", "antithesis.integrations.type": "none", "antithesis.is_ephemeral": "false" }, "links": { "triage_report": "https://antithesis-dev.antithesis.com/report/VQ81z_5My-BjOmj6uFNKqVPq/Pv_GDPOCDEer8yk3Tf90Twj-83iedGwTgf60FyOYtA8.html?auth=v2.public.eyJuYmYiOiIyMDI2LTA0LTI4VDEzOjE0OjA1LjY3NTMyMTY1N1oiLCJzY29wZSI6eyJSZXBvcnRTY29wZVYxIjp7ImFzc2V0IjoiUHZfR0RQT0NERWVyOHlrM1RmOTBUd2otODNpZWRHd1RnZjYwRnlPWXRBOC5odG1sIiwicmVwb3J0X2lkIjoiVlE4MXpfNU15LUJqT21qNnVGTktxVlBxIn19fTuj6S2XLg2SC-7dhP7H4CNTV5WZME2xiXlmReHLchLERjHxLXaOVxnkkv2Li5VF_4MLtIxunbBl_4gOwNJE3gY&debug=true" } }, { "run_id": "ced73597f5f6499a6041f4c7f2329cf1-53-1", "status": "completed", "created_at": "2026-04-28T13:49:49Z", "launcher": "Thesis", "started_at": "2026-04-28T13:49:49Z", "completed_at": "2026-04-28T14:07:36Z", "creator": { "name": "abc.xyz", "type": "user" }, "parameters": { "antithesis.description": "Placeholder description", "antithesis.integrations.type": "none", "antithesis.is_ephemeral": "true" }, "links": { "triage_report": "https://antithesis-dev.antithesis.com/report/upBLS-4SrdaVqSi7tv5IbF38/Fqt1GZOTLPd978JxmCxAY-fXoUWvnqDjaTOmRM2g_g4.html?auth=v2.public.eyJzY29wZSI6eyJSZXBvcnRTY29wZVYxIjp7ImFzc2V0IjoiRnF0MUdaT1RMUGQ5NzhKeG1DeEFZLWZYb1VXdm5xRGphVE9tUk0yZ19nNC5odG1sIiwicmVwb3J0X2lkIjoidXBCTFMtNFNyZGFWcVNpN3R2NUliRjM4In19LCJuYmYiOiIyMDI2LTA0LTI4VDEzOjA3OjI1LjcwMDgzODkwM1oifVZW5_voXDGIhlndVP0FXfpDpBhUyYPbm99Zl7DlSzO38NSGXVU4_hKliNLgMGz1SXP9VW4NJLwDcEGetW224gY&debug=true" }, "session_id": "da7ae868398bbbc39bb6fe183e6a8880-53-1" } ], "next_cursor": "MjAyNi0wNC0yOFQxMzo0OTo0NVosMDM2MDc0MjdmMDg0NmE0OGE3ZjY2ZTQyYTUxOTY3ODktNTMtMQ=="}Error responses (4xx, 5xx) are shared across all endpoints — see Error responses.
Get test run details
GET /api/v0/runs/{run_id}
Get test run details
/api/v0/runs/{run_id} Returns the full details of a single test run, including results.
run_id path required string Content type: application/json
run_id requiredstringExample:
9325f006ffd3a399a8497bc888878b97-50-1status requiredstringAvailable values: starting, in_progress, completed, cancelled, incomplete, unknownstarting: the run is being set up. in_progress: the run is actively running. completed: the run finished successfully. cancelled: the run was cancelled before completion. incomplete: the run did not complete successfully. unknown: the status of the run is unknown.created_at requiredstring <date-time>started_atstring <date-time> (nullable)completed_atstring <date-time> (nullable)creatorobject (nullable)Properties of creator
namestringExample:
demotypestringExample:
cilauncher requiredstringExample:
Payments Nightlydescriptionstring (nullable)Example:
basic_test on mainparametersobject (nullable)Properties of parameters
antithesis.config_imagestringantithesis.images parameter.Example:
my-config:latestantithesis.descriptionstringExample:
basic_test on mainantithesis.durationstringExample:
30antithesis.imagesstring[REGISTRY/]NAME(:TAG|@DIGEST). In most cases, images are parsed from the orchestration configuration (e.g. docker-compose.yaml or /manifests) and do not need to be specified here. It is recommended to use a digest over a tag. Images specified by digest will be tagged as latest within the Antithesis environment. The default registry is us-central1-docker.pkg.dev/molten-verve-216720/$TENANT_NAME-repository/. When images mentioned in the config are also passed via this parameter, the value here overwrites the config. We recommend only using this parameter for images not already mentioned in the config files.Example:
registry/container_1:tag1; registry/container_2:latestantithesis.is_ephemeralstring (nullable)Available values: true, false"true" or "false") that indicates whether or not the run's results should be reflected in future reports as a historic result. Set to "true" when kicking off one-off, exploratory runs. Defaults to "false".antithesis.report.recipientsstringExample:
user1@example.com; user2@example.comantithesis.sourcestringExample:
mainAdditional properties: string — Additional parameters including tooling integration parameters (e.g. antithesis.integrations.<type>.callback_url, antithesis.integrations.<type>.token where type is github, discord, or slack).
linksobject (nullable)Properties of links
triage_reportstring <uri>resultsobjectfailure_momentobject (nullable)vtime and input_hash to the logs endpoint to retrieve logs around the event that caused the run to become incomplete.Properties of failure_moment
input_hash requiredstringExample:
-3625518438076122494vtime requiredstringExample:
398.4898056755774Example response
{ "run_id": "ff0192ee9607f8ffa39187731d359c43-54-0", "status": "completed", "created_at": "2026-05-14T03:01:27Z", "launcher": "basic_k8s_test", "started_at": "2026-05-14T03:01:27Z", "completed_at": "2026-05-14T03:29:04Z", "creator": { "name": "antithesis_pdev", "type": "antithesis_scheduler" }, "parameters": { "antithesis.config_image": "etcd-config-k8s:latest", "antithesis.description": "Nightly: Basic K8s test (etcd)", "antithesis.duration": "15", "antithesis.integrations.type": "none", "antithesis.is_ephemeral": "false", "antithesis.report.recipients": "foo.bar@antithesis.com" }, "links": { "triage_report": "https://antithesis-dev.antithesis.com/report/mj9kKGUQwD-NuB5MKdvoBbUs/hHB2tlELW0k2fysU3tEHMyluQqqzBhspg2JalbFl3tQ.html?auth=v2.public.eyJzY29wZSI6eyJSZXBvcnRTY29wZVYxIjp7ImFzc2V0IjoiaEhCMnRsRUxXMGsyZnlzVTN0RUhNeWx1UXFxekJoc3BnMkphbGJGbDN0US5odG1sIiwicmVwb3J0X2lkIjoibWo5a0tHVVF3RC1OdUI1TUtkdm9CYlVzIn19LCJuYmYiOiIyMDI2LTA1LTE0VDAyOjI5OjAyLjY1MTUxNzIyMloifetWU3K1qICy8CzM5VzyveqhPMgpKgej_FOogxKqyfG9r16HsGjbAEKoiXXIIl6pi6_hvgIduzAgroEoNigj3wo" }, "results": { "environment": { "antithesis_version": "v54-0", "images": [ { "name": "etcd-config-k8s", "image": "us-central1-docker.pkg.dev/molten-verve-216720/antithesis-pdev-repository/etcd-config-k8s@sha256:16f57a2ec79c0d61886c28774264ab1d027e51a9301e014941404a35dcf8c631", "tag": "latest" }, { "name": "mirrored-coredns-coredns", "image": "docker.io/rancher/mirrored-coredns-coredns@sha256:4f7a57135719628cf2070c5e3cbde64b013e90d4c560c5ecbf14004181f91998" }, { "name": "etcd", "image": "docker.io/bitnamilegacy/etcd@sha256:4abe38869d5919c9ec70b2008713c2eb90c1b26d9e6700e126875894681b5b99", "tag": "3.5" }, { "name": "local-path-provisioner", "image": "docker.io/rancher/local-path-provisioner@sha256:5fb0394abf87407a27cc56db94334eb0c92d0b5de2636683a7ec51f38143dfc9" }, { "name": "busybox", "image": "docker.io/library/busybox@sha256:e56bc0f7fc7d4452b17eb4ac0a9261ff4c9a469afa45d2b673e03650716d095d" }, { "name": "mirrored-pause", "image": "docker.io/rancher/mirrored-pause@sha256:7c38f24774e3cbd906d2d33c38354ccf787635581c122965132c9bd309754d4a" }, { "name": "etcd-client-k8s", "image": "us-central1-docker.pkg.dev/molten-verve-216720/antithesis-pdev-repository/etcd-client-k8s@sha256:112394d9bacd070df4a8d18db3b7575d6e314220ee2462a31dc24df2e98373cc", "tag": "latest" } ] } }}Error responses (4xx, 5xx) are shared across all endpoints — see Error responses.
Get logs for a specific moment
GET /api/v0/runs/{run_id}/logs
Get logs for a specific moment
/api/v0/runs/{run_id}/logs Streams the logs for a moment in the test run as newline-delimited JSON (NDJSON) in chronological order. Each line is a self-contained JSON object. The response is streamed and the connection remains open until all matching log lines have been sent.
run_id path required string input_hash query required string vtime query required string begin_vtime query string begin_input_hash query string begin_vtime to fully identify the begin moment.Content type: application/x-ndjson
moment requiredobjectProperties of moment
input_hash requiredstringExample:
-3625518438076122494vtime requiredstringExample:
398.4898056755774Accepts additional properties.
A raft pre-vote request log line
{ "moment": { "input_hash": "-3625518438076122494", "vtime": "398.4898056755774" }, "output_text": "{\"level\":\"info\",\"ts\":\"2026-03-26T01:42:55.628233Z\",\"logger\":\"raft\",\"caller\":\"v3@v3.6.0/raft.go:1064\",\"msg\":\"2c6c7b8d0d0933f7 [logterm: 78, index: 436] sent MsgPreVote request to dcb68c82481661be at term 79\"}", "source": { "container": "etcd0", "name": "etcd0", "stream": "error" }}A slow request warning log line
{ "output_text": "{\"level\":\"warn\",\"ts\":\"2026-03-26T01:41:30.289731Z\",\"caller\":\"txn/util.go:93\",\"msg\":\"apply request took too long\",\"took\":\"200.69629ms\",\"expected-duration\":\"100ms\",\"prefix\":\"read-only range \",\"request\":\"key:\\\"key\\\" \",\"response\":\"\",\"error\":\"context deadline exceeded\"}", "source": { "container": "etcd1", "name": "etcd1", "stream": "error" }, "moment": { "input_hash": "-8212366801093655922", "vtime": "313.15126806590706" }}A watch channel closed log line
{ "output_text": "{\"level\":\"info\",\"ts\":1774489067.310644,\"caller\":\"client/watch.go:101\",\"msg\":\"Watch channel closed\"}", "source": { "container": "client", "name": "antithesis/pods/client/commands/robustness/singleton_driver_traffic.err", "pid": 45, "stream": "error" }, "moment": { "input_hash": "-3704286174724581163", "vtime": "90.17225814750418" }}Error responses (4xx, 5xx) are shared across all endpoints — see Error responses.
Stream build logs
GET /api/v0/runs/{run_id}/build_logs
Stream build logs
/api/v0/runs/{run_id}/build_logs Streams the build logs for a test run as newline-delimited JSON (NDJSON). Each line contains a timestamp, a stream indicator, and the log text. The response is streamed and the connection remains open until all matching log lines have been sent.
run_id path required string Content type: application/x-ndjson
timestamp requiredstring <date-time>Example:
2025-03-20T02:01:12ZstreamstringAvailable values: stdout, stderrtext requiredstringExample:
Building image payments-service...Accepts additional properties.
Example response
{"timestamp":"2026-05-14T03:03:23.481Z","text":"","stream":"stdout"}{"timestamp":"2026-05-14T03:03:24.668Z","text":"About to wait for the flock. If the script is hanging here, somebody else is doing a build.","stream":"stdout"}Error responses (4xx, 5xx) are shared across all endpoints — see Error responses.
List test run properties
GET /api/v0/runs/{run_id}/properties
List test run properties
/api/v0/runs/{run_id}/properties Returns a paginated list of property results for a test run, including both passing and failing properties by default. Use the status parameter to filter by a specific status.
run_id path required string status query stringAvailable values: Passing, Failing limit query integer Default: 50Min: 1 · Max: 100 after query string next_cursor value from a previous response to fetch the next page.Content type: application/json
data requiredarray<any>One of for items of data
object
name requiredstringdescriptionstringstatus requiredstringAvailable values: Passing, Failingis_event requiredbooleanis_event is false, it's evaluated at the level of a whole test rather than a specific branch of execution, e.g., 'Recent version of software was provided' is evaluated at a whole test level and is independent of a branch of execution.is_groupbooleangroup field.groupstringexample_countinteger <uint32>counterexample_countinteger <uint32>examplesarray<object>Items of examples
moment requiredobjectProperties of moment
input_hash requiredstringExample:
-3625518438076122494vtime requiredstringExample:
398.4898056755774Accepts additional properties.
counterexamplesarray<object>Items of counterexamples
moment requiredobjectProperties of moment
input_hash requiredstringExample:
-3625518438076122494vtime requiredstringExample:
398.4898056755774Accepts additional properties.
Accepts additional properties.
object
name requiredstringdescriptionstringstatus requiredstringAvailable values: Passing, Failingis_event requiredbooleanis_event is false, it's evaluated at the level of a whole test rather than a specific branch of execution, e.g., 'Recent version of software was provided' is evaluated at a whole test level and is independent of a branch of execution.is_groupbooleangroup field.groupstringexample_countinteger <uint32>counterexample_countinteger <uint32>examplesarray<any>counterexamplesarray<any>Accepts additional properties.
next_cursorstring (nullable)after query parameter to fetch the next page. Null if no more pages.Example response
{ "data": [ { "name": "Sometimes: Root moments", "description": null, "status": "Passing", "is_event": true, "is_group": false, "example_count": 1, "counterexample_count": 0, "examples": [ { "env_setup": "complete", "source": { "name": "env_root" }, "moment": { "input_hash": "-363173456058459333", "vtime": "22.475549569819123" } } ], "counterexamples": [] }, { "name": "Input count", "description": null, "status": "Passing", "is_event": false, "is_group": false, "example_count": 1, "counterexample_count": 0, "examples": [ 318446 ], "counterexamples": [] } ]}Error responses (4xx, 5xx) are shared across all endpoints — see Error responses.
Search run events
GET /api/v0/runs/{run_id}/events
Search run events
/api/v0/runs/{run_id}/events Searches events in a test run for the given query string. The search matches against output text, assertion messages, function names, and test composer commands. Results are streamed as newline-delimited JSON (NDJSON). Each line is a self-contained JSON object representing an event.
run_id path required string q query required string Content type: application/x-ndjson
moment requiredobjectProperties of moment
input_hash requiredstringExample:
-3625518438076122494vtime requiredstringExample:
398.4898056755774Accepts additional properties.
Example response
{"moment":{"input_hash":"-2978388909754056022","vtime":22.66615231265314},"IPT_bytes_out":1073904,"source":{"command_id":"BSPID1ERCnmoGEnk6WjwIZ4o3TM","name":"setup","stream":"info"},"output_text":"3:08:17AM: ^ Pending: ContainerCreating"}{"moment":{"input_hash":"-2978388909754056022","vtime":22.6661523131188},"IPT_bytes_out":1074064,"source":{"command_id":"BSPID1ERCnmoGEnk6WjwIZ4o3TM","name":"setup","stream":"info"},"output_text":"3:08:17AM: ^ Pending: ContainerCreating"}Error responses (4xx, 5xx) are shared across all endpoints — see Error responses.
Launch
Launch a test run or debugging session.
Launch a test
POST /api/v1/launch/{launcher_name}
Launch a test
/api/v1/launch/{launcher_name} Kicks off a test using the specified launcher (e.g. basic_test or basic_k8s_test). Fetches the relevant container images specified in configuration files and in antithesis.images, builds the test environment, and runs the test for the duration set in antithesis.duration. Returns an HTTP status code indicating whether the test was successfully started (not the test result itself).
launcher_name path required string basic_test for Docker Compose orchestration or basic_k8s_test for Kubernetes orchestration.Content type: application/json
params requiredobjectProperties of params
antithesis.config_imagestringantithesis.images parameter.Example:
my-config:latestantithesis.descriptionstringExample:
basic_test on mainantithesis.durationstringExample:
30antithesis.imagesstring[REGISTRY/]NAME(:TAG|@DIGEST). In most cases, images are parsed from the orchestration configuration (e.g. docker-compose.yaml or /manifests) and do not need to be specified here. It is recommended to use a digest over a tag. Images specified by digest will be tagged as latest within the Antithesis environment. The default registry is us-central1-docker.pkg.dev/molten-verve-216720/$TENANT_NAME-repository/. When images mentioned in the config are also passed via this parameter, the value here overwrites the config. We recommend only using this parameter for images not already mentioned in the config files.Example:
registry/container_1:tag1; registry/container_2:latestantithesis.is_ephemeralstring (nullable)Available values: true, false"true" or "false") that indicates whether or not the run's results should be reflected in future reports as a historic result. Set to "true" when kicking off one-off, exploratory runs. Defaults to "false".antithesis.report.recipientsstringExample:
user1@example.com; user2@example.comantithesis.sourcestringExample:
mainAdditional properties: string — Additional parameters including tooling integration parameters (e.g. antithesis.integrations.<type>.callback_url, antithesis.integrations.<type>.token where type is github, discord, or slack).
Content type: application/json
runId requiredstringExample:
c8d2f4a6e0b3197d5f8a2c4e6b0d3f79-49-1statusCode requiredintegerExample:
200Example response
{ "statusCode": 202, "runId": "0e62aa320a60967967096401ce826bd5-54-1"}Error responses (4xx, 5xx) are shared across all endpoints — see Error responses.
Launch a debugging session
POST /api/v1/launch/debugging
Launch a debugging session
/api/v1/launch/debugging Kicks off a multiverse debugging session that'll be available for six hours. Returns an HTTP status code indicating whether the debugging session request was successfully accepted and the session is getting ready.
Content type: application/json
params requiredobjectProperties of params
antithesis.debugging.session_id requiredstringExample:
d5d1c9cf0e64b5dd69b00e97b07fe3f4-18-1antithesis.debugging.input_hash requiredstringantithesis.debugging.vtime requiredstringExample:
45.334635781589895antithesis.event_descriptionstringExample:
Investigate the failed assertion at this momentantithesis.report.recipientsstringExample:
user1@example.com; user2@example.comAccepts additional properties.
Content type: application/json
run_id requiredstringExample:
c8d2f4a6e0b3197d5f8a2c4e6b0d3f79-49-1Accepts additional properties.
Example response
{ "statusCode": 202, "runId": "633c43d99162a42d8c6b784751802f30-54-1"}Error responses (4xx, 5xx) are shared across all endpoints — see Error responses.
Error responses
The following error responses can be returned by any endpoint in the API. All errors share the same schema.
Content type: application/json
message requiredstringExample:
limit must be between 1 and 100Example response
{ "message": "limit must be between 1 and 100"}Content type: application/json
message requiredstringExample:
limit must be between 1 and 100Example response
{ "message": "Invalid or expired bearer token."}Content type: application/json
message requiredstringExample:
limit must be between 1 and 100Example response
{ "message": "You do not have permission to access this resource."}Content type: application/json
message requiredstringExample:
limit must be between 1 and 100Example response
{ "message": "Run not found: 9325f006ffd3a399a8497bc888878b97-48-1"}Content type: application/json
message requiredstringExample:
limit must be between 1 and 100Example response
{ "message": "Resource not found"}Content type: application/json
message requiredstringExample:
limit must be between 1 and 100Example response
{ "message": "This endpoint does not support the requested Accept type."}Content type: application/json
message requiredstringExample:
limit must be between 1 and 100Example response
{ "message": "Too many requests. Retry after 30 seconds."}Content type: application/json
message requiredstringExample:
limit must be between 1 and 100Example response
{ "message": "An unexpected error occurred. Please try again later."}