Como consumir as rotas disponibilizadas na API PÚBLICA
API Pública GDASH: integração simples e segura com nossos serviços
Base URL: https://public-api.gdash.io/api/v1
Documentação interativa (Swagger): https://public-api.gdash.io/swagger
Autenticação: parâmetroapikeyna query string de todas as requisições
Por que disponibilizamos uma API pública
Com o objetivo de facilitar integrações e ampliar as possibilidades de uso da plataforma, disponibilizamos uma API pública que permite que desenvolvedores e sistemas externos acessem nossos serviços de forma padronizada e segura.
Na prática, isso significa que os dados que você já acompanha no GDASH — usinas, clientes, unidades consumidoras, faturas de energia, cobranças, negociações e chamados — podem ser lidos e, em alguns casos, criados diretamente pelo seu próprio sistema, sem depender de exportações manuais ou de alguém abrindo a plataforma para copiar informação.
O que é uma API pública
Uma API pública é uma interface que permite que aplicações externas se comuniquem com um sistema de maneira estruturada. Ela possibilita que outras plataformas, softwares ou automações utilizem funcionalidades do nosso sistema sem precisar acessar diretamente a aplicação principal.
A disponibilização de uma API pública tem como principal objetivo permitir integrações mais flexíveis. Empresas e desenvolvedores podem automatizar processos, conectar diferentes sistemas e criar novas soluções utilizando os dados e recursos disponibilizados pela plataforma.
Além disso, a API pública também facilita a escalabilidade das integrações. Em vez de processos manuais ou importações de dados, sistemas podem se comunicar automaticamente, garantindo mais eficiência, consistência e rapidez nas operações.
O que dá para construir com ela
Alguns cenários que a API atende bem hoje:
Cenário | Como a API resolve |
|---|---|
Espelhar dados no seu ERP/BI | Leia periodicamente usinas, clientes, unidades consumidoras e faturas, e sincronize com sua base |
Conciliação financeira | Consulte cobranças por status, vencimento e período para bater com o extrato bancári |
Acompanhamento operacional | Monitore chamados e tarefas abertas para alimentar painéis de operação ou disparar alertas internos |
Como começar a utilizar a API pública
Para acessar as rotas da API pública, é necessário possuir uma API Key, que funciona como uma chave de autenticação para identificar e autorizar as requisições feitas ao sistema. É ela que diz à API qual organização está fazendo a chamada — por isso, todos os dados retornados são sempre e exclusivamente os da sua organização.
O processo para gerar uma API Key é simples:
- Acesse o menu Configurações da plataforma.

- Entre na seção API Keys.

- Clique na opção Chave de API habilitada

- Após a criação, copie a Chave de API gerada.
⚠️ Trate a API Key como uma senha. Ela dá acesso de leitura e escrita aos dados da sua organização. Guarde-a em variáveis de ambiente ou em um cofre de segredos — nunca no código-fonte versionado, em repositórios públicos ou no front-end de uma aplicação web (onde qualquer visitante conseguiria lê-la). Se suspeitar que a chave vazou, desabilite e gere uma nova pela mesma tela.
Documentação da API
Para facilitar o uso da API pública, disponibilizamos a documentação por meio do Swagger. O Swagger permite visualizar todas as rotas disponíveis, entender quais parâmetros são necessários e até mesmo testar requisições diretamente pela interface.
Com ele, desenvolvedores conseguem explorar a API de forma mais prática, verificando exemplos de requisição, formatos de resposta e detalhes de cada endpoint.
A documentação completa da API pode ser acessada no link abaixo:
https://public-api.gdash.io/swagger
Após gerar sua API Key, basta acessar a documentação no Swagger, inserir a chave nas requisições e começar a utilizar as rotas da API pública para integrar sua aplicação.

💡 Dica: o Swagger é a fonte da verdade sempre atualizada. Este guia explica os conceitos e o comportamento da API; o Swagger reflete os campos exatos de cada versão em produção. Quando houver divergência, confie no Swagger.
Convenções gerais
Estas regras valem para todas as rotas da API.
Conceito | Detalhe |
|---|---|
Base URL | |
Autenticação | Query param |
Métodos |
|
Formato de resposta |
|
Content-Type |
|
Datas | ISO 8601 (ex.: |
Paginação | Por cursor, nas rotas de maior volume ( |
Escopo dos dados | Sempre limitado à organização dona da API Key |
Formato de resposta
Em caso de sucesso, a resposta segue o envelope abaixo. O conteúdo útil está sempre em data:
{
"ok": true,
"data": [
{ "id": "...", "name": "..." }
]
}Nas rotas paginadas, o envelope também traz o cursor da próxima página:
{
"ok": true,
"data": [ ... ],
"nextCursor": "2026-01-15T10:32:00.000Z"
}Tratamento de erros
Quando algo dá errado, a API responde com o status HTTP apropriado e um corpo descritivo:
{
"success": false,
"status": 400,
"error": "BadRequestException",
"message": "Invalid key or organization not found",
"path": "/api/v1/solar/customers?apikey=***",
"data": []
}Status | Significado provável | O que fazer |
|---|---|---|
| API Key inválida, ausente, ou parâmetro em formato incorreto | Confira se a chave está ativa e se as datas estão em ISO 8601 |
| Recurso não encontrado (ex.: | Verifique o identificador enviado |
| Falha temporária de comunicação interna | Tente novamente com backoff exponencial (ex.: 1s, 2s, 4s) |
💡 Boa prática: implemente retry apenas para erros
5xx. Erros4xxindicam problema na requisição e vão falhar de novo do mesmo jeito.
Paginação por cursor
As rotas com maior volume de dados usam paginação por cursor em vez de paginação por número de página. O cursor é a **data de criação (created_at / createdAt) do último item recebido**: para buscar a próxima página, envie esse valor no parâmetro cursor.
Esse modelo é mais confiável que paginar por número de página porque não "pula" nem "repete" registros quando novos dados são inseridos durante a sua leitura — algo comum em bases que recebem faturas e cobranças o tempo todo.
Parâmetros:
Param | Tipo | Descrição |
|---|---|---|
| ISO 8601 | Data de criação do último item da página anterior. Omita na primeira chamada |
| number | Tamanho da página. Padrão |
Como saber que acabou:
- Em
energy-billing, a resposta devolvenextCursor. Quando ele viernull, não há mais resultados. - Nas demais rotas, continue paginando enquanto
data.length === limit. Quando vier menos itens que olimitpedido, você chegou ao fim.
Associations: trazendo dados relacionados
Várias rotas aceitam o parâmetro opcional associations, que inclui na resposta os identificadores de entidades relacionadas. Os valores são separados por vírgula.
GET /solar/customers?apikey=SUA_API_KEY&associations=plant,consumer_unit,dealIsso evita o clássico problema de fazer uma chamada para listar clientes e depois N chamadas para descobrir a quais usinas cada um pertence.
Rota | Valores aceitos em |
|---|---|
|
|
|
|
|
|
|
|
|
|
|
|
⚠️ Importante:
associationsretorna apenas os IDs das entidades relacionadas, não os objetos completos. Para obter os dados completos de um cliente a partir de um ID, useGET /solar/customers/search.
CRM
GET /crm/task — Tarefas do CRM
Retorna as tarefas (to-dos) registradas no CRM da organização. Útil para acompanhar pendências da equipe comercial ou operacional em painéis externos.
Query params: apikey (obrigatório), associations (opcional — aceita customer).
Campo | Tipo | Descrição |
|---|---|---|
| string | Identificador da tarefa |
| string | Organização dona da tarefa |
| boolean | Se a tarefa já foi concluída |
| string | Título da tarefa |
| string ou null | Descrição/detalhe |
| date | Data de vencimento |
| date ou null | Quando foi concluída ( |
| string | Prioridade |
| date | Criação / última atualização |
GET /crm/deal — Negociações (deals)
Retorna as oportunidades/negociações do CRM, com o funil e a etapa em que cada uma se encontra. É a rota indicada para espelhar o pipeline comercial em um BI ou calcular métricas de conversão.
Query params: apikey (obrigatório), associations (opcional — aceita customer).
Campo | Tipo | Descrição |
|---|---|---|
| string | Identificador do deal |
| string | Nome da negociação |
| string | Organização |
| number | Valor da negociação |
| date | Início |
| date ou null | Fim ( |
| date | Previsão de fechamento |
| string |
|
|
| Funil onde o deal está |
|
| Etapa/fase dentro do funil |
| string ou null | Motivo / descrição da perda |
| string ou null | ID em sistema externo (útil para conciliar com o seu CRM) |
| date | Criação / atualização |
POST /crm/deal/create — Criar negociação
Cria uma nova oportunidade no funil. Os campos pipeline_id e phase_id devem existir previamente na plataforma — consulte-os no GDASH antes de integrar.
Body:
Campo | Tipo | Obrigatório | Descrição |
|---|---|---|---|
| string | sim | Nome do deal |
| number | sim | Valor |
|
| sim | Responsáveis ( |
| date | sim | Data de início |
| date ou null | não | Data de fim |
| date | sim | Previsão de fechamento |
| string | sim | Funil |
| string | sim | Etapa/fase |
| string[] | sim | IDs de produtos vinculados |
| string[] | sim | IDs de empresas vinculadas |
| string[] | sim | IDs de pessoas vinculadas |
| string | sim |
|
| string[] | sim | IDs de tags |
|
| sim | Com quem o deal é compartilhado |
| object[] | não | Campos personalizados |
Solar
GET /solar/plants — Usinas
Retorna as usinas de geração da organização. Cada usina pode trazer suas instalações (unidades consumidoras) em installations.
Query params: apikey (obrigatório), associations (opcional — aceita customer).
Campo | Tipo | Descrição |
|---|---|---|
| string | Identificador da usina |
| string | Organização |
| string | Nome da usina |
| number | Potência instalada (kWp) |
| boolean | Se há alerta ativo |
| number ou null | Azimute dos módulos |
| number ou null | Inclinação dos módulos |
| number ou null | Investimento (CAPEX) |
| string | Credencial/integração do inversor |
| string | Fabricante do inversor |
| boolean | Se é plano gratuito |
| string | Moeda |
| string | Status operacional |
| number ou null | Fuso horário |
| date | Criação / atualização |
| UnidadeConsumidora[] | Unidades consumidoras vinculadas |
GET /solar/consumer-units — Unidades consumidoras
Retorna as unidades consumidoras (UCs) da organização, com filtros e paginação por cursor. É a rota mais direta para trabalhar com UCs sem precisar percorrer usinas ou clientes.
Query params:
Param | Tipo | Descrição |
|---|---|---|
| string | Obrigatório |
| string | Filtrar UCs de um cliente específico |
| string | Filtrar UCs vinculadas a uma usina específica |
| string | Filtrar por |
| string | Casa contra |
| string | Cidade (match exato, case-insensitive) |
| string | Estado (match exato, case-insensitive) |
| string | Distribuidora |
| enum |
|
| boolean | Filtrar apenas geradoras ou apenas consumidoras |
| string |
|
| ISO 8601 / number | Paginação por cursor |
Campos da resposta:
Campo | Tipo | Descrição |
|---|---|---|
| string | Identificador da instalação |
| string | Organização |
| string | Número da instalação |
| string ou null | Novo número (em troca de titularidade) |
| string | Nome da instalação |
| boolean | Se é unidade geradora |
| object[] | Fontes de crédito de energia |
| number | (depreciado — use |
| number | Tipo da unidade |
| number | Modalidade tarifária |
| number ou null | Percentual de desconto |
| object[] ou null | Campos personalizados da UC |
| string ou null | Endereço da unidade |
⚠️ O campo
percentualExcedenteestá depreciado. Ele existe apenas por compatibilidade e não representa mais o rateio real quando há múltiplas fontes de crédito. UseenergyCreditSourcesem integrações novas.
GET /solar/customers — Clientes
Retorna todos os clientes da organização, incluindo as usinas (plants) e as unidades consumidoras (installations) vinculadas a cada um.
Query params: apikey (obrigatório), associations (opcional — aceita deal, plant, ticket, consumer_unit, task).
Campo | Tipo | Descrição |
|---|---|---|
| string | Identificador do cliente |
| string | Organização |
| string | Nome |
| string ou null | Documento |
| string ou null | Contato |
| string ou null | Número do cliente |
| string | Concessionária de energia |
| string[] | IDs das usinas vinculadas |
| UnidadeConsumidora[] | Mesma estrutura das UCs |
| date | Criação / atualização |
GET /solar/customers/search — Buscar clientes com filtros
Mesmo retorno de /solar/customers, mas com filtros. Todos os parâmetros são opcionais e combináveis — quando você envia mais de um, eles se somam (comportamento "E", não "OU").
Esta é também a rota que você usa para resolver um ID vindo de associations em dados completos do cliente.
Param | Descrição |
|---|---|
| Busca parcial por CPF (case-insensitive) |
| Busca parcial por CNPJ (case-insensitive) |
| Busca parcial por nome (case-insensitive) |
| Busca parcial por e-mail (case-insensitive) |
| Match exato da concessionária (ex.: |
| Match exato do número do cliente |
|
|
POST /solar/customers/create — Criar cliente
Cria um cliente já vinculado a uma usina. Os campos de envio (email_sending_enabled, whatsapp_message_sending_enabled) controlam se o cliente passará a receber as comunicações automáticas da plataforma — defina-os conscientemente ao integrar, para não disparar mensagens inesperadas durante uma carga inicial de dados.
Body:
Campo | Tipo | Obrigatório | Descrição |
|---|---|---|---|
| string | sim | Usina associada ao cliente |
| boolean | sim | Habilita envio de e-mails |
| boolean | sim | Habilita envio de WhatsApp |
| string | não | Nome |
| string | não | E-mail principal |
| string | não | Telefone |
| string | não | Documento |
| string | não | Número do cliente fornecido pela concessionária |
| string | não | Concessionária (ex.: |
| string[] | não | E-mails secundários |
| string | não | Senha para desbloquear a fatura no portal da concessionária |
| string[] | não | IDs de produtos |
| object[] | não | Campos personalizados |
|
| não | Responsáveis ( |
|
| não | Compartilhamento |
GET /solar/payments/charges — Cobranças
Retorna as cobranças/pagamentos da organização. Suporta filtros e paginação por cursor. É a rota central para conciliação financeira e para acompanhar inadimplência.
Query params:
Param | Tipo | Descrição |
|---|---|---|
| string | Obrigatório |
| enum |
|
| ISO 8601 | Vencimento (exato ou intervalo) |
| ISO 8601 | Pagamento (exato ou intervalo) |
| ISO 8601 | Criação (exato ou intervalo) |
| ISO 8601 | Mês de referência (ou |
| number | Valor (exato ou intervalo) |
| string | Número da unidade consumidora |
| string | Filtrar cobranças de um cliente específico |
| string | Filtrar cobranças de uma UC específica |
| string | Concessionária |
| string | Cidade |
| ISO 8601 | Cursor de paginação ( |
| number | Tamanho da página (padrão |
Campos da resposta:
Campo | Tipo | Descrição |
|---|---|---|
| string | Identificador da cobrança |
| string | Organização |
| number | Número sequencial da cobrança |
| object | Dados do cliente (ver abaixo) |
| string[] | Unidades consumidoras cobradas |
| number | Valor da cobrança |
| string | Moeda |
| string | Mês de referência |
| string | Vencimento |
| string ou null | Data de pagamento |
| string | Status da cobrança (ver enum acima) |
| string | Método de pagamento (boleto, pix, cartão…) |
| string | Referência do documento |
| string | URL do documento/fatura |
| string ou null | Linha digitável do boleto |
| string ou null | Descrição |
| string | ID da transação |
| object | Dados do provedor de pagamento ( |
| string | Usina relacionada |
|
| Responsáveis |
| number ou null | Percentual de desconto |
| boolean | Se a cobrança deve ser unificada |
| date | Criação / atualização |
Objeto customer: id, name, document, email, phone, number, street, district, city, state.
GET /solar/payments/charges/{charge_id} — Detalhe de uma cobrança
Retorna os dados de uma cobrança específica (mesma estrutura acima), pelo charge_id.
GET /solar/energy-billing — Faturas de energia
Retorna as faturas de energia lidas pela plataforma, já estruturadas em campos — consumo, compensação, tarifas, impostos e saldo de créditos. É a rota mais rica da API e a base para relatórios de economia e de geração distribuída.
Paginação por cursor — a resposta inclui nextCursor.
Query params:
Param | Tipo | Descrição |
|---|---|---|
| string | Obrigatório |
| string | Filtrar faturas de um cliente específico |
| string | Filtrar faturas de uma UC específica |
| ISO 8601 | Cursor de paginação |
| number | Padrão |
Campos principais da resposta (data[]):
Campo | Tipo | Descrição |
|---|---|---|
| string | Identificador da fatura |
| string | Organização |
| string | Número da instalação |
| string | Número do cliente |
| string | Nome da instalação |
| string | Documento do titular |
| string | Mês de referência |
| string | Status da fatura |
| string | Concessionária |
| boolean | Se é unidade geradora |
| string | Mensagem de erro na leitura (se houver) |
| ISO 8601 | Data de emissão |
| ISO 8601 | Vencimento |
| number | Valor total da conta |
| number | Contribuição de iluminação pública (CIP/COSIP) |
| number | Outros valores |
| ISO 8601 | Leitura atual / anterior / próxima |
| string[] | IDs de clientes vinculados |
| number | Custo de disponibilidade |
| number | Tipo de instalação |
| boolean | Se recebe créditos separados |
| number | Economia gerada |
| object | Impostos (ICMS, PIS, COFINS…) |
| EnergyObject | Postos tarifários (ver abaixo) |
| string | Descrição dos créditos do mês |
| string | Linha digitável |
| ISO 8601 | Quando foi importada |
| string | Quem criou |
| ISO 8601 | Criação / atualização |
⚠️ Atenção ao campo
errorMessage. Faturas são lidas automaticamente a partir dos portais das concessionárias, e nem toda leitura é bem-sucedida. QuandoerrorMessageestiver preenchido, os valores numéricos daquela fatura podem estar incompletos ou ausentes. Sempre verifique esse campo antes de usar a fatura em cálculos financeiros.
Objeto hfp / hp / hr (EnergyObject) — detalhamento por posto tarifário:
Campo | Descrição |
|---|---|
| Consumo medido / regulado / contratado (kWh) |
| Consumo compensado (total / GD1 / GD2) |
| Tarifa (com e sem bandeiras) |
| Tarifa de compensação (com e sem bandeiras) |
| Tarifas TUSD e TE |
| Tarifas de compensação GD1 / GD2 |
| Energia injetada (medida / regulada / faturada) |
| Tarifas de injeção TUSD / TE |
| Valores totais consumido / compensado / impostos |
| Saldo / excedente de créditos |
Postos tarifários: HFP = horário fora de ponta, HP = horário de ponta, HR = horário reservado. Em instalações convencionais (baixa tensão, grupo B), normalmente **só o
hfpé preenchido** — os demais vêm zerados. Instalações de média tensão (grupo A) tipicamente trazemhfpehppreenchidos.
Ticket
GET /ticket — Chamados
Retorna os tickets/chamados (ordens de serviço) da organização.
Query params: apikey (obrigatório), associations (opcional — aceita customer).
Campo | Tipo | Descrição |
|---|---|---|
| string | Identificador do ticket |
| string | Organização |
| boolean | Se está concluído |
| string ou null | Título |
| string | Descrição do chamado |
| string ou null | Descrição da conclusão |
| string ou null | Prioridade |
| date | Data de abertura |
| date | Data de execução |
| date ou null | Data de encerramento |
| date | Criação / atualização |
Exemplos em TypeScript
1. Buscar todas as cobranças, página por página
const API_KEY = process.env.GDASH_API_KEY!;
const BASE_URL = 'https://public-api.gdash.io/api/v1';
async function getAllCharges() {
const limit = 50;
let cursor: string | undefined;
const allCharges: any[] = [];
while (true) {
const params = new URLSearchParams({ apikey: API_KEY, limit: String(limit) });
if (cursor) params.set('cursor', cursor);
const response = await fetch(`${BASE_URL}/solar/payments/charges?${params}`);
if (!response.ok) throw new Error(`Falha na API: ${response.status}`);
const { data } = await response.json();
allCharges.push(...data);
// Menos itens que o limite significa que chegamos ao fim
if (data.length < limit) break;
// O próximo cursor é o created_at do último item recebido
cursor = data[data.length - 1].created_at;
}
return allCharges;
}
2. Faturas de energia usando nextCursor
async function getEnergyBillings() {
const all: any[] = [];
let cursor: string | null = null;
do {
const params = new URLSearchParams({ apikey: API_KEY, limit: '100' });
if (cursor) params.set('cursor', cursor);
const response = await fetch(`${BASE_URL}/solar/energy-billing?${params}`);
const { data, nextCursor } = await response.json();
// Ignora faturas cuja leitura falhou antes de usar em cálculos
all.push(...data.filter((bill: any) => !bill.errorMessage));
cursor = nextCursor; // null indica fim dos resultados
} while (cursor);
return all;
}
3. Buscar um cliente e suas unidades consumidoras
async function getCustomerWithUnits(cnpj: string) {
const params = new URLSearchParams({
apikey: API_KEY,
cnpj,
associations: 'consumer_unit,plant',
});
const response = await fetch(`${BASE_URL}/solar/customers/search?${params}`);
const { data } = await response.json();
return data[0];
}
4. Criar um cliente
async function createCustomer() {
const response = await fetch(
`${BASE_URL}/solar/customers/create?apikey=${API_KEY}`,
{
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({
plant_id: 'plant_123',
name: 'Empresa Exemplo LTDA',
cnpj: '12345678000190',
email: 'contato@exemplo.com.br',
provider: 'enelsp',
// Desligue os envios durante uma carga inicial de dados
email_sending_enabled: false,
whatsapp_message_sending_enabled: false,
}),
},
);
const { ok, data } = await response.json();
return data;
}
Boas práticas de integração
Prática | Por quê |
|---|---|
Guarde a API Key em variável de ambiente | Evita vazamento por commit acidental ou exposição no front-end |
Use | Menos requisições para o mesmo volume de dados (respeite o máximo de 100 em |
Filtre no servidor, não no cliente | Use |
Prefira | Uma requisição com |
Implemente retry só para erros | Erros |
Sincronize incrementalmente | Guarde o último cursor processado e retome dali na próxima execução, em vez de reprocessar a base inteira |
Verifique | Faturas com erro de leitura podem ter valores incompletos |
Dúvidas frequentes
A API tem limite de requisições?
Não há um limite rígido publicado, mas integrações devem ser conscientes: prefira cargas incrementais e limit maior a laços de requisições pequenas e frequentes.
Consigo acessar dados de outra organização?
Não. A API Key define o escopo, e toda resposta é restrita à organização dona da chave.
O que acontece se eu gerar uma nova API Key?
A chave anterior deixa de funcionar. Atualize suas integrações antes de desabilitar a antiga.
A ordem dos resultados é garantida?
Nas rotas paginadas por cursor, os resultados vêm ordenados por data de criação — é isso que torna o cursor confiável.
Onde vejo a lista sempre atualizada de rotas e campos?
No Swagger: https://public-api.gdash.io/swagger
Atualizado em: 07/08/2026
Obrigado!
