Exemplos JavaScript / Node.js
Exemplos completos utilizando axios e fetch nativo. Todos os exemplos sao compativeis com Node.js 18+ e navegadores modernos.
Instalacao (axios)
npm install axios
Cliente API Completo
const axios = require('axios');
class TesselysApiClient {
constructor(apiKey, secret) {
this.baseUrl = 'https://api.tesselys.com.br/external/v1';
this.apiKey = apiKey;
this.secret = secret;
this.accessToken = null;
this.companyToken = null;
this.expiresAt = null;
this.client = axios.create({
baseURL: this.baseUrl,
headers: { 'Content-Type': 'application/json' },
timeout: 30000,
});
// Interceptor para renovacao automatica de token
this.client.interceptors.response.use(
(response) => response,
async (error) => {
const originalRequest = error.config;
if (error.response?.status === 401 && !originalRequest._retry) {
originalRequest._retry = true;
try {
await this.authenticate();
originalRequest.headers['Authorization'] = `Bearer ${this.accessToken}`;
originalRequest.headers['x-company-token'] = this.companyToken;
return this.client(originalRequest);
} catch (authError) {
throw authError;
}
}
throw error;
}
);
}
/**
* Autentica com API Key e Secret.
* Armazena os tokens para uso nas chamadas subsequentes.
*/
async authenticate() {
const response = await axios.post(`${this.baseUrl}/auth`, {
secret: this.secret,
}, {
headers: {
'Content-Type': 'application/json',
'x-api-key': this.apiKey,
},
});
this.accessToken = response.data.accessToken;
this.companyToken = response.data.companyToken;
this.expiresAt = Date.now() + (response.data.expiresIn * 1000);
// Configurar headers padrao
this.client.defaults.headers.common['Authorization'] = `Bearer ${this.accessToken}`;
this.client.defaults.headers.common['x-company-token'] = this.companyToken;
return response.data;
}
// ─── Pessoas ──────────────────────────────────────────────
async listPersons(params = {}) {
const response = await this.client.get('/persons', { params });
return response.data;
}
async getPerson(id) {
const response = await this.client.get(`/persons/${id}`);
return response.data;
}
async createPerson(data) {
const response = await this.client.post('/persons', data);
return response.data;
}
async updatePerson(id, data) {
const response = await this.client.put(`/persons/${id}`, data);
return response.data;
}
// ─── Negocios ─────────────────────────────────────────────
async listDeals(params = {}) {
const response = await this.client.get('/deals', { params });
return response.data;
}
async getDeal(id) {
const response = await this.client.get(`/deals/${id}`);
return response.data;
}
async createDeal(data) {
const response = await this.client.post('/deals', data);
return response.data;
}
async updateDeal(id, data) {
const response = await this.client.put(`/deals/${id}`, data);
return response.data;
}
// ─── Lancamentos Financeiros ──────────────────────────────
async listFinancialEntries(params = {}) {
const response = await this.client.get('/financial-entries', { params });
return response.data;
}
async getFinancialEntry(id) {
const response = await this.client.get(`/financial-entries/${id}`);
return response.data;
}
async createFinancialEntry(data) {
const response = await this.client.post('/financial-entries', data);
return response.data;
}
// ─── Produtos ─────────────────────────────────────────────
async listProducts(params = {}) {
const response = await this.client.get('/products', { params });
return response.data;
}
async createProduct(data) {
const response = await this.client.post('/products', data);
return response.data;
}
// ─── Projetos ─────────────────────────────────────────────
async listProjects(params = {}) {
const response = await this.client.get('/projects', { params });
return response.data;
}
async createProject(data) {
const response = await this.client.post('/projects', data);
return response.data;
}
}
module.exports = { TesselysApiClient };
Uso Basico
const { TesselysApiClient } = require('./tesselys-client');
async function main() {
const client = new TesselysApiClient(
process.env.TESSELYS_API_KEY, // tesselys_ak_...
process.env.TESSELYS_API_SECRET // base64url string
);
// 1. Autenticar
await client.authenticate();
console.log('Autenticado com sucesso!');
// 2. Criar uma pessoa
const person = await client.createPerson({
name: 'Empresa Exemplo Ltda',
documentNumber: '12345678000190',
personType: 'COMPANY',
email: 'contato@exemplo.com.br',
classifications: ['CUSTOMER'],
tags: ['novo-cliente'],
});
console.log('Pessoa criada:', person.id);
// 3. Criar um negocio vinculado
const deal = await client.createDeal({
title: 'Proposta Comercial - Empresa Exemplo',
customerId: person.id,
dealType: 'COMMERCIAL',
dealPipelineId: 'seu-pipeline-id',
amount: 25000.00,
expectedCloseDate: '2026-06-30',
});
console.log('Negocio criado:', deal.id, deal.code);
// 4. Listar pessoas com filtro
const customers = await client.listPersons({
personType: 'COMPANY',
classification: 'CUSTOMER',
page: 1,
limit: 10,
});
console.log(`Total de clientes PJ: ${customers.meta.total}`);
}
main().catch(console.error);
Usando Fetch Nativo (sem dependencias)
const BASE_URL = 'https://api.tesselys.com.br/external/v1';
async function authenticate(apiKey, secret) {
const response = await fetch(`${BASE_URL}/auth`, {
method: 'POST',
headers: {
'Content-Type': 'application/json',
'x-api-key': apiKey,
},
body: JSON.stringify({ secret }),
});
if (!response.ok) {
const error = await response.json();
throw new Error(`Autenticacao falhou: ${error.friendlyMessage}`);
}
return response.json();
}
async function apiRequest(method, path, tokens, body = null, params = null) {
let url = `${BASE_URL}${path}`;
if (params) {
const searchParams = new URLSearchParams(params);
url += `?${searchParams.toString()}`;
}
const options = {
method,
headers: {
'Content-Type': 'application/json',
'Authorization': `Bearer ${tokens.accessToken}`,
'x-company-token': tokens.companyToken,
},
};
if (body) {
options.body = JSON.stringify(body);
}
const response = await fetch(url, options);
if (!response.ok) {
const error = await response.json();
throw new Error(`[${error.statusCode}] ${error.friendlyMessage}`);
}
return response.json();
}
// Exemplo de uso
async function main() {
const tokens = await authenticate(
process.env.TESSELYS_API_KEY,
process.env.TESSELYS_API_SECRET
);
// Listar pessoas
const persons = await apiRequest('GET', '/persons', tokens, null, {
page: 1,
limit: 10,
});
console.log(`Encontradas ${persons.meta.total} pessoas`);
// Criar lancamento financeiro
const entry = await apiRequest('POST', '/financial-entries', tokens, {
personId: persons.data[0].id,
title: 'Fatura de Servico - Teste',
typeCategory: 'REVENUE',
originalAmount: 5000.00,
originalDueDate: '2026-04-15',
financialCategoryId: 'sua-categoria-id',
bankAccountId: 'sua-conta-id',
paymentMethod: 'PIX',
});
console.log('Lancamento criado:', entry.id, entry.code);
}
main().catch(console.error);
Tratamento de Erros
const { TesselysApiClient } = require('./tesselys-client');
async function safeOperation() {
const client = new TesselysApiClient(
process.env.TESSELYS_API_KEY,
process.env.TESSELYS_API_SECRET
);
try {
await client.authenticate();
const person = await client.createPerson({
name: 'Teste',
personType: 'INDIVIDUAL',
documentNumber: '00000000000', // CPF invalido
});
} catch (error) {
if (error.response) {
// Erro da API (4xx, 5xx)
const { statusCode, message, friendlyMessage } = error.response.data;
switch (statusCode) {
case 400:
console.error('Dados invalidos:', friendlyMessage);
// Tratar erros de validacao
if (error.response.data.errors) {
error.response.data.errors.forEach((e) => {
console.error(` Campo '${e.field}': ${e.message}`);
});
}
break;
case 401:
console.error('Nao autorizado:', friendlyMessage);
// Token expirado — o interceptor ja tenta renovar automaticamente
break;
case 404:
console.error('Nao encontrado:', friendlyMessage);
break;
case 429:
console.error('Rate limit excedido. Aguardando...');
const retryAfter = error.response.headers['retry-after'] || 60;
// Aguardar antes de tentar novamente
break;
default:
console.error(`Erro ${statusCode}:`, friendlyMessage);
}
} else if (error.request) {
// Erro de rede (timeout, DNS, etc.)
console.error('Erro de conexao:', error.message);
} else {
console.error('Erro inesperado:', error.message);
}
}
}