Zum Inhalt springen

OTOBO REST API – Konfiguration, Endpoints & Beispiele

OTOBO REST API

In diesem Guide: REST API (Generisches Interface) aktivieren, konfigurieren und in eigene Anwendungen integrieren.

Verwandte Themen: Web Services Übersicht · OpenID Connect · Performance-Optimierung · Softoft Services

In dieser ausführlichen Anleitung erfahren Sie, wie Sie die OTOBO REST API (Teil des Generischen Interface) aktivieren, konfigurieren und in eigene Anwendungen integrieren.

OTOBO stellt sein Generisches Interface über REST- und SOAP‑Webservices bereit. Die REST API kommuniziert via HTTP(S)/JSON und ermöglicht:

  • Ticket‑Operationen: Anlegen, Abrufen, Ändern, Löschen
  • Artikel‑Operationen: Posten, Anhänge verwalten
  • Historie & Suche: Ticket‑Verlauf und komplexe Suchanfragen

Hinweis: Eine Standard‑Installation enthält keine vorkonfigurierten Webservices – Sie legen diese selbst im Admin‑Modul „Prozesse & Automation → Web Services“ an.

  1. Im Admin‑Bereich → SysConfigGenericInterface.Transport auf REST (HTTP) umstellen.
  2. Unter AdminGenericInterfaceTransportHTTPREST Timeouts, Host‑Header und Debug‑Level einstellen.
  3. In GenericInterface.Operation gewünschte Operationen (z. B. TicketCreate, TicketSearch, TicketGet, TicketUpdate, TicketDelete, TicketHistoryGet) anlegen und aktivieren.

Web Service Hinzufügen Web Service Provider

  • Basis‑URL

    https://IHR-SERVER/otobo/nph-genericinterface.pl/Webservice/<IhrServiceName>/
  • Authentifizierung

    • OTOBO‑Session‑Cookies
    • API‑Keys / Token (über SysConfig anlegen)
    • Immer HTTPS verwenden!

REST Requester einrichten

Für jeden Endpunkt finden Sie hier eine detaillierte Übersicht zu Parametern, möglichen Antworten und Praxis‑Beispielen.

URL: /Webservice/<ServiceName>/TicketCreate Methode: POST

Beschreibung: Legt ein neues Ticket an und erstellt gleich einen Artikel.

ParameterTypPflichtBeschreibung
SessionIDIntegerJa¹Session-ID oder UserLogin+Password
UserLoginStringJa²Agenten-Login (in Kombination mit Password)
PasswordStringJa²Passwort (in Kombination mit UserLogin)
Ticket.TitleStringJaBetreff des Tickets
Ticket.QueueStringJaQueue-Name oder Ticket.QueueID
Ticket.StateStringJaAnfangszustand (z. B. new)
Ticket.PriorityStringJaPriorität (z. B. 3 normal)
Ticket.CustomerUserStringJaKunden-E-Mail oder Login
Article.SubjectStringJaBetreff des ersten Artikels
Article.BodyStringJaInhalt des ersten Artikels
Article.MimeTypeStringJatext/plain oder text/html

¹ Entweder SessionID ODER UserLogin+Password erforderlich. ² Wenn kein SessionID-Token vorliegt.

Beispiel Request:

POST /Webservice/MyConnectorREST/TicketCreate HTTP/1.1
Host: demo.otobo.org
Content-Type: application/json
X-API-Key: abc123
{
"Data": {
"SessionID": 42,
"Ticket": {
"Title": "Neue Bestellung",
"Queue": "Sales",
"State": "new",
"Priority": "3 normal",
"CustomerUser": "max.mustermann@example.com"
},
"Article": {
"Subject": "Kaufanfrage – Produkt XY",
"Body": "Bitte um Preisangebot…",
"MimeType": "text/plain"
}
}
}

Beispiel Antwort:

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

URL: /Webservice/<ServiceName>/TicketSearch Methode: GET

Beschreibung: Sucht Tickets anhand vielfältiger Filterkriterien.

ParameterTypPflichtBeschreibung
UserLogin, PasswordString,StringJa¹Agenten-Credentials oder SessionID²
SessionIDIntegerJa²Token für authentifizierte Sitzungen
TitleString/String[]NeinWildcard-Suche im Titel (%Bestellung%)
TicketNumberString/String[]NeinTicketnummer(n)
QueueIDsInteger[]NeinQueue-IDs
StatesString[]NeinZustände (new, open, …)
StateTypeString/String[]NeinOpen/Closed-Kategorie
DynamicField_Name.OpMixedNeinDynamische Felder mit Operator (Equals, Like, GreaterThan …)

¹ Entweder UserLogin+Password ODER SessionID. ² Wenn kein Login-Paar übergeben wird.

Beispiel Request:

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

Beispiel Antwort:

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

URL: /Webservice/<ServiceName>/TicketGet Methode: GET

Beschreibung: Gibt detaillierte Ticket-Daten inklusive Artikel, Anhängen und dynamischen Feldern zurück.

ParameterTypPflichtBeschreibung
UserLogin, PasswordString,StringJa¹Agenten-Credentials oder SessionID²
SessionIDIntegerJa²Token für authentifizierte Sitzungen
TicketIDString/String[]JaEine oder mehrere Ticket-IDs (komma-getrennt oder Array)
DynamicFieldsBoolean (0/1)Nein1 = Dynamische Felder im Ergebnis, Default = 0
ExtendedBooleanNein1 = Erweiterte Metadaten (z. B. FirstResponse)
AllArticlesBooleanNein1 = Alle Artikel zurückliefern
ArticleLimitIntegerNeinMax. Anzahl der zurückgegebenen Artikel
AttachmentsBooleanNein1 = Anhänge in Base64 einbetten
GetAttachmentContentsBooleanNein1 = Inhalte der Anhänge ebenfalls laden
HTMLBodyAsAttachmentBooleanNein1 = HTML-Version des Artikels als Attachment anfügen

¹ Entweder UserLogin+Password ODER SessionID. ² Wenn kein Login-Paar übergeben wird.

Beispiel Request:

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

Beispiel Antwort (gekürzt):

{
"Success":1,
"Data":{
"Ticket":[{
"TicketID":12345,
"TicketNumber":"202501230001",
"Title":"Neue Bestellung",
"State":"open",
"DynamicField":[{"Name":"Urgency","Value":"high"}],
"Article":[{
"ArticleID":67890,
"Subject":"Kaufanfrage…",
"Body":"Bitte um Preisangebot…",
"Attachment":[{"Filename":"Angebot.pdf","Content":"JVBERi0x…="}]
}]
}]
}
}

URL: /Webservice/<ServiceName>/TicketUpdate Methode: PUT

Beschreibung: Aktualisiert Felder eines existierenden Tickets und optional einen neuen Artikel erstellt.

ParameterTypPflichtBeschreibung
SessionIDIntegerJa¹Token oder UserLogin+Password²
TicketIDIntegerJaID des zu aktualisierenden Tickets
Ticket.TitleStringNeinNeuer Titel
Ticket.StateStringNeinNeuer Status
Ticket.OwnerString/IDNeinNeuer Besitzer
Ticket.PendingTimeHash / DiffNeinNeue Pending-Zeit
Article.SubjectStringNeinErstellt einen neuen Artikel
Article.BodyStringNeinInhalt des neuen Artikels
DynamicField…ArrayNeinDynamische Felder aktualisieren
Attachment…ArrayNeinNeue Anhänge hinzufügen

¹ Entweder SessionID ODER UserLogin+Password. ² Wenn kein SessionID-Token vorliegt.

Beispiel Request:

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":"Reminder gesetzt","Body":"Ticket wird bearbeitet." }
}
}

Beispiel Antwort:

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

URL: /Webservice/<ServiceName>/TicketDelete Methode: DELETE

Beschreibung: Löscht ein oder mehrere Tickets endgültig.

ParameterTypPflichtBeschreibung
SessionIDIntegerJa¹Token oder UserLogin+Password²
TicketIDString/ArrayJaEin oder mehrere Ticket-IDs

Beispiel Request:

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

Beispiel Antwort:

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

URL: /Webservice/<ServiceName>/TicketHistoryGet Methode: GET

Beschreibung: Ruft die Historie eines oder mehrerer Tickets ab.

ParameterTypPflichtBeschreibung
SessionIDIntegerJa¹Token oder UserLogin+Password²
TicketIDString/ArrayJaEin oder mehrere Ticket-IDs

Beispiel Request:

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

Beispiel Antwort (gekürzt):

{
"Success": 1,
"ErrorMessage": "",
"Data": {
"TicketID": 12345,
"History": [
{ "HistoryType": "NewTicket", "Name": "Neues Ticket erstellt", "CreateTime": "2025-01-23 09:15:00" },
{ "HistoryType": "StateUpdate", "Name": "Status auf open geändert", "CreateTime": "2025-01-23 10:02:11" }
]
}
}

Neue Ressourcen in GenericTicketConnectorREST.wadl:

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

Alternativ per YAML in development/webservices/GenericTicketConnectorREST.yml:

Provider:
Operation:
MyTest:
Description: "Testoperation"
MappingInbound: { }
MappingOutbound: { }
Type: Test::Module
Transport:
Config:
RouteOperationMapping:
MyTest:
RequestMethod: [ GET ]
Route: /MyTest

SOAP Provider hinzufügen


  • Erfolgsindikator: Success: 0|1
  • Fehlermeldung: ErrorMessage im JSON
  • Debugging: Setzen Sie im Transport‑Dialog Debug-Level auf Debug → Log‑Einträge in DB sichtbar

Webservice‑Debugger


ScenarioBeschreibung
Systemübergreifende AutomatisierungTickets aus Monitoring‑Tools (Nagios, Zabbix) erstellen
Daten­synchronisationBatch‑Updates von Ticket‑Feldern aus externem CRM
Self‑Service‑PortaleKunden legen eigene Tickets via REST an
Mobile AppsNative iOS/Android‑Apps kommunizieren per REST

Webservice klonen Error Handling Modul

Die OTOBO REST API ist flexibel, performant und dank Generischem Interface hochgradig erweiterbar. Ob einfache Ticket‑Erstellung oder komplexe Workflow‑Automatisierung – mit wenigen Klicks im Admin und Standard‑JSON‑Requests realisieren Sie nahtlose Integrationen in jede IT‑Landschaft.

Nein. Eine Standard‑Installation enthält keine vorkonfigurierten Webservices. Sie legen diese selbst unter Prozesse & Automation → Web Services an (oder importieren eine YAML‑Definition wie oben gezeigt).

Wie authentifiziere ich mich an der OTOBO REST API?

Abschnitt betitelt „Wie authentifiziere ich mich an der OTOBO REST API?“

Entweder über eine SessionID (per SessionCreate-Operation erzeugt) oder durch Übergabe von UserLogin + Password bei jedem Request. Verwenden Sie immer HTTPS, damit Zugangsdaten und Token nie im Klartext übertragen werden.

https://IHR-SERVER/otobo/nph-genericinterface.pl/Webservice/<IhrServiceName>/. Jede Operation (z. B. TicketCreate) wird anschließend auf eine Route abgebildet, die Sie in der Transport‑Konfiguration festlegen.

Standardmäßig konfigurierbar sind TicketCreate, TicketSearch, TicketGet, TicketUpdate, TicketDelete und TicketHistoryGet. Über das GenericInterface lassen sich eigene Operationen ergänzen.

Gibt es einen Python‑Client für die OTOBO REST API?

Abschnitt betitelt „Gibt es einen Python‑Client für die OTOBO REST API?“

Ja — das Open‑Source‑Paket otobo bietet einen asynchronen, typisierten Client auf Basis von httpx und pydantic. Siehe den Quickstart weiter unten.

Das OpenTicketAI-Paket otobo ist ein asynchroner Python-Client für die OTOBO GenericInterface REST API. Es basiert auf httpx und pydantic und bietet typisierte Requests, Response-Modelle und Hilfsfunktionen für Ticket-Workflows. Die vollständige Anleitung finden Sie in der OpenTicketAI OTOBO Python SDK Dokumentation.

  • Asynchronous HTTP requests using httpx.AsyncClient

  • Pydantic models for request and response data validation

  • Full CRUD operations for tickets:

    • TicketCreate
    • TicketSearch
    • TicketGet
    • TicketUpdate
    • TicketHistoryGet
  • Error handling via OTOBOError for API errors

  • Utility method search_and_get to combine search results with detailed retrieval

Installieren Sie das Paket von PyPI:

Terminal-Fenster
pip install otobo

Create a new web service in OTOBO with the following configuration:

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

Create a new Otobo Agent with a secure password and give it the permissions needed for the thing you want to accomplish.

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": "New Order",
"Queue": "Sales",
"State": "new",
"Priority": "3 normal",
"CustomerUser": "customer@example.com"
},
Article={
"Subject": "Product Inquiry",
"Body": "Please send pricing details...",
"MimeType": "text/plain"
}
)
response: OTOBOTicketCreateResponse = await client.create_ticket(payload)
print(response.TicketID, response.TicketNumber)
from otobo import TicketSearchParams, TicketGetParams
search_params = TicketSearchParams(Title="%Order%")
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

Häufig gestellte Fragen

Wie aktiviert man die OTOBO REST API?

Legen Sie unter Admin → Web Services einen Web-Service mit dem Generischen Interface und Transport HTTP::REST an und aktivieren Sie ihn.

Welche Ticket-Operationen werden häufig genutzt?

TicketCreate, TicketUpdate, TicketGet, TicketSearch und TicketHistoryGet sind typische REST-Operationen für Integrationen.

Wie funktioniert die Authentifizierung an der REST API?

Integrationen authentifizieren sich meist mit einem technischen Benutzer (SessionCreate oder BasicAuth) am Web-Service.