Skip to content

description: Uitgebreide handleiding voor OTOBO / Znuny Web Services (REST), van configuratie tot voorbeelden, met afbeeldingen en tabellen.

OTOBO / Znuny Web Services – REST API

OTOBO REST API

In deze uitgebreide handleiding leert u hoe u de OTOBO REST API (onderdeel van de Generic Interface) activeert, configureert en integreert in uw eigen applicaties.

1. Architectuur & Grondbeginselen

OTOBO biedt zijn Generic Interface via REST- en SOAP-webservices. De REST API communiceert via HTTP(S)/JSON en maakt het volgende mogelijk:

  • Ticket-operaties: Aanmaken, ophalen, wijzigen, verwijderen
  • Artikel-operaties: Posten, bijlagen beheren
  • Geschiedenis & Zoeken: Ticketgeschiedenis en complexe zoekopdrachten

Opmerking: Een standaardinstallatie bevat geen vooraf geconfigureerde webservices – u maakt deze zelf aan in de adminmodule „Processen & Automatisering → Web Services“.

2. Configuratie

2.1 Generic Interface activeren

  1. Ga in het admin-gedeelte naar SysConfigGenericInterface.Transport en schakel over naar REST (HTTP).
  2. Stel onder AdminGenericInterfaceTransportHTTPREST Timeouts, Host-headers en Debug-niveau in.
  3. Maak en activeer de gewenste operaties (bijv. TicketCreate, TicketSearch, TicketGet, TicketUpdate, TicketDelete, TicketHistoryGet) onder GenericInterface.Operation.

Web Service ToevoegenWeb Service Provider

2.2 Basis-URL & Authenticatie

  • Basis-URL

    https://UW-SERVER/otobo/nph-genericinterface.pl/Webservice/<UwServiceName>/
  • Authenticatie

    • OTOBO-sessiecookies
    • API-sleutels / Tokens (aanmaken via SysConfig)
    • Gebruik altijd HTTPS!

REST Requester instellen

3. Endpoints & HTTP-Methoden (Detail)

Voor elke endpoint vindt u hier een gedetailleerd overzicht van parameters, mogelijke antwoorden en praktijkvoorbeelden.

3.1 TicketCreate (POST)

URL: /Webservice/<ServiceName>/TicketCreateMethode: POST

Beschrijving: Maakt een nieuw ticket aan en creëert direct een artikel.

ParameterTypeVereistBeschrijving
SessionIDIntegerJa¹Sessie-ID of UserLogin+Password
UserLoginStringJa²Agent-login (in combinatie met Password)
PasswordStringJa²Wachtwoord (in combinatie met UserLogin)
Ticket.TitleStringJaOnderwerp van het ticket
Ticket.QueueStringJaQueue-naam of Ticket.QueueID
Ticket.StateStringJaBeginstatus (bijv. new)
Ticket.PriorityStringJaPrioriteit (bijv. 3 normal)
Ticket.CustomerUserStringJaKlant-e-mail of login
Article.SubjectStringJaOnderwerp van het eerste artikel
Article.BodyStringJaInhoud van het eerste artikel
Article.MimeTypeStringJatext/plain of text/html

¹ Ofwel SessionID OF UserLogin+Password vereist. ² Indien geen SessionID-token wordt meegegeven.

Voorbeeld Request:

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":        "Nieuwe bestelling",
      "Queue":        "Sales",
      "State":        "new",
      "Priority":     "3 normal",
      "CustomerUser": "max.mustermann@example.com"
    },
    "Article": {
      "Subject":  "Prijsaanvraag – Product XY",
      "Body":     "Graag prijsopgave…",
      "MimeType": "text/plain"
    }
  }
}

Voorbeeld Antwoord:

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

3.2 TicketSearch (GET)

URL: /Webservice/<ServiceName>/TicketSearchMethode: GET

Beschrijving: Zoekt tickets op basis van diverse filtercriteria.

ParameterTypeVereistBeschrijving
UserLogin, PasswordString,StringJa¹Agent-credentials of SessionID²
SessionIDIntegerJa²Token voor geauthenticeerde sessies
TitleString/String[]NeeWildcard-zoekopdracht in de titel (%Bestelling%)
TicketNumberString/String[]NeeTicketnummer(s)
QueueIDsInteger[]NeeQueue-ID's
StatesString[]NeeStatussen (new, open, …)
StateTypeString/String[]NeeOpen/Closed-categorie
DynamicField_Name.OpMixedNeeDynamische velden met operator (Equals, Like, GreaterThan …)

¹ Ofwel UserLogin+Password OF SessionID. ² Indien geen login-paar wordt meegegeven.

Voorbeeld Request:

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

Voorbeeld Antwoord:

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

3.3 TicketGet (GET)

URL: /Webservice/<ServiceName>/TicketGetMethode: GET

Beschrijving: Geeft gedetailleerde ticketgegevens terug, inclusief artikelen, bijlagen en dynamische velden.

ParameterTypeVereistBeschrijving
UserLogin, PasswordString,StringJa¹Agent-credentials of SessionID²
SessionIDIntegerJa²Token voor geauthenticeerde sessies
TicketIDString/String[]JaEén of meerdere ticket-ID's (komma-gescheiden of array)
DynamicFieldsBoolean (0/1)Nee1 = Dynamische velden in het resultaat, Standaard = 0
ExtendedBooleanNee1 = Uitgebreide metadata (bijv. FirstResponse)
AllArticlesBooleanNee1 = Alle artikelen teruggeven
ArticleLimitIntegerNeeMax. aantal teruggegeven artikelen
AttachmentsBooleanNee1 = Bijlagen in Base64 insluiten
GetAttachmentContentsBooleanNee1 = Inhoud van bijlagen ook laden
HTMLBodyAsAttachmentBooleanNee1 = HTML-versie van het artikel als bijlage toevoegen

¹ Ofwel UserLogin+Password OF SessionID. ² Indien geen login-paar wordt meegegeven.

Voorbeeld Request:

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

Voorbeeld Antwoord (ingekort):

json
{
  "Success":1,
  "Data":{
    "Ticket":[{
      "TicketID":12345,
      "TicketNumber":"202501230001",
      "Title":"Nieuwe bestelling",
      "State":"open",
      "DynamicField":[{"Name":"Urgency","Value":"high"}],
      "Article":[{
        "ArticleID":67890,
        "Subject":"Prijsaanvraag…",
        "Body":"Graag prijsopgave…",
        "Attachment":[{"Filename":"Angebot.pdf","Content":"JVBERi0x…="}]
      }]
    }]
  }
}

3.4 TicketUpdate (PUT)

URL: /Webservice/<ServiceName>/TicketUpdateMethode: PUT

Beschrijving: Werkt velden van een bestaand ticket bij en maakt optioneel een nieuw artikel aan.

ParameterTypeVereistBeschrijving
SessionIDIntegerJa¹Token of UserLogin+Password²
TicketIDIntegerJaID van het bij te werken ticket
Ticket.TitleStringNeeNieuwe titel
Ticket.StateStringNeeNieuwe status
Ticket.OwnerString/IDNeeNieuwe eigenaar
Ticket.PendingTimeHash / DiffNeeNieuwe pending-tijd
Article.SubjectStringNeeCreëert een nieuw artikel
Article.BodyStringNeeInhoud van het nieuwe artikel
DynamicField…ArrayNeeDynamische velden bijwerken
Attachment…ArrayNeeNieuwe bijlagen toevoegen

¹ Ofwel SessionID OF UserLogin+Password. ² Indien geen SessionID-token wordt meegegeven.

Voorbeeld Request:

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":"Herinnering ingesteld","Body":"Ticket wordt verwerkt." }
  }
}

Voorbeeld Antwoord:

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

3.5 TicketDelete (DELETE)

URL: /Webservice/<ServiceName>/TicketDeleteMethode: DELETE

Beschrijving: Verwijdert definitief één of meerdere tickets.

ParameterTypeVereistBeschrijving
SessionIDIntegerJa¹Token of UserLogin+Password²
TicketIDString/ArrayJaEén of meerdere ticket-ID's

Voorbeeld Request:

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

Voorbeeld Antwoord:

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

3.6 TicketHistoryGet (GET)

URL: /Webservice/<ServiceName>/TicketHistoryGetMethode: GET

Beschrijving: Haalt de geschiedenis van één of meerdere tickets op.

ParameterTypeVereistBeschrijving
SessionIDIntegerJa¹Token of UserLogin+Password²
TicketIDString/ArrayJaEén of meerdere ticket-ID's

Voorbeeld Request:

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

5. Uitbreiding & Aanpassing

5.1 WADL-definitie

Nieuwe resources in 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 YAML-import

Alternatief via YAML in development/webservices/GenericTicketConnectorREST.yml:

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

SOAP Provider toevoegen


6. Foutafhandeling & Logging

  • Succesindicator: Success: 0|1
  • Foutmelding: ErrorMessage in de JSON
  • Debugging: Stel in het transportdialoogvenster Debug-niveau in op Debug → Logboekvermeldingen zichtbaar in de database

Webservice-debugger


7. Gebruiksscenario's

ScenarioBeschrijving
Systeem-overkoepelende automatiseringTickets aanmaken vanuit monitoringtools (Nagios, Zabbix)
GegevenssynchronisatieBatch-updates van ticketvelden vanuit externe CRM
Self-service portalsKlanten maken zelf tickets aan via REST
Mobiele appsNative iOS/Android-apps communiceren via REST

8. Verdere UI-elementen & Integratie

Web Service Klonen

Webservice klonen

Error Handling Module

Error Handling Module

Conclusie

De OTOBO REST API is flexibel, performant en dankzij de Generic Interface zeer uitbreidbaar. Of het nu gaat om eenvoudige ticket-aanmaak of complexe workflow-automatisering – met een paar klikken in de admin en standaard JSON-requests realiseert u naadloze integraties in elk IT-landschap.

Python OTOBO Client Library

Een asynchrone Python client voor interactie met de OTOBO REST API. Gebouwd met httpx en pydantic voor typeveiligheid en gebruiksgemak.

Kenmerken

  • Asynchrone HTTP-verzoeken met httpx.AsyncClient

  • Pydantic modellen voor validatie van request- en responsegegevens

  • Volledige CRUD-operaties voor tickets:

    • TicketCreate
    • TicketSearch
    • TicketGet
    • TicketUpdate
    • TicketHistoryGet
  • Foutafhandeling via OTOBOError voor API-fouten

  • Hulpmethode search_and_get om zoekresultaten te combineren met gedetailleerde ophaalacties

Installatie

Installeren vanaf PyPI:

bash
pip install otobo

Quickstart

OTOBO Webservices configureren:

Maak een nieuwe webservice aan in OTOBO met de volgende configuratie:

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

Maak een nieuwe Agent aan

Maak een nieuwe Otobo Agent aan met een veilig wachtwoord en geef deze de benodigde rechten voor de gewenste actie.

1. Configureer de client

python
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",
    }
)

2. Initialiseer de client

python
import logging
from otobo import OTOBOClient

logging.basicConfig(level=logging.INFO)


client = OTOBOClient(config)

3. Maak een ticket aan

python
from otobo import (TicketOperation, OTOBOClientConfig, AuthData, TicketSearchParams, TicketCreateParams,
                   TicketHistoryParams, TicketUpdateParams, \
                   TicketGetParams, OTOBOClient, OTOBOTicketCreateResponse)

payload = TicketCreateParams(
    Ticket={
        "Title": "Nieuwe bestelling",
        "Queue": "Sales",
        "State": "new",
        "Priority": "3 normal",
        "CustomerUser": "customer@example.com"
    },
    Article={
        "Subject": "Productaanvraag",
        "Body": "Graag prijsdetails...",
        "MimeType": "text/plain"
    }
)

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

4. Zoek en haal tickets op

python
from otobo import TicketSearchParams, TicketGetParams

search_params = TicketSearchParams(Title="%Bestelling%")
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. Werk een ticket bij

python
from otobo import TicketUpdateParams

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

6. Haal ticketgeschiedenis op

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. Gecombineerd zoeken en ophalen

python
from otobo import FullTicketSearchResponse

full_res: FullTicketSearchResponse = await client.search_and_get(search_params)

Licentie

MIT © Softoft, Tobias A. Bueck