InfoGP API
Base: https://crm.infogpdev.com · v1 · Scalar · ReDoc · Swagger · OpenAPI

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.

i
Para testar interativamente (botão Authorize + "try it out"), use a página Scalar ou o Swagger. O contrato cru está em /openapi.json.

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
!
Sem token → 401. Excesso de requisições → 429. O token identifica sua origem (carimbada no servidor); nunca o exponha publicamente sem necessidade.

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.

PassoExemplo de uso
1Consulte GET /api/v1/stores para as lojas do CRM. O id retornado é o loja_id que você envia ao criar o lead.
2Consulte GET /api/v1/brands e GET /api/v1/models?brand= para marcas e modelos (cascata).
3Crie 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 / tipoDescriçã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).

QueryDescriçã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.

QueryDescriçã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ódigoQuando acontece
400Payload inválido (telefone, loja_id ou cpf). O campo vem em detail.field.
401Token ausente ou inválido.
429Limite de requisições excedido. Tente novamente em instantes.
503Indisponibilidade temporária. Reenvie (a operação é idempotente por telefone).
InfoGP API · documentação oficial.