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:
- Faça login no GLPI como administrador
- Vá para Configuração > Geral > APIs
- Certifique-se de que a opção "Habilitar API REST" esteja ativada
2. Criar um token de API para um usuário
- Vá para Administração > Usuários
- Selecione o usuário para o qual deseja criar o token
- Vá para a seção "Chaves de acesso remoto"
- Marque a opção "re-gerar" e clique em "Salvar"
- Copie a chave gerada
3. Token da aplicação
- Vá para Configuração > Geral > APIs
- Clique no botão "Adicionar clientes da API"
- Insira um nome
- Marque a opção "Ativo" como "Sim"
- Preencha os campos "Início do intervalo de endereços IPv4" e "Fim do intervalo de endereços IPv4"
- Clique no botão "Adicionar"
- Selecione o cliente criado e copie o token.
/apirest.php/initSession
1) Iniciar Sessão
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"
/apirest.php/changeActiveEntities
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.
Headers:
Content-Type: application/json
App-Token: [APP_TOKEN]
Session-Token: [SESSION_TOKEN]
Body (JSON):
{
"entities_id": 1,
"is_recursive": true
}
entities_id: ID da entidade para a qual deseja trocar.is_recursive: setrue, inclui as sub-entidades.
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.
/apirest.php/Ticket
3) Criar um 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"
}
}'
/apirest.php/Ticket/{id}
4) Obter Ticket por ID
Retorna os dados completos de um ticket específico.
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.
/apirest.php/Ticket/{id}
5) Atualizar um Ticket
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]" \
-d '{
"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"
/apirest.php/search/Ticket
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).
Headers:
Content-Type: application/json
App-Token: [APP_TOKEN]
Session-Token: [SESSION_TOKEN]
Diferença entre os campos de usuário:
field=4— Requerente: o usuário que abriu o chamado.field=5— Técnico atribuído: o responsável pelo atendimento.field=12— Status: permite filtrar chamados em aberto (lessthan=5exclui Solucionado e Fechado).
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'
/apirest.php/listSearchOptions/Ticket
7) Listar Campos de um Ticket
Visualizar os campos disponíveis para itemtype 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'
/apirest.php/listSearchOptions/ITILCategory
8) Listar Campos de Categorias
Visualizar os campos disponíveis para itemtype
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]'
/apirest.php/search/ITILCategory
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.
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'
/apirest.php/Document
10) Upload de Documento
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"
Os pontos-chave:
-F(não-d): indicamultipart/form-data, necessário para envio de arquivo bináriouploadManifest: é o JSON de metadados enviado como parte do form, com;type=application/jsonno final para indicar o content-type desse campofilename[0]=@: o@faz o curl ler o conteúdo do arquivo e enviá-lo como binary upload- Não se coloca header
Content-Type: application/json. O curl define automaticamentemultipart/form-dataquando se usa-F.
/apirest.php/Document/{id}
11) Download de Documento
Retorna o arquivo binário de um documento armazenado no GLPI.
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]"
/apirest.php/Document_Item
12) Vincular Documento ao Ticket
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:
- Perfil do usuário sem permissão de escrita em Documentos: No GLPI, vá em Administração
> Perfis >
[perfil do usuário], aba Gerenciamento, e verifique se a permissão de Documentos inclui
Criar e
Atualizar.
- Permissão de vinculação ao Ticket: O usuário precisa ter permissão de escrita no Ticket ao qual está tentando vincular o documento.
- Entidade diferente: Se o documento e o ticket estão em entidades diferentes e o perfil não é recursivo, a vinculação será bloqueada.
/apirest.php/ITILFollowup
13) Incluir Comentário em um Chamado
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.
/apirest.php/Ticket_User
14) Atribuir um Ticket a um Usuário
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:
1- Requerente2- Técnico (atribuído)3- Observador
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.
/apirest.php/Ticket/{id}/{sub_itemtype}
15) Listar Sub-itens de um Ticket
Retorna os sub-itens associados a um ticket, como acompanhamentos (followups), tarefas, documentos, usuários, etc.
Headers:
Content-Type: application/json
App-Token: [APP_TOKEN]
Session-Token: [SESSION_TOKEN]
Valores comuns para sub_itemtype:
ITILFollowup- Acompanhamentos/comentáriosTicketTask- TarefasDocument_Item- Documentos vinculadosTicket_User- Usuários associadosTicketValidation- Validações
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.
/apirest.php/Ticket/{id}
16) Fechar um Chamado
Headers:
Content-Type: application/json
App-Token: [APP_TOKEN]
Session-Token: [SESSION_TOKEN]
Body (JSON):
{
"input": {
"id": 3,
"status": 6
}
}
Valores para status:
1- Novo2- Em atendimento (atribuído)3- Planejado4- Pendente5- Solucionado6- Fechado
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.
/apirest.php/Ticket/{id}
17) Excluir um Ticket
Move um ticket para a lixeira ou exclui permanentemente.
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]"
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.
/apirest.php/User
18) Listar Usuários
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]"
/apirest.php/killSession
19) Encerrar Sessão
Encerra a sessão ativa e invalida o Session-Token.
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]...).
Use o endpoint
GET /apirest.php/listSearchOptions/Ticket
para descobrir os IDs de todos os campos disponíveis para busca.