GLPI REST API - Guia Prático

Exemplos práticos de uso da API REST do GLPI (Gestionnaire Livre de Parc Informatique) para integração e automação de tarefas de gestão de ativos, tickets e outros recursos.  — ⚙ Gerador de CURL

Configuração Inicial

Para obter um token de API no GLPI, você precisa seguir os seguintes passos:

1. Habilitar a API REST no GLPI

Primeiro, verifique se a API REST está habilitada:

2. Criar um token de API para um usuário

3. Token da aplicação

1) Iniciar Sessão

GET /apirest.php/initSession

Headers:

Content-Type: application/json
Authorization: user_token [USER_TOKEN]
App-Token: [APP_TOKEN]

Requisição em formato CURL

curl -X GET \
  -H "Content-Type: application/json" \
  -H "Authorization: user_token [USER_TOKEN]" \
  -H "App-Token: [APP_TOKEN]" \
  "https://glpi.example.com/apirest.php/initSession"

2) Trocar Entidade Ativa

Permite alterar a entidade ativa da sessão. Útil quando o usuário tem acesso a múltiplas entidades e precisa operar em uma entidade específica.

POST /apirest.php/changeActiveEntities

Headers:

Content-Type: application/json
App-Token: [APP_TOKEN]
Session-Token: [SESSION_TOKEN]

Body (JSON):

{
  "entities_id": 1,
  "is_recursive": true
}

Requisição em formato CURL

curl -s -X POST "https://glpi.example.com/apirest.php/changeActiveEntities" \
  -H "Content-Type: application/json" \
  -H "App-Token: [APP_TOKEN]" \
  -H "Session-Token: [SESSION_TOKEN]" \
  --data-raw '{"entities_id":1,"is_recursive":true}'

Importante!
Para listar as entidades disponíveis para o usuário autenticado, use GET /apirest.php/getMyEntities.

Atenção!
O endpoint retorna true em caso de sucesso e false quando a troca não é possível. Os casos mais comuns de retorno false são: o usuário já está na entidade solicitada, não possui acesso à entidade informada, ou o entities_id não existe. Use GET /apirest.php/getMyEntities para descobrir os IDs válidos antes de chamar este endpoint.

3) Criar um Ticket

POST /apirest.php/Ticket

Headers:

Content-Type: application/json
App-Token: [APP_TOKEN]
Session-Token: [SESSION_TOKEN]

Body (JSON):

{
  "input": {
    "name": "Ticket aberto pela API",
    "content": "Descricao do ticket",
    "priority": "1",
    "impact": "4",
    "urgency": "5",
    "type": "2",
    "itilcategories_id": "1"
  }
}

O campo itilcategories_id corresponde ao ID da categoria ITIL à qual o ticket será associado. As categorias são configuradas no GLPI em Configuração > Dropdowns > Categorias ITIL e organizam os chamados por área ou tipo de serviço. Para descobrir os IDs disponíveis, consulte o item 9) Buscar Categorias.

Requisição em formato CURL

curl --request POST \
  --url https://glpi.example.com/apirest.php/Ticket \
  --header 'App-Token: [APP_TOKEN]' \
  --header 'Content-Type: application/json' \
  --header 'Session-Token: [SESSION_TOKEN]' \
  --data '{
  "input": {
    "name": "Ticket aberto pela API",
    "content": "Descricao do ticket",
    "priority": "1",
    "impact": "4",
    "urgency": "5",
    "type": "2",
    "itilcategories_id": "1"
  }
}'

4) Obter Ticket por ID

Retorna os dados completos de um ticket específico.

GET /apirest.php/Ticket/{id}

Headers:

Content-Type: application/json
App-Token: [APP_TOKEN]
Session-Token: [SESSION_TOKEN]

Requisição em formato CURL

curl -s -X GET "https://glpi.example.com/apirest.php/Ticket/3" \
  -H "Content-Type: application/json" \
  -H "App-Token: [APP_TOKEN]" \
  -H "Session-Token: [SESSION_TOKEN]"

Para expandir sub-itens (como usuários associados, documentos, etc.), use o parâmetro expand_dropdowns:

curl -s -X GET "https://glpi.example.com/apirest.php/Ticket/3?expand_dropdowns=true" \
  -H "Content-Type: application/json" \
  -H "App-Token: [APP_TOKEN]" \
  -H "Session-Token: [SESSION_TOKEN]"

Importante!
Substitua o ID na URL pelo ID do ticket que deseja consultar.

5) Atualizar um Ticket

PUT /apirest.php/Ticket/{id}

Headers:

Content-Type: application/json
App-Token: [APP_TOKEN]
Session-Token: [SESSION_TOKEN]

Body (JSON):

{
  "input": {
    "name": "Novo título do ticket",
    "content": "Nova descrição do ticket",
    "status": 2,
    "priority": 3
  }
}

Requisição em formato CURL

curl -v -X PUT \
  -H "Content-Type: application/json" \
  -H "Session-Token: [SESSION_TOKEN]" \
  -H "App-Token: [APP_TOKEN]" \
  --data-raw '{"input":{"name":"Novo título do ticket","content":"Nova descrição do ticket","status":2,"priority":3}}' \
  "https://glpi.example.com/apirest.php/Ticket/1"

6) Buscar Tickets

Retornar tickets com base em critérios de busca. A principal distinção é o papel do usuário no chamado. Para entender como os filtros são estruturados, consulte Como Montar Filtros de Busca (criteria).

GET /apirest.php/search/Ticket

Headers:

Content-Type: application/json
App-Token: [APP_TOKEN]
Session-Token: [SESSION_TOKEN]

Diferença entre os campos de usuário:

Tickets abertos por um usuário (requerente)

Filtra tickets nos quais o usuário é o requerente (quem abriu o chamado), usando field=4. No exemplo abaixo, o usuário johndoe e o período entre 9h do dia 13/04/2020 e 9h do dia 14/04/2020:

Requisição em formato CURL

curl -g -X GET \
  -H 'Content-Type: application/json' \
  -H "Session-Token: [SESSION_TOKEN]" \
  -H "App-Token: [APP_TOKEN]" \
  'https://glpi.example.com/apirest.php/search/Ticket?criteria[0][link]=AND&criteria[0][field]=4&criteria[0][searchtype]=contains&criteria[0][value]=johndoe&criteria[1][link]=AND&criteria[1][field]=15&criteria[1][searchtype]=morethan&criteria[1][value]=2020-04-13 09:00:00&criteria[2][link]=AND&criteria[2][field]=15&criteria[2][searchtype]=lessthan&criteria[2][value]=2020-04-14 09:00:00'

Chamados abertos atribuídos a um usuário (técnico)

Filtra tickets nos quais o usuário é o técnico atribuído, usando field=5. O segundo critério (field=12 com lessthan=5) garante que apenas chamados ainda em aberto sejam retornados, excluindo os com status Solucionado (5) e Fechado (6):

Requisição em formato CURL

curl -g -X GET \
  -H 'Content-Type: application/json' \
  -H "Session-Token: [SESSION_TOKEN]" \
  -H "App-Token: [APP_TOKEN]" \
  'https://glpi.example.com/apirest.php/search/Ticket?criteria[0][link]=AND&criteria[0][field]=5&criteria[0][searchtype]=contains&criteria[0][value]=johndoe&criteria[1][link]=AND&criteria[1][field]=12&criteria[1][searchtype]=lessthan&criteria[1][value]=5'

7) Listar Campos de um Ticket

Visualizar os campos disponíveis para itemtype Ticket.

GET /apirest.php/listSearchOptions/Ticket

Headers:

Content-Type: application/json
App-Token: [APP_TOKEN]
Session-Token: [SESSION_TOKEN]

Requisição em formato CURL

curl -g -X GET \
  -H 'Content-Type: application/json' \
  -H "Session-Token: [SESSION_TOKEN]" \
  -H "App-Token: [APP_TOKEN]" \
  'https://glpi.example.com/apirest.php/listSearchOptions/Ticket'

8) Listar Campos de Categorias

Visualizar os campos disponíveis para itemtype ITILCategory.

GET /apirest.php/listSearchOptions/ITILCategory

Headers:

Content-Type: application/json
App-Token: [APP_TOKEN]
Session-Token: [SESSION_TOKEN]

Requisição em formato CURL

curl --request GET \
  --url https://glpi.example.com/apirest.php/listSearchOptions/ITILCategory \
  --header 'App-Token: [APP_TOKEN]' \
  --header 'Content-Type: application/json' \
  --header 'Session-Token: [SESSION_TOKEN]'

9) Buscar Categorias

Retornar a lista de categorias que estejam listadas na interface simplificada (campo 3). Você pode ajustar o parâmetro range caso deseje evitar a paginação dos resultados.

GET /apirest.php/search/ITILCategory

Headers:

Content-Type: application/json
App-Token: [APP_TOKEN]
Session-Token: [SESSION_TOKEN]

Requisição em formato CURL

curl -g -X GET \
  -H 'App-Token: [APP_TOKEN]' \
  -H 'Content-Type: application/json' \
  -H 'Session-Token: [SESSION_TOKEN]' \
  'https://glpi.example.com/apirest.php/search/ITILCategory?range=0-500&criteria[0][link]=AND&criteria[0][field]=3&criteria[0][searchtype]=equals&criteria[0][value]=1'

Permissão necessária!
O perfil do usuário precisa ter permissão de leitura em Categorias ITIL para que este endpoint funcione. Caso contrário, a API retorna ERROR_RIGHT_MISSING (HTTP 403). Para conceder a permissão, acesse Administração > Perfis > [perfil do usuário], aba Assistência, e verifique a permissão em "Categorias".

10) Upload de Documento

POST /apirest.php/Document

Headers:

App-Token: [APP_TOKEN]
Session-Token: [SESSION_TOKEN]

Body (multipart/form-data):

Campo Valor
uploadManifest {"input":{"name":"teste.pdf","_filename":["teste.pdf"]}} (type: application/json)
filename[0] arquivo teste.pdf (binary)

Importante!
Esta requisição não usa Content-Type: application/json. É multipart/form-data porque envia um arquivo binário.

Requisição em formato CURL

curl -s -X POST "https://glpi.example.com/apirest.php/Document" \
  -H "App-Token: [APP_TOKEN]" \
  -H "Session-Token: [SESSION_TOKEN]" \
  -F 'uploadManifest={"input":{"name":"teste.pdf","_filename":["teste.pdf"]}};type=application/json' \
  -F "filename[0]=@/caminho/para/teste.pdf"

Atenção — Windows!
No Windows com curl nativo (fora do WSL), o caminho do arquivo deve ser informado no formato Windows, por exemplo: -F "filename[0]=@C:\Users\usuario\Downloads\teste.pdf". O uso de caminhos Unix como /caminho/para/arquivo pode causar o erro de leitura exit code 26.

Os pontos-chave:

11) Download de Documento

Retorna o arquivo binário de um documento armazenado no GLPI.

GET /apirest.php/Document/{id}

Headers:

App-Token: [APP_TOKEN]
Session-Token: [SESSION_TOKEN]
Accept: application/octet-stream

Requisição em formato CURL

curl -s -X GET "https://glpi.example.com/apirest.php/Document/1" \
  -H "App-Token: [APP_TOKEN]" \
  -H "Session-Token: [SESSION_TOKEN]" \
  -H "Accept: application/octet-stream" \
  --output documento_baixado.pdf

Importante!
O header Accept: application/octet-stream é obrigatório para receber o arquivo binário. Sem ele, a API retorna apenas os metadados do documento em JSON. Use --output para salvar o conteúdo em um arquivo local.

Para obter apenas os metadados (sem baixar o arquivo):

curl -s -X GET "https://glpi.example.com/apirest.php/Document/1" \
  -H "Content-Type: application/json" \
  -H "App-Token: [APP_TOKEN]" \
  -H "Session-Token: [SESSION_TOKEN]"

12) Vincular Documento ao Ticket

POST /apirest.php/Document_Item

Headers:

Content-Type: application/json
App-Token: [APP_TOKEN]
Session-Token: [SESSION_TOKEN]

Body (JSON):

{
  "input": {
    "documents_id": 1,
    "itemtype": "Ticket",
    "items_id": 3
  }
}

Importante!
Substitua em documents_id o ID retornado no passo 10 e items_id pelo ID do ticket do passo 3.

Importante!
Para chamar POST apirest.php/Document_Item para um ticket, o seu perfil deve ter permissão para editar o ticket. Se o perfil de usuário só pode criar o ticket e não editar, ocorrerá erro de permissão ao tentar associar o documento ao ticket. Verifique também:

13) Incluir Comentário em um Chamado

POST /apirest.php/ITILFollowup

Headers:

Content-Type: application/json
App-Token: [APP_TOKEN]
Session-Token: [SESSION_TOKEN]

Body (JSON):

{
  "input": {
    "itemtype": "Ticket",
    "items_id": 3,
    "content": "Comentario de teste postado via API."
  }
}

Requisição em formato CURL

curl -s -X POST "https://glpi.example.com/apirest.php/ITILFollowup" \
  -H "Content-Type: application/json" \
  -H "App-Token: [APP_TOKEN]" \
  -H "Session-Token: [SESSION_TOKEN]" \
  --data-raw '{"input":{"itemtype":"Ticket","items_id":3,"content":"Comentario de teste postado via API."}}'

Importante!
Substitua o valor de items_id pelo ID do ticket no qual quer inserir o comentário.

14) Atribuir um Ticket a um Usuário

POST /apirest.php/Ticket_User

Headers:

Content-Type: application/json
App-Token: [APP_TOKEN]
Session-Token: [SESSION_TOKEN]

Body (JSON):

{
  "input": {
    "tickets_id": 3,
    "users_id": 8,
    "type": 2
  }
}

Valores para type:

Requisição em formato CURL

curl -s -X POST "https://glpi.example.com/apirest.php/Ticket_User" \
  -H "Content-Type: application/json" \
  -H "App-Token: [APP_TOKEN]" \
  -H "Session-Token: [SESSION_TOKEN]" \
  --data-raw '{"input":{"tickets_id":3,"users_id":8,"type":2}}'

Importante!
Substitua o valor de users_id pelo ID do usuário ao qual quer atribuir o chamado e tickets_id pelo ID do ticket.

15) Listar Sub-itens de um Ticket

Retorna os sub-itens associados a um ticket, como acompanhamentos (followups), tarefas, documentos, usuários, etc.

GET /apirest.php/Ticket/{id}/{sub_itemtype}

Headers:

Content-Type: application/json
App-Token: [APP_TOKEN]
Session-Token: [SESSION_TOKEN]

Valores comuns para sub_itemtype:

Requisição em formato CURL

Listar acompanhamentos de um ticket:

curl -s -X GET "https://glpi.example.com/apirest.php/Ticket/3/ITILFollowup" \
  -H "Content-Type: application/json" \
  -H "App-Token: [APP_TOKEN]" \
  -H "Session-Token: [SESSION_TOKEN]"

Listar tarefas de um ticket:

curl -s -X GET "https://glpi.example.com/apirest.php/Ticket/3/TicketTask" \
  -H "Content-Type: application/json" \
  -H "App-Token: [APP_TOKEN]" \
  -H "Session-Token: [SESSION_TOKEN]"

Listar documentos vinculados a um ticket:

curl -s -X GET "https://glpi.example.com/apirest.php/Ticket/3/Document_Item" \
  -H "Content-Type: application/json" \
  -H "App-Token: [APP_TOKEN]" \
  -H "Session-Token: [SESSION_TOKEN]"

Importante!
Substitua o ID na URL pelo ID do ticket e o sub_itemtype pelo tipo de sub-item desejado.

16) Fechar um Chamado

PUT /apirest.php/Ticket/{id}

Headers:

Content-Type: application/json
App-Token: [APP_TOKEN]
Session-Token: [SESSION_TOKEN]

Body (JSON):

{
  "input": {
    "id": 3,
    "status": 6
  }
}

Valores para status:

Requisição em formato CURL

curl -s -X PUT "https://glpi.example.com/apirest.php/Ticket/3" \
  -H "Content-Type: application/json" \
  -H "App-Token: [APP_TOKEN]" \
  -H "Session-Token: [SESSION_TOKEN]" \
  --data-raw '{"input":{"id":3,"status":6}}'

Importante!
Substitua o ID na URL e no campo id pelo ID do ticket que deseja fechar.

17) Excluir um Ticket

Move um ticket para a lixeira ou exclui permanentemente.

DELETE /apirest.php/Ticket/{id}

Headers:

Content-Type: application/json
App-Token: [APP_TOKEN]
Session-Token: [SESSION_TOKEN]

Requisição em formato CURL

Mover para a lixeira (exclusão lógica):

curl -s -X DELETE "https://glpi.example.com/apirest.php/Ticket/3" \
  -H "Content-Type: application/json" \
  -H "App-Token: [APP_TOKEN]" \
  -H "Session-Token: [SESSION_TOKEN]"

Excluir permanentemente (force purge):

curl -s -X DELETE "https://glpi.example.com/apirest.php/Ticket/3?force_purge=true" \
  -H "Content-Type: application/json" \
  -H "App-Token: [APP_TOKEN]" \
  -H "Session-Token: [SESSION_TOKEN]"

Importante!
Sem o parâmetro force_purge, o ticket é movido para a lixeira e pode ser restaurado. Com force_purge=true, a exclusão é permanente e irreversível. O usuário precisa ter permissão de exclusão no perfil.

Permissão necessária!
Para excluir tickets, o perfil do usuário precisa ter permissão de Exclusão em Tickets. Sem essa permissão, a API retorna ERROR_GLPI_DELETE (HTTP 400). Para conceder a permissão, acesse Administração > Perfis > [perfil do usuário], aba Assistência, e habilite a opção de exclusão em "Chamados".

18) Listar Usuários

GET /apirest.php/User

Headers:

Content-Type: application/json
App-Token: [APP_TOKEN]
Session-Token: [SESSION_TOKEN]

Por padrão retorna os primeiros 20 registros. Para paginar, use o parâmetro range na URL.

Requisição em formato CURL

curl -s -X GET "https://glpi.example.com/apirest.php/User" \
  -H "Content-Type: application/json" \
  -H "App-Token: [APP_TOKEN]" \
  -H "Session-Token: [SESSION_TOKEN]"

Para paginar resultados:

curl -s -X GET "https://glpi.example.com/apirest.php/User?range=0-49" \
  -H "Content-Type: application/json" \
  -H "App-Token: [APP_TOKEN]" \
  -H "Session-Token: [SESSION_TOKEN]"

Para buscar um usuário específico por nome, use searchText:

curl -s -X GET "https://glpi.example.com/apirest.php/User?searchText[name]=ricardo" \
  -H "Content-Type: application/json" \
  -H "App-Token: [APP_TOKEN]" \
  -H "Session-Token: [SESSION_TOKEN]"

Atenção — colchetes na URL!
O parâmetro searchText[name] usa colchetes que alguns shells interpretam como globbing. Se o comando falhar, use a flag -g no curl para desabilitar o globbing, ou substitua os colchetes pela codificação URL: searchText%5Bname%5D=valor.

19) Encerrar Sessão

Encerra a sessão ativa e invalida o Session-Token.

GET /apirest.php/killSession

Headers:

Content-Type: application/json
App-Token: [APP_TOKEN]
Session-Token: [SESSION_TOKEN]

Requisição em formato CURL

curl -s -X GET "https://glpi.example.com/apirest.php/killSession" \
  -H "Content-Type: application/json" \
  -H "App-Token: [APP_TOKEN]" \
  -H "Session-Token: [SESSION_TOKEN]"

Importante!
Após encerrar a sessão, o Session-Token não poderá mais ser utilizado. Para novas operações, será necessário iniciar uma nova sessão (passo 1).

Referência de Valores

Os valores de status, prioridade, urgência, impacto e tipo de chamado são fixos (hardcoded) no GLPI e não há função de API para retorná-los como uma lista isolada. Eles estão definidos no código-fonte do GLPI:

Status

Valor Descrição
1 Novo
2 Em atendimento (atribuído)
3 Planejado
4 Pendente
5 Solucionado
6 Fechado

Urgência, Impacto e Prioridade

Valor Descrição
1 Muito baixa
2 Baixa
3 Média
4 Alta
5 Muito alta

Tipo do Chamado

Valor Descrição
1 Incidente
2 Requisição

Como Montar Filtros de Busca (criteria)

Os endpoints de busca da API do GLPI (como GET /apirest.php/search/Ticket) aceitam filtros compostos por meio do parâmetro criteria, que é um array indexado. Cada índice representa uma condição independente de filtro.

Estrutura de um critério

Cada critério criteria[N] é composto por quatro sub-parâmetros:

Sub-parâmetro Função Valores comuns
criteria[N][link] Operador lógico para combinar com o critério anterior AND, OR
criteria[N][field] ID numérico do campo a ser filtrado Ver tabela abaixo
criteria[N][searchtype] Tipo de comparação contains, equals, notequals, lessthan, morethan, notcontains
criteria[N][value] Valor a ser comparado Texto, número ou data (YYYY-MM-DD HH:MM:SS)

Campos mais utilizados em Ticket

Os IDs de campo são obtidos via 7) Listar Campos de um Ticket. Os mais comuns são:

field Campo
1 Título
4 Requerente (usuário que abriu)
5 Técnico atribuído
12 Status
15 Data de abertura
18 Data de fechamento
21 Descrição
52 Entidade

Exemplo comentado

A query abaixo retorna chamados abertos atribuídos ao técnico johndoe. Cada linha corresponde a um critério:

criteria[0][link]=AND
criteria[0][field]=5           ← campo: técnico atribuído
criteria[0][searchtype]=contains
criteria[0][value]=johndoe     ← nome do usuário

criteria[1][link]=AND
criteria[1][field]=12          ← campo: status
criteria[1][searchtype]=lessthan
criteria[1][value]=5           ← menor que 5 = exclui Solucionado e Fechado

Na URL, os parâmetros são concatenados com & e o array usa a notação de colchetes (criteria[0][field]=5&criteria[1][field]=12). Para adicionar mais condições, basta incrementar o índice ([2], [3]...).

Dica!
Use o endpoint GET /apirest.php/listSearchOptions/Ticket para descobrir os IDs de todos os campos disponíveis para busca.