Pular para o conteúdo principal

Criar uma transferência

import { Client } from "@pagouai/api-sdk";

const client = new Client({
	apiKey: process.env.PAGOU_API_KEY!,
	environment: "sandbox",
});

const transfer = await client.transfers.create({
	pix_key_type: "CPF",
	pix_key_value: "12345678901",
	amount: 5000,
	description: "Pagamento ao fornecedor",
	external_ref: "inv_001",
});

console.log(transfer.data.id, transfer.data.status, transfer.meta.requestId);

Criar uma transferência a partir de uma solicitação interna

type PayoutRequest = {
	id: string;
	amount: number;
	pixKeyType: "CPF" | "CNPJ" | "EMAIL" | "PHONE" | "EVP";
	pixKeyValue: string;
	description: string;
};

export async function createTransferForPayout(payout: PayoutRequest) {
	return client.transfers.create(
		{
			pix_key_type: payout.pixKeyType,
			pix_key_value: payout.pixKeyValue,
			amount: payout.amount,
			description: payout.description,
			external_ref: payout.id,
		},
		{ requestId: `payout_${payout.id}` },
	);
}

Listar transferências

const page = await client.transfers.list({
	page: 1,
	limit: 20,
	status: "pending",
});

console.log(page.data.metadata.total);

for (const item of page.data.data) {
	console.log(item.id, item.status, item.amount);
}

Montar uma fila operacional com transferências pendentes

const pending = await client.transfers.list({
	page: 1,
	limit: 100,
	status: "pending",
});

const queue = pending.data.data.map((item) => ({
	id: item.id,
	status: item.status,
	amount: item.amount,
}));

Consultar por ID

const current = await client.transfers.retrieve("tf_123");

console.log(current.data.status, current.data.amount, current.data.pix_key);

Cancelar uma transferência

const cancelled = await client.transfers.cancel(
	"tf_123",
	{ reason: "wrong recipient" },
	{ requestId: "cancel_tf_123" },
);

console.log(cancelled.data.status);

Helper de cancelamento seguro para suporte

export async function cancelTransfer(id: string, reason: string) {
	return client.transfers.cancel(
		id,
		{ reason },
		{ requestId: `cancel_${id}` },
	);
}

Percorrer todas as páginas automaticamente

for await (const item of client.transfers.listAutoPagingIterator({ limit: 100 })) {
	console.log(item.id, item.status);
}

Job em lote para repasses a fornecedores

const suppliers = [
	{ id: "sup_1", email: "supplier-1@example.com", amount: 12000 },
	{ id: "sup_2", email: "supplier-2@example.com", amount: 8000 },
];

for (const supplier of suppliers) {
	await client.transfers.create(
		{
			pix_key_type: "EMAIL",
			pix_key_value: supplier.email,
			amount: supplier.amount,
			description: `Repasse para ${supplier.id}`,
			external_ref: `settlement_${supplier.id}`,
		},
		{ requestId: `job_${supplier.id}` },
	);
}

Reconciliar o estado da transferência

async function reconcileTransfer(id: string) {
	const response = await client.transfers.retrieve(id, {
		timeoutMs: 10_000,
	});

	return {
		id: response.data.id,
		status: response.data.status,
		requestId: response.meta.requestId,
	};
}

Consumidor de webhook com consulta do estado atual

export async function handleTransferWebhook(payload: { id: string; event: string }) {
	const response = await client.transfers.retrieve(payload.id, {
		requestId: `webhook_transfer_${payload.id}`,
	});

	await saveTransferState({
		id: response.data.id,
		status: response.data.status,
		event: payload.event,
		requestId: response.meta.requestId,
	});
}

Exemplo de repasse a fornecedor

await client.transfers.create(
	{
		pix_key_type: "EMAIL",
		pix_key_value: "supplier@example.com",
		amount: 12500,
		description: "Liquidação da fatura 2026-001",
		external_ref: "supplier_settlement_2026_001",
	},
	{
		requestId: "payout_job_2026_001",
	},
);

Reconciliar uma lista de transferências inacabadas

const unfinished = await loadTransfersNeedingReconciliation();

for (const item of unfinished) {
	const response = await client.transfers.retrieve(item.transferId);

	await markTransferAsReconciled({
		transferId: response.data.id,
		status: response.data.status,
		requestId: response.meta.requestId,
	});
}