Aller au contenu

Web Services OTOBO – REST API

OTOBO REST API

Dans ce guide détaillé, vous apprendrez comment activer, configurer et intégrer l’API REST OTOBO (partie de l’Interface Générique) dans vos propres applications.

OTOBO met à disposition son Interface Générique via des Web Services REST et SOAP. L’API REST communique via HTTP(S)/JSON et permet :

  • Opérations sur les tickets : Créer, récupérer, modifier, supprimer
  • Opérations sur les articles : Publier, gérer les pièces jointes
  • Historique & Recherche : Historique des tickets et requêtes de recherche complexes

Remarque : Une installation standard ne contient aucun Web Service préconfiguré – vous devez les créer vous-même dans le module d’administration « Processus & Automatisation → Web Services ».

  1. Dans la zone d’administration → SysConfigGenericInterface.Transport, passez à REST (HTTP).
  2. Sous AdminGenericInterfaceTransportHTTPREST, configurez les timeouts, l’en-tête Host et le niveau de debug.
  3. Dans GenericInterface.Operation, créez et activez les opérations souhaitées (par ex. TicketCreate, TicketSearch, TicketGet, TicketUpdate, TicketDelete, TicketHistoryGet).

Ajouter un Web Service Fournisseur de Web Service

  • URL de base

    https://VOTRE-SERVEUR/otobo/nph-genericinterface.pl/Webservice/<VotreNomDeService>/
  • Authentification

    • Cookies de session OTOBO
    • Clés API / Token (à créer via SysConfig)
    • Toujours utiliser HTTPS !

Configurer le Requester REST

Pour chaque endpoint, vous trouverez ici un aperçu détaillé des paramètres, des réponses possibles et des exemples pratiques.

URL : /Webservice/<ServiceName>/TicketCreate Méthode : POST

Description : Crée un nouveau ticket et génère immédiatement un article.

ParamètreTypeRequisDescription
SessionIDIntegerOui¹ID de session ou UserLogin+Password
UserLoginStringOui²Login de l’agent (en combinaison avec Password)
PasswordStringOui²Mot de passe (en combinaison avec UserLogin)
Ticket.TitleStringOuiObjet du ticket
Ticket.QueueStringOuiNom de la file ou Ticket.QueueID
Ticket.StateStringOuiÉtat initial (par ex. new)
Ticket.PriorityStringOuiPriorité (par ex. 3 normal)
Ticket.CustomerUserStringOuiE-mail ou login du client
Article.SubjectStringOuiObjet du premier article
Article.BodyStringOuiContenu du premier article
Article.MimeTypeStringOuitext/plain ou text/html

¹ Soit SessionID OU UserLogin+Password requis. ² Si aucun token SessionID n’est disponible.

Exemple de requête :

POST /Webservice/MyConnectorREST/TicketCreate HTTP/1.1
Host: demo.otobo.org
Content-Type: application/json
X-API-Key: abc123
{
"Data": {
"SessionID": 42,
"Ticket": {
"Title": "Nouvelle commande",
"Queue": "Sales",
"State": "new",
"Priority": "3 normal",
"CustomerUser": "max.mustermann@example.com"
},
"Article": {
"Subject": "Demande d'achat – Produit XY",
"Body": "Veuillez envoyer une offre de prix…",
"MimeType": "text/plain"
}
}
}

Exemple de réponse :

{
"Success": 1,
"ErrorMessage": "",
"Data": {
"TicketID": "12345",
"ArticleID": "67890"
}
}

URL : /Webservice/<ServiceName>/TicketSearch Méthode : GET

Description : Recherche des tickets selon divers critères de filtrage.

ParamètreTypeRequisDescription
UserLogin, PasswordString,StringOui¹Identifiants de l’agent ou SessionID²
SessionIDIntegerOui²Token pour les sessions authentifiées
TitleString/String[]NonRecherche par wildcard dans le titre (%Commande%)
TicketNumberString/String[]NonNuméro(s) de ticket
QueueIDsInteger[]NonIDs des files
StatesString[]NonÉtats (new, open, …)
StateTypeString/String[]NonCatégorie Open/Closed
DynamicField_Name.OpMixedNonChamps dynamiques avec opérateur (Equals, Like, GreaterThan …)

¹ Soit UserLogin+Password OU SessionID. ² Si aucun couple de login n’est transmis.

Exemple de requête :

GET /Webservice/MyConnectorREST/TicketSearch?UserLogin=agent1&Password=secret&Title=%25Commande%25 HTTP/1.1
Host: demo.otobo.org

Exemple de réponse :

{
"Success": 1,
"Data": {
"TicketID": [1001,1005,1012]
}
}

URL : /Webservice/<ServiceName>/TicketGet Méthode : GET

Description : Renvoie les données détaillées du ticket, y compris les articles, les pièces jointes et les champs dynamiques.

ParamètreTypeRequisDescription
UserLogin, PasswordString,StringOui¹Identifiants de l’agent ou SessionID²
SessionIDIntegerOui²Token pour les sessions authentifiées
TicketIDString/String[]OuiUn ou plusieurs IDs de ticket (séparés par virgule ou tableau)
DynamicFieldsBoolean (0/1)Non1 = Champs dynamiques dans le résultat, défaut = 0
ExtendedBooleanNon1 = Métadonnées étendues (par ex. FirstResponse)
AllArticlesBooleanNon1 = Renvoyer tous les articles
ArticleLimitIntegerNonNombre max. d’articles renvoyés
AttachmentsBooleanNon1 = Intégrer les pièces jointes en Base64
GetAttachmentContentsBooleanNon1 = Charger également le contenu des pièces jointes
HTMLBodyAsAttachmentBooleanNon1 = Ajouter la version HTML de l’article en pièce jointe

¹ Soit UserLogin+Password OU SessionID. ² Si aucun couple de login n’est transmis.

Exemple de requête :

GET /Webservice/MyConnectorREST/TicketGet?SessionID=42&TicketID=12345&AllArticles=1&DynamicFields=1 HTTP/1.1
Host: demo.otobo.org

Exemple de réponse (tronqué) :

{
"Success":1,
"Data":{
"Ticket":[{
"TicketID":12345,
"TicketNumber":"202501230001",
"Title":"Nouvelle commande",
"State":"open",
"DynamicField":[{"Name":"Urgency","Value":"high"}],
"Article":[{
"ArticleID":67890,
"Subject":"Demande d'achat…",
"Body":"Veuillez envoyer une offre de prix…",
"Attachment":[{"Filename":"Offre.pdf","Content":"JVBERi0x…="}]
}]
}]
}
}

URL : /Webservice/<ServiceName>/TicketUpdate Méthode : PUT

Description : Met à jour les champs d’un ticket existant et crée éventuellement un nouvel article.

ParamètreTypeRequisDescription
SessionIDIntegerOui¹Token ou UserLogin+Password²
TicketIDIntegerOuiID du ticket à mettre à jour
Ticket.TitleStringNonNouveau titre
Ticket.StateStringNonNouvel état
Ticket.OwnerString/IDNonNouveau propriétaire
Ticket.PendingTimeHash / DiffNonNouveau temps d’attente
Article.SubjectStringNonCrée un nouvel article
Article.BodyStringNonContenu du nouvel article
DynamicField…ArrayNonMettre à jour les champs dynamiques
Attachment…ArrayNonAjouter de nouvelles pièces jointes

¹ Soit SessionID OU UserLogin+Password. ² Si aucun token SessionID n’est disponible.

Exemple de requête :

PUT /Webservice/MyConnectorREST/TicketUpdate HTTP/1.1
Host: demo.otobo.org
Content-Type: application/json
X-API-Key: abc123
{
"Data":{
"SessionID":42,
"TicketID":12345,
"Ticket":{ "State":"pending reminder","PendingTime":{"Diff":1440} },
"Article":{ "Subject":"Rappel défini","Body":"Le ticket est en cours de traitement." }
}
}

Exemple de réponse :

{ "Success":1, "ErrorMessage":"", "Data":{ "TicketID":12345, "ArticleID":67891 } }

URL : /Webservice/<ServiceName>/TicketDelete Méthode : DELETE

Description : Supprime définitivement un ou plusieurs tickets.

ParamètreTypeRequisDescription
SessionIDIntegerOui¹Token ou UserLogin+Password²
TicketIDString/ArrayOuiUn ou plusieurs IDs de ticket

Exemple de requête :

DELETE /Webservice/MyConnectorREST/TicketDelete?SessionID=42&TicketID=12345 HTTP/1.1
Host: demo.otobo.org

Exemple de réponse :

{ "Success":1, "ErrorMessage":"", "Data":{} }

URL : /Webservice/<ServiceName>/TicketHistoryGet Méthode : GET

Description : Récupère l’historique d’un ou plusieurs tickets.

ParamètreTypeRequisDescription
SessionIDIntegerOui¹Token ou UserLogin+Password²
TicketIDString/ArrayOuiUn ou plusieurs IDs de ticket

Exemple de requête :

GET /Webservice/MyConnectorREST/TicketHistoryGet?SessionID=42&TicketID=12345,

Nouvelles ressources dans GenericTicketConnectorREST.wadl :

<resource path="MyTest" id="MyTest">
<method name="GET" id="GET_MyTest">
<response status="200">
<representation mediaType="application/json"/>
</response>
</method>
</resource>

Alternativement via YAML dans development/webservices/GenericTicketConnectorREST.yml :

Provider:
Operation:
MyTest:
Description: "Opération de test"
MappingInbound: { }
MappingOutbound: { }
Type: Test::Module
Transport:
Config:
RouteOperationMapping:
MyTest:
RequestMethod: [ GET ]
Route: /MyTest

Ajouter un fournisseur SOAP


  • Indicateur de succès : Success: 0|1
  • Message d’erreur : ErrorMessage dans le JSON
  • Debugging : Dans la boîte de dialogue Transport, réglez Debug-Level sur Debug → entrées de log visibles dans la DB

Debugger de Web Service


ScénarioDescription
Automatisation inter-systèmesCréer des tickets à partir d’outils de monitoring (Nagios, Zabbix)
Synchronisation de donnéesMises à jour par lots des champs de ticket depuis un CRM externe
Portails Self-ServiceLes clients créent leurs propres tickets via REST
Applications mobilesLes applications natives iOS/Android communiquent via REST

Cloner un Web Service Module de gestion des erreurs

L’API REST OTOBO est flexible, performante et hautement extensible grâce à l’Interface Générique. Qu’il s’agisse d’une simple création de ticket ou d’une automatisation de workflow complexe, vous réalisez des intégrations transparentes dans n’importe quel paysage informatique en quelques clics dans l’Admin et avec des requêtes JSON standard.

Un client Python asynchrone pour interagir avec l’API REST OTOBO. Construit avec httpx et pydantic pour la sécurité des types et la facilité d’utilisation.

  • Requêtes HTTP asynchrones utilisant httpx.AsyncClient

  • Modèles Pydantic pour la validation des données de requête et de réponse

  • Opérations CRUD complètes pour les tickets :

    • TicketCreate
    • TicketSearch
    • TicketGet
    • TicketUpdate
    • TicketHistoryGet
  • Gestion des erreurs via OTOBOError pour les erreurs d’API

  • Méthode utilitaire search_and_get pour combiner les résultats de recherche avec une récupération détaillée

Installer depuis PyPI :

Fenêtre de terminal
pip install otobo

Créez un nouveau Web Service dans OTOBO avec la configuration suivante :

---
Debugger:
DebugThreshold: debug
TestMode: '0'
Description: ''
FrameworkVersion: 11.0.5
Provider:
Operation:
session-create:
Description: ''
IncludeTicketData: '0'
MappingInbound:
Type: Simple
MappingOutbound:
Type: Simple
Type: Session::SessionCreate
ticket-create:
Description: ''
IncludeTicketData: '1'
MappingInbound:
Type: Simple
MappingOutbound:
Type: Simple
Type: Ticket::TicketCreate
ticket-get:
Description: ''
IncludeTicketData: '0'
MappingInbound:
Config:
KeyMapDefault:
MapTo: ''
MapType: Keep
ValueMapDefault:
MapTo: ''
MapType: Keep
Type: Simple
MappingOutbound:
Type: Simple
Type: Ticket::TicketGet
ticket-history-get:
Description: ''
IncludeTicketData: '0'
MappingInbound:
Type: Simple
MappingOutbound:
Type: Simple
Type: Ticket::TicketHistoryGet
ticket-search:
Description: ''
IncludeTicketData: '0'
MappingInbound:
Type: Simple
MappingOutbound:
Type: Simple
Type: Ticket::TicketSearch
ticket-update:
Description: ''
IncludeTicketData: '1'
MappingInbound:
Type: Simple
MappingOutbound:
Type: Simple
Type: Ticket::TicketUpdate
Transport:
Config:
AdditionalHeaders: ~
KeepAlive: '1'
MaxLength: '16000'
RouteOperationMapping:
session-create:
RequestMethod:
- HEAD
- OPTIONS
- PATCH
- POST
- PUT
Route: /session
ticket-create:
RequestMethod:
- HEAD
- OPTIONS
- POST
Route: /ticket
ticket-get:
RequestMethod:
- HEAD
- OPTIONS
- POST
Route: /ticket/get
ticket-history-get:
RequestMethod:
- HEAD
- OPTIONS
- POST
Route: /ticket/history
ticket-search:
RequestMethod:
- HEAD
- OPTIONS
- POST
Route: /ticket/search
ticket-update:
RequestMethod:
- HEAD
- OPTIONS
- PATCH
- PUT
Route: /ticket
Type: HTTP::REST
RemoteSystem: ''
Requester:
Transport:
Type: HTTP::REST

Créez un nouvel agent Otobo avec un mot de passe sécurisé et donnez-lui les permissions nécessaires pour accomplir la tâche souhaitée.

from otobo import TicketOperation, OTOBOClientConfig
from otobo import AuthData
config = OTOBOClientConfig(
base_url="https://your-otobo-server/nph-genericinterface.pl",
service="OTOBO",
auth=AuthData(UserLogin="user1", Password="SecurePassword"),
operations={
TicketOperation.CREATE.value: "ticket",
TicketOperation.SEARCH.value: "ticket/search",
TicketOperation.GET.value: "ticket/get",
TicketOperation.UPDATE.value: "ticket",
TicketOperation.HISTORY_GET.value: "ticket/history",
}
)
import logging
from otobo import OTOBOClient
logging.basicConfig(level=logging.INFO)
client = OTOBOClient(config)
from otobo import (TicketOperation, OTOBOClientConfig, AuthData, TicketSearchParams, TicketCreateParams,
TicketHistoryParams, TicketUpdateParams, \
TicketGetParams, OTOBOClient, OTOBOTicketCreateResponse)
payload = TicketCreateParams(
Ticket={
"Title": "Nouvelle commande",
"Queue": "Sales",
"State": "new",
"Priority": "3 normal",
"CustomerUser": "customer@example.com"
},
Article={
"Subject": "Demande de produit",
"Body": "Veuillez envoyer les détails de prix...",
"MimeType": "text/plain"
}
)
response: OTOBOTicketCreateResponse = await client.create_ticket(payload)
print(response.TicketID, response.TicketNumber)
from otobo import TicketSearchParams, TicketGetParams
search_params = TicketSearchParams(Title="%Commande%")
search_res = await client.search_tickets(search_params)
ids = search_res.TicketID
for ticket_id in ids:
get_params = TicketGetParams(TicketID=ticket_id, AllArticles=1)
details = await client.get_ticket(get_params)
print(details.Ticket[0])
from otobo import TicketUpdateParams
update_params = TicketUpdateParams(
TicketID=response.TicketID,
Ticket={"State": "closed"}
)
await client.update_ticket(update_params)
from otobo import TicketHistoryParams
history_params = TicketHistoryParams(TicketID=str(response.TicketID))
history_res = await client.get_ticket_history(history_params)
print(history_res.History)
from otobo import FullTicketSearchResponse
full_res: FullTicketSearchResponse = await client.search_and_get(search_params)

MIT © Softoft, Tobias A. Bueck