curl --request POST \
--url https://api-dev.rain.xyz/v1/simulate/transactions/authorize \
--header 'Api-Key: <api-key>' \
--header 'Content-Type: application/json' \
--data '
{
"cardId": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"amount": 2,
"currency": "<string>",
"merchantName": "<string>",
"merchantCategoryCode": "<string>"
}
'import requests
url = "https://api-dev.rain.xyz/v1/simulate/transactions/authorize"
payload = {
"cardId": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"amount": 2,
"currency": "<string>",
"merchantName": "<string>",
"merchantCategoryCode": "<string>"
}
headers = {
"Api-Key": "<api-key>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {'Api-Key': '<api-key>', 'Content-Type': 'application/json'},
body: JSON.stringify({
cardId: '3c90c3cc-0d44-4b50-8888-8dd25736052a',
amount: 2,
currency: '<string>',
merchantName: '<string>',
merchantCategoryCode: '<string>'
})
};
fetch('https://api-dev.rain.xyz/v1/simulate/transactions/authorize', 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-dev.rain.xyz/v1/simulate/transactions/authorize",
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([
'cardId' => '3c90c3cc-0d44-4b50-8888-8dd25736052a',
'amount' => 2,
'currency' => '<string>',
'merchantName' => '<string>',
'merchantCategoryCode' => '<string>'
]),
CURLOPT_HTTPHEADER => [
"Api-Key: <api-key>",
"Content-Type: application/json"
],
]);
$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-dev.rain.xyz/v1/simulate/transactions/authorize"
payload := strings.NewReader("{\n \"cardId\": \"3c90c3cc-0d44-4b50-8888-8dd25736052a\",\n \"amount\": 2,\n \"currency\": \"<string>\",\n \"merchantName\": \"<string>\",\n \"merchantCategoryCode\": \"<string>\"\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("Api-Key", "<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-dev.rain.xyz/v1/simulate/transactions/authorize")
.header("Api-Key", "<api-key>")
.header("Content-Type", "application/json")
.body("{\n \"cardId\": \"3c90c3cc-0d44-4b50-8888-8dd25736052a\",\n \"amount\": 2,\n \"currency\": \"<string>\",\n \"merchantName\": \"<string>\",\n \"merchantCategoryCode\": \"<string>\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api-dev.rain.xyz/v1/simulate/transactions/authorize")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Api-Key"] = '<api-key>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"cardId\": \"3c90c3cc-0d44-4b50-8888-8dd25736052a\",\n \"amount\": 2,\n \"currency\": \"<string>\",\n \"merchantName\": \"<string>\",\n \"merchantCategoryCode\": \"<string>\"\n}"
response = http.request(request)
puts response.read_body{
"transactionId": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"status": "authorized",
"declinedReason": "<string>",
"completionReason": "SETTLEMENT"
}Simulate a card authorization
Triggers a card authorization against a real card, exactly as if a merchant had initiated it. Use this to test authorization flows, webhook handling, and decline scenarios end-to-end.
Sandbox only. This endpoint returns 404 Not Found in production environments.
curl --request POST \
--url https://api-dev.rain.xyz/v1/simulate/transactions/authorize \
--header 'Api-Key: <api-key>' \
--header 'Content-Type: application/json' \
--data '
{
"cardId": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"amount": 2,
"currency": "<string>",
"merchantName": "<string>",
"merchantCategoryCode": "<string>"
}
'import requests
url = "https://api-dev.rain.xyz/v1/simulate/transactions/authorize"
payload = {
"cardId": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"amount": 2,
"currency": "<string>",
"merchantName": "<string>",
"merchantCategoryCode": "<string>"
}
headers = {
"Api-Key": "<api-key>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {'Api-Key': '<api-key>', 'Content-Type': 'application/json'},
body: JSON.stringify({
cardId: '3c90c3cc-0d44-4b50-8888-8dd25736052a',
amount: 2,
currency: '<string>',
merchantName: '<string>',
merchantCategoryCode: '<string>'
})
};
fetch('https://api-dev.rain.xyz/v1/simulate/transactions/authorize', 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-dev.rain.xyz/v1/simulate/transactions/authorize",
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([
'cardId' => '3c90c3cc-0d44-4b50-8888-8dd25736052a',
'amount' => 2,
'currency' => '<string>',
'merchantName' => '<string>',
'merchantCategoryCode' => '<string>'
]),
CURLOPT_HTTPHEADER => [
"Api-Key: <api-key>",
"Content-Type: application/json"
],
]);
$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-dev.rain.xyz/v1/simulate/transactions/authorize"
payload := strings.NewReader("{\n \"cardId\": \"3c90c3cc-0d44-4b50-8888-8dd25736052a\",\n \"amount\": 2,\n \"currency\": \"<string>\",\n \"merchantName\": \"<string>\",\n \"merchantCategoryCode\": \"<string>\"\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("Api-Key", "<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-dev.rain.xyz/v1/simulate/transactions/authorize")
.header("Api-Key", "<api-key>")
.header("Content-Type", "application/json")
.body("{\n \"cardId\": \"3c90c3cc-0d44-4b50-8888-8dd25736052a\",\n \"amount\": 2,\n \"currency\": \"<string>\",\n \"merchantName\": \"<string>\",\n \"merchantCategoryCode\": \"<string>\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api-dev.rain.xyz/v1/simulate/transactions/authorize")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Api-Key"] = '<api-key>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"cardId\": \"3c90c3cc-0d44-4b50-8888-8dd25736052a\",\n \"amount\": 2,\n \"currency\": \"<string>\",\n \"merchantName\": \"<string>\",\n \"merchantCategoryCode\": \"<string>\"\n}"
response = http.request(request)
puts response.read_body{
"transactionId": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"status": "authorized",
"declinedReason": "<string>",
"completionReason": "SETTLEMENT"
}Authorizations
Body
Card authorization simulation request
The Rain card ID to authorize against. Must belong to the calling tenant.
The transaction amount in cents (merchant currency). Must be a positive integer.
x >= 1The merchant currency code (for example, USD, EUR, GBP).
The merchant name.
The merchant category code (MCC). For example, 5814 for fast food restaurants.
Simulate a declined authorization.
account_credit_limit_exceeded, card_locked, card_canceled, card_not_activated, blocked_mcc, blocked_merchant, balance_inquiry_not_permitted, expiry_mismatch, cvv_mismatch, invalid_pin, restricted_country Response
Successful operation
The transaction ID.
The transaction status.
authorized, declined, settled Present when status is declined. The reason for the decline.
Present when status is settled. Either SETTLEMENT or REFUND.
SETTLEMENT, REFUND