Create a quote
curl --request POST \
--url https://api.kemycard.com/v1/payouts/quotes \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"customer_code": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"beneficiary_code": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"amount_usd": 100
}
'import requests
url = "https://api.kemycard.com/v1/payouts/quotes"
payload = {
"customer_code": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"beneficiary_code": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"amount_usd": 100
}
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({
customer_code: '3c90c3cc-0d44-4b50-8888-8dd25736052a',
beneficiary_code: '3c90c3cc-0d44-4b50-8888-8dd25736052a',
amount_usd: 100
})
};
fetch('https://api.kemycard.com/v1/payouts/quotes', 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.kemycard.com/v1/payouts/quotes",
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([
'customer_code' => '3c90c3cc-0d44-4b50-8888-8dd25736052a',
'beneficiary_code' => '3c90c3cc-0d44-4b50-8888-8dd25736052a',
'amount_usd' => 100
]),
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>",
"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.kemycard.com/v1/payouts/quotes"
payload := strings.NewReader("{\n \"customer_code\": \"3c90c3cc-0d44-4b50-8888-8dd25736052a\",\n \"beneficiary_code\": \"3c90c3cc-0d44-4b50-8888-8dd25736052a\",\n \"amount_usd\": 100\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("Authorization", "Bearer <token>")
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.kemycard.com/v1/payouts/quotes")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"customer_code\": \"3c90c3cc-0d44-4b50-8888-8dd25736052a\",\n \"beneficiary_code\": \"3c90c3cc-0d44-4b50-8888-8dd25736052a\",\n \"amount_usd\": 100\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.kemycard.com/v1/payouts/quotes")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"customer_code\": \"3c90c3cc-0d44-4b50-8888-8dd25736052a\",\n \"beneficiary_code\": \"3c90c3cc-0d44-4b50-8888-8dd25736052a\",\n \"amount_usd\": 100\n}"
response = http.request(request)
puts response.read_body{
"success": true,
"data": {
"quote_code": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"rail": "sepa",
"status": "open",
"customer_code": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"beneficiary": {
"code": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"name": "JANE DOE",
"iban_masked": "DE89 **** 3000",
"account_number_masked": "**** 9012",
"routing_number": "021000021",
"bank_name": "Test Bank",
"country": "DE"
},
"amount_usd": 100,
"fee_usd": 7,
"total_debited_usd": 107,
"received_amount": 86,
"received_currency": "EUR",
"amount_eur": 86,
"exchange_rate": 0.86,
"balance_type": "payout_sepa",
"expires_at": "2023-11-07T05:31:56Z",
"created_at": "2023-11-07T05:31:56Z"
},
"meta": {
"request_id": "a4f8e2c1b3d97056",
"mode": "test",
"timestamp": "2023-11-07T05:31:56Z"
}
}Payouts
Create a Quote
Prices a payout: the amount the beneficiary will receive (received_amount in received_currency), the
KemyCard fee and the total that will be debited from your balance. Nothing is debited at this stage.
The rail follows the beneficiary:
| Beneficiary | rail | Received | Paid from (balance_type) | Amount per payout |
|---|---|---|---|---|
SEPA (rail sepa) | sepa | EUR (amount_eur, exchange_rate) | Payout SEPA (payout_sepa) | 25 to 2,499 USD |
United States (rail us) | ach | USD, no conversion (amount_eur and exchange_rate are null) | Ops Others (others) | 100 to 2,499 USD |
Confirm the quote with POST /payouts before expires_at. amount_usd has at most 2 decimals. The fee
depends on your plan, is the same for SEPA and ACH, and is charged on top of
the amount.
The checks of the payout are run here and again at confirmation: customer verified and active, Découverte
monthly limit (SEPA and ACH combined), and a balance that covers total_debited_usd.
POST
/
payouts
/
quotes
Create a quote
curl --request POST \
--url https://api.kemycard.com/v1/payouts/quotes \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"customer_code": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"beneficiary_code": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"amount_usd": 100
}
'import requests
url = "https://api.kemycard.com/v1/payouts/quotes"
payload = {
"customer_code": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"beneficiary_code": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"amount_usd": 100
}
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({
customer_code: '3c90c3cc-0d44-4b50-8888-8dd25736052a',
beneficiary_code: '3c90c3cc-0d44-4b50-8888-8dd25736052a',
amount_usd: 100
})
};
fetch('https://api.kemycard.com/v1/payouts/quotes', 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.kemycard.com/v1/payouts/quotes",
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([
'customer_code' => '3c90c3cc-0d44-4b50-8888-8dd25736052a',
'beneficiary_code' => '3c90c3cc-0d44-4b50-8888-8dd25736052a',
'amount_usd' => 100
]),
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>",
"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.kemycard.com/v1/payouts/quotes"
payload := strings.NewReader("{\n \"customer_code\": \"3c90c3cc-0d44-4b50-8888-8dd25736052a\",\n \"beneficiary_code\": \"3c90c3cc-0d44-4b50-8888-8dd25736052a\",\n \"amount_usd\": 100\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("Authorization", "Bearer <token>")
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.kemycard.com/v1/payouts/quotes")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"customer_code\": \"3c90c3cc-0d44-4b50-8888-8dd25736052a\",\n \"beneficiary_code\": \"3c90c3cc-0d44-4b50-8888-8dd25736052a\",\n \"amount_usd\": 100\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.kemycard.com/v1/payouts/quotes")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"customer_code\": \"3c90c3cc-0d44-4b50-8888-8dd25736052a\",\n \"beneficiary_code\": \"3c90c3cc-0d44-4b50-8888-8dd25736052a\",\n \"amount_usd\": 100\n}"
response = http.request(request)
puts response.read_body{
"success": true,
"data": {
"quote_code": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"rail": "sepa",
"status": "open",
"customer_code": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"beneficiary": {
"code": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"name": "JANE DOE",
"iban_masked": "DE89 **** 3000",
"account_number_masked": "**** 9012",
"routing_number": "021000021",
"bank_name": "Test Bank",
"country": "DE"
},
"amount_usd": 100,
"fee_usd": 7,
"total_debited_usd": 107,
"received_amount": 86,
"received_currency": "EUR",
"amount_eur": 86,
"exchange_rate": 0.86,
"balance_type": "payout_sepa",
"expires_at": "2023-11-07T05:31:56Z",
"created_at": "2023-11-07T05:31:56Z"
},
"meta": {
"request_id": "a4f8e2c1b3d97056",
"mode": "test",
"timestamp": "2023-11-07T05:31:56Z"
}
}Authorizations
API key (sk_test_... or sk_live_...)
Body
application/json