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.| Circle event type | Payment status | Meaning |
|---|---|---|
payments.payment_completed | SETTLED | The fiat transfer completed. The beneficiary’s bank account has been credited. |
payments.payment_failed | FAILED | The transfer could not be completed. Check the dashboard for a failure reason. |
payments.compliance_hold | COMPLIANCE_HOLD | The payment has been placed on a compliance hold by Circle and requires manual review. |
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.Troubleshooting
| Symptom | Likely cause | Resolution |
|---|---|---|
Payment stuck in PENDING | Circle webhook not configured | Verify https://corridor.meterlane.app/webhooks/circle is registered in your Circle dashboard. |
Webhooks returning 401 | Mismatched webhook secret | Confirm the secret in Meterlane account settings matches the one Circle is signing with. |
payments.compliance_hold event received | Compliance review triggered | Do not resend the payout. Contact Meterlane support with the paymentId for guidance. |