Open a ticket on failure
Turn compliance.failed into an issue in the tracker your team already watches.
Point Ironfang Audit at an endpoint and it sends signed events when an audit completes, a page changes, a rule starts failing or evidence is about to expire. Retried for two days, with a delivery history you can read.
Create a free accountRead the API docs
POST /your/endpoint
Ironfang-Event-Id: ev_01HZY7F8A2
Ironfang-Timestamp: 1756480271
Ironfang-Signature: v1=8a13c09e4f22...
User-Agent: Ironfang-Webhooks/1
{
"type": "compliance.failed",
"audit_id": "aw-2841",
"site": "acme.example",
"pages": 128,
"failing_rules": 1
}One endpoint
A finding that lives in a dashboard is a finding somebody has to remember to go and look at. The audit that matters is usually the one that ran while everyone was busy with something else.
A webhook puts the event where the work already happens: the tracker, the channel, the deploy pipeline. Ironfang Audit signs it so you can trust it, keeps retrying while your endpoint is down, and records what happened either way.
// verify the signature before trusting the body
const expected =
'v1=' + crypto.createHmac('sha256', secret)
.update(timestamp + '.' + rawBody)
.digest('hex');
if (!crypto.timingSafeEqual(
Buffer.from(expected), Buffer.from(received))) {
return res.status(400).end();
}Capabilities
The parts that decide whether you can build on it: how it is signed, how hard it tries, and what you can see afterwards.
HMAC-SHA256 over the timestamp and the raw body, sent as v1=<hex>. The version prefix leaves room to change the scheme without breaking receivers.
One minute, five, thirty, two hours, eight, then a day twice. Eight attempts, long enough to survive an outage somebody fixes the next morning.
A Retry-After on your response is honoured up to a cap, so an endpoint under pressure can slow the retries rather than absorb them.
One event per audit with counts and a link, rather than one per page. A hundred-page audit is a single delivery.
Status, attempts and an excerpt of your own response, kept per endpoint, with manual retry when you have fixed the thing that broke.
Secrets are shown once and stored sealed, and can be rotated from the API without recreating the endpoint.
Use cases
Each of these is one event and a handful of lines at the other end.
Turn compliance.failed into an issue in the tracker your team already watches.
Send change.detected where the people who own the page will actually see it.
Wait for audit.completed and read the compliance summary before promoting a release.
Pull the evidence bundle as soon as the audit seals, rather than polling for it.
Act on monitor.skipped, which says why a scheduled run did not start, a usage limit included.
Use evidence.expiring to export a bundle before its retention period ends.
Events
Subscribe an endpoint to the events you want. Each one is an aggregate for the audit rather than one message per page.
audit.startedAn audit began.audit.completedEvery page finished and the evidence is sealed.audit.partialThe audit finished with some pages incomplete.audit.failedThe audit could not complete.change.detectedA page changed by more than its monitor policy allows.compliance.failedA rule that was passing is now failing.monitor.skippedA scheduled slot was skipped, with the reason, such as a usage limit.evidence.expiringHosted evidence expires soon and no export holds a copy.Prefer the evidence itself rather than a notification? See export to your own storage.
Pricing
There is no per-delivery charge and no add-on. What counts is the pages you capture, beyond the free monthly allowance; getting the results out is part of the product. Evidence integrity and delivery behaviour are identical on every account, free or paid.
Questions
The details that decide whether this fits, without reading the whole reference first.
Less to operate. More to ship.
Create an account, add a site and point an endpoint at it. The audit that triggers the first event is inside your free monthly allowance.
Webhooks are included on every account, with no per-delivery charge and no card required to start.