curl --request POST \
--url https://api-sandbox.zapyd.com/pis/api/v1/payin/quotation \
--header 'Content-Type: application/json' \
--header 'X-API-KEY: <api-key>' \
--header 'X-SIGNATURE: <api-key>' \
--header 'X-TIMESTAMP: <api-key>' \
--data '
{
"asset": "usdt",
"fiat": "inr",
"sending_amount": "51",
"customer_id": "def8b740-99f9-4cba-bc9e-99de57e927b4",
"payment_method": "IMPS",
"risk_parameters": {
"ip_address": "127.0.0.1",
"device_id": "<string>",
"suspicious_activity_report": false,
"law_enforcement_agency_report": false
},
"network": "tron",
"bank_id": "4e6f1b20-a73c-11ec-b909-0242ac120002"
}
'import requests
url = "https://api-sandbox.zapyd.com/pis/api/v1/payin/quotation"
payload = {
"asset": "usdt",
"fiat": "inr",
"sending_amount": "51",
"customer_id": "def8b740-99f9-4cba-bc9e-99de57e927b4",
"payment_method": "IMPS",
"risk_parameters": {
"ip_address": "127.0.0.1",
"device_id": "<string>",
"suspicious_activity_report": False,
"law_enforcement_agency_report": False
},
"network": "tron",
"bank_id": "4e6f1b20-a73c-11ec-b909-0242ac120002"
}
headers = {
"X-API-KEY": "<api-key>",
"X-TIMESTAMP": "<api-key>",
"X-SIGNATURE": "<api-key>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {
'X-API-KEY': '<api-key>',
'X-TIMESTAMP': '<api-key>',
'X-SIGNATURE': '<api-key>',
'Content-Type': 'application/json'
},
body: JSON.stringify({
asset: 'usdt',
fiat: 'inr',
sending_amount: '51',
customer_id: 'def8b740-99f9-4cba-bc9e-99de57e927b4',
payment_method: 'IMPS',
risk_parameters: {
ip_address: '127.0.0.1',
device_id: '<string>',
suspicious_activity_report: false,
law_enforcement_agency_report: false
},
network: 'tron',
bank_id: '4e6f1b20-a73c-11ec-b909-0242ac120002'
})
};
fetch('https://api-sandbox.zapyd.com/pis/api/v1/payin/quotation', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://api-sandbox.zapyd.com/pis/api/v1/payin/quotation",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => json_encode([
'asset' => 'usdt',
'fiat' => 'inr',
'sending_amount' => '51',
'customer_id' => 'def8b740-99f9-4cba-bc9e-99de57e927b4',
'payment_method' => 'IMPS',
'risk_parameters' => [
'ip_address' => '127.0.0.1',
'device_id' => '<string>',
'suspicious_activity_report' => false,
'law_enforcement_agency_report' => false
],
'network' => 'tron',
'bank_id' => '4e6f1b20-a73c-11ec-b909-0242ac120002'
]),
CURLOPT_HTTPHEADER => [
"Content-Type: application/json",
"X-API-KEY: <api-key>",
"X-SIGNATURE: <api-key>",
"X-TIMESTAMP: <api-key>"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://api-sandbox.zapyd.com/pis/api/v1/payin/quotation"
payload := strings.NewReader("{\n \"asset\": \"usdt\",\n \"fiat\": \"inr\",\n \"sending_amount\": \"51\",\n \"customer_id\": \"def8b740-99f9-4cba-bc9e-99de57e927b4\",\n \"payment_method\": \"IMPS\",\n \"risk_parameters\": {\n \"ip_address\": \"127.0.0.1\",\n \"device_id\": \"<string>\",\n \"suspicious_activity_report\": false,\n \"law_enforcement_agency_report\": false\n },\n \"network\": \"tron\",\n \"bank_id\": \"4e6f1b20-a73c-11ec-b909-0242ac120002\"\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("X-API-KEY", "<api-key>")
req.Header.Add("X-TIMESTAMP", "<api-key>")
req.Header.Add("X-SIGNATURE", "<api-key>")
req.Header.Add("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.post("https://api-sandbox.zapyd.com/pis/api/v1/payin/quotation")
.header("X-API-KEY", "<api-key>")
.header("X-TIMESTAMP", "<api-key>")
.header("X-SIGNATURE", "<api-key>")
.header("Content-Type", "application/json")
.body("{\n \"asset\": \"usdt\",\n \"fiat\": \"inr\",\n \"sending_amount\": \"51\",\n \"customer_id\": \"def8b740-99f9-4cba-bc9e-99de57e927b4\",\n \"payment_method\": \"IMPS\",\n \"risk_parameters\": {\n \"ip_address\": \"127.0.0.1\",\n \"device_id\": \"<string>\",\n \"suspicious_activity_report\": false,\n \"law_enforcement_agency_report\": false\n },\n \"network\": \"tron\",\n \"bank_id\": \"4e6f1b20-a73c-11ec-b909-0242ac120002\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api-sandbox.zapyd.com/pis/api/v1/payin/quotation")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["X-API-KEY"] = '<api-key>'
request["X-TIMESTAMP"] = '<api-key>'
request["X-SIGNATURE"] = '<api-key>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"asset\": \"usdt\",\n \"fiat\": \"inr\",\n \"sending_amount\": \"51\",\n \"customer_id\": \"def8b740-99f9-4cba-bc9e-99de57e927b4\",\n \"payment_method\": \"IMPS\",\n \"risk_parameters\": {\n \"ip_address\": \"127.0.0.1\",\n \"device_id\": \"<string>\",\n \"suspicious_activity_report\": false,\n \"law_enforcement_agency_report\": false\n },\n \"network\": \"tron\",\n \"bank_id\": \"4e6f1b20-a73c-11ec-b909-0242ac120002\"\n}"
response = http.request(request)
puts response.read_bodyCreate Quotation
Creates a payin quotation that fixes the exchange rate. The quotation ID is valid for a fixed period.
curl --request POST \
--url https://api-sandbox.zapyd.com/pis/api/v1/payin/quotation \
--header 'Content-Type: application/json' \
--header 'X-API-KEY: <api-key>' \
--header 'X-SIGNATURE: <api-key>' \
--header 'X-TIMESTAMP: <api-key>' \
--data '
{
"asset": "usdt",
"fiat": "inr",
"sending_amount": "51",
"customer_id": "def8b740-99f9-4cba-bc9e-99de57e927b4",
"payment_method": "IMPS",
"risk_parameters": {
"ip_address": "127.0.0.1",
"device_id": "<string>",
"suspicious_activity_report": false,
"law_enforcement_agency_report": false
},
"network": "tron",
"bank_id": "4e6f1b20-a73c-11ec-b909-0242ac120002"
}
'import requests
url = "https://api-sandbox.zapyd.com/pis/api/v1/payin/quotation"
payload = {
"asset": "usdt",
"fiat": "inr",
"sending_amount": "51",
"customer_id": "def8b740-99f9-4cba-bc9e-99de57e927b4",
"payment_method": "IMPS",
"risk_parameters": {
"ip_address": "127.0.0.1",
"device_id": "<string>",
"suspicious_activity_report": False,
"law_enforcement_agency_report": False
},
"network": "tron",
"bank_id": "4e6f1b20-a73c-11ec-b909-0242ac120002"
}
headers = {
"X-API-KEY": "<api-key>",
"X-TIMESTAMP": "<api-key>",
"X-SIGNATURE": "<api-key>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {
'X-API-KEY': '<api-key>',
'X-TIMESTAMP': '<api-key>',
'X-SIGNATURE': '<api-key>',
'Content-Type': 'application/json'
},
body: JSON.stringify({
asset: 'usdt',
fiat: 'inr',
sending_amount: '51',
customer_id: 'def8b740-99f9-4cba-bc9e-99de57e927b4',
payment_method: 'IMPS',
risk_parameters: {
ip_address: '127.0.0.1',
device_id: '<string>',
suspicious_activity_report: false,
law_enforcement_agency_report: false
},
network: 'tron',
bank_id: '4e6f1b20-a73c-11ec-b909-0242ac120002'
})
};
fetch('https://api-sandbox.zapyd.com/pis/api/v1/payin/quotation', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://api-sandbox.zapyd.com/pis/api/v1/payin/quotation",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => json_encode([
'asset' => 'usdt',
'fiat' => 'inr',
'sending_amount' => '51',
'customer_id' => 'def8b740-99f9-4cba-bc9e-99de57e927b4',
'payment_method' => 'IMPS',
'risk_parameters' => [
'ip_address' => '127.0.0.1',
'device_id' => '<string>',
'suspicious_activity_report' => false,
'law_enforcement_agency_report' => false
],
'network' => 'tron',
'bank_id' => '4e6f1b20-a73c-11ec-b909-0242ac120002'
]),
CURLOPT_HTTPHEADER => [
"Content-Type: application/json",
"X-API-KEY: <api-key>",
"X-SIGNATURE: <api-key>",
"X-TIMESTAMP: <api-key>"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://api-sandbox.zapyd.com/pis/api/v1/payin/quotation"
payload := strings.NewReader("{\n \"asset\": \"usdt\",\n \"fiat\": \"inr\",\n \"sending_amount\": \"51\",\n \"customer_id\": \"def8b740-99f9-4cba-bc9e-99de57e927b4\",\n \"payment_method\": \"IMPS\",\n \"risk_parameters\": {\n \"ip_address\": \"127.0.0.1\",\n \"device_id\": \"<string>\",\n \"suspicious_activity_report\": false,\n \"law_enforcement_agency_report\": false\n },\n \"network\": \"tron\",\n \"bank_id\": \"4e6f1b20-a73c-11ec-b909-0242ac120002\"\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("X-API-KEY", "<api-key>")
req.Header.Add("X-TIMESTAMP", "<api-key>")
req.Header.Add("X-SIGNATURE", "<api-key>")
req.Header.Add("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.post("https://api-sandbox.zapyd.com/pis/api/v1/payin/quotation")
.header("X-API-KEY", "<api-key>")
.header("X-TIMESTAMP", "<api-key>")
.header("X-SIGNATURE", "<api-key>")
.header("Content-Type", "application/json")
.body("{\n \"asset\": \"usdt\",\n \"fiat\": \"inr\",\n \"sending_amount\": \"51\",\n \"customer_id\": \"def8b740-99f9-4cba-bc9e-99de57e927b4\",\n \"payment_method\": \"IMPS\",\n \"risk_parameters\": {\n \"ip_address\": \"127.0.0.1\",\n \"device_id\": \"<string>\",\n \"suspicious_activity_report\": false,\n \"law_enforcement_agency_report\": false\n },\n \"network\": \"tron\",\n \"bank_id\": \"4e6f1b20-a73c-11ec-b909-0242ac120002\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api-sandbox.zapyd.com/pis/api/v1/payin/quotation")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["X-API-KEY"] = '<api-key>'
request["X-TIMESTAMP"] = '<api-key>'
request["X-SIGNATURE"] = '<api-key>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"asset\": \"usdt\",\n \"fiat\": \"inr\",\n \"sending_amount\": \"51\",\n \"customer_id\": \"def8b740-99f9-4cba-bc9e-99de57e927b4\",\n \"payment_method\": \"IMPS\",\n \"risk_parameters\": {\n \"ip_address\": \"127.0.0.1\",\n \"device_id\": \"<string>\",\n \"suspicious_activity_report\": false,\n \"law_enforcement_agency_report\": false\n },\n \"network\": \"tron\",\n \"bank_id\": \"4e6f1b20-a73c-11ec-b909-0242ac120002\"\n}"
response = http.request(request)
puts response.read_bodyCreate Quotation
VERIFIED. Check their limit with Payin Limits before quoting.Payment methods by currency
fiat and payment_method pick the market and the rail. deposit_instructions in the response follow the rail.
fiat | payment_method | bank_id | How the user pays |
|---|---|---|---|
INR | IMPS | Optional | Bank transfer to the account in deposit_instructions |
UPI | Optional | Any UPI app: open deposit_instructions.deep_link, or ios_checkout_link on iOS. See UPI QR codes | |
USD | ACH_PULL | Required | Nothing to do: Zapyd debits the account linked with Generate Bank Link |
WIRE | Optional | Wire to the account and routing number in deposit_instructions | |
RTP | Optional | Instant transfer to the account and routing number in deposit_instructions |
bank_id is a VERIFIED account from Fetch Bank Accounts.
After quoting
- Show the user
deposit_instructions, the exactsending_amountand the time left beforeexpiry_time. - The user pays from an account in their own KYC name, the exact amount, in one transfer. Otherwise the payin is refunded.
- Call Create Payin before
expiry_time.
Error Codes and Messages
| API Status Code | Response | Reason |
|---|---|---|
| 400 | Customer is unverified | Customer is added but KYC is unverified |
| 400 | Customer is unverified | Customer does not belong to the organization |
| 400 | Bank account is unverified | Bank account is not added |
| 400 | Bank account is unverified | Bank account is added but still processing |
| 400 | Bank account is unverified | The account holder’s name doesn’t match the KYC name |
| 400 | Bank account is unverified | Bank account is linked to another customer |
| 400 | Onramp is disabled | The customer’s KYC doesn’t allow payins in their market. In India, payins need an Aadhaar-verified customer |
| 400 | Entered amount is less than minimum transaction amount | sending_amount is below the minimum for the payment method |
| 400 | Entered amount exceeds maximum transaction amount | sending_amount is above the maximum for the payment method |
| 400 | AML SCREENING FAILED | Customer appears in sanction lists and the Politically Exposed Persons (PEP) database and/or has material adverse media |
| 400 | EDD required | Suspicious activity or Red Flag Indicator is triggered |
| 400 | EDD required | Transaction milestone since last EDD is reached |
| 400 | EDD required | Annual EDD is due or overdue |
| 400 | Daily onramp limit exhausted | Daily onramp limit exhausted |
| 500 | Internal Server Error | Internal Server Error |
| 503 | Service unavailable | Unexpected Error Occurred |
Authorizations
API Key for authentication
Current timestamp in seconds since epoch
HMAC SHA256 signature of the request encoded in Base64
Body
The cryptocurrency asset code
"usdt"
The fiat currency code
"inr"
The amount to be sent
"51"
Customer's unique identifier
"def8b740-99f9-4cba-bc9e-99de57e927b4"
Payment method valid for the fiat: INR imps or upi; USD ach_pull, wire or rtp. Limits must be configured for it.
"IMPS"
Required. Send every key listed in required_risk_parameters for the fiat in Fetch Configuration. Send {} if that list is empty.
Hide child attributes
Hide child attributes
End user's IP address (IPv4 or IPv6).
"127.0.0.1"
End user's device identifier.
true if you have filed a suspicious activity report on this user.
false
true if a law enforcement agency has reported this user.
false
Blockchain network to deliver the crypto on, for example tron or polygon.
"tron"
Required when payment_method is ACH_PULL: the VERIFIED linked account from Fetch Bank Accounts, which Zapyd debits. Optional otherwise.
"4e6f1b20-a73c-11ec-b909-0242ac120002"
Response
Quotation created successfully
true
"Success"
Hide child attributes
Hide child attributes
"6a1c0e7e-2b53-4f7e-9d2f-6d6e2b1c9a10"
"84737c7d-7b62-4204-80d6-80f6ecb3ceb4"
"cab47575-bbcb-4294-81a3-30774104f3b6"
"USDT"
"INR"
Network
"tron"
"IMPS"
Fiat amount the customer pays
"10000.00"
"91.91"
Crypto amount delivered
"108.80"
Hide child attributes
Hide child attributes
450
5
450
18
81
0.9
81
81
889.17
88.92
Where the customer sends fiat. For INR: account_number, ifsc and account_name. For USD: account_number, routing_number, bank_name, bank_address, account_holder_name and narrative. ACH_PULL has none.
Hide child attributes
Hide child attributes
"1234567890"
"SBIN0000001"
"Sandbox Technologies Pvt Ltd"
"upi://pay?pa=testing-payin@ybl&am=1000"
"https://pay.google.com/upi/deeplink?pa=testing-payin@ybl&am=1000"
"2026-09-30T10:00:00Z"
"2026-09-30T10:10:00Z"