Durchsuchbare Dokumentation aufrufen | Zurück zur Dokumentationsübersicht
Navigation: Dokumentationen agorum core > agorum core für Entwickler > agorum core REST-API
Das Plugin NORA | 360° (Projekt agorum.smartorga) wird mit einer REST-Schnittstelle ausgeliefert, die den kompletten Funktionsumfang der NORA | 360° AI Tools auch für externe Systeme über HTTP verfügbar macht
Mit der REST-API können Sie:
Tipp: Zur einfachen Verwendung der REST-Schnittstelle finden Sie im Projektverzeichnis unter doc/NORA 360 REST-API.postman_collection.json eine Postman-Collection, die Sie direkt in Postman importieren können. Sie enthält alle Endpunkte mit Beispiel-Anfragen und -Bodies.
Zur Verwendung der REST-API benötigen Sie ein JWT-Token. Dieses Token können Sie in agorum core über den JWT-Generator (Administration > Werkzeuge > JWT-Generator) erzeugen oder programmatisch über die JavaScript-Bibliothek common/jwt.
Sie müssen das Token bei jeder Anfrage im HTTP-Header Authorization mitgeben:
Authorization: Bearer <jwt-token>
_create, _view, _search) für die betroffenen Objekttypen. Diese werden über die automatisch angelegten NORA-Gruppen GRP_acso2_<identifier>_create, GRP_acso2_<identifier>_view und GRP_acso2_<identifier>_search gesteuert. Zusätzlich sind die klassischen agorum core Objekt-ACLs (Lese-/Schreibzugriff) auf die konkreten Objekte erforderlich.Die Schnittstelle ist erreichbar unter:
{{agorum-core-server}}/api/rest/custom/agorum.smartorga.<service>
Beispiel: https://mein-server/api/rest/custom/agorum.smartorga.search
Gehen Sie wie folgt vor, um die Collection in Postman zu verwenden:
Tipp: Sie können sich in Postman die Collection auch als generierte Dokumentation anzeigen lassen, zum Beispiel für die ganze Collection über View complete documentation:
Die REST-API liefert folgende HTTP-Statuscodes:
addressType).GET object/metadata (Parameter id) und POST note (Parameter target).POST/PUT object, POST/PUT template, POST/PUT person, POST/PUT address) als auch die Verletzung von Pflichtfeldern der NORA-Objekttypen. Die zugrunde liegende Transaktion wird in diesem Fall vollständig zurückgerollt.Erfolgreiche Anfragen liefern in der Regel eine JSON-Struktur zurück. Anlage- und Update-Operationen antworten stets mit einer minimalen Struktur:
{
"uuid": "<uuid-des-objekts>",
"name": "<object.name>"
}
Hinweis zum name-Feld: Der zurückgegebene name entspricht dem object.name nach dem Speichern. Das ist je nach Objekttyp ein unterschiedlicher Wert:
Angebot prüfen (TSK113).POST/PUT person) und Adressbausteinen (POST address) ist es ein interner Container-Bezeichner, z. B. D4WADDRESSCONTAINER_2550788, D4WADDRESSDATA_2551329, D4WADDRESSPHONE_2551132, D4WADDRESSEMAIL_2551137, D4WADDRESSLINK_2551142.POST note) ist es ein interner Notiz-Bezeichner der Form NOTEOBJECT_<nummer>.html.Verlassen Sie sich in Skripten daher immer auf die zurückgegebene uuid, wenn Sie das erzeugte Objekt später wieder ansprechen wollen. Wollen Sie den Anzeigenamen einer Person oder Firma programmatisch ermitteln, verwenden Sie im Anschluss GET object/metadata.
Die REST-API besteht aus den folgenden Services:
Mit der GET-Anfrage agorum.smartorga.search können Sie NORA-Objekte per Solr suchen. Alle Kriterien sind optional und werden mit UND verknüpft. Die Suche bezieht sich immer auf den agorum core Root (inpath:9999).
Hinweis: Die zu suchenden NORA-Objekttypen müssen im System deployt sein. Der aufrufende Benutzer sieht nur Objekte, für die er entsprechende ACL-Berechtigungen und NORA-Suchberechtigung (_search) besitzt.
Anfrageparameter:
identifier_ci). Beispiel: agorum.smartorga.task.inpath_uuid). Beschränkt die Suche auf Objekte unterhalb dieses Elternobjekts.acso2_name).acso2_number).{"agorum_smartorga_status":"agorum.smartorga.status.todo"}.uuid ist immer enthalten. Beispiel: properties=acso2_name&properties=acso2_number.lastmodifydate desc.true, wird nur die Gesamtzahl der Treffer zurückgegeben (kein rows-Array).GET <agorum-core-server>/api/rest/custom/agorum.smartorga.search
?identifier=agorum.smartorga.task
&metadata=%7B%22agorum_smartorga_status%22%3A%22agorum.smartorga.status.todo%22%7D
&properties=acso2_name
&properties=acso2_number
&limit=20
&sort=lastmodifydate%20desc
Beispiel – Antwort:
{
"total": 3,
"query": "inpath:9999 identifier_ci:\"agorum.smartorga.task\" agorum_smartorga_status:agorum.smartorga.status.todo",
"rows": [
{ "uuid": "...", "acso2_name": "Angebot prüfen", "acso2_number": "T-0001" },
{ "uuid": "...", "acso2_name": "Termin bestätigen", "acso2_number": "T-0002" },
{ "uuid": "...", "acso2_name": "Rechnung freigeben", "acso2_number": "T-0003" }
]
}
Beispiel – Nur die Trefferzahl abfragen:
GET <agorum-core-server>/api/rest/custom/agorum.smartorga.search?identifier=agorum.smartorga.customer&total=true
{
"total": 42,
"query": "inpath:9999 identifier_ci:\"agorum.smartorga.customer\""
}
Beispiel – Alle Kunden unterhalb eines bestimmten Ablagebereichs mit einer freien Solr-Abfrage:
GET <agorum-core-server>/api/rest/custom/agorum.smartorga.search
?identifier=agorum.smartorga.crm.customer
&parent=e13f6820-8128-11f1-8046-02420a0a0012
&query=acso2_name%3AMuster*
Der Service agorum.smartorga.object deckt drei Operationen ab: Anlegen (POST), Aktualisieren (PUT) und Lesen von Metadaten (GET /metadata).
Mit der POST-Anfrage agorum.smartorga.object legen Sie ein neues NORA-Objekt eines beliebigen Typs an.
Voraussetzungen:
identifier muss ein gültiger NORA-Objekttyp sein, der im System deployt und für den Benutzer erlaubt ist (NORA-Berechtigung _create).target muss ein gültiger Ablagebereich für den Objekttyp sein (z. B. eine business-storage-area für Kunden, eine task-area für Aufgaben). Ist die passende Ablagestruktur nicht eingerichtet, schlägt der Aufruf fehl.Anfrage-Body (JSON):
agorum.smartorga.task, agorum.smartorga.crm.customer.Beispiel – Neue Aufgabe anlegen:
POST <agorum-core-server>/api/rest/custom/agorum.smartorga.object
Content-Type: application/json
{
"identifier": "agorum.smartorga.task",
"target": "<uuid-der-task-area>",
"acso2_name": "Angebot prüfen",
"data": {
"agorum_smartorga_status": "agorum.smartorga.status.todo",
"agorum_smartorga_priority": "agorum.smartorga.priority.03"
}
}
Beispiel – Antwort:
{
"uuid": "7f929a00-fb8d-11f0-a330-02420a0a0013",
"name": "Angebot prüfen (TSK113)"
}
Hinweis: Der zurückgegebene name entspricht dem endgültigen object.name nach dem Speichern, inklusive der vergebenen Nummer (z. B. (TSK113)). Er weicht damit typischerweise vom übergebenen acso2_name ab.
Mit der PUT-Anfrage agorum.smartorga.object aktualisieren Sie die Metadaten eines vorhandenen NORA-Objekts.
Voraussetzung: Der Benutzer, mit dem das JWT ausgestellt wurde, benötigt Schreibzugriff auf das Objekt.
Anfrage-Body (JSON):
Beispiel – Aufgabe abschließen:
PUT <agorum-core-server>/api/rest/custom/agorum.smartorga.object
Content-Type: application/json
{
"id": "7f929a00-fb8d-11f0-a330-02420a0a0013",
"data": {
"agorum_smartorga_status": "agorum.smartorga.status.done"
}
}
Beispiel – Antwort:
{
"uuid": "7f929a00-fb8d-11f0-a330-02420a0a0013",
"name": "Angebot prüfen (TSK113)"
}
Mit der GET-Anfrage agorum.smartorga.object/metadata lesen Sie die Metadaten eines NORA-Objekts. Intern wird das JavaScript-API metadata().load() verwendet.
Anfrageparameter:
acso2_name, agorum_smartorga_status).~ – alle nicht-vererbten Metadaten.~~ – alle vererbten Metadaten./pattern/flags (wird auf dem Server in ein RegExp konvertiert).~.Beispiel – Alle NORA-Metadaten eines Objekts abfragen:
GET <agorum-core-server>/api/rest/custom/agorum.smartorga.object/metadata
?id=7f929a00-fb8d-11f0-a330-02420a0a0013
&metadata=%2F%5Eagorum_smartorga_%2F
&metadata=acso2_name
&metadata=acso2_number
Beispiel – Antwort:
{
"id": "7f929a00-fb8d-11f0-a330-02420a0a0013",
"metadata": {
"acso2_name": "Angebot prüfen",
"acso2_number": "T-0001",
"agorum_smartorga_status": "agorum.smartorga.status.done",
"agorum_smartorga_priority": "agorum.smartorga.priority.03"
}
}
Der Service agorum.smartorga.template stellt zwei Endpunkte bereit: einen zum Abfragen der Feldinformationen einer Vorlage (GET) und einen zum Anlegen eines Objekts aus der Vorlage (POST).
Mit der GET-Anfrage agorum.smartorga.template fragen Sie ab, welche Felder eine NORA-Vorlage beim Erstellen erwartet. Dieser Aufruf ist nützlich, bevor Sie ein Objekt aus einer Vorlage erstellen. So wissen Sie, welche Schlüssel Sie in data mitgeben müssen und welche davon Pflicht sind.
Voraussetzung: Die Vorlage muss zuvor über die NORA-Vorlagen-Verwaltung angelegt und für den Benutzer sichtbar sein.
Anfrageparameter:
Beispiel:
GET <agorum-core-server>/api/rest/custom/agorum.smartorga.template?template=<uuid-der-vorlage>
Antwort:
data-Objekt übergeben werden muss.agorum.composite.form.element.text, agorum.composite.form.element.date, agorum.composite.form.element.number, agorum.composite.form.element.select). Falls die Vorlage keinen expliziten Typ definiert, wird als Fallback text geliefert.{
"uuid": "<uuid-der-vorlage>",
"name": "Neukunden-Prozess",
"fields": [
{ "key": "Titel", "required": true, "type": "agorum.composite.form.element.text" },
{ "key": "Ansprechpartner", "required": false, "type": "agorum.composite.form.element.text" },
{ "key": "Deadline", "required": false, "type": "agorum.composite.form.element.date" }
],
"usage": "Call nora_create_from_template with the template, the target (UUID/path of the target folder) and a data object. In data, use each field \"key\" as the property name and provide a value. All required fields must be provided."
}
Hinweis: Das Feld usage ist ein interner Hilfstext, der für das gleichnamige NORA AI Tool nora_create_from_template gedacht ist.
Mit der POST-Anfrage agorum.smartorga.template erstellen Sie ein NORA-Objekt aus einer Vorlage. Platzhalter in der Vorlage (${variable}) werden mit den Werten aus data ersetzt.
Voraussetzungen und Verhalten:
target muss ein gültiges Ablageziel für den zu erstellenden Wurzelobjekttyp der Vorlage sein.required: true gekennzeichneten Felder müssen in data vorhanden sein, sonst antwortet der Service mit einer Fehlermeldung (missing required template field(s): <liste>).target landet, unabhängig davon, ob die Vorlage ein acso2_parent-Feld definiert.Anfrage-Body (JSON):
key aus GET template).Beispiel – Objekt aus Vorlage erstellen:
POST <agorum-core-server>/api/rest/custom/agorum.smartorga.template
Content-Type: application/json
{
"template": "<uuid-der-vorlage>",
"target": "<uuid-des-zielordners>",
"acso2_name": "Neukunde Mustermann",
"data": {
"Titel": "Neukunde Mustermann",
"Ansprechpartner": "Max Mustermann"
}
}
Antwort:
{
"uuid": "<uuid-des-neuen-objekts>",
"name": "Neukunde Mustermann (PRC17)"
}
Tipp: Praxis-Workflow: Rufen Sie zuerst GET template auf, um zu ermitteln, welche Felder Sie ausfüllen müssen. Erst dann rufen Sie POST template mit den passenden Werten auf. Der zurückgegebene name enthält das vom Save-Handler ausgegebene Nummer-Suffix des Wurzelobjekt-Typs (z. B. (PRC17) für einen Vorgang).
Der Service agorum.smartorga.person legt Kontaktpersonen im NORA-Adresssystem an oder aktualisiert sie.
Mit der POST-Anfrage agorum.smartorga.person legen Sie eine neue Kontaktperson unterhalb eines Business-Objekts (Kunde, Partner, Lieferant) an.
Voraussetzung: Das target muss ein NORA-Business-Objekt (Kunde, Partner, Lieferant) sein. Die Person wird direkt als Kind dieses Business-Objekts angelegt (Metadatum acso2_parent = target). Anders als bei POST/PUT address findet keine automatische Auflösung zur verknüpften Firmenadresse (agorum_smartorga_business_company_address) statt.
Anfrage-Body (JSON):
mr, mrs, mrmrs, family.Dr., Prof.).Beispiel – Ansprechpartner zu einem Kunden anlegen:
POST <agorum-core-server>/api/rest/custom/agorum.smartorga.person
Content-Type: application/json
{
"target": "<uuid-des-kunden>",
"salutation": "mr",
"givenName": "Max",
"familyName": "Mustermann",
"title": "Dr.",
"description": "Ansprechpartner Einkauf"
}
Antwort:
{
"uuid": "<uuid-der-person>",
"name": "D4WADDRESSCONTAINER_<interne-nummer>"
}
Hinweis zum name-Feld: Der zurückgegebene name ist ein interner Bezeichner der Form D4WADDRESSCONTAINER_<nummer> und nicht der Anzeigename der Person (Anrede, Titel, Vor-/Nachname). Der eigentliche Anzeigename wird von den zugehörigen Metadaten der Person abgeleitet und ist über GET object/metadata auslesbar. Verlassen Sie sich in Skripten deshalb auf die zurückgegebene uuid.
Mit der PUT-Anfrage agorum.smartorga.person aktualisieren Sie eine vorhandene Kontaktperson. Alle Felder außer id sind optional; nur explizit übergebene Felder werden verändert.
Anfrage-Body (JSON):
Beispiel:
PUT <agorum-core-server>/api/rest/custom/agorum.smartorga.person
Content-Type: application/json
{
"id": "<uuid-der-person>",
"title": "Prof.",
"description": "Geschäftsführer"
}
Antwort:
{
"uuid": "<uuid-der-person>",
"name": "D4WADDRESSCONTAINER_<interne-nummer>"
}
Der Service agorum.smartorga.address legt Adressbausteine (Adressdaten, Telefonnummern, E-Mail-Adressen und Web-Links) an oder aktualisiert sie. Der Bausteintyp wird immer über den Parameter addressType gesteuert.
Mögliche Werte für addressType:
Voraussetzung: Ist das target ein NORA-Business-Objekt (Kunde, Partner, Lieferant), wird intern automatisch die verknüpfte Firmenadresse (Metadatum agorum_smartorga_business_company_address) aufgelöst und der Adressbaustein an dieser angelegt. Existiert am Business-Objekt noch keine Firmenadresse, wird der Baustein direkt am Business-Objekt selbst angelegt. Sie können alternativ auch direkt die UUID einer Firmenadresse oder einer Kontaktperson als target angeben.
Feldnamen der data-Struktur: Die Felder unterhalb von data werden 1:1 an die agorum core JavaScript-API address/objects durchgereicht. Die zulässigen Felder pro addressType sind daher identisch mit zu address/objects beschriebenen Feldern, siehe Verwendbare Objekte. Die in dieser Doku gezeigten Feldnamen (street1, houseNumber1, zip, phoneNumber, mailAddress, link, ...) sind die tatsächlich unterstützten Namen.
Anfrage-Body (JSON):
data, phone, mail, link. Andere Werte werden mit HTTP 400 abgelehnt.Beispiel – Adressdaten zu einem Kunden anlegen (target = Business-Objekt, wird automatisch aufgelöst):
POST <agorum-core-server>/api/rest/custom/agorum.smartorga.address
Content-Type: application/json
{
"addressType": "data",
"target": "<uuid-des-kunden>",
"data": {
"street1": "Musterstraße",
"houseNumber1": "42",
"zip": "70173",
"city": "Stuttgart",
"state": "Baden-Württemberg",
"country": "de"
}
}
Beispiel – Festnetznummer als Standard anlegen:
POST <agorum-core-server>/api/rest/custom/agorum.smartorga.address
Content-Type: application/json
{
"addressType": "phone",
"target": "<uuid-des-kunden>",
"data": {
"type": "telephone",
"defaultNumber": true,
"phoneNumber": "+49 711 12345-0"
}
}
Beispiel – E-Mail-Adresse anlegen:
POST <agorum-core-server>/api/rest/custom/agorum.smartorga.address
Content-Type: application/json
{
"addressType": "mail",
"target": "<uuid-des-kunden>",
"data": {
"mailAddress": "info@testfirma.de",
"defaultMailAddress": true
}
}
Beispiel – Firmenwebsite als Link anlegen:
POST <agorum-core-server>/api/rest/custom/agorum.smartorga.address
Content-Type: application/json
{
"addressType": "link",
"target": "<uuid-des-kunden>",
"data": {
"link": "https://www.testfirma.de",
"defaultLink": true,
"subject": "Firmenwebsite"
}
}
Mit der PUT-Anfrage agorum.smartorga.address aktualisieren Sie einen vorhandenen Adressbaustein. Der Baustein wird über seine UUID (id) referenziert; der addressType muss dem Typ des vorhandenen Bausteins entsprechen.
Anfrage-Body (JSON):
data, phone, mail oder link.Beispiel – Telefonnummer ändern:
PUT <agorum-core-server>/api/rest/custom/agorum.smartorga.address
Content-Type: application/json
{
"addressType": "phone",
"id": "<uuid-des-telefon-bausteins>",
"data": {
"phoneNumber": "+49 89 98765-0"
}
}
Antwort (bei Erfolg): Die dokumentierte Struktur ist:
{
"uuid": "<uuid-des-telefon-bausteins>",
"name": "<interne-container-id>"
}
Hinweis: Der name eines Adressbausteins ist ein interner Container-Bezeichner (z. B. D4WADDRESSPHONE_2551132, D4WADDRESSDATA_2551329, D4WADDRESSEMAIL_2551137, D4WADDRESSLINK_2551142), nicht der formatierte Anzeigetext. Verlassen Sie sich in Skripten deshalb auf die zurückgegebene uuid.
Mit der POST-Anfrage agorum.smartorga.note legen Sie eine Notiz (agorum core Notiz-Objekt) an einem beliebigen Objekt an und stellen sie optional den angegebenen Empfängern (Benutzer oder Gruppen) in deren Eingang zu.
Voraussetzungen:
target muss ein existierendes agorum core Objekt sein und der authentifizierte Benutzer benötigt Schreibzugriff darauf.objects.tryFind() aufgelöst. Nicht auflösbare Werte werden 1:1 an das darunterliegende objects.create('note', ...) durchgereicht. Sind die Empfänger auch dort ungültig, antwortet der Service mit HTTP 500. Es empfiehlt sich, Empfänger vorab per GET object/metadata zu prüfen.Anfrage-Body (JSON):
noteFormat: 'text/html'. Wird reiner Text ohne HTML-Markup übergeben, wird dieser als HTML-Text interpretiert (Zeilenumbrüche gehen dabei verloren).objects.tryFind() aufgelöst werden können, insbesondere:
user:<login> für Benutzer.group:<name> für Gruppen.Beispiel – Notiz an einer Aufgabe anlegen und an einen Benutzer und eine Gruppe zustellen:
POST <agorum-core-server>/api/rest/custom/agorum.smartorga.note
Content-Type: application/json
{
"target": "<uuid-der-aufgabe>",
"content": "<p>Bitte prüfen Sie diesen Vorgang bis morgen.</p>",
"recipients": [
"user:demo",
"group:GRP_Vertrieb"
]
}
Antwort:
{
"uuid": "<uuid-der-notiz>",
"name": "NOTEOBJECT_<interne-nummer>.html"
}
Hinweise:
name einer Notiz ist ein interner, generierter Objektname der Form NOTEOBJECT_<nummer>.html und nicht der Notiztext. Verlassen Sie sich in Skripten deshalb auf die zurückgegebene uuid.recipients weggelassen oder leer übergeben, wird die Notiz nur am Zielobjekt abgelegt, ohne einem Empfänger in dessen Eingang zugestellt zu werden.Das folgende Beispiel zeigt einen typischen End-to-End-Ablauf, wie ein externes System über die REST-API einen neuen Kunden komplett anlegen kann. Alle Aufrufe verwenden dasselbe JWT-Bearer-Token im Authorization-Header (hier der Übersicht halber weggelassen).
Schritt 1 – Kunden anlegen (POST object):
POST /api/rest/custom/agorum.smartorga.object
{
"identifier": "agorum.smartorga.crm.customer",
"target": "<uuid-der-kunden-storage-area>",
"acso2_name": "Testfirma GmbH"
}
=> { "uuid": "<kunde-uuid>", "name": "Testfirma GmbH (CST<nummer>)" }
Schritt 2 – Adresse hinzufügen (POST address, addressType=data):
POST /api/rest/custom/agorum.smartorga.address
{
"addressType": "data",
"target": "<kunde-uuid>",
"data": {
"street1": "Musterstraße",
"houseNumber1": "42",
"zip": "70173",
"city": "Stuttgart",
"country": "de"
}
}
Schritt 3 – Telefonnummer und E-Mail-Adresse hinzufügen:
POST /api/rest/custom/agorum.smartorga.address
{
"addressType": "phone",
"target": "<kunde-uuid>",
"data": {
"type": "telephone",
"defaultNumber": true,
"phoneNumber": "+49 711 12345-0"
}
}
POST /api/rest/custom/agorum.smartorga.address
{
"addressType": "mail",
"target": "<kunde-uuid>",
"data": {
"mailAddress": "info@testfirma.de",
"defaultMailAddress": true
}
}
Schritt 4 – Ansprechpartner (Kontaktperson) anlegen (POST person):
POST /api/rest/custom/agorum.smartorga.person
{
"target": "<kunde-uuid>",
"salutation": "mr",
"givenName": "Max",
"familyName": "Mustermann",
"description": "Ansprechpartner Einkauf"
}
=> { "uuid": "<person-uuid>", "name": "D4WADDRESSCONTAINER_<interne-nummer>" }
Schritt 5 – Notiz am neuen Kunden hinterlegen und an einen Kollegen zustellen:
POST /api/rest/custom/agorum.smartorga.note
{
"target": "<kunde-uuid>",
"content": "<p>Neuer Kunde angelegt. Bitte im nächsten Meeting besprechen.</p>",
"recipients": [ "user:demo" ]
}
Schritt 6 – Verifikation per Suche:
GET /api/rest/custom/agorum.smartorga.search
?identifier=agorum.smartorga.crm.customer
&name=Testfirma*
&properties=acso2_name
&properties=acso2_number
&limit=5
=> {
"total": 1,
"query": "...",
"rows": [
{ "uuid": "<kunde-uuid>", "acso2_name": "Testfirma GmbH", "acso2_number": "<automatisch-vergebene-nummer>" }
]
}