SDK oficial da ClickPay para JavaScript e TypeScript.
Integre pagamentos PIX, gestão de clientes, produtos, webhooks e saques em qualquer ambiente JS — Node.js, NestJS, Next.js, browser e mais.
Instalação
npm install @clickpay/sdk
Início Rápido e Simples
import { ClickPay, WebhookEvent } from '@clickpay/sdk';
const clickpay = new ClickPay({
apiKey: 'cpk_sandbox_sua_chave_aqui',
});
Cobranças
Criar Link de Pagamento
const charge = await clickpay.charges.createPaymentLink({
total: 5000, // R$ 50,00 (em centavos)
customer: {
taxId: '12345678900',
name: 'João Silva',
email: 'joao@email.com',
phone: '11999999999',
},
successUrl: 'https://meusite.com/sucesso',
failedUrl: 'https://meusite.com/falha',
items: [
{ productId: 'prod_abc123', quantity: 2 },
],
});
console.log(charge.data?.url); // URL da página de pagamento
Criar Cobrança PIX Direta
const pix = await clickpay.charges.createPixCharge({
amount: 1500, // R$ 15,00
customer: {
taxId: '12345678900',
name: 'Maria Santos',
email: 'maria@email.com',
phone: '11988888888',
},
expiresIn: 900, // 15 minutos em segundos
});
console.log(pix.data?.brCode); // PIX copia-e-cola
console.log(pix.data?.brCodeBase64); // QR Code em base64
Consultar Cobrança
const charge = await clickpay.charges.getById('charge_id_aqui');
console.log(charge.data?.status); // OPEN | COMPLETED | EXPIRED
console.log(charge.data?.paymentStatus); // PENDING | PROCESSING | PAID | EXPIRED
Gerar PIX para Link de Pagamento Existente
const pixPayment = await clickpay.charges.generatePixForCharge('charge_id', {
customer: {
taxId: '12345678900',
name: 'João Silva',
email: 'joao@email.com',
phone: '11999999999',
},
});
Simular Pagamento (Sandbox)
Funciona apenas com cobranças criadas com devMode: true.
await clickpay.charges.simulatePayment('charge_id');
Idempotência
As operações de criação de cobrança suportam chave de idempotência (UUID v4, TTL 24h):
const charge = await clickpay.charges.createPixCharge(
{
amount: 5000,
customer: {
taxId: '12345678900',
name: 'João Silva',
email: 'joao@email.com',
phone: '11999999999',
},
},
{ idempotencyKey: 'f47ac10b-58cc-4372-a567-0e02b2c3d479' },
);
Clientes
import { DefaultStatus } from '@clickpay/sdk';
// Listar todos
const customers = await clickpay.customers.list();
// Buscar por ID
const customer = await clickpay.customers.getById('cust_abc123');
// Criar cliente
const newCustomer = await clickpay.customers.create({
name: 'João Silva',
taxId: '12345678900',
email: 'joao@email.com',
phone: '11999999999',
status: DefaultStatus.ACTIVE,
postalCode: '01001000',
address: 'Praça da Sé',
number: '1',
district: 'Sé',
});
// Atualizar cliente
await clickpay.customers.update({
id: 'cust_abc123',
phone: '11977777777',
status: DefaultStatus.INACTIVE,
});
Produtos
import { DefaultStatus } from '@clickpay/sdk';
// Listar produtos
const products = await clickpay.products.list({ status: DefaultStatus.ACTIVE });
// Buscar por ID
const product = await clickpay.products.getById('prod_abc123');
// Buscar por SKU
const productBySku = await clickpay.products.getBySku('PLAN-MONTHLY');
// Criar produto
const newProduct = await clickpay.products.create({
name: 'Plano Mensal',
description: 'Assinatura mensal do serviço',
price: 4990, // R$ 49,90 (em centavos)
sku: 'PLAN-MONTHLY',
});
// Atualizar produto
await clickpay.products.update({
id: 'prod_abc123',
price: 5990,
});
Webhooks
import { WebhookEvent } from '@clickpay/sdk';
// Listar webhooks
const webhooks = await clickpay.webhooks.list();
// Criar webhook
const webhook = await clickpay.webhooks.create({
name: 'Meu Webhook',
url: 'https://meusite.com/webhooks/clickpay',
events: [WebhookEvent.CHARGE_PAID, WebhookEvent.CHARGE_EXPIRED],
});
// Atualizar webhook
await clickpay.webhooks.update({
id: 'wh_abc123',
events: [WebhookEvent.CHARGE_PAID],
});
// Deletar webhook
await clickpay.webhooks.delete('wh_abc123');
// Listar eventos disponíveis
const events = await clickpay.webhooks.listEvents();
// Estatísticas da fila
const stats = await clickpay.webhooks.getQueueStats();
Conta
// Consultar saldo
const balance = await clickpay.account.getBalance();
// Criar saque (transferência PIX)
const withdraw = await clickpay.account.withdraw({
value: 10000, // R$ 100,00
});
// Listar histórico de saques
const withdrawals = await clickpay.account.listWithdrawals();
Configuração Avançada
Opções do Cliente
const clickpay = new ClickPay({
// Autenticação (obrigatório)
apiKey: 'cpk_sandbox_sua_chave_aqui',
// URL customizada (padrão: https://api.clickpay.app.br)
baseUrl: 'https://minha-api.com',
// Ambiente sandbox
sandbox: true,
// Timeout em ms (padrão: 30000)
timeout: 15000,
// Retentativas automáticas em 429/5xx (padrão: 2)
maxRetries: 3,
// Headers extras
headers: {
'X-Custom-Header': 'valor',
},
// fetch customizado (Node.js < 18)
fetch: customFetchImplementation,
});
| Opção | Tipo | Padrão | Descrição |
|---|
apiKey | string | — | Chave de API para autenticação (obrigatório) |
baseUrl | string | https://api.clickpay.app.br | URL base da API |
sandbox | boolean | false | Habilita ambiente sandbox |
timeout | number | 30000 | Timeout das requisições em milissegundos |
maxRetries | number | 2 | Número máximo de retentativas em erros 429/5xx |
headers | object | {} | Headers HTTP adicionais |
fetch | function | globalThis.fetch | Implementação customizada de fetch |
Tratamento de Erros
import {
ClickPay,
ClickPayApiError,
ClickPayRateLimitError,
ClickPayIdempotencyError,
ClickPayTimeoutError,
ClickPayNetworkError,
} from '@clickpay/sdk';
try {
await clickpay.charges.createPixCharge({ /* ... */ });
} catch (error) {
if (error instanceof ClickPayRateLimitError) {
console.log(`Rate limited. Tente novamente em ${error.retryAfter}s`);
} else if (error instanceof ClickPayIdempotencyError) {
console.log('Conflito de chave de idempotência');
} else if (error instanceof ClickPayTimeoutError) {
console.log('Timeout na requisição');
} else if (error instanceof ClickPayNetworkError) {
console.log('Erro de rede:', error.message);
} else if (error instanceof ClickPayApiError) {
console.log(`Erro da API ${error.statusCode}: ${error.message}`);
console.log('Corpo da resposta:', error.body);
}
}
| Classe de Erro | Descrição |
|---|
ClickPayApiError | Erro genérico da API (classe base) |
ClickPayRateLimitError | Limite de requisições excedido (429) |
ClickPayIdempotencyError | Conflito de chave de idempotência |
ClickPayTimeoutError | Timeout na requisição |
ClickPayNetworkError | Erro de conexão/rede |
Valores Monetários
Todos os valores monetários na SDK são representados em centavos (inteiros):
| Valor Real | Valor na SDK |
|---|
| R$ 5,00 | 500 |
| R$ 49,90 | 4990 |
| R$ 100,00 | 10000 |
O valor mínimo para cobranças é 500 (R$ 5,00).
Tipos e Enums
Todos os tipos TypeScript são exportados para uso direto:
import type {
Customer,
CreateCustomerInput,
ChargeDetail,
CreatePixChargeInput,
Product,
Webhook,
ClickPayResponse,
} from '@clickpay/sdk';
import {
DefaultStatus, // ACTIVE | INACTIVE
ChargeStatus, // OPEN | COMPLETED | EXPIRED
PaymentStatus, // PENDING | PROCESSING | PAID | EXPIRED
WebhookEvent, // CHARGE_PAID | CHARGE_EXPIRED | ...
WithdrawStatus, // Status de saques
} from '@clickpay/sdk';
import { Module, Injectable } from '@nestjs/common';
import { ClickPay } from '@clickpay/sdk';
@Module({
providers: [
{
provide: ClickPay,
useFactory: () =>
new ClickPay({ apiKey: process.env.CLICKPAY_API_KEY }),
},
],
exports: [ClickPay],
})
export class ClickPayModule {}
// No service:
@Injectable()
export class PaymentService {
constructor(private readonly clickpay: ClickPay) {}
async createCharge(amount: number) {
return this.clickpay.charges.createPixCharge({
amount,
customer: { /* ... */ },
});
}
}
Compatibilidade
| Ambiente | Suportado |
|---|
| Node.js >= 18 | ✅ |
| Bun | ✅ |
| Deno | ✅ |
| Browser (ESM) | ✅ |
| NestJS | ✅ |
| Next.js | ✅ |
| React Native | ✅ |
Para Node.js < 18, passe uma implementação de fetch via a opção fetch (ex: node-fetch ou undici).