Zum Inhalt springen

Schnellstart

Kurzantwort: Sie brauchen drei Dinge: die Basis-URL der API, ein Zugriffstoken und den API-Pfad Ihres Modells. Damit steht der erste Request in fünf Minuten. Alle komplexen Lesevorgänge laufen über POST, weil die Anfrage einen Körper braucht — das ist die wichtigste Umgewöhnung gegenüber üblichen REST-APIs.


Beispielwoher
Basis-URLhttps://api.example.com/api/restvom Betreiber
Token-Endpunkthttps://id.example.com/realms/<realm>/protocol/openid-connect/tokenvom Betreiber
ZugangsdatenClient-ID, ggf. Secretvom Betreiber
API-Pfad des Modells/crm/customeraus dem Modell bzw. der OpenAPI-Beschreibung

Für einen technischen Zugang (Server-zu-Server) genügen Client-Credentials:

Terminal-Fenster
curl -s -X POST \
"https://id.example.com/realms/<realm>/protocol/openid-connect/token" \
-d grant_type=client_credentials \
-d client_id=<client-id> \
-d client_secret=<secret>

Antwort (gekürzt):

{ "access_token": "eyJhbGciOi…", "expires_in": 300, "token_type": "Bearer" }

Für Anwendungen mit angemeldeten Benutzern nehmen Sie stattdessen den Authorization-Code-Flow — siehe Bearer-Token und Kontext.

Terminal-Fenster
curl -X POST "https://api.example.com/api/rest/crm/customer/create" \
-H "Authorization: Bearer $TOKEN" \
-H "Content-Type: application/json" \
-d '{
"data": { "name": "Muster GmbH", "email": "info@muster.de" },
"response": ["id", "name"]
}'
{
"data": { "id": "5a2b8f1e-…", "name": "Muster GmbH" },
"meta": { "error": false, "errorMessage": null, "notNull": false }
}

Zwei Dinge fallen sofort auf:

  1. Das eigentliche Objekt steckt in data, nicht auf oberster Ebene.
  2. response ist Pflicht. Sie sagen darin, welche Felder Sie zurückbekommen wollen — steht dort nichts, ist der Request ungültig (400).
Terminal-Fenster
curl -X POST "https://api.example.com/api/rest/crm/customer/read/5a2b8f1e-…" \
-H "Authorization: Bearer $TOKEN" \
-H "Content-Type: application/json" \
-d '{ "response": ["+"] }'

+ steht für „alle einfachen Felder”. Für einen schnellen Blick geht auch GET /read/{id} ohne Körper — das liefert immer * (alle Felder plus Referenzen mit ID).

Terminal-Fenster
curl -X POST "https://api.example.com/api/rest/crm/customer/query" \
-H "Authorization: Bearer $TOKEN" \
-H "Content-Type: application/json" \
-d '{
"response": ["id", "name"],
"parameter": {
"limit": 25,
"page": 0,
"order": [{ "field": "name", "order": "ASC" }],
"query": {
"type": "AND",
"filter": [{ "key": "name", "value": "Muster", "param": "LIKE" }]
}
}
}'
{
"data": [{ "id": "5a2b8f1e-…", "name": "Muster GmbH" }],
"meta": { "totalCount": 1, "currentPage": 0, "currentPageSize": 25, "currentLimit": 25 }
}
Terminal-Fenster
curl -X PATCH "https://api.example.com/api/rest/crm/customer/update/5a2b8f1e-…" \
-H "Authorization: Bearer $TOKEN" \
-H "Content-Type: application/json" \
-d '{
"data": { "id": "5a2b8f1e-…", "email": "neu@muster.de" },
"response": ["+"]
}'

PATCH ändert nur, was Sie nennen. PUT dagegen beschreibt den kompletten Zielzustand — was dort fehlt, wird geleert. Der Unterschied ist die häufigste Fehlerquelle beim Einstieg, siehe Daten schreiben.

flowchart LR
    A["Token im Header<br/>Authorization: Bearer …"] --> B["POST auf den Endpunkt"]
    B --> C["Körper:<br/>data · response · parameter"]
    C --> D["Antwort:<br/>data + meta"]
Bausteinwofür
datadas Objekt, das geschrieben wird (bei Schreiboperationen)
responsewelche Felder die Antwort enthält — immer erforderlich
parameterFilter, Sortierung, Seitengröße (bei Listen)
excludeeinzelne Felder aus einer Wildcard herausnehmen