Primeiros passos
Siga as etapas na ordem. Ao final, seu sistema estará autenticado, lendo dados, gravando com segurança e recebendo eventos do Mapogos.
- Acesso ao painel Mapogos com permissão Gerenciar API (ou alguém da locadora que tenha).
- Um terminal com
curl— ou PHP, Node.js ou Python, se preferir testar já no seu código.
Crie a chave de API no painel
No painel do Mapogos, abra o menu Integrações → API do Sistema e clique em Criar nova API. O assistente tem 5 etapas:
- Identificação — dê um nome que diga quem vai usar (ex.: Painel BI Financeiro), escolha o ambiente e as carteiras.
- Permissões — marque, módulo por módulo, o que a integração pode fazer: Ler, Criar, Atualizar, Excluir, Exportar e LGPD (dados pessoais sem máscara). Libere só o necessário.
- Segurança — opcionalmente restrinja os IPs que podem usar a chave e ajuste o limite por minuto.
- Webhooks — opcional; pode configurar depois (etapa 10).
- Revisão — confira e clique em Criar API.
mpg_live_A1b2C3d4E5f6_••••••••••••••••CopiarGuarde a chave com segurança
A chave dá acesso aos dados da locadora: trate-a como uma senha. O jeito recomendado é uma variável de ambiente, que todos os exemplos desta documentação usam com o nome MAPOGOS_API_KEY.
- Colocar a chave no código-fonte ou em repositórios (GitHub etc.).
- Usar a chave em páginas web ou aplicativos que rodam no navegador/celular do usuário.
- Enviar a chave por e-mail ou WhatsApp em texto aberto.
Formato da chave: mpg_live_… (produção) ou mpg_test_… (ambiente de teste).
# Linux / macOS (sessão atual)
export MAPOGOS_API_KEY="mpg_live_SEU_PREFIXO_SEU_SEGREDO"# arquivo .env do seu projeto (NÃO versione este arquivo)
MAPOGOS_API_KEY=mpg_live_SEU_PREFIXO_SEU_SEGREDOREM Windows (PowerShell, permanente para o usuário)
setx MAPOGOS_API_KEY "mpg_live_SEU_PREFIXO_SEU_SEGREDO"Verifique se a API está no ar
A rota /v1/status é pública (não precisa de chave). Use-a para confirmar que seu servidor alcança a API.
Se não houver resposta, verifique firewall/proxy de saída da sua rede: a API usa somente HTTPS, porta 443.
curl https://apimapogos.sixinformatica.com/v1/status{
"sucesso": true,
"dados": {
"status": "online",
"versao": "1.0.0",
"api": "API Mapogos · SIX Informática",
"banco": "ok",
"latencia_banco_ms": 2,
"hora": "2026-10-08T14:30:00-03:00"
},
"request_id": "req_a1b2c3d4e5f6a7b8c9d0"
}Faça a primeira chamada autenticada
Envie a chave no cabeçalho Authorization: Bearer <sua-chave>. A rota /v1/me devolve os dados da própria chave — ótima para validar a configuração e ver quais permissões ela tem.
| Se receber… | Significa | O que fazer |
|---|---|---|
401 nao_autenticado | O cabeçalho não chegou | Confira o nome Authorization e a palavra Bearer + espaço |
401 chave_invalida | Chave errada ou incompleta | Copie de novo; ela tem 3 partes separadas por "_" |
401 chave_suspensa | Suspensa no painel | Peça a reativação ao administrador |
403 ip_nao_permitido | IP fora da lista da chave | Inclua o IP do seu servidor na chave |
curl -X GET "https://apimapogos.sixinformatica.com/v1/me" \
-H "Authorization: Bearer $MAPOGOS_API_KEY"<?php
$ch = curl_init('https://apimapogos.sixinformatica.com/v1/me');
curl_setopt_array($ch, [
CURLOPT_CUSTOMREQUEST => 'GET',
CURLOPT_RETURNTRANSFER => true,
CURLOPT_HTTPHEADER => [
'Authorization: Bearer ' . getenv('MAPOGOS_API_KEY'),
],
]);
$resposta = json_decode(curl_exec($ch), true);
$http = curl_getinfo($ch, CURLINFO_RESPONSE_CODE);
if ($resposta['sucesso']) {
print_r($resposta['dados']);
} else {
echo $resposta['erro']['mensagem'];
}const resposta = await fetch('https://apimapogos.sixinformatica.com/v1/me', {
method: 'GET',
headers: {
Authorization: `Bearer ${process.env.MAPOGOS_API_KEY}`,
},
});
const json = await resposta.json();
if (json.sucesso) console.log(json.dados);
else console.error(json.erro.mensagem);import os, uuid, requests
resposta = requests.request(
"GET",
"https://apimapogos.sixinformatica.com/v1/me",
headers={"Authorization": f"Bearer {os.environ['MAPOGOS_API_KEY']}"},
timeout=30,
)
json = resposta.json()
print(json["dados"] if json["sucesso"] else json["erro"]["mensagem"]){
"sucesso": true,
"dados": {
"id": 7,
"nome": "Painel BI Financeiro",
"prefixo": "mpg_live_A1b2C3d4E5f6",
"ambiente": "live",
"status": "ativa",
"carteiras": [
"mapogos",
"premium"
],
"limite_por_minuto": 120,
"expira_em": null,
"permissoes": {
"clientes": [
"ler"
],
"pagamentos": [
"ler",
"exportar"
]
}
},
"request_id": "req_0a1b2c3d4e5f6a7b8c9d"
}Liste registros
Toda listagem segue o padrão GET /v1/{modulo}. A resposta traz os registros em dados e as informações de paginação em meta.
| Campo da resposta | O que contém |
|---|---|
dados | Lista de registros da página atual |
meta.total | Total de registros que atendem ao filtro |
meta.pagina / meta.paginas | Página atual / total de páginas |
meta.dados_pessoais | "mascarados" quando a chave não tem permissão LGPD |
request_id | Identificador da chamada — informe ao suporte se precisar |
***.982.247-**, *******5432. Veja Dados pessoais e carteiras.curl -X GET "https://apimapogos.sixinformatica.com/v1/clientes?por_pagina=2" \
-H "Authorization: Bearer $MAPOGOS_API_KEY"<?php
$ch = curl_init('https://apimapogos.sixinformatica.com/v1/clientes?por_pagina=2');
curl_setopt_array($ch, [
CURLOPT_CUSTOMREQUEST => 'GET',
CURLOPT_RETURNTRANSFER => true,
CURLOPT_HTTPHEADER => [
'Authorization: Bearer ' . getenv('MAPOGOS_API_KEY'),
],
]);
$resposta = json_decode(curl_exec($ch), true);
$http = curl_getinfo($ch, CURLINFO_RESPONSE_CODE);
if ($resposta['sucesso']) {
print_r($resposta['dados']);
} else {
echo $resposta['erro']['mensagem'];
}const resposta = await fetch('https://apimapogos.sixinformatica.com/v1/clientes?por_pagina=2', {
method: 'GET',
headers: {
Authorization: `Bearer ${process.env.MAPOGOS_API_KEY}`,
},
});
const json = await resposta.json();
if (json.sucesso) console.log(json.dados);
else console.error(json.erro.mensagem);import os, uuid, requests
resposta = requests.request(
"GET",
"https://apimapogos.sixinformatica.com/v1/clientes?por_pagina=2",
headers={"Authorization": f"Bearer {os.environ['MAPOGOS_API_KEY']}"},
timeout=30,
)
json = resposta.json()
print(json["dados"] if json["sucesso"] else json["erro"]["mensagem"]){
"sucesso": true,
"dados": [
{
"id": 1024,
"name": "Maria Fernanda Souza",
"cpf_cnpj": "***.982.247-**",
"phone": "*******5432",
"city": "Belém",
"uf": "PA",
"created_at": "2026-03-02T10:15:00-03:00"
}
],
"meta": {
"total": 655,
"pagina": 1,
"por_pagina": 2,
"paginas": 328,
"dados_pessoais": "mascarados"
},
"request_id": "req_9f8e7d6c5b4a39281706"
}Percorra todas as páginas
Use pagina e por_pagina (máximo 200). Repita aumentando a página até chegar em meta.paginas.
Para volumes muito grandes (carga inicial de BI), prefira a exportação por cursor, que é mais rápida e estável.
429, aguarde os segundos indicados no cabeçalho Retry-After.<?php
$pagina = 1;
do {
$ch = curl_init('https://apimapogos.sixinformatica.com/v1/clientes?por_pagina=200&pagina=' . $pagina);
curl_setopt_array($ch, [CURLOPT_RETURNTRANSFER => true,
CURLOPT_HTTPHEADER => ['Authorization: Bearer ' . getenv('MAPOGOS_API_KEY')]]);
$r = json_decode(curl_exec($ch), true);
foreach ($r['dados'] as $cliente) {
salvarNoMeuSistema($cliente);
}
$pagina++;
} while ($pagina <= $r['meta']['paginas']);let pagina = 1, paginas = 1;
do {
const r = await fetch(`https://apimapogos.sixinformatica.com/v1/clientes?por_pagina=200&pagina=${pagina}`, {
headers: { Authorization: `Bearer ${process.env.MAPOGOS_API_KEY}` },
}).then(res => res.json());
for (const cliente of r.dados) await salvarNoMeuSistema(cliente);
paginas = r.meta.paginas;
pagina++;
} while (pagina <= paginas);import os, requests
H = {"Authorization": f"Bearer {os.environ['MAPOGOS_API_KEY']}"}
pagina, paginas = 1, 1
while pagina <= paginas:
r = requests.get("https://apimapogos.sixinformatica.com/v1/clientes",
params={"por_pagina": 200, "pagina": pagina}, headers=H, timeout=30).json()
for cliente in r["dados"]:
salvar_no_meu_sistema(cliente)
paginas = r["meta"]["paginas"]
pagina += 1Filtre, ordene e escolha os campos
Combine parâmetros na URL para trazer exatamente o que precisa:
| Parâmetro | Exemplo | Efeito |
|---|---|---|
| filtro por campo | status=pago | Somente registros com esse valor |
| vários valores | status=pendente,vencido | Qualquer um dos valores |
| período | criado_desde=2026-10-01 | Criados a partir da data |
| ordenação | ordenar=-paid_at | "-" = do maior para o menor |
| campos | campos=id,amount,paid_at | Resposta só com esses campos |
| busca | q=logan | Busca textual nos campos do módulo |
Os filtros e ordenações aceitos por cada módulo estão na referência. Um parâmetro desconhecido retorna 400 — de propósito, para que um erro de digitação nunca devolva dados sem filtro.
curl -X GET "https://apimapogos.sixinformatica.com/v1/pagamentos?status=pago&criado_desde=2026-10-01&ordenar=-paid_at&campos=id,rental_id,amount,paid_at" \
-H "Authorization: Bearer $MAPOGOS_API_KEY"<?php
$ch = curl_init('https://apimapogos.sixinformatica.com/v1/pagamentos?status=pago&criado_desde=2026-10-01&ordenar=-paid_at&campos=id,rental_id,amount,paid_at');
curl_setopt_array($ch, [
CURLOPT_CUSTOMREQUEST => 'GET',
CURLOPT_RETURNTRANSFER => true,
CURLOPT_HTTPHEADER => [
'Authorization: Bearer ' . getenv('MAPOGOS_API_KEY'),
],
]);
$resposta = json_decode(curl_exec($ch), true);
$http = curl_getinfo($ch, CURLINFO_RESPONSE_CODE);
if ($resposta['sucesso']) {
print_r($resposta['dados']);
} else {
echo $resposta['erro']['mensagem'];
}const resposta = await fetch('https://apimapogos.sixinformatica.com/v1/pagamentos?status=pago&criado_desde=2026-10-01&ordenar=-paid_at&campos=id,rental_id,amount,paid_at', {
method: 'GET',
headers: {
Authorization: `Bearer ${process.env.MAPOGOS_API_KEY}`,
},
});
const json = await resposta.json();
if (json.sucesso) console.log(json.dados);
else console.error(json.erro.mensagem);import os, uuid, requests
resposta = requests.request(
"GET",
"https://apimapogos.sixinformatica.com/v1/pagamentos?status=pago&criado_desde=2026-10-01&ordenar=-paid_at&campos=id,rental_id,amount,paid_at",
headers={"Authorization": f"Bearer {os.environ['MAPOGOS_API_KEY']}"},
timeout=30,
)
json = resposta.json()
print(json["dados"] if json["sucesso"] else json["erro"]["mensagem"]){
"sucesso": true,
"dados": [
{
"id": 88231,
"rental_id": 1024,
"amount": "450.00",
"paid_at": "2026-10-08T09:12:44-03:00"
}
],
"meta": {
"total": 1,
"pagina": 1,
"por_pagina": 50,
"paginas": 1
},
"request_id": "req_1a2b3c4d5e6f7a8b9c0d"
}Busque só o que mudou (sincronização)
Depois da carga inicial, não baixe tudo de novo. Guarde a hora em que a sincronização começou e, na próxima vez, peça apenas o que foi criado ou alterado desde então com atualizado_desde.
- Anote a hora atual (
inicio) antes de chamar a API. - Busque
?atualizado_desde=<última sincronização>e percorra as páginas. - Grave/atualize os registros no seu sistema pelo
id. - Salve
iniciocomo a nova "última sincronização".
import os, requests, datetime
H = {"Authorization": f"Bearer {os.environ['MAPOGOS_API_KEY']}"}
ultima = ler_ultima_sincronizacao() # ex.: "2026-10-08T09:00:00-03:00"
inicio = datetime.datetime.now().astimezone().isoformat(timespec="seconds")
pagina, paginas = 1, 1
while pagina <= paginas:
r = requests.get("https://apimapogos.sixinformatica.com/v1/pagamentos", headers=H, timeout=30,
params={"atualizado_desde": ultima, "por_pagina": 200, "pagina": pagina}).json()
for p in r["dados"]:
gravar_ou_atualizar(p["id"], p)
paginas, pagina = r["meta"]["paginas"], pagina + 1
salvar_ultima_sincronizacao(inicio)<?php
$ultima = lerUltimaSincronizacao(); // ex.: '2026-10-08T09:00:00-03:00'
$inicio = date('c');
$pagina = 1;
do {
$url = 'https://apimapogos.sixinformatica.com/v1/pagamentos?' . http_build_query([
'atualizado_desde' => $ultima, 'por_pagina' => 200, 'pagina' => $pagina]);
$ch = curl_init($url);
curl_setopt_array($ch, [CURLOPT_RETURNTRANSFER => true,
CURLOPT_HTTPHEADER => ['Authorization: Bearer ' . getenv('MAPOGOS_API_KEY')]]);
$r = json_decode(curl_exec($ch), true);
foreach ($r['dados'] as $p) gravarOuAtualizar($p['id'], $p);
$pagina++;
} while ($pagina <= $r['meta']['paginas']);
salvarUltimaSincronizacao($inicio);Grave um registro
Para criar use POST; para alterar parte de um registro, PATCH. Envie o corpo em JSON com o cabeçalho Content-Type: application/json (a chave precisa da permissão Criar ou Atualizar no módulo).
Sempre envie o cabeçalho Idempotency-Key com um identificador único da operação. Se a conexão cair e você reenviar, a API devolve a mesma resposta em vez de criar um registro duplicado.
Se algum campo estiver errado, a API responde 422 listando todos os problemas de uma vez em erro.detalhes:
{
"sucesso": false,
"erro": {
"codigo": "validacao",
"mensagem": "2 campos inválidos.",
"detalhes": [
{
"campo": "cpf_cnpj",
"mensagem": "CPF/CNPJ inválido."
},
{
"campo": "email",
"mensagem": "E-mail inválido."
}
]
},
"request_id": "req_5e6f7a8b9c0d1e2f3a4b"
}curl -X POST "https://apimapogos.sixinformatica.com/v1/clientes" \
-H "Authorization: Bearer $MAPOGOS_API_KEY" \
-H "Content-Type: application/json" \
-H "Idempotency-Key: $(uuidgen)" \
-d '{"name":"Maria Fernanda Souza","cpf_cnpj":"529.982.247-25","phone":"(91) 99876-5432","email":"maria@exemplo.com.br","city":"Belém","uf":"PA"}'<?php
$ch = curl_init('https://apimapogos.sixinformatica.com/v1/clientes');
curl_setopt_array($ch, [
CURLOPT_CUSTOMREQUEST => 'POST',
CURLOPT_RETURNTRANSFER => true,
CURLOPT_HTTPHEADER => [
'Authorization: Bearer ' . getenv('MAPOGOS_API_KEY'),
'Content-Type: application/json',
'Idempotency-Key: ' . bin2hex(random_bytes(16)),
],
CURLOPT_POSTFIELDS => json_encode([
'name' => 'Maria Fernanda Souza',
'cpf_cnpj' => '529.982.247-25',
'phone' => '(91) 99876-5432',
'email' => 'maria@exemplo.com.br',
'city' => 'Belém',
'uf' => 'PA',
]),
]);
$resposta = json_decode(curl_exec($ch), true);
$http = curl_getinfo($ch, CURLINFO_RESPONSE_CODE);
if ($resposta['sucesso']) {
print_r($resposta['dados']);
} else {
echo $resposta['erro']['mensagem'];
}const resposta = await fetch('https://apimapogos.sixinformatica.com/v1/clientes', {
method: 'POST',
headers: {
Authorization: `Bearer ${process.env.MAPOGOS_API_KEY}`,
'Content-Type': 'application/json',
'Idempotency-Key': crypto.randomUUID(),
},
body: JSON.stringify({
"name": "Maria Fernanda Souza",
"cpf_cnpj": "529.982.247-25",
"phone": "(91) 99876-5432",
"email": "maria@exemplo.com.br",
"city": "Belém",
"uf": "PA"
}),
});
const json = await resposta.json();
if (json.sucesso) console.log(json.dados);
else console.error(json.erro.mensagem);import os, uuid, requests
resposta = requests.request(
"POST",
"https://apimapogos.sixinformatica.com/v1/clientes",
headers={"Authorization": f"Bearer {os.environ['MAPOGOS_API_KEY']}",
"Idempotency-Key": str(uuid.uuid4())},
json={
"name": "Maria Fernanda Souza",
"cpf_cnpj": "529.982.247-25",
"phone": "(91) 99876-5432",
"email": "maria@exemplo.com.br",
"city": "Belém",
"uf": "PA"
},
timeout=30,
)
json = resposta.json()
print(json["dados"] if json["sucesso"] else json["erro"]["mensagem"]){
"sucesso": true,
"dados": {
"id": 1031,
"name": "Maria Fernanda Souza",
"cpf_cnpj": "52998224725",
"phone": "91998765432",
"email": "maria@exemplo.com.br",
"city": "Belém",
"uf": "PA",
"created_at": "2026-10-08T14:32:10-03:00"
},
"request_id": "req_7b8c9d0e1f2a3b4c5d6e"
}Receba eventos em tempo real (webhooks)
Com webhooks, o Mapogos chama uma URL do seu sistema quando algo acontece — por exemplo pagamento.confirmado ou veiculo.bloqueado.
- Crie no seu sistema um endereço https que aceite
POSTcom JSON. - No painel: API do Sistema → Webhooks → Novo webhook, informe a URL e escolha os eventos.
- Copie o segredo exibido (uma única vez) e use-o para validar a assinatura de cada aviso.
- Clique em Testar para receber um evento de teste.
- Responda
200em até 10 segundos; processe o restante em segundo plano.
Lista de eventos, formato do aviso e validação da assinatura: Webhooks.
<?php
// webhook.php — recebe avisos do Mapogos
$segredo = getenv('MAPOGOS_WEBHOOK_SECRET');
$corpo = file_get_contents('php://input');
$ts = $_SERVER['HTTP_X_MAPOGOS_TIMESTAMP'] ?? '';
$assin = $_SERVER['HTTP_X_MAPOGOS_ASSINATURA'] ?? '';
$esperado = 'sha256=' . hash_hmac('sha256', $ts . '.' . $corpo, $segredo);
if (!hash_equals($esperado, $assin) || abs(time() - (int)$ts) > 300) {
http_response_code(401);
exit;
}
$evento = json_decode($corpo, true);
if (!jaProcessado($evento['id'])) { // evita processar duas vezes
enfileirar($evento); // processe depois, responda rápido
}
http_response_code(200);import crypto from 'node:crypto';
import express from 'express';
const app = express();
app.post('/webhooks/mapogos', express.raw({ type: 'application/json' }), (req, res) => {
const ts = req.get('X-Mapogos-Timestamp');
const assin = req.get('X-Mapogos-Assinatura') || '';
const esperado = 'sha256=' + crypto
.createHmac('sha256', process.env.MAPOGOS_WEBHOOK_SECRET)
.update(`${ts}.${req.body}`)
.digest('hex');
const valido = assin.length === esperado.length &&
crypto.timingSafeEqual(Buffer.from(assin), Buffer.from(esperado));
if (!valido || Math.abs(Date.now() / 1000 - Number(ts)) > 300) return res.sendStatus(401);
const evento = JSON.parse(req.body);
enfileirar(evento); // processe depois
res.sendStatus(200);
});import hmac, hashlib, os, time, json
from flask import Flask, request, abort
app = Flask(__name__)
@app.post("/webhooks/mapogos")
def mapogos():
corpo = request.get_data()
ts = request.headers.get("X-Mapogos-Timestamp", "")
assin = request.headers.get("X-Mapogos-Assinatura", "")
esperado = "sha256=" + hmac.new(os.environ["MAPOGOS_WEBHOOK_SECRET"].encode(),
ts.encode() + b"." + corpo, hashlib.sha256).hexdigest()
if not hmac.compare_digest(esperado, assin) or abs(time.time() - int(ts or 0)) > 300:
abort(401)
evento = json.loads(corpo)
enfileirar(evento) # processe depois
return "", 200Leve para produção
Antes de ligar a integração de verdade, confira:
- A chave fica em variável de ambiente ou cofre de segredos — nunca no código ou no navegador.
- A chave tem apenas as permissões necessárias (e LGPD só se realmente precisar dos dados pessoais).
- Se seu servidor tem IP fixo, ele está cadastrado na lista de IPs permitidos da chave.
- Toda gravação envia
Idempotency-Key. - Seu código trata
429esperando o tempo deRetry-Aftere tenta de novo. - Erros são registrados com o
request_idda resposta. - O receptor de webhooks valida a assinatura, responde rápido e ignora eventos repetidos (mesmo
id). - Existe um plano de troca de chave (Regenerar) em caso de vazamento.