Skip to main content
A payin turns a user’s fiat bank transfer into stablecoins. The user pays Zapyd’s collection account, and Zapyd delivers them on the network you choose. Base URL: https://sandbox.zapyd.com/pis/api/v1. Customer calls use /cms/api/v1 and limit calls use /ren/api/v1.

Before you start

  • The customer is VERIFIED. See Onboard customers.
  • Your webhook URL is registered.
  • Your organization has a delivery wallet for each asset and network you use. Zapyd sets this up during onboarding.

Flow

1. Read the configuration

GET /payin/configuration returns, for each fiat, the supported assets and networks, the crypto minimum and maximum per network and payment method, settlement times, and the risk parameters you must send. Cache it and refresh it daily. The fiats you see depend on the markets enabled for your organization. The example below shows INR.

2. Check the customer’s limit

GET /ren/api/v1/payin/limits/{customer_id} returns the customer’s daily limit, how much is left, and whether they need Enhanced Due Diligence.

3. Create a quotation

Optionally show a live rate first with GET /payin/fetch-rate. When the user confirms, create a quotation with POST /payin/quotation. It locks the rate until expiry_time. The request is the same in every market. fiat and payment_method pick the market and the rail, and deposit_instructions in the response follow that rail.
Request
Response (201)

4. Collect the fiat

Show the user deposit_instructions, the exact sending_amount and the time left before expiry_time.
Payins are rejected or refunded when the user pays from an account that isn’t in their own KYC name, pays a different amount, or splits the payment. Tell the user this before they pay.
After the transfer, the user’s bank gives them a reference. Send it as transaction_reference_id when you initiate:

5. Initiate the payin

Call POST /payin/initiate before the quotation expires.
transaction_reference_id can’t be reused across payins. It’s required for INR and optional for other fiats. The payin starts as PROCESSING.

6. Track the result

Zapyd matches the transfer, then delivers the crypto and sends a PAYIN webhook. To poll instead, call GET /payin/{payin_id} no more than once a minute. GET /payin/history lists orders with filters.

Where the crypto goes

Zapyd delivers the crypto to your organization’s delivery wallet for that asset and network, set up during onboarding. The address is wallet_address on the payin. If no wallet is set up for the pair, the quotation fails with Not configured for asset: X & network: Y. Credit the user from that wallet in your own ledger.

Test it in sandbox

  1. Create a quotation, then initiate it. For INR, use any 12-digit transaction_reference_id. For USD you can leave it out.
  2. Move the payin with Mock Payin Status: SUCCESS, ON_HOLD, REFUNDED or FAILED.
  3. Check that your webhook handler credits the user only on SUCCESS.