CI, API and webhooks

Automated and manual results in one place

TestPlum accepts JUnit XML from any CI system over a single HTTP request, matches tests to cases by automation ID and records the results in a run. A versioned REST API described by OpenAPI 3.1 covers the rest, with organization-scoped API keys and rate-limit headers, and webhooks deliver HMAC-signed events with retries and a delivery log.

TestPlum project overview with 30-day pass rate trend, executions, requirement coverage and release readiness

What you can do

JUnit XML ingestion with idempotency keys, OpenAPI 3.1 REST API, scoped API keys and signed webhooks.

JUnit XML from any CI

POST the report your test runner already writes. Send an Idempotency-Key header and a retried upload is recorded once, not twice.

REST API with OpenAPI 3.1

Every endpoint is described in a machine-readable OpenAPI 3.1 document, and a test keeps the document and the router in sync.

Scoped API keys

Keys are tied to one organization, hashed at rest, expire and can be revoked. Rate-limit headers tell clients how much budget is left.

Signed webhooks

Events are signed with HMAC-SHA256 and a timestamp, retried on failure, logged per delivery and disabled automatically if an endpoint keeps failing.

Optional AI assistance

If enabled, AI can draft test cases from a requirement and summarise run failures, with cost controls. Coverage-gap rules work without it.

How it works

  1. Create an API key

    Scoped to your organization, with an expiry.

  2. Map automation IDs

    Set the automation ID on each case to its test name.

  3. Upload from CI

    Add one curl step after your tests.

  4. Subscribe to events

    Point a webhook at your chat or deploy tooling.

CI, API and webhooks: frequently asked questions

Which CI tools work with TestPlum?

Any CI system that can run curl. TestPlum ingests JUnit XML, the report format produced by most test runners, including those for Java, JavaScript, Python, Go and .NET.

Is the TestPlum API documented?

Yes. The API is versioned under /api/v1 and described by an OpenAPI 3.1 document served by the application. An automated test checks that every documented endpoint exists.

How do I verify a TestPlum webhook?

Each delivery carries an X-TestPlum-Signature header with a timestamp and an HMAC-SHA256 of the timestamp and body, computed with your webhook secret. Recompute it and compare before trusting the payload.

See your release readiness in minutes

Create a workspace, add a project and record your first run. Everything on this site is in the product today.