Skip to main content
ARQERA
FeaturesOreOjuIntegrationsDocs
Request Early Access
Real-time

Webhooks & Events

Receive real-time HTTP notifications for governance decisions, agent actions, compliance changes, and billing updates.

Request Early AccessAPI Reference

Why Webhooks?

Push-based event delivery so your systems stay in sync without polling.

Real-Time Delivery

Events are dispatched within seconds of occurrence. HTTPS POST to your endpoint with JSON payloads, signed with HMAC-SHA256.

Cryptographically Signed

Every payload includes a timestamp and HMAC-SHA256 signature so you can verify authenticity and reject tampered requests.

Automatic Retries

Failed deliveries are retried with Fibonacci-based backoff. Delivery logs and health monitoring keep you informed.

Event Filtering

Subscribe to specific event types per endpoint. Receive only the events your system needs — no noise.

Tenant-Scoped

Webhooks are isolated per tenant. Each endpoint receives events only for its own organization, enforced at the platform level.

Developer Tools

Test endpoints, inspect delivery logs, replay events, and debug locally with CLI tools and the webhook dashboard.

Event Categories

35+ event types organized by domain. Subscribe to exactly what you need.

Governance Events

Fired when actions flow through the governance engine — requests, approvals, rejections, and policy enforcement.

Event TypeDescription
action.requestedAn action has been submitted for governance evaluation
action.approvedAn action was approved (automatically or by a human)
action.rejectedAn action was rejected by a reviewer or governance policy
action.auto_executedAn AUTO-tier action was executed without human review
policy.updatedA governance policy was created or modified
policy.violatedAn action triggered a policy violation

Agent Events

Lifecycle events for AI agents — creation, execution, failures, and completions.

Event TypeDescription
agent.createdA new AI agent was registered
agent.executedAn agent began executing a task
agent.failedAn agent execution encountered an error
agent.completedAn agent finished its task successfully
ara.action.triggeredAra triggered an autonomous action

Evidence Events

Emitted when audit evidence is created, verified, or shared across the evidence chain.

Event TypeDescription
evidence.emittedA new evidence artifact was recorded
evidence.chain.verifiedThe evidence chain integrity was verified
artifact.createdA governance artifact (report, decision log) was created
artifact.sharedAn artifact was shared with external stakeholders

Compliance Events

Compliance framework evaluations, violations, and regulatory change notifications.

Event TypeDescription
compliance.check.completedA compliance check finished (pass or fail)
compliance.framework.updatedA compliance framework configuration changed
compliance.violation.detectedA compliance violation was identified

User Events

User lifecycle — account creation, profile changes, provisioning, and authentication.

Event TypeDescription
user.createdA new user account was created
user.updatedA user profile or role was modified
user.deprovisionedA user was deactivated or removed via SCIM
user.loginA user authenticated successfully
user.mfa.enabledMulti-factor authentication was enabled for a user

Integration Events

Connection lifecycle for third-party integrations — OAuth flows, syncs, and disconnections.

Event TypeDescription
integration.connectedA new integration was connected via OAuth
integration.disconnectedAn integration was disconnected or revoked
integration.sync.completedA data sync from an integration finished

Billing Events

Subscription changes, invoice payments, and usage threshold alerts.

Event TypeDescription
subscription.createdA new subscription was created
subscription.updatedA subscription plan or quantity changed
subscription.canceledA subscription was canceled
invoice.paidAn invoice payment was processed successfully
usage.threshold.reachedAPI usage reached a configured threshold

Webhook Configuration

Register endpoints via the dashboard or the REST API.

Via Dashboard

  1. Navigate to Settings → Webhooks in the ARQERA app.
  2. Click Add Endpoint and enter your HTTPS URL.
  3. Select the event types you want to receive, or choose All Events.
  4. Copy the generated signing secret and store it securely in your application.
  5. Click Send Test Event to verify your endpoint responds with a 2xx status.

Via REST API

Create a webhook endpoint programmatically with a POST request:

curl -X POST https://app.arqera.io/api/webhooks \
  -H "Authorization: Bearer ak_your_api_key" \
  -H "Content-Type: application/json" \
  -d '{
    "name": "Production Governance Alerts",
    "url": "https://your-app.com/webhooks/arqera",
    "events": [
      "action.approved",
      "action.rejected",
      "policy.violated",
      "compliance.violation.detected"
    ],
    "secret": "whsec_your_signing_secret"
  }'

Response:

{
  "id": "wh_a1b2c3d4e5f6",
  "name": "Production Governance Alerts",
  "url": "https://your-app.com/webhooks/arqera",
  "events": [
    "action.approved",
    "action.rejected",
    "policy.violated",
    "compliance.violation.detected"
  ],
  "status": "active",
  "created_at": "2026-02-19T14:00:00.000Z"
}

Payload Format

Every webhook delivers a consistent JSON structure regardless of event type.

{
  "id": "evt_01HX7V9K3M2N4P5Q6R8S0T1U2V",
  "type": "action.approved",
  "timestamp": "2026-02-19T14:23:07.000Z",
  "version": "2026-02-01",
  "data": {
    "action_id": "act_9f8e7d6c5b4a3210",
    "action_type": "data.export",
    "approved_by": "user_a1b2c3d4e5f6",
    "approval_method": "manual",
    "agent_id": "agent_x7y8z9",
    "risk_tier": "HARD",
    "evidence_artifact_id": "art_f0e1d2c3b4a5"
  },
  "tenant_id": "ten_4k7m2n8p1q3r",
  "signature": "t=1740000187,v1=5d41402abc4b2a76b9719d911017c592..."
}
FieldTypeDescription
idstringUnique event identifier. Use for idempotency.
typestringDot-notation event type (e.g. action.approved).
timestampstringISO 8601 timestamp of when the event occurred.
versionstringAPI version that generated this event.
dataobjectEvent-specific payload. Schema varies by event type.
tenant_idstringTenant the event belongs to.
signaturestringHMAC-SHA256 signature for verification.

The data object varies by event type. Refer to the API reference for the full schema of each event payload.

Signature Verification

Verify that webhook payloads originated from ARQERA using HMAC-SHA256.

How Signatures Work

  1. ARQERA serializes the payload as canonical JSON (sorted keys, no whitespace).
  2. A signed string is constructed: {timestamp}.{canonical_json}
  3. The signed string is hashed with HMAC-SHA256 using your webhook secret.
  4. The result is sent in the X-Webhook-Signature header as t=timestamp,v1=hash.
  5. Your server reconstructs the same hash and compares using constant-time comparison.
PythonVerification example
import hmac
import hashlib
import json

def verify_webhook(payload_body: bytes, signature_header: str, secret: str) -> bool:
    """Verify ARQERA webhook signature.

    Args:
        payload_body: Raw request body bytes.
        signature_header: Value of X-Webhook-Signature header.
        secret: Your webhook signing secret.

    Returns:
        True if the signature is valid.
    """
    # Parse the signature header: "t=<timestamp>,v1=<hash>"
    parts = dict(p.split("=", 1) for p in signature_header.split(","))
    timestamp = parts["t"]
    received_sig = parts["v1"]

    # Reconstruct the signed payload
    payload_str = json.dumps(
        json.loads(payload_body),
        sort_keys=True,
        separators=(",", ":"),
    )
    signed_payload = f"{timestamp}.{payload_str}"

    # Compute expected signature
    expected_sig = hmac.new(
        secret.encode("utf-8"),
        signed_payload.encode("utf-8"),
        hashlib.sha256,
    ).hexdigest()

    # Constant-time comparison
    return hmac.compare_digest(expected_sig, received_sig)
TypeScriptVerification example
import crypto from "crypto";

function verifyWebhook(
  payloadBody: string,
  signatureHeader: string,
  secret: string
): boolean {
  // Parse the signature header: "t=<timestamp>,v1=<hash>"
  const parts = Object.fromEntries(
    signatureHeader.split(",").map((p) => {
      const [k, ...v] = p.split("=");
      return [k, v.join("=")];
    })
  );
  const timestamp = parts["t"];
  const receivedSig = parts["v1"];

  // Reconstruct the signed payload
  const parsed = JSON.parse(payloadBody);
  const canonical = JSON.stringify(parsed, Object.keys(parsed).sort());
  // Remove spaces after separators to match Python's separators=(",",":")
  const compact = canonical.replace(/: /g, ":").replace(/, /g, ",");
  const signedPayload = `${timestamp}.${compact}`;

  // Compute expected signature
  const expectedSig = crypto
    .createHmac("sha256", secret)
    .update(signedPayload)
    .digest("hex");

  // Constant-time comparison
  return crypto.timingSafeEqual(
    Buffer.from(expectedSig),
    Buffer.from(receivedSig)
  );
}
SDKOne-liner with the ARQERA SDK
# Python SDK
from arqera import Arqera

client = Arqera(api_key="ak_...")
is_valid = client.webhooks.verify(
    payload=request.body,
    signature=request.headers["X-Webhook-Signature"],
    secret="whsec_...",
)

# TypeScript SDK
import { Arqera } from "@arqera/sdk";

const client = new Arqera({ apiKey: "ak_..." });
const isValid = client.webhooks.verify(
  req.body,
  req.headers["x-webhook-signature"],
  "whsec_..."
);

Retry Policy

Failed deliveries are retried automatically with Fibonacci-based backoff.

AttemptDelayCumulative
160 s1 min
260 s2 min
3120 s4 min
4180 s7 min
5300 s12 min
6480 s20 min
7780 s33 min

Fibonacci Backoff

Retry delays follow the Fibonacci sequence multiplied by a 60-second base. This provides natural, logarithmic growth that is gentler than exponential backoff.

Exhaustion

After all retry attempts are exhausted, the delivery is marked as failed. The event is preserved in the delivery log and can be manually replayed via the API or CLI.

Health Monitoring

Endpoints that repeatedly fail are moved to an error state. The webhook dashboard shows delivery success rates, failure counts, and last-delivered timestamps.

Manual Re-delivery

Replay any event via the API (POST /api/webhooks/replay) or the CLI. Useful for recovering from outages.

Testing Webhooks

Tools for developing and debugging your webhook integration.

CLI Tools

Send test events, list deliveries, and replay failed events from the command line.

# Send a test event to your endpoint
arqera webhooks test \
  --endpoint wh_a1b2c3d4e5f6 \
  --event action.approved

# List recent deliveries
arqera webhooks deliveries \
  --endpoint wh_a1b2c3d4e5f6 \
  --limit 20

# Replay a specific event
arqera webhooks replay \
  --delivery dlv_x7y8z9w0 \
  --endpoint wh_a1b2c3d4e5f6

Local Development

Use ngrok or a similar tunnel to expose your local server and receive webhooks during development.

# Use ngrok to expose your local server
ngrok http 3000

# Then register the ngrok URL as your webhook endpoint
curl -X POST https://app.arqera.io/api/webhooks \
  -H "Authorization: Bearer ak_your_api_key" \
  -H "Content-Type: application/json" \
  -d '{
    "name": "Local Development",
    "url": "https://abc123.ngrok.io/webhooks/arqera",
    "events": ["*"]
  }'

Webhook Dashboard

The webhook dashboard in Settings → Webhooks provides:

Delivery logs — Inspect every delivery attempt with request/response details
Health status — Per-endpoint success rate, error count, and last delivery time
Test button — Send a synthetic event to any endpoint with one click
Event filtering — Filter logs by event type, status, and date range
Payload inspector — View the full JSON payload for any delivery attempt
Replay controls — Re-send any failed delivery directly from the log view

Best Practices

Production guidance for reliable webhook consumption.

Always Verify Signatures

Check the HMAC-SHA256 signature on every request before processing. Reject unsigned or tampered payloads immediately.

Implement Idempotency

Use the event id field to deduplicate. Store processed event IDs and skip duplicates. Webhooks may be delivered more than once.

Respond Within 5 Seconds

Return a 2xx status within 5 seconds. If processing takes longer, accept the event, queue it internally, and process asynchronously.

Handle Retries Gracefully

ARQERA retries failed deliveries with increasing delays. Ensure your endpoint is idempotent so retried events do not cause duplicate side effects.

Filter by Event Type

Subscribe only to the events you need. Fewer events mean less noise, lower latency, and simpler processing logic.

Use IP Allowlisting

Restrict your webhook endpoint to ARQERA's IP ranges for defence in depth. Fetch the current list from GET /api/webhooks/ips.

Monitor Delivery Health

Check the webhook dashboard for delivery success rates. Set up alerts for elevated failure rates or endpoints in error state.

Test Before Going Live

Use the test endpoint or CLI to send synthetic events. Verify your handler processes them correctly before subscribing to production events.

Event Type Quick Reference

All supported event types at a glance.

Event TypeCategoryDescription
action.requestedGovernance EventsAn action has been submitted for governance evaluation
action.approvedGovernance EventsAn action was approved (automatically or by a human)
action.rejectedGovernance EventsAn action was rejected by a reviewer or governance policy
action.auto_executedGovernance EventsAn AUTO-tier action was executed without human review
policy.updatedGovernance EventsA governance policy was created or modified
policy.violatedGovernance EventsAn action triggered a policy violation
agent.createdAgent EventsA new AI agent was registered
agent.executedAgent EventsAn agent began executing a task
agent.failedAgent EventsAn agent execution encountered an error
agent.completedAgent EventsAn agent finished its task successfully
ara.action.triggeredAgent EventsAra triggered an autonomous action
evidence.emittedEvidence EventsA new evidence artifact was recorded
evidence.chain.verifiedEvidence EventsThe evidence chain integrity was verified
artifact.createdEvidence EventsA governance artifact (report, decision log) was created
artifact.sharedEvidence EventsAn artifact was shared with external stakeholders
compliance.check.completedCompliance EventsA compliance check finished (pass or fail)
compliance.framework.updatedCompliance EventsA compliance framework configuration changed
compliance.violation.detectedCompliance EventsA compliance violation was identified
user.createdUser EventsA new user account was created
user.updatedUser EventsA user profile or role was modified
user.deprovisionedUser EventsA user was deactivated or removed via SCIM
user.loginUser EventsA user authenticated successfully
user.mfa.enabledUser EventsMulti-factor authentication was enabled for a user
integration.connectedIntegration EventsA new integration was connected via OAuth
integration.disconnectedIntegration EventsAn integration was disconnected or revoked
integration.sync.completedIntegration EventsA data sync from an integration finished
subscription.createdBilling EventsA new subscription was created
subscription.updatedBilling EventsA subscription plan or quantity changed
subscription.canceledBilling EventsA subscription was canceled
invoice.paidBilling EventsAn invoice payment was processed successfully
usage.threshold.reachedBilling EventsAPI usage reached a configured threshold

Ready to receive real-time events?

Create your free account and configure your first webhook in minutes.

Request Early AccessBack to Docs

Product

  • Ore
  • Oju
  • Integrations

Solutions

  • For Developers
  • For Operations
  • For Startups
  • Compliance

Resources

  • Documentation
  • FAQ
  • Open Source

Company

  • About
  • Security
  • Privacy
  • Terms
  • Cookies
  • Legal
© 2026 ARQERA. All rights reserved.