Send the raw event payload to any endpoint you control
When a test fails, a session ends or a scan finishes, TestKase POSTs a small JSON body — the event, a timestamp and the event data — to a public HTTPS URL you own, ready to post to Slack, open a ticket or trigger the next job.
Any public HTTP(S) endpoint · raw JSON, not a rendered card
Content-Type: application/json
{
"event": "automate.session.failed",
"timestamp": "2026-09-28T09:41:03.812Z",
"data": {
"build_name": "Checkout suite",
"name": "pays with saved card",
"device": "Chrome 152 on Windows 11",
"duration_seconds": 161,
"run_by": "[email protected]",
"url": "https://app.testkase.com/automate/sessions/8f2c…"
}
}- Raw JSON
- the event, a timestamp and the data — nothing rendered for you
- Any endpoint
- a public HTTP(S) URL you control
- Same catalogue
- the events every chat channel gets
- 5 retries
- before a delivery is marked exhausted
What you receive, and how
One neutral event fires the same JSON to every subscribed endpoint — no per-platform card, just the payload and the rules that govern its delivery.
The raw event payload
Every send is the same three keys — the event string, an ISO timestamp taken at dispatch, and the event's data object forwarded exactly as it fired. The custom endpoint is deliberately not card-rendered: a machine consumer wants the payload, not a layout.
To any endpoint you control
Paste a public HTTP(S) URL — your own server, a serverless function, a CI hook. TestKase POSTs the JSON to it; what you do next is yours.
The same event catalogue
The endpoint subscribes to the same events as Slack or Teams: Automate sessions, Live sessions, accessibility scans, and the test-management events — picked per product, by hand or with a preset.
Delivery guarantees
Sending is fire-and-forget, so a slow endpoint never holds up the run. A failed send is retried up to five times, then marked exhausted; an incomplete send is abandoned after ten seconds.
URL validation
Only a public http(s) URL is accepted, and it is re-validated before every dispatch. Loopback, private, link-local, carrier-grade NAT and multicast addresses are refused, and redirects are not followed.
One integration, one endpoint
An integration is a single URL. Deliveries are de-duplicated by URL so a project rule and a global rule to the same endpoint do not double-send — and the more specific project rule wins.
Every event you can subscribe to
Pick events per product — by hand, or with a preset (all results, or failures only). These are the only events that exist, and the endpoint receives each one as raw JSON.
Device farm & accessibility
- Automate test passed, failed or errored
- Live session ended (neutral) or failed
- Accessibility scan completed or failed
Test management
- Test case created or deleted
- Cycle created, completed or deleted
- Plan created, completed or deleted
- Bulk execution completed
Deliberately absent
- Visual — appears in the picker with an empty list; nothing emits a visual event yet.
- No automate.build.completed — a build is a label, not an object with a lifecycle.
- Attempts before a delivery is marked exhausted
- 5
- After which an incomplete send is abandoned
- 10s
- Delivered records are swept after a week
- 7 days
- Unsuccessful records are swept after a month
- 30 days
Sending is fire-and-forget — a slow endpoint never holds up the run. Retries are spaced a minute, five minutes, half an hour, two hours and eight hours apart. Only a public http(s) URL is accepted; loopback, private, link-local, carrier-grade NAT and multicast addresses are refused, redirects are not followed, and the URL is re-validated every dispatch.
Frequently asked questions
Three top-level keys: the event string, an ISO-8601 timestamp taken at the moment of dispatch, and a data object carrying the event's own fields — for a session that is the build and test name, the device, the duration in seconds, who ran it and a link back to the run. The custom endpoint is not descriptor-rendered the way Slack or Teams are; you get the raw JSON.
Only an ordinary public http(s) URL. Loopback, private (RFC1918), link-local, carrier-grade NAT and multicast addresses are refused, along with localhost and URLs with embedded credentials. The URL is re-validated before every dispatch rather than only when you save it, and redirects are not followed — a redirect could land somewhere that never passed the check.
The send is retried up to five attempts, spaced a minute, five minutes, half an hour, two hours and eight hours apart, then marked exhausted. If you switch the integration off part way through, the pending delivery is cancelled rather than retried. Any single attempt is abandoned after ten seconds so a slow endpoint never holds up the test that triggered it.
No. One integration is one webhook URL. Deliveries are de-duplicated by URL, so if the same endpoint is targeted by both a project rule and an org-wide rule it is only sent once, and the more specific project rule wins. For two endpoints, create two integrations.
No. The request is a plain JSON POST with a Content-Type header — there is no HMAC signature or secret header today. Keep the endpoint URL private, and treat the payload as advisory: fetch the run through the link in it if you need the authoritative record. If a send fails, the error text is the status code only.
Not yet. Visual is in the event picker with a deliberately empty list: nothing emits a visual notification event today. There is also no automate.build.completed — a build name is a free-text label, not an object with a lifecycle, so nothing can honestly say when a build finished.
Related
- Test CasesSteps, custom fields, folders and version history
- Test CyclesPlan a round of testing, assign it, and watch it land
- RequirementsWhat you are building, linked to the tests that verify it
- All of Test ManagementOrganize, execute, and track tests across projects
- PricingPer-seat test management and per-thread device testing, priced on the page
Point the next failure at your own endpoint
Create a webhook integration, paste a URL you control, and see the first real payload land.