PixIn Webhook (Deposits)
Receive automatic notifications whenever an incoming transaction (PIX) changes status.
Endpoint and Authentication
Example: https://mysite.com/api/webhook/respawn
The URL must use HTTPS, port 443 and a public domain. Private network or local IP addresses are rejected.
Headers Sent
Content-Type: application/jsonX-Idempotency-Key: <uuid>X-Webhook-Event-Id: <uuid> (same value)X-Webhook-Correlation-Id: <id>X-Webhook-Sent-At: 2025-11-27T11:07:15ZX-Webhook-Secret: <secret> (only if you registered a secret on the webhook)Use X-Idempotency-Key (same value as X-Webhook-Event-Id) to detect repeated deliveries of the same event. X-Webhook-Secret is the secret you registered on the webhook, sent as is so you can check it.
How to Configure
In the dashboard: open the Webhooks menu, create a webhook and enter the URL, the scope (cash-in, cash-out or both) and the statuses you want to receive (awaiting, pending, success, failure and refund).
Through the API: use POST /api/SendWebhook with your X-Client-Id and X-API-Key. To change it, use PUT /api/SendWebhook/{id}.
{ "companyId": "2f3c1c0e-6a52-4a0f-9d34-6a7b3f6f2b10", "sendLink": "https://mysite.com/api/webhook/respawn", "webhookSecret": "your-own-secret-up-to-500-characters", "onlyTransaction": false, "onlyWithdraw": false, "awaiting": true, "pending": true, "successful": true, "failure": true, "refunded": true}You only receive the statuses you selected. The postbackUrl field on transaction creation does not replace this configuration.
How to Verify the Origin
The webhook body carries no HMAC signature. To be sure the notice came from Respawn Pay, combine:
1. Confirm the event through the API: look up the transaction or withdrawal with your credentials and trust only that response.
2. Register a webhookSecret (optional field of the configuration). It arrives in every notice in the X-Webhook-Secret header; compare it with yours and reject if it differs.
3. Allow the source IPs 144.126.159.43 (IPv4) and 2605:a140:2365:9572::1 (IPv6).
QR Code Creation / Awaiting payment
{ "object": "transaction", "type": "cashin", "status": "awaiting", "companyId": "2f3c1c0e-6a52-4a0f-9d34-6a7b3f6f2b10", "transactionId": "6dcf2aee0d6148e1a12b78db78", "subTransactionId": 234, "externalRef": "LEAD-1762647077342_322066", "method": "pix", "value": 500, "amount": 5, "currency": "BRL", "providerTxId": "6dcf2aee0d6148e1a12b78db78", "endToEndId": null, "providerEndToEndId": null, "pixKey": null, "providerAmount": 5, "providerCreditedAt": null, "providerPayload": null, "payer": { "name": "Joao Silva", "document": "12345678900", "documentId": "12345678900" }, "receiver": { "name": null, "document": null, "documentId": null }, "createdAt": "2025-11-09T00:10:00.000000", "updatedAt": "2025-11-09T00:10:00.000000", "processedAt": "2025-11-09T00:10:00Z"}Payment Confirmed
{ "object": "transaction", "type": "cashin", "status": "successful", "companyId": "2f3c1c0e-6a52-4a0f-9d34-6a7b3f6f2b10", "transactionId": "6dcf2aee0d6148e1a12b78db78", "subTransactionId": 41394, "externalRef": "LEAD-1764252408748_52740", "method": "pix", "value": 500, "amount": 5, "currency": "BRL", "endToEndId": "E22896431202511271407sjUGQflhcVE", "providerEndToEndId": "E22896431202511271407sjUGQflhcVE", "providerTxId": "6dcf2aee0d6148e1a12b78db78", "pixKey": "c32361fa-44de-4be7-815f-0e782a10860c", "providerAmount": 5, "providerCreditedAt": "2025-11-27T11:07:14.997603", "providerPayload": "{... JSON text from the provider ...}", "localInstrument": null, "transactionType": null, "creditDebitType": null, "remittanceInformation": null, "payer": { "name": "MARIA SILVA SANTOS", "documentId": "50651470862", "document": "50651470862", "bankName": null, "ispb": null, "issuer": null, "number": null, "accountType": null }, "receiver": { "name": null, "documentId": "48969523000177", "document": "48969523000177", "ispb": null, "issuer": null, "number": null, "accountType": null }, "createdAt": "2025-11-27T11:06:58.120000", "updatedAt": "2025-11-27T11:07:15.010000", "processedAt": "2025-11-27T11:07:14.997603Z"}Field Descriptions
companyIdstringYour company ID (UUID)transactionIdstringTransaction ID, the same id returned on creationsubTransactionIdnumberInternal transaction IDexternalRefstringYour reference, sent in customer.externalRef on creationmethodstringPayment method (pix)valuenumberAmount in cents (500 = R$ 5.00)amountnumberAmount in reais (5 = R$ 5.00)endToEndIdstringUnique Pix transaction identifier (E2E)providerEndToEndIdstringE2E returned by the providerproviderTxIdstringTransaction ID at the providerpixKeystringPIX key that received the paymentproviderAmountnumberAmount in reais returned by the providerproviderCreditedAtstringCredit date/time at the providerproviderPayloadstringPayload returned by the provider, as JSON text (parse it if you need inner fields). Null until the provider confirms the paymentpayerobjectPayer data. Before payment it holds the customer name and document you sent (or the placeholders, see Create Transaction); after payment, the data reported by the bankreceiverobjectReceiver data (your company)localInstrumentstringPayment instrument reported by the provider (when available)transactionTypestringTransaction type reported by the provider (when available)creditDebitTypestringCredit or debit, reported by the provider (when available)remittanceInformationstringMessage sent by the payer (when available)createdAtstringTransaction creation date/timeupdatedAtstringLast update date/timeprocessedAtstringProcessing date/timePossible Statuses
You only receive the webhook for the statuses enabled in your webhook configuration. There is no expired transaction status: expired, canceled and chargeback arrive as failure.
Automatic Retry
Response Example
{ "received": true, "idempotent": false }Handler Example
app.post('/webhook/respawn', async (req, res) => { const { type, status, transactionId, value, amount, endToEndId, payer, providerCreditedAt } = req.body; const idempotencyKey = req.headers['x-idempotency-key']; // Check whether this event was already processed const processed = await checkIdempotency(idempotencyKey); if (processed) { return res.status(200).json({ received: true, idempotent: true }); } if (type === 'cashin' && status === 'successful') { console.log(`Payment received: R$ ${amount}`); console.log(`Amount in cents: ${value}`); console.log(`Payer: ${payer.name}`); console.log(`E2E ID: ${endToEndId}`); console.log(`Credited at: ${providerCreditedAt}`); // Process the payment... await processPayment(transactionId, value); } // Mark as processed await markAsProcessed(idempotencyKey); res.status(200).json({ received: true, idempotent: false });});