InfoGP API
API REST para criar leads e consultar dados do CRM da InfoGP (lojas, marcas e modelos). Como você usa — landing page, aplicativo, formulário, integração própria — é decisão sua. Base de produção: https://crm.infogpdev.com.
Visão geral
Dois recursos: criar leads (POST /api/v1/leads) e
consultar o catálogo do CRM (lojas, marcas, modelos). Todos os endpoints ficam sob
/api/v1 e exigem token. O lead é identificado pelo telefone;
reenvios do mesmo telefone não criam duplicata.
Autenticação
Envie o token no cabeçalho Authorization: Bearer <token> em toda chamada a /api/v1/*. Solicite seu token à equipe da InfoGP.
Authorization: Bearer SEU_TOKEN_AQUI
Fluxo típico
Um uso comum (você decide o seu): consultar o catálogo para oferecer opções e então criar o lead. Os GETs são independentes — use só o que precisar.
| Passo | Exemplo de uso |
|---|---|
| 1 | Consulte GET /api/v1/stores para as lojas do CRM. O id retornado é o loja_id que você envia ao criar o lead. |
| 2 | Consulte GET /api/v1/brands e GET /api/v1/models?brand= para marcas e modelos (cascata). |
| 3 | Crie o lead com POST /api/v1/leads. |
Identidade e deduplicação
O lead é identificado pelo telefone (normalizado para o formato E.164,
ex.: +5511999998888). Se o telefone já existir, a API responde
200 com {"status":"exists"} e o lead existente —
não duplica nem sobrescreve o cadastro. Telefone novo → 201
{"status":"created"}.
POST/api/v1/leads
Cria um lead no CRM. Deduplicação por telefone (ver acima). A origem é definida
no servidor a partir do token.
Parâmetros do corpo (application/json)
| Nome / tipo | Descrição |
|---|---|
| nome stringobrigatório | Nome do lead. |
| telefone stringobrigatório | Telefone com DDD. Aceita formatado ((11) 99999-8888) ou só dígitos. É normalizado para E.164 e usado como chave de identidade/deduplicação. Telefone inválido → 400. |
| loja_id integerobrigatório | Id da loja, obtido em GET /api/v1/stores. Loja inexistente/inativa → 400. |
| cpf stringopcional | CPF do lead. Validado (mód-11) quando enviado. |
| email stringopcional | E-mail do lead. |
| marca stringopcional | Marca de interesse (de GET /api/v1/brands). Aceita id ou nome. |
| modelo stringopcional | Modelo de interesse (de GET /api/v1/models). Aceita id ou nome. |
Exemplos de requisição
curl -X POST https://crm.infogpdev.com/api/v1/leads \
-H "Authorization: Bearer SEU_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"nome": "Maria da Silva",
"telefone": "(11) 99999-8888",
"loja_id": 12,
"cpf": "000.000.000-00",
"email": "maria@email.com",
"marca": "Volkswagen",
"modelo": "Tera 2026"
}'const r = await fetch("https://crm.infogpdev.com/api/v1/leads", {
method: "POST",
headers: {
"Authorization": "Bearer SEU_TOKEN",
"Content-Type": "application/json",
},
body: JSON.stringify({
nome: "Maria da Silva",
telefone: "(11) 99999-8888",
loja_id: 12,
cpf: "000.000.000-00",
email: "maria@email.com",
marca: "Volkswagen",
modelo: "Tera 2026",
}),
});
const data = await r.json(); // { lead_id, status }import requests
r = requests.post(
"https://crm.infogpdev.com/api/v1/leads",
headers={"Authorization": "Bearer SEU_TOKEN"},
json={
"nome": "Maria da Silva",
"telefone": "(11) 99999-8888",
"loja_id": 12,
"cpf": "000.000.000-00",
"email": "maria@email.com",
"marca": "Volkswagen",
"modelo": "Tera 2026",
},
)
print(r.status_code, r.json())Respostas
201 Lead criado.
{ "lead_id": "lp:5511999998888", "status": "created" }
200 Lead já existia (deduplicado por telefone) — não duplicado.
{ "lead_id": "lp:5511999998888", "status": "exists" }
400 Payload inválido — o campo problemático vem em detail.field.
{ "detail": { "error": "telefone inválido", "field": "telefone" } }
GET/api/v1/stores
Lista as lojas ativas do CRM. O id é usado como loja_id ao criar um
lead. Paginado e cacheável (Cache-Control: 300s).
| Query | Descrição |
|---|---|
| limit integeropcional | Itens por página. padrão 50, máx 200. |
| offset integeropcional | Deslocamento. padrão 0. |
curl https://crm.infogpdev.com/api/v1/stores \ -H "Authorization: Bearer SEU_TOKEN"
200
{
"items": [
{ "id": 12, "nome": "BYD Colinas", "marca": "BYD", "cidade": "São José dos Campos", "uf": "SP" }
],
"total": 55, "limit": 50, "offset": 0
}
GET/api/v1/brands
Lista as marcas disponíveis no CRM.
curl https://crm.infogpdev.com/api/v1/brands -H "Authorization: Bearer SEU_TOKEN"
200
{ "items": [ { "nome": "BYD" }, { "nome": "Volkswagen" } ], "total": 2, "limit": 2, "offset": 0 }
GET/api/v1/models
Lista os modelos de uma marca cadastrada no CRM.
| Query | Descrição |
|---|---|
| brand stringobrigatório | Marca (nome ou id) cujos modelos serão listados. |
curl "https://crm.infogpdev.com/api/v1/models?brand=Volkswagen" \ -H "Authorization: Bearer SEU_TOKEN"
200
{ "items": [ { "marca": "Volkswagen", "modelo": "Tera 2026" } ], "total": 1, "limit": 1, "offset": 0 }
Paginação
Os endpoints de lista (/stores, /brands, /models) aceitam
?limit= (padrão 50, máx 200) e ?offset=, e respondem em envelope:
{ "items": [ ... ], "total": N, "limit": L, "offset": O }
Erros
| Código | Quando acontece |
|---|---|
| 400 | Payload inválido (telefone, loja_id ou cpf). O campo vem em detail.field. |
| 401 | Token ausente ou inválido. |
| 429 | Limite de requisições excedido. Tente novamente em instantes. |
| 503 | Indisponibilidade temporária. Reenvie (a operação é idempotente por telefone). |