Provider webhooks are one of the three ways evidence enters ReconLayer, alongside file imports and integration polling.
Provider webhooks: Bridge
Today, ReconLayer ships a native inbound webhook integration for Bridge. Each Bridge integration you configure gets its own dedicated webhook URL:{integrationKey} is the integrationKey you chose when creating the Bridge integration (POST /v1/bridge-integrations), and itโs how ReconLayer resolves which organization and which signing key the incoming payload belongs to โ there is no Authorization or x-organization-id header on this route.
Signature verification
Bridge signs every webhook with the header:webhookPublicKey:
- Parses
t=(timestamp, milliseconds) andv0=(base64-encoded signature) from the header. Missing or malformed headers fail verification immediately. - Rejects the webhook if
|now - t|exceeds a 10-minute (600,000 ms) replay tolerance window. - Verifies an RSA-SHA256 signature over the string
${timestamp}.${rawBody}using the integrationโs public key.
Even when the signature is invalid, ReconLayer still persists the payload as a
RawRecord (with validationStatus: 'failed', signatureValid: false) for audit purposes โ the matching engine is skipped, but nothing is silently dropped. The 400 response includes details.rawRecordId and details.sourceRef so you can locate the record.Responses
Returned when the signature is valid. Same shape used across all evidence endpoints:
The
integrationKey in the path does not resolve to a known, active Bridge integration.Signature missing, malformed, expired (outside the 10-minute window), or failed RSA-SHA256 verification.
FlowLegs, see Bridge Integration.
Listing configured inbound endpoints
GET /v1/webhook-endpoints lists the inbound webhook URLs ReconLayer has generated for your active integrations (currently Bridge):
No native webhook for your provider? Submit evidence directly
If youโre integrating a provider, bank, or system that doesnโt have a native ReconLayer webhook adapter, push evidence directly through the canonical evidence endpoints. These are the same entry points used internally by Bridge polling and on-chain ingestion โ they go through the identicalingestEvidence pipeline and produce the same EvidenceAcceptanceResponse.
Both endpoints require Authorization, x-organization-id, and an Idempotency-Key header.
POST /v1/evidence/provider
Use this for any provider/PSP-side settlement, payout, or transfer event.Provider identifier, e.g.
"acme-psp".A stable identifier unique per
(organizationId, source) โ used for duplicate detection.Link directly to a known
PaymentIntent if you already know it.The providerโs own transfer/transaction ID.
Your reference, used for matching against
PaymentIntent.externalReference.e.g.
intermediary_in, transfer, intermediary_out, destination (defaults to intermediary_in for provider evidence).A
FlowLeg status, e.g. pending, confirmed, failed, reversed.{ "amount": string, "currency": string }.ISO 8601 timestamp of when the event occurred.
Additional
FlowLegReference key/value entries.The raw payload as received from the provider โ stored verbatim on the
RawRecord.POST /v1/evidence/onchain
Use this for an on-chain transfer observed by your own indexer or RPC node, for chains/providers not covered by a native on-chain integration.Currently only
evm is supported โ other values raise an error during normalization.The on-chain transaction hash. Lowercased during normalization.
EVM chain ID (e.g.
1 for Ethereum, 137 for Polygon).Sender address.
Recipient address.
ERC-20 token contract address, if applicable.
Your reference, used for matching against
PaymentIntent.externalReference.A
FlowLeg status.{ "amount": string, "currency": string }.Optional override for the dedup key; if omitted, derived from
txHash.The raw payload โ stored verbatim on the
RawRecord.tx_hash/external_reference references, chainFamily/networkId metadata).
Idempotency on evidence endpoints
Both endpoints requireIdempotency-Key. ReconLayer hashes the request body and stores it against the key:
- Same key + same body โ replays the original response with
Idempotency-Replayed: true. - Same key + different body โ
409 idempotency_key_conflict. - Same key while the original request is still processing โ
409 idempotency_request_in_progress.
201 for newly accepted evidence and 200 if ingestEvidence determined the record was a (organizationId, source, sourceRef) duplicate (duplicate: true in the response body) โ this is independent of, and in addition to, the Idempotency-Key mechanism.
Next steps
- Ingestion Flows โ see how webhook-delivered evidence flows into the matching engine.
- Bridge Integration โ full lifecycle for connecting, enabling, and polling Bridge.
- On-chain Integrations โ chain-indexer-based polling and push ingestion.
- Outbound Webhooks โ get notified by ReconLayer when expectations and cases change.
