GLPI REST API
Exemplos práticos de uso da API REST do GLPI (Gestionnaire Libre de Parc Informatique) para integração e automação de tarefas de gestão de ativos, tickets e outros recursos.
Gerador de CURLConfiguraçã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.
GET 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"
POST 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
}
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}'
Para listar as entidades disponíveis para o
usuário autenticado, use GET /apirest.php/getMyEntities.
POST 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"
}
}'
GET 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]"
Substitua o ID na URL pelo ID do ticket que deseja consultar.
PUT 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]" \
-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"
GET 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]
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'
GET 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'
GET 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]'
GET 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'
POST 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) |
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.
GET 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
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]"
POST 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
}
}
Substitua em documents_id o ID
retornado no passo 10 e items_id pelo ID do ticket do passo 3.
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.
POST 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."}}'
Substitua o valor de items_id
pelo ID do ticket no qual quer inserir o comentário.
POST 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:
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}}'
Substitua o valor de users_id
pelo ID do usuário ao qual quer atribuir o chamado e tickets_id pelo ID do
ticket.
GET 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:
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]"
Substitua o ID na URL pelo ID do ticket e o
sub_itemtype pelo tipo de sub-item desejado.
PUT 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:
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}}'
Substitua o ID na URL e no campo
id pelo ID do ticket que deseja fechar.
DELETE 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]
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.
GET 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]"
GET 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]"
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.