Pular para o conteúdo principal
POST
/
v1
/
transfers
Enviar transferência Pix
curl --request POST \
  --url https://conta-public-api.kiwify.com/v1/transfers \
  --header 'Content-Type: application/json' \
  --header 'X-PoP-Challenge: <api-key>' \
  --header 'X-PoP-Format: <api-key>' \
  --header 'X-PoP-Signature: <api-key>' \
  --header 'x-access-id: <api-key>' \
  --data '
{
  "allowed_tax_ids": [
    "12345678909"
  ],
  "transfers": [
    {
      "amount_in_cents": 15000,
      "display_description": "Pagamento fornecedor",
      "external_reference_id": "payroll-2026-05-001",
      "pix_key": "12345678901",
      "pix_key_type": "cpf",
      "type": "pix_key"
    },
    {
      "account_number": "123456",
      "account_type": "payment_account",
      "amount_in_cents": 25000,
      "branch_code": "0001",
      "external_reference_id": "supplier-001",
      "ispb": "00000000",
      "name": "João Silva",
      "tax_id": "12345678909",
      "type": "bank_account"
    }
  ]
}
'
import requests

url = "https://conta-public-api.kiwify.com/v1/transfers"

payload = {
"allowed_tax_ids": ["12345678909"],
"transfers": [
{
"amount_in_cents": 15000,
"display_description": "Pagamento fornecedor",
"external_reference_id": "payroll-2026-05-001",
"pix_key": "12345678901",
"pix_key_type": "cpf",
"type": "pix_key"
},
{
"account_number": "123456",
"account_type": "payment_account",
"amount_in_cents": 25000,
"branch_code": "0001",
"external_reference_id": "supplier-001",
"ispb": "00000000",
"name": "João Silva",
"tax_id": "12345678909",
"type": "bank_account"
}
]
}
headers = {
"x-access-id": "<api-key>",
"X-PoP-Challenge": "<api-key>",
"X-PoP-Format": "<api-key>",
"X-PoP-Signature": "<api-key>",
"Content-Type": "application/json"
}

response = requests.post(url, json=payload, headers=headers)

print(response.text)
const options = {
method: 'POST',
headers: {
'x-access-id': '<api-key>',
'X-PoP-Challenge': '<api-key>',
'X-PoP-Format': '<api-key>',
'X-PoP-Signature': '<api-key>',
'Content-Type': 'application/json'
},
body: JSON.stringify({
allowed_tax_ids: ['12345678909'],
transfers: [
{
amount_in_cents: 15000,
display_description: 'Pagamento fornecedor',
external_reference_id: 'payroll-2026-05-001',
pix_key: '12345678901',
pix_key_type: 'cpf',
type: 'pix_key'
},
{
account_number: '123456',
account_type: 'payment_account',
amount_in_cents: 25000,
branch_code: '0001',
external_reference_id: 'supplier-001',
ispb: '00000000',
name: 'João Silva',
tax_id: '12345678909',
type: 'bank_account'
}
]
})
};

fetch('https://conta-public-api.kiwify.com/v1/transfers', 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://conta-public-api.kiwify.com/v1/transfers",
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([
'allowed_tax_ids' => [
'12345678909'
],
'transfers' => [
[
'amount_in_cents' => 15000,
'display_description' => 'Pagamento fornecedor',
'external_reference_id' => 'payroll-2026-05-001',
'pix_key' => '12345678901',
'pix_key_type' => 'cpf',
'type' => 'pix_key'
],
[
'account_number' => '123456',
'account_type' => 'payment_account',
'amount_in_cents' => 25000,
'branch_code' => '0001',
'external_reference_id' => 'supplier-001',
'ispb' => '00000000',
'name' => 'João Silva',
'tax_id' => '12345678909',
'type' => 'bank_account'
]
]
]),
CURLOPT_HTTPHEADER => [
"Content-Type: application/json",
"X-PoP-Challenge: <api-key>",
"X-PoP-Format: <api-key>",
"X-PoP-Signature: <api-key>",
"x-access-id: <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://conta-public-api.kiwify.com/v1/transfers"

payload := strings.NewReader("{\n \"allowed_tax_ids\": [\n \"12345678909\"\n ],\n \"transfers\": [\n {\n \"amount_in_cents\": 15000,\n \"display_description\": \"Pagamento fornecedor\",\n \"external_reference_id\": \"payroll-2026-05-001\",\n \"pix_key\": \"12345678901\",\n \"pix_key_type\": \"cpf\",\n \"type\": \"pix_key\"\n },\n {\n \"account_number\": \"123456\",\n \"account_type\": \"payment_account\",\n \"amount_in_cents\": 25000,\n \"branch_code\": \"0001\",\n \"external_reference_id\": \"supplier-001\",\n \"ispb\": \"00000000\",\n \"name\": \"João Silva\",\n \"tax_id\": \"12345678909\",\n \"type\": \"bank_account\"\n }\n ]\n}")

req, _ := http.NewRequest("POST", url, payload)

req.Header.Add("x-access-id", "<api-key>")
req.Header.Add("X-PoP-Challenge", "<api-key>")
req.Header.Add("X-PoP-Format", "<api-key>")
req.Header.Add("X-PoP-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://conta-public-api.kiwify.com/v1/transfers")
.header("x-access-id", "<api-key>")
.header("X-PoP-Challenge", "<api-key>")
.header("X-PoP-Format", "<api-key>")
.header("X-PoP-Signature", "<api-key>")
.header("Content-Type", "application/json")
.body("{\n \"allowed_tax_ids\": [\n \"12345678909\"\n ],\n \"transfers\": [\n {\n \"amount_in_cents\": 15000,\n \"display_description\": \"Pagamento fornecedor\",\n \"external_reference_id\": \"payroll-2026-05-001\",\n \"pix_key\": \"12345678901\",\n \"pix_key_type\": \"cpf\",\n \"type\": \"pix_key\"\n },\n {\n \"account_number\": \"123456\",\n \"account_type\": \"payment_account\",\n \"amount_in_cents\": 25000,\n \"branch_code\": \"0001\",\n \"external_reference_id\": \"supplier-001\",\n \"ispb\": \"00000000\",\n \"name\": \"João Silva\",\n \"tax_id\": \"12345678909\",\n \"type\": \"bank_account\"\n }\n ]\n}")
.asString();
require 'uri'
require 'net/http'

url = URI("https://conta-public-api.kiwify.com/v1/transfers")

http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true

request = Net::HTTP::Post.new(url)
request["x-access-id"] = '<api-key>'
request["X-PoP-Challenge"] = '<api-key>'
request["X-PoP-Format"] = '<api-key>'
request["X-PoP-Signature"] = '<api-key>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"allowed_tax_ids\": [\n \"12345678909\"\n ],\n \"transfers\": [\n {\n \"amount_in_cents\": 15000,\n \"display_description\": \"Pagamento fornecedor\",\n \"external_reference_id\": \"payroll-2026-05-001\",\n \"pix_key\": \"12345678901\",\n \"pix_key_type\": \"cpf\",\n \"type\": \"pix_key\"\n },\n {\n \"account_number\": \"123456\",\n \"account_type\": \"payment_account\",\n \"amount_in_cents\": 25000,\n \"branch_code\": \"0001\",\n \"external_reference_id\": \"supplier-001\",\n \"ispb\": \"00000000\",\n \"name\": \"João Silva\",\n \"tax_id\": \"12345678909\",\n \"type\": \"bank_account\"\n }\n ]\n}"

response = http.request(request)
puts response.read_body
{
  "batch": {
    "created_at": "2026-05-28T14:30:00Z",
    "id": 123,
    "origin_bank_account_id": 123,
    "total_amount_in_cents": 123,
    "total_items": 123,
    "allowed_tax_ids": [
      "<string>"
    ],
    "idempotency_key": "<string>"
  },
  "transfers": [
    {
      "amount_in_cents": 123,
      "beneficiary": {
        "pix_key": "<string>",
        "resolved_account_number": "<string>",
        "resolved_branch": "<string>",
        "resolved_ispb": "<string>",
        "name": "<string>",
        "tax_id": "<string>"
      },
      "created_at": "2026-05-28T14:30:00Z",
      "id": 123,
      "display_description": "<string>",
      "end_to_end_id": "<string>",
      "external_reference_id": "<string>",
      "failed_message": "<string>",
      "scheduled_date": "2026-06-01",
      "transaction_id": 123
    }
  ]
}
{
"error": {
"code": "INVALID_REQUEST",
"message": "<string>",
"details": {}
},
"timestamp": "2026-05-28T14:30:00Z"
}
{
"error": {
"code": "INVALID_REQUEST",
"message": "<string>",
"details": {}
},
"timestamp": "2026-05-28T14:30:00Z"
}
{
"error": {
"code": "INVALID_REQUEST",
"message": "<string>",
"details": {}
},
"timestamp": "2026-05-28T14:30:00Z"
}
{
"error": {
"code": "INVALID_REQUEST",
"message": "<string>",
"details": {}
},
"timestamp": "2026-05-28T14:30:00Z"
}
{
"error": {
"code": "INVALID_REQUEST",
"message": "<string>",
"details": {}
},
"timestamp": "2026-05-28T14:30:00Z"
}
{
"error": {
"code": "INVALID_REQUEST",
"message": "<string>",
"details": {}
},
"timestamp": "2026-05-28T14:30:00Z"
}

Autorizações

x-access-id
string
header
obrigatório

UUID of the service account (e.g., 550e8400-e29b-41d4-a716-446655440000)

X-PoP-Challenge
string
header
obrigatório

Unix timestamp in milliseconds (e.g., 1704636800000). Must be within 5 minutes of server time.

X-PoP-Format
string
header
obrigatório

Must be 'service-account' for service account authentication

X-PoP-Signature
string
header
obrigatório

EdDSA signature of the request in base64 format. Signs: uri:method:body:timestamp

Cabeçalhos

X-Idempotency-Key
string | null

Optional idempotency key for safe retries. When provided, requests with the same key return the same result. Without this header, duplicate external_reference_id values will fail with 400 Bad Request.

Corpo

application/json
transfers
(Chave Pix · object | Transferência manual · object)[]
obrigatório

Transfers to create in this batch (1–100 items).

Transfer to a PIX key (email, phone, CPF/CNPJ, or random key).

allowed_tax_ids
string[]

Optional list of CPF/CNPJ that restricts the allowed beneficiary documents for this batch. For pix_key transfers: the document resolved from the PIX key must match one of the listed values. For bank_account transfers: the tax_id provided in the transfer must be present in the list. When empty, transfers to any document are accepted.

Resposta

Transfers batch created successfully

batch
object
obrigatório

Batch metadata for the created transfers.

transfers
object[]
obrigatório

Individual transfer items in the batch.