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
Para obter um token de API no GLPI, você precisa seguir os seguintes passos:
Primeiro, verifique se a API REST está habilitada:
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"
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: se true, 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, useGET /apirest.php/getMyEntities.
Atenção!
O endpoint retornatrueem caso de sucesso efalsequando a troca não é possível. Os casos mais comuns de retornofalsesão: o usuário já está na entidade solicitada, não possui acesso à entidade informada, ou oentities_idnão existe. UseGET /apirest.php/getMyEntitiespara descobrir os IDs válidos antes de chamar este endpoint.
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"
}
}'
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.
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"
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:
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).
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'
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'
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'
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]'
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 retornaERROR_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".
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 usaContent-Type: application/json. Émultipart/form-dataporque 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/arquivopode causar o erro de leituraexit code 26.
Os pontos-chave:
-F (não -d): indica multipart/form-data, necessário para envio de
arquivo bináriouploadManifest: é o JSON de metadados enviado como parte do form, com
;type=application/json no final para indicar o content-type desse campo
filename[0]=@: o @ faz o curl ler o conteúdo do arquivo e enviá-lo como binary
uploadContent-Type: application/json. O curl define
automaticamente multipart/form-data quando se usa -F.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 headerAccept: application/octet-streamé obrigatório para receber o arquivo binário. Sem ele, a API retorna apenas os metadados do documento em JSON. Use--outputpara 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 /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 emdocuments_ido ID retornado no passo 10 eitems_idpelo ID do ticket do passo 3.
Importante!
Para chamarPOST apirest.php/Document_Itempara 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 /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 deitems_idpelo ID do ticket no qual quer inserir o comentá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 - ObservadorRequisiçã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 deusers_idpelo ID do usuário ao qual quer atribuir o chamado etickets_idpelo ID do 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çõesRequisiçã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 osub_itemtypepelo tipo de sub-item desejado.
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 - FechadoRequisiçã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 campoidpelo ID do ticket que deseja fechar.
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âmetroforce_purge, o ticket é movido para a lixeira e pode ser restaurado. Comforce_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 retornaERROR_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".
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âmetrosearchText[name]usa colchetes que alguns shells interpretam como globbing. Se o comando falhar, use a flag-gno curl para desabilitar o globbing, ou substitua os colchetes pela codificação URL:searchText%5Bname%5D=valor.
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).
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:
| Valor | Descrição |
|---|---|
| 1 | Novo |
| 2 | Em atendimento (atribuído) |
| 3 | Planejado |
| 4 | Pendente |
| 5 | Solucionado |
| 6 | Fechado |
| Valor | Descrição |
|---|---|
| 1 | Muito baixa |
| 2 | Baixa |
| 3 | Média |
| 4 | Alta |
| 5 | Muito alta |
| Valor | Descrição |
|---|---|
| 1 | Incidente |
| 2 | Requisição |
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.
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) |
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 |
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 endpointGET /apirest.php/listSearchOptions/Ticketpara descobrir os IDs de todos os campos disponíveis para busca.