Gerenciamento de usuários¶
Serviço para criar e editar usuários e controlar a carteirização: quais clientes cada usuário enxerga.
| Base URL | https://integracao.gob.com.br/api/v1/services |
| Formato | JSON (Content-Type: application/json) |
| Autenticação | Cabeçalho X-Api-Key |
Referência interativa deste serviço
Autenticação¶
Toda requisição precisa do cabeçalho X-Api-Key com a chave fornecida pelo suporte — a mesma usada na API de dados.
| Cabeçalho | Valor |
|---|---|
X-Api-Key |
Sua API key de integração |
Sem a chave, ou com uma chave incorreta, revogada ou inativa, a resposta é 401 sem corpo.
Conceitos¶
- Cliente (account)
- Uma empresa ou pessoa atendida pelo seu escritório, cadastrada no GOB.
- Carteira
- O conjunto de clientes que um usuário enxerga.
- Acesso por carteira (
cAcessoCarteira) -
true— o usuário enxerga apenas os clientes da carteira dele. Com a carteira vazia, ele não enxerga nenhum cliente;false— o usuário enxerga todos os clientes. Ele não tem carteira (mudar parafalseesvazia a carteira).
Obtendo os ids¶
Este serviço não lista clientes nem usuários. Para obter os ids, use a API de dados com a mesma API key:
Os accountIds são os ids da entidade Account (Cliente). O CNPJ/CPF fica no campo sicCode, somente números. Para buscar vários clientes de uma vez, use o operador in:
O :id usado nas rotas deste serviço é o id do usuário. A mesma consulta mostra se ele tem acesso por carteira (cAcessoCarteira) e quais papéis possui (rolesIds):
const searchParams = {
select: ["id", "userName", "isActive", "cAcessoCarteira", "rolesIds", "rolesNames"],
where: [{ type: "equals", attribute: "userName", value: "analista.carteira" }]
};
const url = `https://integracao.gob.com.br/api/v1/User?searchParams=${encodeURIComponent(JSON.stringify(searchParams))}`;
As consultas seguem as mesmas regras de paginação, seleção e filtros, o mesmo formato de resposta e o mesmo tratamento de erros da API de dados.
Não confunda as duas rotas de usuário
/api/v1/User— API de dados, somente leitura: use para consultar usuários, ids, acesso por carteira e papéis./api/v1/services/User— este serviço: use para criar, editar e gerenciar a carteira.
Passo a passo rápido¶
- Crie o usuário (
POST /User) e guarde odata.idda resposta (ou consulte depois em/api/v1/User). - Se for acesso por carteira, envie
cAcessoCarteira: trueeaccountIdsjá na criação (ou habilite depois comPUT /User/:id, enviandocAcessoCarteira: trueeaccountIds). - Confira com
GET /User/:id/Accounte vejadata.total(quantos clientes ele enxerga). - Ajuste quando precisar:
PUT /User/:idpara dados e carteira inteira, ou as rotas/Account/:accountIdpara adicionar/remover um cliente. - Para tirar o acesso de alguém, desative:
PUT /User/:idcom{"isActive": false}. Não existe exclusão de usuário por este serviço.
Exemplo completo¶
Criar um analista que enxerga apenas 3 clientes, identificados pelo CNPJ:
- busque os ids dos clientes em
/api/v1/AccountpelosicCode; - crie o usuário com
cAcessoCarteira: truee esses ids; - confira a carteira.
const BASE = "https://integracao.gob.com.br/api/v1";
const headers = { "X-Api-Key": process.env.GOB_API_KEY, "Accept": "application/json" };
// 1. Ids dos clientes pelos CNPJs (API de dados: erro vem sem corpo)
const cnpjs = ["12345678000199", "98765432000188", "11222333000144"];
const sp = { select: ["id", "sicCode"], where: [{ type: "in", attribute: "sicCode", value: cnpjs }] };
const r1 = await fetch(`${BASE}/Account?searchParams=${encodeURIComponent(JSON.stringify(sp))}`, { headers });
if (!r1.ok) throw new Error(`${r1.status}: ${r1.headers.get("X-Status-Reason")}`);
const accountIds = (await r1.json()).list.map(a => a.id);
if (accountIds.length !== cnpjs.length) throw new Error("Algum CNPJ não foi encontrado");
// 2. Cria o usuário já com a carteira (Serviço: erro vem em JSON, exceto 401)
const r2 = await fetch(`${BASE}/services/User`, {
method: "POST",
headers: { ...headers, "Content-Type": "application/json" },
body: JSON.stringify({
userName: "analista.carteira", firstName: "Analista", lastName: "Carteira",
emailAddress: "analista@example.com", password: "DEFINA_UMA_SENHA_FORTE",
cAcessoCarteira: true, accountIds
})
});
if (r2.status === 401) throw new Error("Chave ausente ou inválida");
const criado = await r2.json();
if (!criado.success) throw new Error(`${r2.status}: ${criado.message} (requestId ${criado.requestId})`);
// 3. Confere a carteira
const r3 = await fetch(`${BASE}/services/User/${criado.data.id}/Account`, { headers });
console.log((await r3.json()).data.total); // 3
import json, os, requests
BASE = "https://integracao.gob.com.br/api/v1"
headers = {"X-Api-Key": os.environ["GOB_API_KEY"], "Accept": "application/json"}
# 1. Ids dos clientes pelos CNPJs (API de dados: erro vem sem corpo)
cnpjs = ["12345678000199", "98765432000188", "11222333000144"]
sp = {"select": ["id", "sicCode"], "where": [{"type": "in", "attribute": "sicCode", "value": cnpjs}]}
r1 = requests.get(f"{BASE}/Account", params={"searchParams": json.dumps(sp)}, headers=headers)
if not r1.ok:
raise RuntimeError(f"{r1.status_code}: {r1.headers.get('X-Status-Reason')}")
account_ids = [a["id"] for a in r1.json()["list"]]
if len(account_ids) != len(cnpjs):
raise RuntimeError("Algum CNPJ não foi encontrado")
# 2. Cria o usuário já com a carteira (Serviço: erro vem em JSON, exceto 401)
r2 = requests.post(f"{BASE}/services/User", headers=headers, json={
"userName": "analista.carteira", "firstName": "Analista", "lastName": "Carteira",
"emailAddress": "analista@example.com", "password": "DEFINA_UMA_SENHA_FORTE",
"cAcessoCarteira": True, "accountIds": account_ids,
})
if r2.status_code == 401:
raise RuntimeError("Chave ausente ou inválida")
criado = r2.json()
if not criado["success"]:
raise RuntimeError(f"{r2.status_code}: {criado['message']} (requestId {criado['requestId']})")
# 3. Confere a carteira
r3 = requests.get(f"{BASE}/services/User/{criado['data']['id']}/Account", headers=headers)
print(r3.json()["data"]["total"]) # 3
Endpoints¶
As rotas abaixo são relativas à Base URL: /User significa https://integracao.gob.com.br/api/v1/services/User.
| Método | Rota | O que faz |
|---|---|---|
| POST | /User |
Cria um usuário (opcionalmente já com carteira) |
| PUT | /User/:id |
Edita um usuário (e/ou sua carteira) |
| PUT | /User/:id/Account/:accountId |
Adiciona um cliente à carteira do usuário |
| DELETE | /User/:id/Account/:accountId |
Remove um cliente da carteira do usuário |
| GET | /User/:id/Account |
Lista a carteira do usuário (e quantos clientes são) |
Corpo JSON no PowerShell
Nos exemplos com corpo JSON, a aba Windows usa Invoke-RestMethod: com curl.exe, as aspas do JSON precisam de escape e o comportamento muda entre versões do PowerShell. Em caso de erro, o Invoke-RestMethod lança uma exceção — o corpo da resposta (com o requestId) fica em $_.ErrorDetails.Message.
Criar usuário¶
POST /User
curl -i -X POST "https://integracao.gob.com.br/api/v1/services/User" \
-H "Content-Type: application/json" \
-H "Accept: application/json" \
-H "X-Api-Key: SUA_CHAVE_AQUI" \
--data-raw '{
"userName": "usuario.teste",
"firstName": "Usuario",
"lastName": "Teste",
"emailAddress": "usuario.teste@example.com",
"password": "DEFINA_UMA_SENHA_FORTE"
}'
$body = @{
userName = "usuario.teste"
firstName = "Usuario"
lastName = "Teste"
emailAddress = "usuario.teste@example.com"
password = "DEFINA_UMA_SENHA_FORTE"
} | ConvertTo-Json
Invoke-RestMethod -Method Post `
-Uri "https://integracao.gob.com.br/api/v1/services/User" `
-Headers @{ "X-Api-Key" = "SUA_CHAVE_AQUI"; "Accept" = "application/json" } `
-ContentType "application/json; charset=utf-8" `
-Body $body
Campos¶
| Campo | Tipo | Descrição |
|---|---|---|
userName |
string | Obrigatório. Nome de usuário (login). Recomendado até 50 caracteres |
firstName |
string | Obrigatório. Nome |
lastName |
string | Obrigatório. Sobrenome |
emailAddress |
string | Obrigatório. E-mail |
password |
string | Obrigatório. Senha inicial |
name |
string | Nome de exibição (opcional; se omitido, assume o userName) |
phoneNumber |
string | Telefone (opcional) |
sendAccessInfo |
boolean | Envia os dados de acesso ao usuário por e-mail (opcional) |
rolesIds |
array de strings | Ids de papéis do usuário (opcional). Veja Papéis |
isActive |
boolean | Usuário ativo (opcional, padrão true) |
cAcessoCarteira |
boolean | Habilita acesso por carteira (opcional, padrão false) |
accountIds |
array de strings | Clientes da carteira — obrigatório e não vazio quando cAcessoCarteira é true; não deve ser enviado quando cAcessoCarteira é false ou está ausente |
Campos não listados são ignorados. isActive e cAcessoCarteira, se enviados, precisam ser true ou false — valores como "true" (texto) dão 400. Sem rolesIds, o usuário é criado sem papéis.
Criar já com carteira¶
curl -i -X POST "https://integracao.gob.com.br/api/v1/services/User" \
-H "Content-Type: application/json" \
-H "Accept: application/json" \
-H "X-Api-Key: SUA_CHAVE_AQUI" \
--data-raw '{
"userName": "analista.carteira",
"firstName": "Analista",
"lastName": "Carteira",
"emailAddress": "analista@example.com",
"password": "DEFINA_UMA_SENHA_FORTE",
"cAcessoCarteira": true,
"accountIds": ["5f8e7d6c5b4a39281", "5f8e7d6c5b4a39282"]
}'
$body = @{
userName = "analista.carteira"
firstName = "Analista"
lastName = "Carteira"
emailAddress = "analista@example.com"
password = "DEFINA_UMA_SENHA_FORTE"
cAcessoCarteira = $true
accountIds = @("5f8e7d6c5b4a39281", "5f8e7d6c5b4a39282")
} | ConvertTo-Json
Invoke-RestMethod -Method Post `
-Uri "https://integracao.gob.com.br/api/v1/services/User" `
-Headers @{ "X-Api-Key" = "SUA_CHAVE_AQUI"; "Accept" = "application/json" } `
-ContentType "application/json; charset=utf-8" `
-Body $body
- Se algum
accountIdnão existir ou não estiver disponível para você, a resposta é403e nada é criado. - Se o
userNamejá estiver em uso, a resposta é409("Já existe um usuário com esse userName.") e nada é criado — escolha outro. - Se receber
502, confira se o usuário foi criado (em/api/v1/User) antes de tentar de novo.
Resposta¶
{
"success": true,
"message": "User ID 6a1b2c3d4e5f67890 created successfully.",
"data": { "id": "6a1b2c3d4e5f67890" }
}
Guarde o data.id — é o :id usado nos outros endpoints.
Editar usuário¶
PUT /User/:id
curl -i -X PUT "https://integracao.gob.com.br/api/v1/services/User/6a1b2c3d4e5f67890" \
-H "Content-Type: application/json" \
-H "Accept: application/json" \
-H "X-Api-Key: SUA_CHAVE_AQUI" \
--data-raw '{
"firstName": "Usuario",
"lastName": "Teste Editado",
"emailAddress": "usuario.teste@example.com"
}'
$body = @{
firstName = "Usuario"
lastName = "Teste Editado"
emailAddress = "usuario.teste@example.com"
} | ConvertTo-Json
Invoke-RestMethod -Method Put `
-Uri "https://integracao.gob.com.br/api/v1/services/User/6a1b2c3d4e5f67890" `
-Headers @{ "X-Api-Key" = "SUA_CHAVE_AQUI"; "Accept" = "application/json" } `
-ContentType "application/json; charset=utf-8" `
-Body $body
Campos aceitos¶
Os mesmos da criação, exceto userName, que não pode ser alterado. Envie apenas os campos que quer alterar.
Para trocar a senha, envie password com a nova senha (e, se quiser, sendAccessInfo: true para enviar os novos dados de acesso por e-mail).
Observações¶
- Alguns usuários administrativos não podem ser alterados por este serviço (resposta
403); faça a alteração pelo painel do GOB. rolesIdssubstitui a lista de papéis do usuário: envie a lista completa que ele deve ter. Para consultar os papéis atuais, veja Obtendo os ids.
Alterando a carteira por aqui¶
A carteira só muda se o corpo trouxer a chave cAcessoCarteira, sempre com true ou false:
| Situação do usuário → você envia | O que acontece |
|---|---|
sem carteira → cAcessoCarteira: true + accountIds |
adiciona todos os accountIds (obrigatório e não vazio, senão 400) |
sem carteira → cAcessoCarteira: false |
nada muda |
com carteira → cAcessoCarteira: false |
esvazia a carteira; o usuário passa a ver todos os clientes |
com carteira → cAcessoCarteira: true + accountIds |
a lista enviada passa a ser a carteira: adiciona os novos e remove os que não estão nela |
com carteira → cAcessoCarteira: true sem accountIds |
nada muda na carteira |
chave cAcessoCarteira ausente |
nada muda na carteira |
accountIds com cAcessoCarteira: false, ou sem a chave cAcessoCarteira |
400 |
- Se algum
accountIdnão existir ou não estiver disponível para você, a resposta é403e nada muda. - Se a lista ultrapassar o limite de 100 KB por requisição, divida: envie parte no
PUTe adicione o restante pelas rotas/Account/:accountId. - Cada carteira comporta até 5000 clientes.
Confira o resultado
Depois de alterar a carteira de alguém, consulte GET /User/:id/Account para confirmar que ela ficou como esperado.
Resposta¶
Adicionar cliente à carteira¶
PUT /User/:id/Account/:accountId
Útil para adicionar um cliente sem reenviar a carteira inteira. O usuário precisa estar com acesso por carteira habilitado (cAcessoCarteira: true); caso contrário, a resposta é 409 — habilite antes com PUT /User/:id (enviando cAcessoCarteira: true e accountIds) e então adicione os demais.
Resposta¶
- Se o cliente não existir ou não estiver disponível para você →
403. - Se o cliente já estiver na carteira →
409. - Se o usuário estiver sem acesso por carteira →
409(veja acima).
Remover cliente da carteira¶
DELETE /User/:id/Account/:accountId
Resposta¶
{ "success": true, "message": "Account 5f8e7d6c5b4a39281 desvinculada do usuário 6a1b2c3d4e5f67890." }
- Se o cliente não existir ou não estiver disponível para você →
403. - Se o cliente não estiver na carteira →
404. - Ao remover o último cliente, a carteira fica vazia e o usuário não enxerga nenhum cliente. Para ele voltar a ver todos, envie
cAcessoCarteira: falsecomPUT /User/:id.
Listar a carteira¶
GET /User/:id/Account
Retorna os clientes da carteira do usuário — ou seja, os clientes que ele enxerga quando tem acesso por carteira.
Resposta¶
{
"success": true,
"data": {
"list": [ { "id": "5f8e7d6c5b4a39281" }, { "id": "5f8e7d6c5b4a39282" } ],
"total": 2
},
"message": {
"list": [ { "id": "5f8e7d6c5b4a39281" }, { "id": "5f8e7d6c5b4a39282" } ],
"total": 2
}
}
Cada item de list traz os demais campos do cliente no GOB. A resposta traz a carteira completa (no máximo 5000 clientes).
data × message
data e message trazem o mesmo conteúdo (mantido por compatibilidade). Use data em novas integrações.
Quantos clientes o usuário enxerga¶
O número de clientes da carteira é data.total; os clientes em si estão em data.list, com o id que você usa nas rotas /Account/:accountId.
Requer o jq instalado.
# quantos clientes
curl -s "https://integracao.gob.com.br/api/v1/services/User/6a1b2c3d4e5f67890/Account" \
-H "X-Api-Key: SUA_CHAVE_AQUI" | jq '.data.total'
# ids dos clientes
curl -s "https://integracao.gob.com.br/api/v1/services/User/6a1b2c3d4e5f67890/Account" \
-H "X-Api-Key: SUA_CHAVE_AQUI" | jq '[.data.list[].id]'
Como interpretar — combine com o cAcessoCarteira do usuário, consultado em /api/v1/User:
cAcessoCarteira |
data.total |
O usuário enxerga |
|---|---|---|
true |
maior que 0 |
apenas os clientes da carteira |
true |
0 |
nenhum cliente |
false |
0 |
todos os clientes |
Papéis (rolesIds)¶
rolesIds é uma lista de ids de papel, sempre como strings. Só os papéis abaixo podem ser atribuídos por este serviço; qualquer outro id (inclusive números sem aspas) responde 403.
| Id | Papel |
|---|---|
1 |
1 - Monitoramento de Obrigações Acessórias |
2 |
2 - Caixa Postal e-CAC |
3 |
3 - CND - Certidão Negativa de Débitos |
5 |
5 - Situação Fiscal Federal |
6 |
6 - Parcelamentos Federais |
7 |
7 - Simples Nacional (Sublimite) |
8 |
8 - PER/DCOMP |
9 |
9 - Caixa Postal DET |
10 |
10 - Gestão de Certificados |
11 |
11 - Procurações |
- Ao editar,
rolesIdssubstitui a lista de papéis do usuário: envie a lista completa que ele deve ter, não só o papel novo. Os papéis atuais podem ser consultados em/api/v1/User(rolesIdserolesNames). - A lista de papéis pode mudar; em caso de dúvida sobre um id, consulte o suporte.
Códigos de status¶
| Status | Significado |
|---|---|
| 200 | Sucesso |
| 400 | Requisição inválida — campo com tipo errado (ex.: isActive como texto), accountIds incoerente com cAcessoCarteira ou faltando, JSON malformado |
| 401 | API key ausente, incorreta, revogada ou inativa (resposta sem corpo) |
| 403 | Sem permissão para o recurso solicitado — inclui usuário ou cliente inexistente ou indisponível, e papel não permitido |
| 404 | Usuário removido pelo painel do GOB, ou remover cliente que não está na carteira |
| 409 | Conflito — userName já em uso, cliente já na carteira, ou adicionar cliente a usuário sem acesso por carteira |
| 502 | Erro ao processar a requisição |
| 504 | Serviço temporariamente indisponível (timeout) |
Formato de erro¶
Diferente da API de dados, os erros deste serviço vêm com corpo JSON:
{
"success": false,
"message": "Descrição do erro.",
"requestId": "e5b4c1d2a3f6789012345678abcdef01"
}
O requestId também volta no cabeçalho X-Request-Id e é o que você deve informar ao abrir um chamado de suporte — a partir dele o time consegue localizar a requisição. A exceção é o 401 de autenticação, que vem sem corpo.
Erros comuns¶
Termos nas mensagens da API
As mensagens são devolvidas pela API como estão. Nelas, "colaborador da account" significa que o cliente está na carteira do usuário, e "carteira", em alguns textos, se refere a um cliente.
| Mensagem | Status | O que fazer |
|---|---|---|
"Usuário não tem Organização definida." |
409 |
Entre em contato com o suporte. |
"Usuário alvo não pertence a nenhuma organização do requisitante." |
403 |
O usuário informado não existe ou não está disponível para a sua chave. Confira o id. |
"Accounts inválidas ou sem permissão: <ids>." / "Account <id> inválida ou sem permissão." |
403 |
Algum id de cliente não existe ou não está disponível para você. Corrija os ids. |
"Lista de rolesIds contém valores inválidos." |
403 |
Algum papel não está na lista de papéis permitidos, ou foi enviado como número. |
"accountIds só pode ser enviado quando cAcessoCarteira é true." |
400 |
Você enviou accountIds com cAcessoCarteira: false (ou sem ele). |
"accountIds é obrigatório e não pode ser vazio quando cAcessoCarteira é true." / "Para habilitar o acesso por carteira (cAcessoCarteira: true), envie accountIds com ao menos uma carteira." |
400 |
Habilitar carteira exige a lista de clientes. |
"Usuário sem acesso por carteira. Habilite a carteira (cAcessoCarteira: true) com PUT /User/:id antes de vincular contas." |
409 |
Você tentou adicionar um cliente a um usuário com cAcessoCarteira: false. Habilite a carteira antes com PUT /User/:id. |
"Já existe um usuário com esse userName." |
409 |
O userName já está em uso. Escolha outro. |
"Conflito ao criar usuário no GOB." |
409 |
Confira os dados enviados; se persistir, contate o suporte. |
"isActive deve ser boolean." / "cAcessoCarteira deve ser boolean." |
400 |
Envie true ou false (sem aspas). |
"Usuário já é colaborador da account <id>." |
409 |
O cliente já está na carteira. |
"Usuário não é colaborador da account <id>." |
404 |
O cliente não está na carteira. |
"Ocorreu um erro ao processar a requisição." |
vários | Informe o requestId ao suporte. |
Boas práticas¶
- Sempre envie
Accept: application/json. - Guarde o
requestIdde toda resposta comsuccess: false. - Não repita automaticamente uma requisição de escrita (criar, editar, adicionar cliente) que retornou
502ou504sem antes conferir o estado atual — a operação pode ter sido concluída. - Depois de alterar a carteira de alguém, confirme com
GET /User/:id/Accountedata.total. - Para adicionar ou remover um cliente, prefira as rotas
/Account/:accountId; para redefinir a carteira inteira, usePUT /User/:idcom a lista completa emaccountIds. - Antes de adicionar clientes em lote, use
GET /User/:id/Accountpara conferir a carteira atual e evitar409.