Skip to main content
Integrations · Notifications

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

POSTyour endpoint

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.

FAQ

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.

Point the next failure at your own endpoint

Create a webhook integration, paste a URL you control, and see the first real payload land.