Pular para conteúdo

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 para false esvazia 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:

const searchParams = {
  select: ["id", "name", "sicCode"],
  where: [{ type: "in", attribute: "sicCode", value: ["12345678000199", "98765432000188", "11222333000144"] }]
};
const url = `https://integracao.gob.com.br/api/v1/Account?searchParams=${encodeURIComponent(JSON.stringify(searchParams))}`;

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

  1. Crie o usuário (POST /User) e guarde o data.id da resposta (ou consulte depois em /api/v1/User).
  2. Se for acesso por carteira, envie cAcessoCarteira: true e accountIds já na criação (ou habilite depois com PUT /User/:id, enviando cAcessoCarteira: true e accountIds).
  3. Confira com GET /User/:id/Account e veja data.total (quantos clientes ele enxerga).
  4. Ajuste quando precisar: PUT /User/:id para dados e carteira inteira, ou as rotas /Account/:accountId para adicionar/remover um cliente.
  5. Para tirar o acesso de alguém, desative: PUT /User/:id com {"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:

  1. busque os ids dos clientes em /api/v1/Account pelo sicCode;
  2. crie o usuário com cAcessoCarteira: true e esses ids;
  3. 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 accountId não existir ou não estiver disponível para você, a resposta é 403 e nada é criado.
  • Se o userName já 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.
  • rolesIds substitui 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 accountId não existir ou não estiver disponível para você, a resposta é 403 e nada muda.
  • Se a lista ultrapassar o limite de 100 KB por requisição, divida: envie parte no PUT e 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

{ "success": true, "message": "User ID 6a1b2c3d4e5f67890 updated successfully." }

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.

curl -i -X PUT "https://integracao.gob.com.br/api/v1/services/User/6a1b2c3d4e5f67890/Account/5f8e7d6c5b4a39281" \
  -H "Accept: application/json" \
  -H "X-Api-Key: SUA_CHAVE_AQUI"
curl.exe -i -X PUT "https://integracao.gob.com.br/api/v1/services/User/6a1b2c3d4e5f67890/Account/5f8e7d6c5b4a39281" `
  -H "Accept: application/json" `
  -H "X-Api-Key: SUA_CHAVE_AQUI"

Resposta

{ "success": true, "message": "Account 5f8e7d6c5b4a39281 vinculada ao usuário 6a1b2c3d4e5f67890." }
  • 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

curl -i -X DELETE "https://integracao.gob.com.br/api/v1/services/User/6a1b2c3d4e5f67890/Account/5f8e7d6c5b4a39281" \
  -H "Accept: application/json" \
  -H "X-Api-Key: SUA_CHAVE_AQUI"
curl.exe -i -X DELETE "https://integracao.gob.com.br/api/v1/services/User/6a1b2c3d4e5f67890/Account/5f8e7d6c5b4a39281" `
  -H "Accept: application/json" `
  -H "X-Api-Key: SUA_CHAVE_AQUI"

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: false com PUT /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.

curl -i "https://integracao.gob.com.br/api/v1/services/User/6a1b2c3d4e5f67890/Account" \
  -H "Accept: application/json" \
  -H "X-Api-Key: SUA_CHAVE_AQUI"
curl.exe -i "https://integracao.gob.com.br/api/v1/services/User/6a1b2c3d4e5f67890/Account" `
  -H "Accept: application/json" `
  -H "X-Api-Key: SUA_CHAVE_AQUI"

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]'
$r = Invoke-RestMethod `
  -Uri "https://integracao.gob.com.br/api/v1/services/User/6a1b2c3d4e5f67890/Account" `
  -Headers @{ "X-Api-Key" = "SUA_CHAVE_AQUI"; "Accept" = "application/json" }

$r.data.total      # quantos clientes
$r.data.list.id    # ids dos clientes

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
{ "rolesIds": ["3", "11"] }
  • Ao editar, rolesIds substitui 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 (rolesIds e rolesNames).
  • 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 requestId de toda resposta com success: false.
  • Não repita automaticamente uma requisição de escrita (criar, editar, adicionar cliente) que retornou 502 ou 504 sem 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/Account e data.total.
  • Para adicionar ou remover um cliente, prefira as rotas /Account/:accountId; para redefinir a carteira inteira, use PUT /User/:id com a lista completa em accountIds.
  • Antes de adicionar clientes em lote, use GET /User/:id/Account para conferir a carteira atual e evitar 409.