Aufgaben in der Codenica API
Bevor die erste Anfrage für eine Aufgabe gesendet wird, muss in den Codenica-Einstellungen ein API-Schlüssel erstellt werden. Falls noch kein Schlüssel vorhanden ist, öffnen Sie Codenica API - Einführung in einer neuen Registerkarte. Dort werden die gemeinsamen Regeln für Schlüsselerstellung, Authentifizierung, API-Adressen und die sichere Speicherung des Secrets erklärt.
Eine Aufgabe beschreibt eine konkrete Tätigkeit, eine Zuständigkeit oder einen Arbeitsschritt, der erledigt werden soll. Ein Datensatz kann ein Fälligkeitsdatum, Status, Priorität, Kategorie, Beschreibung, Ort, Abteilung, Link und Tags enthalten. Außerdem kann eine Aufgabe mit anderen Objekten aus Service Desk und Assetverwaltung verbunden werden.
Im API-Vertrag hat ein Datensatz den Wert itemType worktask, während die Endpoint-Sammlung worktasks heißt. Die Beispiele enthalten sichere Demonstrationswerte. Ersetzen Sie Kennungen, Adressen und Datumswerte durch Werte aus Ihrer Integration.
Aufgaben - API-Adresse und Installationswahl
Alle Routen für Aufgaben beginnen mit:
{BASE_URL}/api/v1/worktasksBASE_URL ist die Adresse der Codenica-Anwendung ohne das Suffix /api/v1. Hängen Sie keinen Datenbanknamen und keine Firmenkennung an die Adresse.
Codenica Cloud: Verwenden Sie die der Firma zugewiesene Domain oder Subdomain:
export BASE_URL="https://{your-company-domain}"Codenica On-Premise: Die von Codenica Discovery lokal registrierte Standardadresse lautet:
export BASE_URL="http://codenica.local:5150"Wenn die Installation über eine Firmendomain, HTTPS, einen Reverse Proxy oder einen anderen Port erreichbar ist, verwenden Sie die genaue Adresse dieser Installation. Einzelheiten finden Sie in der Installationsanleitung für Codenica On-Premise. Verwenden Sie localhost nur in einer bewusst eingerichteten lokalen Testumgebung, in der HTTP-Client und API auf demselben Computer laufen.
Senden Sie tenantId weder im Body noch als Query-Parameter. Die richtige Datenbank wird über Anfrageadresse und Host ausgewählt.
Aufgaben - API-Schlüssel und Lizenzlimits
Erstellen Sie den Schlüssel unter Einstellungen -> API -> API-Schlüssel. Ein eigener Schlüssel für jede Anwendung und Umgebung erleichtert die Zugriffskontrolle. Geben Sie dem Schlüssel einen eindeutigen Namen und wählen Sie nur die für Aufgaben benötigten Scopes.
Beim Löschen eines Schlüssels wird sein Datensatz entfernt und ein Platz im Limit frei. Das Ablaufdatum beendet die Authentifizierung, ersetzt aber nicht die Pflege der Schlüsselliste. Ohne ausgewähltes Enddatum beträgt die Standardlaufzeit 90 Tage; die maximale Laufzeit eines Schlüssels beträgt 5 Jahre.
Aufgaben - Authentifizierung von Anfragen
Authentifizieren Sie jede Anfrage an die Codenica API mit zwei Headern:
X-Codenica-Client-Id: {CLIENT_ID}
X-Codenica-Client-Secret: {CLIENT_SECRET}
Accept: application/jsonBeispiel für den ersten Lesezugriff:
export PUBLIC_API_CLIENT_ID="cna_your_client_id"
export PUBLIC_API_CLIENT_SECRET="cns_your_client_secret"
curl --fail-with-body --silent --show-error --header "Accept: application/json" --header "X-Codenica-Client-Id: $PUBLIC_API_CLIENT_ID" --header "X-Codenica-Client-Secret: $PUBLIC_API_CLIENT_SECRET" "$BASE_URL/api/v1/context"Eine externe Integration benötigt weder eine Panelsitzung noch das Bearer-JWT des Benutzers. Speichern Sie das Secret serverseitig oder in einem Secrets-Manager. Legen Sie es nicht in Browsercode, einem Repository, einer URL, der Shell-History oder Logs ab.
Aufgaben - Verbindungskontext prüfen
Lesen Sie den context, bevor Sie eine Liste laden oder die erste Aufgabe erstellen. So wird bestätigt, dass die Adresse zur richtigen Datenbank führt und der Schlüssel über die erforderlichen Scopes und Limits verfügt.
curl --fail-with-body --silent --show-error --header "X-Codenica-Client-Id: $PUBLIC_API_CLIENT_ID" --header "X-Codenica-Client-Secret: $PUBLIC_API_CLIENT_SECRET" "$BASE_URL/api/v1/context" | jqPrüfen Sie in der Antwort data.tenant.id, data.tenant.name, data.tenant.subdomain, data.tenant.resolvedDomain, data.caller.clientId und data.caller.scopes. Stellen Sie außerdem sicher, dass die capabilities supportsRelationships, supportsFiles, supportsETag und supportsIdempotency enthalten.
{
"data": {
"apiVersion": "v1",
"caller": {
"authentication": "api_key",
"clientId": "{CLIENT_ID}",
"scopes": [
"worktasks:read",
"worktasks:write"
]
},
"capabilities": {
"supportsETag": true,
"supportsIdempotency": true,
"supportsRelationships": true,
"supportsFiles": true
}
},
"meta": {
"requestId": "{REQUEST_ID}"
}
}Wenn der context auf eine andere Firma zeigt oder der erforderliche Scope fehlt, unterbrechen Sie die Integration und korrigieren Sie Adresse oder Schlüssel. Versuchen Sie nicht, die Datenbank durch eine fremde ID im Body zu ändern.
Aufgaben - Schema und unterstützte Felder
Das Schema ist die verbindliche Quelle für die aktuelle Konfiguration der Aufgaben. Es liefert Feldtypen, Pflichtangaben, Schreibbarkeit, technische Felder und die in der Installation verfügbaren Beziehungsziele.
curl --fail-with-body --silent --show-error --header "X-Codenica-Client-Id: $PUBLIC_API_CLIENT_ID" --header "X-Codenica-Client-Secret: $PUBLIC_API_CLIENT_SECRET" "$BASE_URL/api/v1/worktasks/schema" | jq{
"data": {
"itemType": "worktask",
"fields": [
{
"name": "customId",
"type": "string",
"readable": true,
"writable": true,
"required": false
},
{
"name": "title",
"type": "string",
"readable": true,
"writable": true,
"required": false
}
],
"relationshipTargets": [
{
"targetDataSet": "assets",
"targetItemType": "asset"
},
{
"targetDataSet": "tickets",
"targetItemType": "ticket"
}
]
}
}Gehen Sie nicht davon aus, dass jede Datenbank gleich konfiguriert ist. Lesen Sie vor der Feldzuordnung das aktuelle Schema und beachten Sie readable, writable, required, technical und maxLength.
Aufgaben - beschreibbare und systemische Felder
Die folgenden Felder gehören in attributes. Wenn das Schema der aktuellen Installation andere Grenzen vorgibt, hat es Vorrang.
customIddateDuedateEndlocationdepartmenttaglinktitlestatusprioritycategorydescriptionDas Feld pin ist schreibgeschützt und wird über die eigene Route /pin geändert. Technische Felder wie authorId, agentId, workTimeId, creator, updater, dateCreated, dateUpdated, importId, importSource und dateImported werden vom System gefüllt. Senden Sie sie nicht bei einer normalen Erstellung oder in einem PATCH. Der Wert itemType muss immer worktask sein.
Aufgaben - wichtigste Endpunkte
Die folgende Übersicht zeigt die wichtigsten Operationen für das Objekt worktask. Fügen Sie nur den Scope hinzu, der für die gewünschte Operation notwendig ist.
Aufgaben - Listen und Paginierung
Lesen Sie die Aufgabenliste Seite für Seite. Setzen Sie die Sortierung ausdrücklich, damit nachfolgende Lesezugriffe eine vorhersehbare Reihenfolge verwenden:
curl --fail-with-body --silent --show-error --header "X-Codenica-Client-Id: $PUBLIC_API_CLIENT_ID" --header "X-Codenica-Client-Secret: $PUBLIC_API_CLIENT_SECRET" "$BASE_URL/api/v1/worktasks?page=1&pageSize=25&sort=dateCreated&direction=desc" | jqLesen Sie in der Antwort data.items, page, pageSize, totalItems, totalPages und hasNextPage. Wenn hasNextPage den Wert true hat, fordern Sie die nächste Seite an. Prüfen Sie die maximale Seitengröße in data.capabilities.limits.maxPageSize aus dem context.
Mit ids können ausgewählte UUIDs angefordert werden. Für eine Synchronisierung ist es sinnvoll, im integrierenden System eine stabile customId zu behalten und anschließend die von der Codenica API gelieferte UUID zu speichern.
Aufgaben - Suche und Filter
Die Liste unterstützt die Textsuche, die Suche in ausgewählten Feldern und einen strukturellen Filter. Häufige Parameter sind customId, search, title, status, priority, category, location, department, tag, createdAfter, createdBefore, updatedAfter und updatedBefore.
curl --fail-with-body --silent --show-error --header "X-Codenica-Client-Id: $PUBLIC_API_CLIENT_ID" --header "X-Codenica-Client-Secret: $PUBLIC_API_CLIENT_SECRET" "$BASE_URL/api/v1/worktasks?search=arbeitsplatz&filter=status%3Aeq%3AOpen&sort=dateDue&direction=asc&page=1&pageSize=25" | jqEin Filter hat die Form field:operator:value. Beispiele für Operatoren:
status:eq:Open
priority:ne:Low
title:startswith:Arbeitsplatz
description:contains:Netzwerk
dateDue:gte:2026-09-01T00:00:00ZDie Kurzformen =, !=, ge, le, sw und ew entsprechen Gleichheit, Ungleichheit, größer oder gleich, kleiner oder gleich, startswith und endswith. URL-enkodieren Sie Werte mit Sonderzeichen.
Aufgaben - Feldauswahl und eingeschlossene Daten
Mit fields begrenzen Sie die Felder, die in einem Datensatz zurückgegeben werden. Dadurch wird die Antwort kleiner und leichter zu verarbeiten:
curl --fail-with-body --silent --show-error --header "X-Codenica-Client-Id: $PUBLIC_API_CLIENT_ID" --header "X-Codenica-Client-Secret: $PUBLIC_API_CLIENT_SECRET" "$BASE_URL/api/v1/worktasks?fields=customId,title,status,priority,dateDue&page=1&pageSize=25" | jqVerwenden Sie include, wenn verbundene Daten benötigt werden:
curl --fail-with-body --silent --show-error --header "X-Codenica-Client-Id: $PUBLIC_API_CLIENT_ID" --header "X-Codenica-Client-Secret: $PUBLIC_API_CLIENT_SECRET" "$BASE_URL/api/v1/worktasks/{WORKTASK_ID}?fields=%2A&include=files%2Crelationships%2Cusers" | jqEingeschlossene Daten erweitern die Berechtigungen des Schlüssels nicht. Für Dateien, Beziehungen oder Benutzer benötigt der Schlüssel worktasks:files:read, worktasks:relationships:read und worktasks:users:read. Verwenden Sie fields=* nur, wenn technische Felder tatsächlich benötigt werden.
Aufgaben - Statistiken und Feldwerte
Statistiken helfen beim Erstellen von Übersichten, ohne die gesamte Sammlung herunterzuladen. Beispiel: Aufgaben nach Status zählen:
curl --fail-with-body --silent --show-error --header "X-Codenica-Client-Id: $PUBLIC_API_CLIENT_ID" --header "X-Codenica-Client-Secret: $PUBLIC_API_CLIENT_SECRET" "$BASE_URL/api/v1/worktasks/stats?field=status&limit=20" | jq{
"data": {
"total": 42,
"field": "status",
"values": [
{ "value": "Open", "count": 12 },
{ "value": "In progress", "count": 18 },
{ "value": "Closed", "count": 12 }
]
},
"meta": {
"requestId": "{REQUEST_ID}"
}
}Der Endpunkt values liefert Feldwerte, die einer Suche entsprechen. Das eignet sich zum Beispiel für Vorschläge in einem Formular:
curl --fail-with-body --silent --show-error --header "X-Codenica-Client-Id: $PUBLIC_API_CLIENT_ID" --header "X-Codenica-Client-Secret: $PUBLIC_API_CLIENT_SECRET" "$BASE_URL/api/v1/worktasks/values?field=category&search=ein&limit=20" | jqBeide Routen sind schreibgeschützt und erfordern den Scope worktasks:stats.
Aufgaben - minimale Erstellung
Eine minimale Schreibanfrage muss itemType und ein Objekt attributes enthalten. In der Praxis sollten Sie sofort eine eigene customId und einen Titel setzen:
{
"itemType": "worktask",
"attributes": {
"customId": "ERP-WORKTASK-2026-0042",
"title": "Arbeitsplatz vorbereiten",
"status": "Open",
"priority": "High",
"category": "IT"
}
}Anfrage zum Erstellen des Datensatzes:
curl --fail-with-body --silent --show-error --request POST --header "Accept: application/json, application/problem+json" --header "Content-Type: application/json" --header "X-Codenica-Client-Id: $PUBLIC_API_CLIENT_ID" --header "X-Codenica-Client-Secret: $PUBLIC_API_CLIENT_SECRET" --header "Idempotency-Key: erp-worktask-create-2026-0042" --data-raw '{
"itemType": "worktask",
"attributes": {
"customId": "ERP-WORKTASK-2026-0042",
"title": "Arbeitsplatz vorbereiten",
"status": "Open",
"priority": "High",
"category": "IT"
}
}' "$BASE_URL/api/v1/worktasks" | jqEine erfolgreiche Antwort hat den Status 201 Created. Speichern Sie data.id und das ETag des Datensatzes für die weitere Arbeit.
Aufgaben - vollständige Erstellung
Das folgende Beispiel enthält die Daten, die ein Planungssystem normalerweise an eine Aufgabe übergibt:
{
"itemType": "worktask",
"attributes": {
"customId": "ERP-WORKTASK-2026-0042",
"title": "Arbeitsplatz für eine neue Person vorbereiten",
"description": "Installieren Sie den Computer, konfigurieren Sie den Netzwerkzugang und bestätigen Sie die Einsatzbereitschaft des Arbeitsplatzes.",
"status": "Open",
"priority": "High",
"category": "Einarbeitung",
"dateDue": "2026-09-30T12:00:00Z",
"location": "Krakau",
"department": "IT",
"tag": "einarbeitung,arbeitsplatz",
"link": "https://portal.example.com/tasks/ERP-WORKTASK-2026-0042"
}
}Die Werte für Status, Priorität und Kategorie müssen der Konfiguration Ihrer Datenbank entsprechen. Die API legt kein neues Wörterbuch an, nur weil eine Integration einen neuen Namen sendet.
curl --fail-with-body --silent --show-error --request POST --header "Accept: application/json, application/problem+json" --header "Content-Type: application/json" --header "X-Codenica-Client-Id: $PUBLIC_API_CLIENT_ID" --header "X-Codenica-Client-Secret: $PUBLIC_API_CLIENT_SECRET" --header "Idempotency-Key: erp-worktask-create-2026-0042" --data-binary @worktask.json "$BASE_URL/api/v1/worktasks" | jqAufgaben - Idempotency-Key und sichere Wiederholungen
Jede Änderung mit einem API-Schlüssel benötigt den Header Idempotency-Key. Der Wert kennzeichnet eine geschäftliche Absicht. Bei einer Wiederholung derselben Anfrage behalten Sie denselben Schlüssel und ändern den Body nicht. Für eine neue Aufgabe oder eine andere Operation erzeugen Sie einen anderen Wert.
--header "Idempotency-Key: erp-worktask-create-2026-0042"Wenn die Verbindung abbricht, nachdem die Anfrage gesendet wurde, wiederholen Sie zuerst exakt dieselbe Anfrage mit demselben Schlüssel. Erzeugen Sie nicht sofort einen neuen Schlüssel, da dadurch ein Duplikat entstehen kann. Ohne den Header endet die Änderung mit 428 und dem Code idempotency_key_required.
Aufgaben - einen Datensatz lesen
Lesen Sie den Datensatz nach der Erstellung mit der in data.id zurückgegebenen UUID:
export WORKTASK_ID="{UUID_FROM_CREATE_RESPONSE}"
curl --fail-with-body --silent --show-error --header "X-Codenica-Client-Id: $PUBLIC_API_CLIENT_ID" --header "X-Codenica-Client-Secret: $PUBLIC_API_CLIENT_SECRET" "$BASE_URL/api/v1/worktasks/$WORKTASK_ID?fields=customId,title,status,priority,category,dateDue,description" | jqEin einzelner Datensatz enthält id, itemType, attributes und meta. Lesen Sie das ETag aus meta; sie wird für die nächste Änderung benötigt.
{
"data": {
"id": "{WORKTASK_ID}",
"itemType": "worktask",
"attributes": {
"customId": "ERP-WORKTASK-2026-0042",
"title": "Arbeitsplatz für eine neue Person vorbereiten",
"status": "Open"
},
"meta": {
"customId": "ERP-WORKTASK-2026-0042",
"etag": "{CURRENT_ETAG}"
}
},
"meta": {
"requestId": "{REQUEST_ID}",
"etag": "{CURRENT_ETAG}"
}
}Aufgaben - Aktualisierung mit ETag und If-Match
Lesen Sie vor jeder Änderung die aktuelle Version des Datensatzes und bewahren Sie den exakten ETag-Wert auf, einschließlich der Anführungszeichen, sofern sie dazugehören:
ETAG=$(curl --fail-with-body --silent --show-error --header "X-Codenica-Client-Id: $PUBLIC_API_CLIENT_ID" --header "X-Codenica-Client-Secret: $PUBLIC_API_CLIENT_SECRET" "$BASE_URL/api/v1/worktasks/$WORKTASK_ID?fields=customId,title,status,priority,description" | jq -r '.data.meta.etag // .meta.etag')PATCH ändert nur die ausgewählten Attribute. Speichern Sie nach dem Erfolg die neue ETag:
curl --fail-with-body --silent --show-error --request PATCH --header "Accept: application/json, application/problem+json" --header "Content-Type: application/json" --header "X-Codenica-Client-Id: $PUBLIC_API_CLIENT_ID" --header "X-Codenica-Client-Secret: $PUBLIC_API_CLIENT_SECRET" --header "If-Match: $ETAG" --header "Idempotency-Key: erp-worktask-update-2026-0042" --data-raw '{
"attributes": {
"title": "Arbeitsplatz für eine neue Person konfigurieren",
"status": "In progress",
"priority": "Normal",
"description": "Computer und Netzwerkzugang werden eingerichtet."
}
}' "$BASE_URL/api/v1/worktasks/$WORKTASK_ID" | jqVerwenden Sie kein ETag, die vor einer weiteren Änderung gespeichert wurde. Jede erfolgreiche Änderung kann die Version des Datensatzes verändern.
Aufgaben - veraltete oder fehlende ETag
Wenn eine andere Person oder Integration die Aufgabe geändert hat, führt eine alte ETag zu 412 Precondition Failed und dem Code if_match_failed. Die abgelehnte Änderung darf nicht angewendet werden.
{
"type": "https://docs.codenica.com/errors/if_match_failed",
"title": "Precondition failed.",
"status": 412,
"detail": "Die angegebene ETag ist nicht die aktuelle Version der Aufgabe.",
"code": "if_match_failed",
"requestId": "{REQUEST_ID}"
}PATCH, DELETE, Beziehungen, Dateien und das Anheften ohne erforderlichen If-Match liefern 428 Precondition Required mit dem Code if_match_required. Nach 412 lesen Sie den Datensatz erneut, entscheiden Sie, ob die lokale Änderung beibehalten werden soll, und senden Sie erst danach eine neue Anfrage.
Aufgaben - anheften und lösen
Das Feld pin ist innerhalb von attributes schreibgeschützt. Ändern Sie es über den eigenen Endpunkt:
POST /api/v1/worktasks/{WORKTASK_ID}/pinAuf Ebene 3 anheften:
curl --fail-with-body --silent --show-error --request POST --header "Content-Type: application/json" --header "X-Codenica-Client-Id: $PUBLIC_API_CLIENT_ID" --header "X-Codenica-Client-Secret: $PUBLIC_API_CLIENT_SECRET" --header "If-Match: $ETAG" --header "Idempotency-Key: erp-worktask-pin-2026-0042" --data '{"pin":3}' "$BASE_URL/api/v1/worktasks/$WORKTASK_ID/pin" | jqDer Wert null löst die Aufgabe:
curl --fail-with-body --silent --show-error --request POST --header "Content-Type: application/json" --header "X-Codenica-Client-Id: $PUBLIC_API_CLIENT_ID" --header "X-Codenica-Client-Secret: $PUBLIC_API_CLIENT_SECRET" --header "If-Match: $NEW_ETAG" --header "Idempotency-Key: erp-worktask-unpin-2026-0042" --data '{"pin":null}' "$BASE_URL/api/v1/worktasks/$WORKTASK_ID/pin" | jqLesen Sie die Aufgabe nach beiden Operationen erneut, da sich ihre ETag ändern kann.
Aufgaben - Beziehungen zu Autor und Agent
Die Benutzerbeziehung hat eine eigene Route und dient zum Lesen des Autors und des zugewiesenen Agents:
curl --fail-with-body --silent --show-error --header "X-Codenica-Client-Id: $PUBLIC_API_CLIENT_ID" --header "X-Codenica-Client-Secret: $PUBLIC_API_CLIENT_SECRET" "$BASE_URL/api/v1/worktasks/$WORKTASK_ID/user-relationships?page=1&pageSize=20" | jqDie Sammlung enthält nur Beziehungen mit dem Typ author oder agent. Beispiel für ein Element:
{
"targetId": "{USER_ID}",
"targetDataSet": "users",
"relationshipType": "agent",
"displayName": "Anna Schmidt",
"email": "[email protected]",
"role": "Agent"
}authorId und agentId sind technische Felder. Versuchen Sie nicht, sie über einen normalen PATCH attributes zu ändern. Wenn die API-Version eine eigene Zuweisungsoperation bereitstellt, folgen Sie ihrem Schema und dem erforderlichen Scope.
Aufgaben - zulässige Objektbeziehungen
Das Aufgaben-Schema stellt elf Objektgruppen als Beziehungsziele bereit:
Bei assets hängt der Typ vom konkreten Asset ab. Die Tabelle verwendet computer als Beispiel. Lesen Sie vor dem Speichern der Beziehung den tatsächlichen itemType des ausgewählten Objekts.
Aufgaben - targetItemType und Beziehungsformat auswählen
targetItemType muss dem tatsächlichen Typ des Zielobjekts entsprechen. Die sicherste Reihenfolge ist: Zielliste oder Schema lesen, den itemType lesen und erst danach den Relationship-Body erstellen.
curl --fail-with-body --silent --show-error --header "X-Codenica-Client-Id: $PUBLIC_API_CLIENT_ID" --header "X-Codenica-Client-Secret: $PUBLIC_API_CLIENT_SECRET" "$BASE_URL/api/v1/assets?page=1&pageSize=10&sort=dateCreated&direction=desc" | jq '.data.items[0] | {id, itemType}'Objektbeziehungen von Aufgaben akzeptieren kein relationshipType. Senden Sie nur Kennung, Sammlungsnamen und Objekttyp:
{
"targetId": "{ASSET_ID}",
"targetDataSet": "assets",
"targetItemType": "computer"
}Kopieren Sie nicht einfach asset, document oder task, ohne das konkrete Ziel zu prüfen. Ein falscher Typ führt zu einem Validierungsfehler.
Aufgaben - Beziehung hinzufügen, lesen und entfernen
Das Hinzufügen einer Asset-Beziehung benötigt die aktuelle ETag der Aufgabe und einen eigenen Idempotency-Key:
curl --fail-with-body --silent --show-error --request POST --header "Content-Type: application/json" --header "X-Codenica-Client-Id: $PUBLIC_API_CLIENT_ID" --header "X-Codenica-Client-Secret: $PUBLIC_API_CLIENT_SECRET" --header "If-Match: $ETAG" --header "Idempotency-Key: erp-worktask-relation-assets-2026-0042" --data '{
"targetId": "{ASSET_ID}",
"targetDataSet": "assets",
"targetItemType": "computer"
}' "$BASE_URL/api/v1/worktasks/$WORKTASK_ID/relationships" | jqLesen Sie die Beziehung mit einem Filter für den Zieldatensatz:
curl --fail-with-body --silent --show-error --header "X-Codenica-Client-Id: $PUBLIC_API_CLIENT_ID" --header "X-Codenica-Client-Secret: $PUBLIC_API_CLIENT_SECRET" "$BASE_URL/api/v1/worktasks/$WORKTASK_ID/relationships?targetDataSet=assets&page=1&pageSize=100" | jqEine einzelne Beziehung entfernen:
curl --fail-with-body --silent --show-error --request DELETE --header "X-Codenica-Client-Id: $PUBLIC_API_CLIENT_ID" --header "X-Codenica-Client-Secret: $PUBLIC_API_CLIENT_SECRET" --header "If-Match: $ETAG" --header "Idempotency-Key: erp-worktask-relation-delete-assets-2026-0042" "$BASE_URL/api/v1/worktasks/$WORKTASK_ID/relationships/assets/{ASSET_ID}" | jqNach dem Entfernen sollte die Antwort data=true enthalten. Das Hinzufügen einer neuen Beziehung liefert 201 Created; in manchen Situationen kann eine bereits vorhandene Beziehung erneut mit 200 OK beantwortet werden.
Aufgaben - Relationship-Batch
Mehrere Beziehungen lassen sich in einer Anfrage hinzufügen oder entfernen:
{
"add": [
{
"targetId": "{DOCUMENT_ID}",
"targetDataSet": "documents",
"targetItemType": "document"
}
],
"remove": [
{
"targetId": "{ASSET_ID}",
"targetDataSet": "assets",
"targetItemType": "computer"
}
]
}curl --fail-with-body --silent --show-error --request POST --header "Content-Type: application/json" --header "X-Codenica-Client-Id: $PUBLIC_API_CLIENT_ID" --header "X-Codenica-Client-Secret: $PUBLIC_API_CLIENT_SECRET" --header "If-Match: $ETAG" --header "Idempotency-Key: erp-worktask-relationships-batch-2026-0042" --data-binary @worktask-relationships.json "$BASE_URL/api/v1/worktasks/$WORKTASK_ID/relationships:batch" | jq{
"data": {
"added": 1,
"removed": 1,
"skipped": 0
},
"meta": {
"requestId": "{REQUEST_ID}"
}
}Relationship-Batches akzeptieren ebenfalls kein relationshipType. Verwenden Sie die aktuelle ETag der Aufgabe und lesen Sie das Elementlimit aus dem context. Speichern Sie die neue ETag, falls sie zurückgegeben wird, und lesen Sie danach die Sammlung, um das Ergebnis zu prüfen.
Aufgaben - Dateiliste und Upload
Dateien einer Aufgabe verwenden eine eigene Endpunktgruppe. Beginnen Sie mit dem Lesen der Liste:
curl --fail-with-body --silent --show-error --header "X-Codenica-Client-Id: $PUBLIC_API_CLIENT_ID" --header "X-Codenica-Client-Secret: $PUBLIC_API_CLIENT_SECRET" "$BASE_URL/api/v1/worktasks/$WORKTASK_ID/files?page=1&pageSize=100" | jqEin Listenelement enthält id, fileName, contentType, size, relationshipType, isMain und downloadUrl. Laden Sie eine neue Datei als multipart/form-data hoch:
curl --fail-with-body --silent --show-error --request POST --header "Accept: application/json, application/problem+json" --header "X-Codenica-Client-Id: $PUBLIC_API_CLIENT_ID" --header "X-Codenica-Client-Secret: $PUBLIC_API_CLIENT_SECRET" --header "If-Match: $ETAG" --header "Idempotency-Key: erp-worktask-file-upload-2026-0042" --form "file=@./workstation-instructions.pdf;type=application/pdf" "$BASE_URL/api/v1/worktasks/$WORKTASK_ID/files?relationshipType=instruction" | jqFür den Upload sind worktasks:files:write, die aktuelle ETag und das aus dem context gelesene Dateilimit erforderlich. Bei Aufgaben setzt die API isMain=false; gehen Sie nicht von einer eigenen Operation für eine Hauptdatei aus.
Aufgaben - Datei herunterladen und anhängen
Laden Sie den Dateiinhalt über die Route content herunter und speichern Sie ihn im Binärmodus:
curl --fail-with-body --silent --show-error --output ./workstation-instructions-downloaded.pdf --header "X-Codenica-Client-Id: $PUBLIC_API_CLIENT_ID" --header "X-Codenica-Client-Secret: $PUBLIC_API_CLIENT_SECRET" "$BASE_URL/api/v1/worktasks/$WORKTASK_ID/files/{FILE_ID}/content"Wenn eine Datei bereits im System gespeichert ist, können Sie sie an eine zweite Aufgabe anhängen, ohne den Inhalt erneut hochzuladen. Lesen Sie zuerst das ETag der zweiten Aufgabe:
curl --fail-with-body --silent --show-error --request POST --header "Accept: application/json, application/problem+json" --header "X-Codenica-Client-Id: $PUBLIC_API_CLIENT_ID" --header "X-Codenica-Client-Secret: $PUBLIC_API_CLIENT_SECRET" --header "If-Match: $SECOND_WORKTASK_ETAG" --header "Idempotency-Key: erp-worktask-file-attach-2026-0042" "$BASE_URL/api/v1/worktasks/$SECOND_WORKTASK_ID/files/{FILE_ID}?relationshipType=reference" | jqAttach legt eine Dateibeziehung zur zweiten Aufgabe an. Dieselbe Datei kann in beiden Datensätzen sichtbar sein; reference ist der Dateibeziehungstyp und kein Typ einer Objektbeziehung.
Aufgaben - Datei lösen und löschen
Lösen Sie die Datei mit ihrer aktuellen ETag von der zweiten Aufgabe:
curl --fail-with-body --silent --show-error --request DELETE --header "X-Codenica-Client-Id: $PUBLIC_API_CLIENT_ID" --header "X-Codenica-Client-Secret: $PUBLIC_API_CLIENT_SECRET" --header "If-Match: $SECOND_WORKTASK_ETAG" --header "Idempotency-Key: erp-worktask-file-detach-2026-0042" "$BASE_URL/api/v1/worktasks/$SECOND_WORKTASK_ID/files/{FILE_ID}" | jqDas Lösen sollte data=true liefern und die Dateibeziehung zur ursprünglichen Aufgabe nicht entfernen. Um die Datei von der ursprünglichen Aufgabe zu löschen, lesen Sie deren neue ETag und führen Sie Folgendes aus:
curl --fail-with-body --silent --show-error --request DELETE --header "X-Codenica-Client-Id: $PUBLIC_API_CLIENT_ID" --header "X-Codenica-Client-Secret: $PUBLIC_API_CLIENT_SECRET" --header "If-Match: $SOURCE_WORKTASK_ETAG" --header "Idempotency-Key: erp-worktask-file-delete-2026-0042" "$BASE_URL/api/v1/worktasks/$WORKTASK_ID/files/{FILE_ID}" | jqPrüfen Sie die Dateiliste nach dem Löschen. Für Aufgaben gibt es keinen eigenen Endpunkt zum Festlegen einer Hauptdatei.
Aufgaben - Batch-Vorgänge für Datensätze
Der Endpunkt /api/v1/worktasks:batch kombiniert die Erstellung, Aktualisierung und Löschung von Aufgaben. Jedes Update- oder Delete-Element hat eine eigene ETag:
{
"items": [
{
"operation": "create",
"create": {
"itemType": "worktask",
"attributes": {
"customId": "ERP-WORKTASK-BATCH-A",
"title": "Zugriff vorbereiten",
"status": "Open",
"priority": "Normal",
"category": "IT"
}
}
},
{
"operation": "update",
"id": "{WORKTASK_ID}",
"ifMatch": "{CURRENT_ETAG}",
"update": {
"attributes": {
"title": "Zugriff vorbereiten - zweite Stufe",
"status": "In progress"
}
}
},
{
"operation": "delete",
"id": "{OTHER_WORKTASK_ID}",
"ifMatch": "{OTHER_CURRENT_ETAG}"
}
]
}curl --fail-with-body --silent --show-error --request POST --header "Content-Type: application/json" --header "X-Codenica-Client-Id: $PUBLIC_API_CLIENT_ID" --header "X-Codenica-Client-Secret: $PUBLIC_API_CLIENT_SECRET" --header "Idempotency-Key: erp-worktasks-batch-2026-0042" --data-binary @worktasks-batch.json "$BASE_URL/api/v1/worktasks:batch" | jq{
"data": {
"items": [
{
"index": 0,
"operation": "create",
"status": 201,
"id": "{CREATED_WORKTASK_ID}",
"data": {
"meta": {
"etag": "{CREATED_ETAG}"
}
}
}
],
"succeeded": 1,
"failed": 0
},
"meta": {
"requestId": "{REQUEST_ID}"
}
}Bei einem Teilergebnis kann die API 207 Multi-Status zurückgeben. Gehen Sie data.items durch, prüfen Sie jedes Element und wiederholen Sie nur Operationen, die tatsächlich einen weiteren Versuch benötigen.
Aufgaben - einen Datensatz löschen
Lesen Sie den Datensatz vor dem Löschen erneut, prüfen Sie UUID und aktuelle ETag und verwenden Sie einen neuen Idempotency-Key:
curl --fail-with-body --silent --show-error --request DELETE --header "Accept: application/json, application/problem+json" --header "X-Codenica-Client-Id: $PUBLIC_API_CLIENT_ID" --header "X-Codenica-Client-Secret: $PUBLIC_API_CLIENT_SECRET" --header "If-Match: $CURRENT_ETAG" --header "Idempotency-Key: erp-worktask-delete-2026-0042" "$BASE_URL/api/v1/worktasks/$WORKTASK_ID" | jqEine erfolgreiche Antwort enthält 200 OK und data=true. Prüfen Sie nach dem Löschen, dass der Datensatz nicht mehr verfügbar ist:
curl --fail-with-body --silent --show-error --header "X-Codenica-Client-Id: $PUBLIC_API_CLIENT_ID" --header "X-Codenica-Client-Secret: $PUBLIC_API_CLIENT_SECRET" "$BASE_URL/api/v1/worktasks/$WORKTASK_ID"Erwartet wird 404 Not Found. Sie können die Liste außerdem mit customId=ERP-WORKTASK-2026-0042 filtern und totalItems=0 bestätigen.
Aufgaben - Fehler, Limits und sichere Reihenfolge
Fehlerantworten verwenden das Format Problem Details. Verwenden Sie code in der Integrationslogik und bewahren Sie bei einer Meldung auch requestId auf. Schreiben Sie weder das Secret noch vollständige Header in Logs.
validation_failedauthentication_requiredworktask_not_foundfile_not_foundif_match_failedfile_too_largeif_match_requiredidempotency_key_requiredinternal_errorLesen Sie die Header X-RateLimit-Limit und X-RateLimit-Remaining. Bei 429 lesen Sie Retry-After und verwenden Sie Backoff mit zunehmenden Wartezeiten und Jitter. Begrenzen Sie die Anzahl der Versuche und wiederholen Sie niemals endlos bei 400, 401, 403, 404 oder 412.
Sichere Reihenfolge der Operationen
BASE_URLfür die richtige Installation setzen und dencontextlesen.- Scopes, Limits, Schema und den tatsächlichen
itemTypeder Beziehungsziele prüfen. - Eine Aufgabe mit eigenem
Idempotency-Keyerstellen und UUID sowie ETag speichern. - Vor jeder Änderung, Beziehung, Dateioperation oder Pin-Aktion die aktuelle ETag lesen.
- Nach einer erfolgreichen Änderung die neue ETag speichern und das Ergebnis durch einen Lesezugriff prüfen.
- Nach der Synchronisierung den Datensatz mit
customIdprüfen und Demonstrationsdaten mit einer eigenen Anfrage löschen. - In n8n den Knoten HTTP Request verwenden. Client ID und Client Secret in den Zugangsdaten speichern und UUID, ETag sowie Idempotency-Key zwischen den Knoten weitergeben.
