PENDING status while Circle processes the fiat leg. Your application cannot poll the /pay response for a final result—Circle posts the outcome asynchronously as a webhook event. Meterlane exposes a webhook receiver that Circle calls directly; when a matching event arrives, Meterlane updates the payment status in your account and you can react to it from your own systems.
Webhook endpoint
Register the following URL as your webhook destination inside the Circle developer dashboard under Notifications → Webhooks.Signature verification
Every request Circle sends to the webhook endpoint includes aCircle-Signature header. Meterlane verifies this signature using HMAC SHA-256 computed over the raw request body and your configured webhook secret. Requests that arrive without a valid signature are rejected with a 401 response and never processed.
Meterlane performs the signature check on your behalf. You do not write verification code—just make sure the webhook secret configured in your Meterlane account settings matches the one in your Circle dashboard.
Payment status events
Circle emits three event types that affect corridor payment status. Meterlane maps each event to a final payment status.Example webhook payload
When Circle fires apayments.payment_completed event, the payload looks like this:
data.id field contains the Circle CPN payment ID. Meterlane matches this value against the cpnPaymentId returned in the original /pay response and updates the corresponding payment record.
Confirming payout settlement
Because final status arrives via webhook, build your integration around event-driven status updates rather than polling. Here is the recommended pattern:- Call
POST /corridors/:id/payand store the returnedpaymentIdandcpnPaymentIdin your database. - When Meterlane receives the Circle webhook, it updates the payment record to
SETTLED,FAILED, orCOMPLIANCE_HOLD. - Reflect the updated status in your application by checking the payment status via your dashboard or by building a thin status-check endpoint that queries your stored
paymentId.
Meterlane acknowledges every webhook from Circle with a
{ "received": true } response immediately after processing, regardless of whether a matching payment record was found. This prevents Circle from retrying deliverable events unnecessarily.