GLPI API
Versão 1.1 - Atualizado

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 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.

GET 1) Iniciar Sessão

GET /apirest.php/initSession

Headers:

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:

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

Body (JSON):

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, use GET /apirest.php/getMyEntities.

POST 3) Criar um Ticket

POST /apirest.php/Ticket

Headers:

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

Body (JSON):

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:

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 5) Atualizar um Ticket

PUT /apirest.php/Ticket/{id}

Headers:

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

Body (JSON):

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:

Headers
Content-Type: application/json
App-Token: [APP_TOKEN]
Session-Token: [SESSION_TOKEN]
Diferença entre os campos de usuário:
  • field=4Requerente: o usuário que abriu o chamado.
  • field=5Técnico atribuído: o responsável pelo atendimento.
  • field=12Status: permite filtrar chamados em aberto (lessthan=5 exclui 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:

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:

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:

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:

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): indica multipart/form-data, necessário para envio de arquivo binário
  • uploadManifest: é 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 upload
  • Não se coloca header Content-Type: application/json. O curl define automaticamente multipart/form-data quando 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:

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]"

POST 12) Vincular Documento ao Ticket

POST /apirest.php/Document_Item

Headers:

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

Body (JSON):

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.

POST 13) Incluir Comentário em um Chamado

POST /apirest.php/ITILFollowup

Headers:

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

Body (JSON):

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.

POST 14) Atribuir um Ticket a um Usuário

POST /apirest.php/Ticket_User

Headers:

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

Body (JSON):

Body (JSON)
{
  "input": {
    "tickets_id": 3,
    "users_id": 8,
    "type": 2
  }
}

Valores para type:

  • 1 - Requerente
  • 2 - 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.

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:

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

Valores comuns para sub_itemtype:

  • ITILFollowup - Acompanhamentos/comentários
  • TicketTask - Tarefas
  • Document_Item - Documentos vinculados
  • Ticket_User - Usuários associados
  • TicketValidation - 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.

PUT 16) Fechar um Chamado

PUT /apirest.php/Ticket/{id}

Headers:

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

Body (JSON):

Body (JSON)
{
  "input": {
    "id": 3,
    "status": 6
  }
}

Valores para status:

  • 1 - Novo
  • 2 - Em atendimento (atribuído)
  • 3 - Planejado
  • 4 - Pendente
  • 5 - Solucionado
  • 6 - 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.

DELETE 17) Excluir um Ticket

Move um ticket para a lixeira ou exclui permanentemente.

DELETE /apirest.php/Ticket/{id}

Headers:

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]"
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.

GET 18) Listar Usuários

GET /apirest.php/User

Headers:

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:

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:

Exemplo de Query
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.