Visão geral
A API pública permite que qualquer sistema se integre ao provedor que usa o WebSystem Provider: plataformas de atendimento e chatbot, URA, aplicativos próprios, painéis de BI e automações. Ela é REST, recebe e devolve JSON em UTF-8, e usa nomes de campos em português.
Nesta versão você pode:
- localizar o cliente pelo CPF/CNPJ ou telefone e ver os contratos, a situação e o status de conexão;
- listar faturas e entregar a segunda via (link, PDF, PIX copia e cola e linha digitável);
- aplicar o desbloqueio de confiança, com as mesmas regras do autoatendimento;
- consultar e abrir chamados;
- consultar os planos ativos.
Cada provedor tem o seu próprio ambiente e as suas próprias chaves. A chave criada por um provedor só acessa os dados daquele provedor.
Criar uma chave
A chave é criada pelo provedor, dentro do sistema:
- Acesse Configurações → API pública e clique em Nova chave.
- Dê um nome que identifique o sistema que vai usá-la (ex.: “Chatbot da Empresa X”).
- Marque só as permissões necessárias. Opcionalmente, restrinja os IPs de origem, ajuste o limite por minuto e defina uma validade.
- Copie a chave exibida. Ela começa com
wsp_e só é mostrada uma vez.
Por padrão, apenas usuários com perfil Administrador podem criar e revogar chaves. A permissão pode ser liberada para outros perfis no card de Permissões, em Configurações → Chaves da API pública.
Autenticação
Envie a chave em toda requisição, no cabeçalho Authorization:
Authorization: Bearer wsp_SUA_CHAVE_AQUI
Se a sua ferramenta não permitir esse cabeçalho, use X-API-Key:
X-API-Key: wsp_SUA_CHAVE_AQUI
Chave inexistente, revogada ou expirada recebe 401. Chamada de um IP fora da lista
autorizada recebe 403.
Endereço da API
A API fica no mesmo endereço do painel do provedor, seguido de /api/v1.
O endereço exato aparece em Configurações → API pública, com botão para copiar.
https://painel.seuprovedor.com.br/api/v1
A API é feita para ser chamada de servidor para servidor. Não use a chave em código que roda no navegador ou em aplicativo instalado no celular do assinante: qualquer pessoa conseguiria lê-la. Nesses casos, chame a API a partir do seu backend.
Formato das respostas
Toda resposta de sucesso tem "sucesso": true e os dados em dados:
{
"sucesso": true,
"dados": { "id": 5, "nome": "João Silva" }
}
Convenções:
- Datas sem hora no formato
AAAA-MM-DD; data e hora em ISO 8601, em UTC (2026-10-13T15:04:05.000Z). - Valores em reais como número decimal com 2 casas (
99.9= R$ 99,90). - Situações e tipos em minúsculas e sem acento (
ativo,bloqueado,vencida). - Campo sem informação vem como
null, nunca omitido.
Paginação
Listas aceitam pagina (começa em 1) e por_pagina (padrão 20, máximo 100), e
devolvem o bloco paginacao:
{
"sucesso": true,
"dados": [ ... ],
"paginacao": { "pagina": 1, "por_pagina": 20, "total": 134, "total_paginas": 7 }
}
Erros
Em caso de erro, a resposta tem "sucesso": false e um código estável, que o seu sistema pode tratar:
{
"sucesso": false,
"erro": { "codigo": "permissao_insuficiente", "mensagem": "Esta chave não tem a permissão \"financeiro:leitura\"." }
}
| HTTP | Código | Quando acontece |
|---|---|---|
| 400 | parametro_invalido | Parâmetro ou corpo fora do formato esperado. A mensagem diz qual campo. |
| 400 | cpf_cnpj_invalido · telefone_invalido · id_invalido | Valor de busca inválido. |
| 401 | chave_ausente · chave_invalida | Chave não enviada ou inexistente. |
| 401 | chave_revogada · chave_expirada | A chave foi revogada pelo provedor ou passou da validade. |
| 403 | ip_nao_autorizado | A chamada veio de um IP fora da lista autorizada da chave. |
| 403 | permissao_insuficiente | A chave não tem a permissão exigida pela rota. |
| 404 | nao_encontrado · rota_inexistente | Registro ou rota inexistente. |
| 409 | desbloqueio_ativo | O contrato já está com desbloqueio de confiança em vigor. |
| 422 | ver cada endpoint | A regra de negócio não permite a ação (ex.: contrato_nao_bloqueado). |
| 429 | limite_excedido | Limite de requisições por minuto atingido. Veja limites. |
| 500 | erro_interno | Falha inesperada. Tente de novo; se persistir, fale com o suporte. |
Limites de uso
Cada chave tem um limite de requisições por minuto, definido pelo provedor na criação (padrão 120/min, até 1.200/min). Toda resposta informa o consumo:
| Cabeçalho | Significado |
|---|---|
X-RateLimit-Limit | Requisições permitidas por minuto. |
X-RateLimit-Remaining | Quantas ainda restam na janela atual. |
X-RateLimit-Reset | Segundos até a janela reiniciar. |
Retry-After | Só na resposta 429: segundos para tentar de novo. |
Ao receber 429, aguarde o tempo de Retry-After antes de repetir. Não repita em loop.
Permissões
Cada rota exige uma permissão, marcada pelo provedor ao criar a chave:
| Permissão | Libera |
|---|---|
clientes:leitura | Consultar clientes e contratos. |
financeiro:leitura | Consultar faturas e segunda via. |
contratos:desbloqueio | Aplicar desbloqueio de confiança. |
chamados:leitura | Consultar chamados. |
chamados:escrita | Abrir chamados. |
planos:leitura | Consultar planos ativos. |
Endpoints
Nos exemplos, troque $API pelo endereço da API do provedor e $CHAVE pela chave.
Testar a chave
Confirma que a chave funciona e mostra o provedor e as permissões dela. Use para testar a integração.
curl "$API/status" -H "Authorization: Bearer $CHAVE"
{
"sucesso": true,
"dados": {
"provedor": "Fibra Exemplo Telecom",
"chave": "Chatbot da Empresa X",
"permissoes": ["clientes:leitura", "financeiro:leitura"],
"versao": "v1"
}
}
Listar ou buscar clientes
Sem filtros, lista todos os clientes. Com cpf_cnpj, encontra o cliente pelo documento, com ou sem pontuação. Cada cliente vem com os contratos.
Parâmetros (query)
| Nome | Descrição |
|---|---|
cpf_cnpj | CPF (11 dígitos) ou CNPJ (14 dígitos). |
telefone | Telefone com DDD. Compara pelos últimos 8 dígitos. |
situacao | ativo, bloqueado, cancelado, inativo, observacao ou pre_cadastro. |
pagina, por_pagina | Paginação. |
curl "$API/clientes?cpf_cnpj=123.456.789-09" -H "Authorization: Bearer $CHAVE"
{
"sucesso": true,
"dados": [
{
"id": 5,
"nome": "João Silva",
"nome_fantasia": null,
"tipo": "pf",
"cpf_cnpj": "123.456.789-09",
"email": "joao@email.com",
"telefones": ["95999990000"],
"situacao": "ativo",
"data_nascimento": null,
"criado_em": "2026-01-10T12:00:00.000Z",
"endereco": { "cep": "69300000", "logradouro": "Rua A", "numero": "10", "complemento": null, "bairro": "Centro", "cidade": "Boa Vista", "uf": "RR" },
"contratos": [
{
"id": 10,
"cliente_id": 5,
"situacao": "ativo",
"conexao": "online",
"tipo_conexao": "pppoe",
"login": "joao",
"mac": null,
"ip": "100.64.0.10",
"tipo_cobranca": "pos_pago",
"dia_vencimento": 10,
"valor": 99.9,
"ativado_em": "2026-01-15",
"bloqueado_em": null,
"desbloqueio_confianca": { "ativo": false, "ate": null },
"plano": { "id": 3, "nome": "300 Mega", "download_mbps": 300, "upload_mbps": 150 },
"endereco_instalacao": { "cep": "69300000", "logradouro": "Rua A", "numero": "10", "complemento": null, "bairro": "Centro", "cidade": "Boa Vista", "uf": "RR" }
}
]
}
],
"paginacao": { "pagina": 1, "por_pagina": 20, "total": 1, "total_paginas": 1 }
}
situacao do contrato: pendente, ativo, bloqueado, inativo,
cancelado ou cancelado_definitivo. conexao: online,
offline ou desconhecido. tipo_cobranca: pos_pago,
pre_pago ou isento.
Consultar um cliente
Mesmo formato de um item de /clientes, com os contratos.
curl "$API/clientes/5" -H "Authorization: Bearer $CHAVE"
Consultar um contrato
Mesmo formato do contrato dentro do cliente: situação, status de conexão, plano, valor, vencimento e desbloqueio de confiança em vigor.
curl "$API/contratos/10" -H "Authorization: Bearer $CHAVE"
Aplicar desbloqueio de confiança
Libera a conexão de um contrato bloqueado por falta de pagamento, pelo prazo definido nas regras de cobrança do provedor. Valem as mesmas regras do autoatendimento (Central do Assinante e WhatsApp):
- o desbloqueio de confiança precisa estar habilitado nas regras de cobrança do provedor;
- o contrato precisa estar bloqueado por cobrança: bloqueio feito manualmente pelo provedor só sai pelo atendimento;
- depois do primeiro uso, um novo desbloqueio só é liberado quando a fatura que motivou o anterior for quitada.
Corpo (opcional)
| Campo | Descrição |
|---|---|
motivo | Texto livre, até 500 caracteres. Aparece no histórico do contrato. |
curl -X POST "$API/contratos/10/desbloqueio-confianca" \
-H "Authorization: Bearer $CHAVE" -H "Content-Type: application/json" \
-d '{"motivo": "Cliente informou que paga amanhã"}'
{
"sucesso": true,
"dados": { "contrato_id": 10, "dias": 3, "ate": "2026-10-16T15:00:00.000Z" }
}
Recusas possíveis
| HTTP | Código | Significado |
|---|---|---|
| 422 | desbloqueio_desabilitado | O provedor não habilitou o desbloqueio de confiança. |
| 422 | contrato_nao_bloqueado | O contrato não está bloqueado. |
| 422 | bloqueio_manual | O bloqueio foi feito pelo provedor; só o atendimento libera. |
| 422 | fatura_anterior_em_aberto | O desbloqueio já foi usado e a fatura anterior não foi paga. |
| 409 | desbloqueio_ativo | Já existe um desbloqueio em vigor. |
Listar faturas
Lista faturas, da mais recente para a mais antiga. As faturas em aberto já vêm com a segunda via.
Parâmetros (query)
| Nome | Descrição |
|---|---|
cliente_id | Faturas de um cliente. |
contrato_id | Faturas de um contrato. |
situacao | aberta (pendente + vencida), pendente, vencida, paga, cancelada, estornada ou todas (padrão). |
vencimento_de, vencimento_ate | Período de vencimento, no formato AAAA-MM-DD. |
pagina, por_pagina | Paginação. |
curl "$API/faturas?cliente_id=5&situacao=aberta" -H "Authorization: Bearer $CHAVE"
{
"sucesso": true,
"dados": [
{
"id": 77,
"cliente_id": 5,
"contrato_id": 10,
"descricao": "Mensalidade 300 Mega",
"situacao": "vencida",
"tipo": "boleto",
"valor": 99.9,
"valor_atualizado": null,
"valor_pago": 0,
"vencimento": "2026-10-10",
"emitida_em": "2026-09-25T10:00:00.000Z",
"pago_em": null,
"segunda_via": {
"link_pagamento": "https://banco.exemplo/boleto/77",
"pdf": "https://banco.exemplo/boleto/77.pdf",
"pagina_pix": "https://painel.seuprovedor.com.br/api/billings/77/pix",
"pix_copia_cola": "00020126580014br.gov.bcb.pix...",
"linha_digitavel": "23793.38128 60000.000003 00000.000000 1 00000000000000",
"codigo_barras": "23791000000000000003381286000000000000000000"
}
}
],
"paginacao": { "pagina": 1, "por_pagina": 20, "total": 1, "total_paginas": 1 }
}
segunda_viasó vem preenchida em fatura pendente ou vencida; nas demais énull.- Cada campo da segunda via pode ser
null, conforme o banco e o tipo de cobrança. Fatura só PIX não tem linha digitável. pagina_pixé a página de pagamento PIX do provedor. O QR é gerado de novo a cada abertura, então o link não expira.valor_atualizadoaparece quando o PIX foi recalculado com multa e juros: é o valor a pagar hoje.tipo:boleto,pix,carneoucarteira.
Consultar uma fatura
Mesmo formato de um item de /faturas, com a segunda via quando em aberto.
curl "$API/faturas/77" -H "Authorization: Bearer $CHAVE"
Listar chamados
Parâmetros (query)
| Nome | Descrição |
|---|---|
cliente_id, contrato_id | Filtra por cliente ou contrato. |
situacao | aberto, pendente, pendente_terceiro, em_andamento, reaberto, solucionado, cancelado ou em_aberto (todos que ainda não foram encerrados). |
pagina, por_pagina | Paginação. |
curl "$API/chamados?cliente_id=5&situacao=em_aberto" -H "Authorization: Bearer $CHAVE"
{
"sucesso": true,
"dados": [
{
"id": 300,
"cliente_id": 5,
"contrato_id": 10,
"situacao": "aberto",
"prioridade": "alta",
"categoria": "TECNICO",
"assunto": "Sem internet",
"descricao": "Luz vermelha no roteador desde ontem.",
"solucao": null,
"aberto_em": "2026-10-13T12:00:00.000Z",
"fechado_em": null,
"agendado_para": null
}
],
"paginacao": { "pagina": 1, "por_pagina": 20, "total": 1, "total_paginas": 1 }
}
Antes de abrir um chamado novo, consulte os chamados em_aberto do cliente para não duplicar o atendimento.
Consultar um chamado
curl "$API/chamados/300" -H "Authorization: Bearer $CHAVE"
Abrir chamado
O chamado entra na fila do provedor como qualquer outro, e a equipe recebe o aviso de chamado novo com origem API.
Corpo
| Campo | Descrição |
|---|---|
cliente_id * | Cliente do chamado. |
contrato_id | Contrato relacionado (precisa ser do mesmo cliente). |
assunto * | De 3 a 300 caracteres. |
descricao * | De 3 a 5.000 caracteres. |
prioridade | baixa, normal (padrão), alta ou urgente. |
categoria | TECNICO, FINANCEIRO, COMERCIAL, INSTALACAO, CANCELAMENTO ou OUTRO. |
curl -X POST "$API/chamados" \
-H "Authorization: Bearer $CHAVE" -H "Content-Type: application/json" \
-d '{
"cliente_id": 5,
"contrato_id": 10,
"assunto": "Sem internet",
"descricao": "Luz vermelha no roteador desde ontem. Cliente prefere visita pela manhã.",
"prioridade": "alta",
"categoria": "TECNICO"
}'
Responde 201 com o chamado criado, no mesmo formato de /chamados/{id}.
Listar planos ativos
curl "$API/planos" -H "Authorization: Bearer $CHAVE"
{
"sucesso": true,
"dados": [
{ "id": 3, "nome": "300 Mega", "download_mbps": 300, "upload_mbps": 150, "valor": 99.9, "tecnologia": "FIBRA", "descricao": null }
]
}
Exemplo: fluxo de chatbot
Um atendimento típico de segunda via e desbloqueio pelo WhatsApp:
- 1. O assinante informa o CPF →
GET /clientes?cpf_cnpj=.... - 2. Se houver mais de um contrato, pergunte qual. A situação e a
conexaode cada um ajudam a orientar. - 3. Pediu o boleto →
GET /faturas?contrato_id=...&situacao=abertae envie olink_pagamentoou opix_copia_cola. - 4. Contrato
bloqueadoe o cliente promete pagar →POST /contratos/{id}/desbloqueio-confianca. Em caso de recusa, amensagemjá explica o motivo ao cliente. - 5. Problema técnico → consulte
GET /chamados?cliente_id=...&situacao=em_aberto; se não houver chamado sobre o mesmo assunto,POST /chamados.
Segurança e boas práticas
- Guarde a chave como senha. Nunca a coloque em código de navegador, aplicativo de celular, repositório público ou URL.
- Uma chave por sistema. Assim o provedor revoga só o que precisa, e a auditoria mostra quem fez cada ação.
- Permissões mínimas e, sempre que possível, restrição de IP ao servidor da integração.
- Revogue a chave assim que a integração deixar de ser usada ou houver suspeita de vazamento. A revogação vale na hora.
- Toda ação que altera dados (desbloqueio, abertura de chamado) aparece na Auditoria de Usuários do provedor, com o nome da chave e o IP de origem.
- A API devolve dados pessoais de assinantes. Quem integra é responsável por tratá-los conforme a LGPD, só para a finalidade combinada com o provedor.
Versões e mudanças
A versão faz parte do endereço (/api/v1). Dentro da v1, nenhum campo existente muda de
nome ou de tipo, e nenhum é removido. Podem entrar campos e rotas novos, então ignore campos que o seu
sistema não conhece. Mudanças incompatíveis, se um dia forem necessárias, virão numa /api/v2,
com a v1 mantida por um período de transição.
| Data | Mudança |
|---|---|
| 13/10/2026 | Lançamento da v1: clientes, contratos, faturas e segunda via, desbloqueio de confiança, chamados e planos. |
Suporte
Dúvidas técnicas sobre a integração podem ser enviadas pelos nossos canais. Para pedir acesso a um provedor específico, fale diretamente com ele: as chaves são criadas e controladas pelo próprio provedor.
- E-mail: websystemprovider@gmail.com
- WhatsApp: (95) 98109-6166