Skip to content

OTOBO / Znuny Web Services – API REST

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.

1. Architecture & Fondamentaux

OTOBO fournit son Interface Générique via des services Web REST et SOAP. L'API REST communique via HTTP(S)/JSON et permet :

  • Opérations sur les tickets : Création, récupération, modification, suppression
  • Opérations sur les articles : Publication, gestion des pièces jointes
  • Historique & Recherche : Historique des tickets et requêtes de recherche complexes

Note : Une installation standard ne contient pas de services Web préconfigurés – vous les créez vous-même dans le module Admin « Processus & Automatisation → Services Web ».

2. Configuration

2.1 Activation de l'Interface Générique

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

Ajouter un Service WebProvider de Service Web

2.2 URL de Base & Authentification

  • URL de Base

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

    • Cookies de session OTOBO
    • Clés API / Tokens (à créer via SysConfig)
    • Utilisez toujours HTTPS !

Configuration du Requester REST

3. Points d'Accès & Méthodes HTTP (Détail)

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

3.1 TicketCreate (POST)

URL : /Webservice/<ServiceName>/TicketCreateMéthode : POST

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

ParamètreTypeObligatoireDescription
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.TitleStringOuiSujet du ticket
Ticket.QueueStringOuiNom de la queue ou Ticket.QueueID
Ticket.StateStringOuiÉtat initial (par ex. new)
Ticket.PriorityStringOuiPriorité (par ex. 3 normal)
Ticket.CustomerUserStringOuiE-mail ou login du client
Article.SubjectStringOuiSujet du premier article
Article.BodyStringOuiContenu du premier article
Article.MimeTypeStringOuitext/plain ou text/html

¹ Soit SessionID, soit UserLogin+Password requis. ² Si aucun token SessionID n'est fourni.

Exemple de Requête :

http
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":     "Merci de fournir une offre de prix…",
      "MimeType": "text/plain"
    }
  }
}

Exemple de Réponse :

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

3.2 TicketSearch (GET)

URL : /Webservice/<ServiceName>/TicketSearchMéthode : GET

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

ParamètreTypeObligatoireDescription
UserLogin, PasswordString,StringOui¹Identifiants agent ou SessionID²
SessionIDIntegerOui²Token pour les sessions authentifiées
TitleString/String[]NonRecherche avec joker dans le titre (%Commande%)
TicketNumberString/String[]NonNuméro(s) de ticket
QueueIDsInteger[]NonIDs de file d'attente
StatesString[]NonÉtats (new, open, …)
StateTypeString/String[]NonCatégorie Ouvert/Fermé
DynamicField_Name.OpMixedNonChamps dynamiques avec opérateur (Equals, Like, GreaterThan …)

¹ Soit UserLogin+Password, soit SessionID. ² Si aucune paire de connexion n'est fournie.

Exemple de Requête :

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

Exemple de Réponse :

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

3.3 TicketGet (GET)

URL : /Webservice/<ServiceName>/TicketGetMé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ètreTypeObligatoireDescription
UserLogin, PasswordString,StringOui¹Identifiants 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 maximum 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, soit SessionID. ² Si aucune paire de connexion n'est fournie.

Exemple de Requête :

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

Exemple de Réponse (tronqué) :

json
{
  "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":"Merci de fournir une offre de prix…",
        "Attachment":[{"Filename":"Angebot.pdf","Content":"JVBERi0x…="}]
      }]
    }]
  }
}

3.4 TicketUpdate (PUT)

URL : /Webservice/<ServiceName>/TicketUpdateMéthode : PUT

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

ParamètreTypeObligatoireDescription
SessionIDIntegerOui¹Token ou UserLogin+Password²
TicketIDIntegerOuiID du ticket à mettre à jour
Ticket.TitleStringNonNouveau titre
Ticket.StateStringNonNouveau statut
Ticket.OwnerString/IDNonNouveau propriétaire
Ticket.PendingTimeHash / DiffNonNouvelle heure de mise en attente
Article.SubjectStringNonCrée un nouvel article
Article.BodyStringNonContenu du nouvel article
DynamicField…ArrayNonMise à jour des champs dynamiques
Attachment…ArrayNonAjout de nouvelles pièces jointes

¹ Soit SessionID, soit UserLogin+Password. ² Si aucun token SessionID n'est fourni.

Exemple de Requête :

http
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 :

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

3.5 TicketDelete (DELETE)

URL : /Webservice/<ServiceName>/TicketDeleteMéthode : DELETE

Description : Supprime définitivement un ou plusieurs tickets.

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

Exemple de Requête :

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

Exemple de Réponse :

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

3.6 TicketHistoryGet (GET)

URL : /Webservice/<ServiceName>/TicketHistoryGetMéthode : GET

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

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

Exemple de Requête :

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

5. Extension & Personnalisation

5.1 Définition WADL

Nouvelles ressources dans GenericTicketConnectorREST.wadl :

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

5.2 Import YAML

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

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

Ajouter un Provider SOAP


6. Gestion des Erreurs & Journalisation

  • Indicateur de succès : Success: 0|1
  • Message d'erreur : ErrorMessage dans le JSON
  • Débogage : Réglez Debug-Level sur Debug dans la boîte de dialogue Transport → entrées de journal visibles dans la base de données

Débogueur de Service Web


7. Cas d'Usage

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

8. Autres Éléments d'Interface Utilisateur & Intégration

Clonage de Service Web

Cloner un Service Web

Module de Gestion des Erreurs

Module de Gestion des Erreurs

Conclusion

L'API REST OTOBO est flexible, performante et hautement extensible grâce à l'Interface Générique. Qu'il s'agisse de création de tickets simple ou d'automatisation de flux de travail complexes, avec quelques clics dans l'interface d'administration et des requêtes JSON standard, vous pouvez réaliser des intégrations transparentes dans n'importe quel paysage informatique.

Bibliothèque Client Python OTOBO

Une bibliothèque client Python asynchrone pour interagir avec l'API REST OTOBO. Construite avec httpx et pydantic pour la sécurité des types et la facilité d'utilisation.

Fonctionnalités

  • 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

Installation

Installez depuis PyPI :

bash
pip install otobo

Démarrage Rapide

Configuration des Services Web OTOBO :

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

yaml
---
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éer un nouvel Agent

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.

1. Configurer le client

python
from otobo import TicketOperation, OTOBOClientConfig
from otobo import AuthData

config = OTOBOClientConfig(
    base_url="https://votre-serveur-otobo/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",
    }
)

2. Initialiser le client

python
import logging
from otobo import OTOBOClient

logging.basicConfig(level=logging.INFO)


client = OTOBOClient(config)

3. Créer un ticket

python
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 des prix...",
        "MimeType": "text/plain"
    }
)

response: OTOBOTicketCreateResponse = await client.create_ticket(payload)
print(response.TicketID, response.TicketNumber)

4. Rechercher et récupérer des tickets

python
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])

5. Mettre à jour un ticket

python
from otobo import TicketUpdateParams

update_params = TicketUpdateParams(
    TicketID=response.TicketID,
    Ticket={"State": "closed"}
)
await client.update_ticket(update_params)

6. Obtenir l'historique des tickets

python
from otobo import TicketHistoryParams

history_params = TicketHistoryParams(TicketID=str(response.TicketID))
history_res = await client.get_ticket_history(history_params)
print(history_res.History)

7. Recherche et récupération combinées

python
from otobo import FullTicketSearchResponse

full_res: FullTicketSearchResponse = await client.search_and_get(search_params)

Licence

MIT © Softoft, Tobias A. Bueck