Skip to content

Independent CVU Payin Callback API ​

Overview ​

In Independent CVU mode, a merchant owns an exclusively bound receiving CVU. After an end user transfers funds directly to that CVU, Veloraya receives the inbound callback, automatically creates a payin order, completes settlement/accounting, and then pushes the inbound details (including payer CUIT, bank transaction ID, etc.) to the merchant via this callback. The merchant uses these details to credit the user.

Differences from the Order-mode payin callback:

ItemOrder-mode Payin CallbackIndependent CVU Payin Callback
Order required firstYes, merchant calls Create Payin OrderNo, platform auto-creates the order
Callback URLMerchant configures payin callback URL in merchant adminMerchant configures VA inbound callback URL in merchant admin
Order ID sourceMerchant-provided merchantOrderIdPlatform-generated; merchantOrderId = platform order ID
Core matching keyID number + amount + expiryOperated by the merchant
Payer IDDNI (prefix/suffix stripped)Full CUIT (11 digits)

The two modes are mutually exclusive and cannot coexist in production environment: each merchant can use only one payin mode, which the merchant must confirm before onboarding. If you need both modes, please contact your account manager to open two merchants.

Callback URL Configuration ​

The Independent CVU callback uses a separate URL vaNotifyUrl, independent from the payin callback URL payinNotifyUrl:

  • Configured by operations staff in the merchant-admin Access Configuration page (same page and save flow as the payin callback URL);
  • If vaNotifyUrl is not configured, the platform only logs and does not push or alert. Ensure it is configured before go-live.

Callback Mechanism ​

Trigger conditions ​

  • The platform receives a CVU inbound callback that hits a merchant's exclusively bound CVU;
  • Triggered after auto order creation and settlement/accounting complete.

Retry mechanism ​

ItemDescription
Max retries11 times (including the first push)
Interval30 seconds (first 6 retries)
Interval3 minutes (last 5 retries)
Timeout30 seconds
Retry conditionHTTP status != 200, business code != 10000, or network error
Success criteriaHTTP 200 with business response {"code": 10000, "message": "Success"}

Callback Request ​

Method ​

  • Method: POST
  • Content-Type: application/json
  • Encoding: UTF-8

Headers ​

HeaderTypeRequiredDescription
Content-TypestringYapplication/json
TimestampstringYTimestamp (milliseconds)
NoncestringYRandom string (UUID without dashes)
SignaturestringYSignature generated with Veloraya private key, used to verify callback authenticity

Callback Parameters (body) ​

ParameterTypeRequiredDescription
merchantIdstringYMerchant ID
orderIdstringYPlatform order ID (auto-generated)
merchantOrderIdstringYMerchant order ID; in Independent CVU mode this equals the platform order ID
orderStatusstringYOrder status, see order status enum
amountBigDecimalYOrder amount
payAmountBigDecimalYActual paid amount
currencystringYCurrency code, fixed ARS
feeBigDecimalYFee (calculated by VA_DIRECT product rate)
createDatetimestringYOrder create time (Argentina timezone UTC-3), format: yyyy-MM-dd HH:mm:ss
completionDatetimestringNOrder completion time (Argentina timezone UTC-3), format: yyyy-MM-dd HH:mm:ss
notifyTypestringYNotification type, fixed VA_DIRECT, distinguishes from order-mode callback
payerCuitstringYPayer's full CUIT (11 digits), core basis for merchant to credit user
payerAccountstringNPayer's transfer-out account (fromCBU); may be null in manual backfill scenarios
receiveAccountstringNReceiving account (toCBU, i.e. the bound CVU); may be null in manual backfill scenarios
bankTxnIdstringYCoelsa bank transaction ID, for bank-side transaction traceability
errorCodestringNError code (on failure)
errorMsgstringNError message (on failure)

Order status enum ​

ValueDescription
SUCCESSSuccess
FAILEDFailed

Callback Example ​

Inbound success callback (auto order creation) ​

json
{
  "merchantId": "206092",
  "orderId": "AU2102293964635131904",
  "merchantOrderId": "AU2102293964635131904",
  "orderStatus": "SUCCESS",
  "amount": 100.00,
  "payAmount": 100.00,
  "currency": "ARS",
  "fee": 2.00,
  "createDatetime": "2026-09-22 04:08:34",
  "completionDatetime": "2026-09-22 04:08:36",
  "notifyType": "VA_DIRECT",
  "payerCuit": "20234567890",
  "payerAccount": "0000003100000000000001",
  "receiveAccount": "0000003100000000000099",
  "bankTxnId": "COELSA1234567890",
  "errorCode": null,
  "errorMsg": null
}

Manual补单 callback (payerAccount/receiveAccount null) ​

json
{
  "merchantId": "206092",
  "orderId": "AU2102293964635131904",
  "merchantOrderId": "AU2102293964635131904",
  "orderStatus": "SUCCESS",
  "amount": 100.00,
  "payAmount": 100.00,
  "currency": "ARS",
  "fee": 2.00,
  "createDatetime": "2026-09-22 04:08:34",
  "completionDatetime": "2026-09-22 04:08:36",
  "notifyType": "VA_DIRECT",
  "payerCuit": "20234567890",
  "payerAccount": null,
  "receiveAccount": null,
  "bankTxnId": "COELSA1234567890",
  "errorCode": null,
  "errorMsg": null
}

Callback Response ​

Success response ​

The merchant must return HTTP 200 with business code 10000 to acknowledge:

json
{
  "code": 10000,
  "message": "Success"
}

Failure response ​

If processing fails, return an error message (the system will keep retrying):

json
{
  "code": 40001,
  "message": "Processing failed"
}

Note

Only returning {"code": 10000, "message": "Success"} stops the retry. Any other response (including non-200 HTTP status) triggers the retry mechanism.

Signature Verification ​

Verification steps ​

  1. Extract signature: get the Signature header
  2. Build verification content: timestamp={timestamp},nonce={nonce},body={bodyJson}
    • Note: the verification content does NOT include merchantId, only timestamp, nonce and body
  3. Verify with Veloraya public key: verify the signature with the public key provided by Veloraya
  4. Use the unified guide: reuse the "Callback Verification Guide" and Appendix B sample code in API Signature

Key notes ​

  • Veloraya public key: provided by Veloraya, used to verify callback signatures
  • Algorithm: SHA256withRSA
  • Encoding: UTF-8 + Base64

Business Rules ​

  1. No order needed: the merchant does not need to call Create Payin Order; users transfer directly to the exclusive CVU to trigger the inbound callback
  2. Exclusive CVU binding: 1 CVU is exclusively bound to 1 merchant; 1 merchant can bind multiple CVUs; once bound it is permanent and cannot be reassigned or deactivated
  3. Fee: calculated by the merchant's VA_DIRECT payin product rate formula (fixedFee + amount × rateFee/100, subject to minFee)
  4. Timezone: createDatetime and completionDatetime are in Argentina local time (UTC-3, no daylight saving)
  5. User crediting basis: the merchant credits its own user based on payerCuit (payer CUIT) + bankTxnId (bank transaction ID) from the callback
  6. Mutually exclusive modes: Independent CVU mode and Order Mode are mutually exclusive and cannot coexist; the merchant must confirm which mode to use before onboarding. If both modes are needed, contact your account manager to open two merchants

Notes ​

  • Callback URL configuration: the Independent CVU callback URL vaNotifyUrl must be filled in by operations in the merchant-admin Access Configuration page before go-live; it is independent from the payin callback URL payinNotifyUrl
  • Signature verification: always verify callback signature legitimacy; use the unified callback verification logic per API Signature
  • Idempotency: implement idempotency to avoid duplicate processing; dedupe by orderId; the same inbound may produce multiple callbacks due to re-push or retry
  • Field compatibility: notifyType = VA_DIRECT identifies this as an Independent CVU callback; order-mode payin callbacks do not include notifyType, so you can distinguish the two callback types by this field
  • Null field handling: in manual backfill scenarios payerAccount and receiveAccount may be null; the merchant should handle nulls gracefully and reconcile via payerCuit + bankTxnId
  • Response format: must return {"code": 10000, "message": "Success"} to stop retries
  • Logging: log all callback requests, responses and processing time

Released under the MIT License.