REST-API v2

Kunden, Rechnungen und alle weiteren Module aus Fremdsoftware anlegen, abrufen und ändern – mit Webhooks für Ereignisse in Echtzeit.

Basis-Adresse
https://crm.serv24-it.ch/api/v2
Alternative, falls die Adresse oben auf Ihrem Server nicht funktioniert: https://crm.serv24-it.ch/api.php/v2
Version 2.0.0JSON · UTF-8OpenAPI 3: openapi.jsonRate-Limit 120/Min.

Schnellstart

  1. Im CRM unter Einstellungen → REST-API einen Schlüssel erstellen (Rechte «lesen und schreiben», bei Bedarf nur bestimmte Bereiche). Der Schlüssel crm_… wird nur einmal angezeigt.
  2. Verbindung testen:
export CRM_KEY="crm_…"
curl "https://crm.serv24-it.ch/api/v2/me" -H "Authorization: Bearer $CRM_KEY"

Kunde anlegen und gleich eine Rechnung senden:

curl -X POST "https://crm.serv24-it.ch/api/v2/customers" -H "Authorization: Bearer $CRM_KEY" -H "Content-Type: application/json" \
  -d '{"company":"Muster AG","first_name":"Anna","last_name":"Muster","email":"anna.muster@example.ch","street":"Bahnhofstrasse 1","zip":"8001","city":"Zürich","country":"CH"}'
# → {"data":{"id":123,"customer_no":"10024","region":"Zürich",…}}

curl -X POST "https://crm.serv24-it.ch/api/v2/documents" -H "Authorization: Bearer $CRM_KEY" -H "Content-Type: application/json" \
  -H "Idempotency-Key: rechnung-erp-4711" \
  -d '{"type":"invoice","customer_id":123,"title":"Webseite","items":[{"description":"Design","qty":8,"unit":"Std.","price":150}],"send":true}'
# → {"data":{"id":456,"number":"RE-2026-0042","status":"open","total":1297.2,"url":"https://…",…},"delivery":{"ok":true,"channel":"email",…}}

curl -X POST "https://crm.serv24-it.ch/api/v2/payments" -H "Authorization: Bearer $CRM_KEY" -H "Content-Type: application/json" -d '{"document_id":456,"amount":1297.2}'

Authentifizierung & Rechte

Jede Anfrage braucht den Header Authorization: Bearer crm_… (alternativ X-API-Key: crm_…). Schlüssel gehören zu einem Betrieb und werden nur als Hash gespeichert – verlorene Schlüssel löschen und neu erstellen. Immer über HTTPS aufrufen und Schlüssel nie im Browser/Frontend verwenden.

EinstellungWirkung
Rechtenur lesen: nur GET · lesen und schreiben: alle Methoden
BereicheOptional auf einzelne Bereiche beschränken (z.B. nur customers und documents). Andere Bereiche liefern 403 insufficient_scope.
IP-FreigabeOptional: nur von bestimmten IP-Adressen oder Netzen (z.B. 203.0.113.10, 198.51.100.0/24).
AblaufdatumOptional: nach diesem Tag ist der Schlüssel ungültig (401 key_expired).
ModuleBereiche wie Mobile, Webhosting oder Online-Shop funktionieren nur, wenn das Modul im Abo aktiv ist (sonst 403 module_unavailable). GET /me zeigt, was verfügbar ist.

Sensible Daten werden über die API nie ausgegeben: hinterlegte Zahlungsmittel, PIN/PUK, Zugangsdaten, Ausweiskopien, Tresor-Inhalte und interne Links/Tokens.

Anfragen & Antworten

  • Eingaben als JSON-Objekt (Content-Type: application/json), Formulardaten werden ebenfalls angenommen.
  • Erfolg: {"data": …}, bei Listen zusätzlich "meta". Fehler: {"error": {"code", "message", "details", "request_id"}}.
  • PATCH ändert nur die übergebenen Felder (PUT wird gleich behandelt). Nur-lesen-Felder werden ignoriert, unbekannte Felder abgelehnt.
  • Beträge in CHF als Zahl mit Dezimalpunkt (1297.2), Datum JJJJ-MM-TT, Zeitpunkte ISO 8601 (2026-10-24T14:05:00+02:00), MWST-Sätze in Prozent (8.1).
  • Jede Antwort hat den Header X-Request-Id – bei Rückfragen bitte angeben.

Listen, Filter, Sortierung

Alle Listen sind seitenweise: limit (1–200, Standard 50) und offset. meta.total nennt die Gesamtzahl, meta.has_more ob weitere Einträge folgen. Filter je Endpunkt (siehe unten) lassen sich kombinieren; Mehrfachwerte kommagetrennt (status=open,partial). Sortierung mit sort=-date,number.

{
    "data": [
        {
            "id": 123,
            "customer_no": "10023",
            "name": "Muster AG (Anna Muster)",
            "…": "…"
        }
    ],
    "meta": {
        "total": 87,
        "limit": 50,
        "offset": 0,
        "has_more": true
    }
}

Änderungen seit dem letzten Abgleich: bei vielen Listen created_since, für laufende Änderungen sind Webhooks die bessere Wahl.

Fehler

HTTPcodeBedeutung
400invalid_json, invalid_bodyKein gültiges JSON bzw. kein JSON-Objekt
401unauthorized, key_expiredSchlüssel fehlt, ist falsch oder abgelaufen
402subscription_inactiveAbo des Betriebs nicht aktiv
403insufficient_scope, module_unavailable, ip_not_allowedSchlüssel darf das nicht (nur lesen / Bereich), Modul nicht im Abo, IP nicht freigegeben
404not_found, unknown_endpointDatensatz oder Endpunkt gibt es nicht
405method_not_allowedMethode für diesen Pfad nicht möglich (Header Allow)
409conflict, not_draft, has_documents, period_locked, duplicate …Widerspricht dem aktuellen Zustand
413payload_too_largeDatei zu gross
422validation_failed, rejected, delivery_failedEingaben ungültig – details nennt die Felder
429rate_limitedZu viele Anfragen (Retry-After)
500server_errorInterner Fehler – bitte mit request_id melden
{
    "error": {
        "code": "validation_failed",
        "message": "Ungültige Eingaben: email, items[0].price",
        "details": {
            "email": "ungültige E-Mail-Adresse",
            "items[0].price": "Zahl erwartet (Dezimalpunkt)"
        },
        "request_id": "7c1e2a9b04d3"
    }
}

Rate-Limit

Höchstens 120 Anfragen pro Minute und Schlüssel. Jede Antwort enthält X-RateLimit-Limit, X-RateLimit-Remaining und X-RateLimit-Reset (Unix-Zeit). Bei Überschreitung folgt 429 mit Retry-After (Sekunden) – danach einfach erneut senden.

Idempotenz

Bei POST kann ein Header Idempotency-Key mitgesendet werden (z.B. die ID aus Ihrem System). Wird dieselbe Anfrage innert 24 Stunden mit demselben Schlüssel wiederholt – etwa nach einem Verbindungsabbruch –, wird sie nicht doppelt ausgeführt; Sie erhalten die ursprüngliche Antwort mit Header Idempotent-Replayed: true. Derselbe Schlüssel mit anderem Inhalt ergibt 422 idempotency_mismatch.

Webhooks

Webhooks melden Ereignisse sofort per POST an Ihre HTTPS-Adresse – einrichten unter Einstellungen → REST-API oder über /webhooks. Antworten Sie innert 8 Sekunden mit einem 2xx-Status. Bei Fehlern wird bis zu 8 Mal wiederholt (nach 1, 5, 15 Min., 1, 3, 6, 12 und 24 Std.); nach 50 Fehlschlägen in Folge wird der Webhook pausiert. Ereignisse können in seltenen Fällen doppelt ankommen – nutzen Sie id zum Erkennen.

EreignisAuslöser
customer.createdKunde angelegt
customer.updatedKunde geändert
customer.deletedKunde gelöscht
document.createdBeleg als Entwurf angelegt
document.finalizedBeleg abgeschlossen (Nummer vergeben)
document.sentBeleg an den Kunden versendet
document.paidRechnung vollständig bezahlt
document.cancelledBeleg storniert
payment.createdZahlung erfasst
payment.deletedZahlung gelöscht
request.createdKundenanfrage eröffnet
request.updatedNeue Nachricht oder Statuswechsel bei einer Anfrage
shop_order.createdBestellung im Online-Shop eingegangen
webhook.testTestereignis (über die Einstellungen oder POST /webhooks/{id}/test)

Nutzdaten

{
    "id": "evt_3f9a1c…",
    "event": "document.paid",
    "created_at": "2026-11-14T14:21:37+01:00",
    "data": {
        "id": 456,
        "type": "invoice",
        "number": "RE-2026-0042",
        "status": "paid",
        "customer_id": 123,
        "total": 1297.2,
        "paid_total": 1297.2,
        "balance": 0,
        "…": "…"
    }
}

data hat dieselbe Form wie die Antwort des entsprechenden GET-Endpunkts (ohne Positionen).

Header

X-Webhook-EventEreignis, z.B. document.paid
X-Webhook-DeliveryNummer der Zustellung
X-Webhook-AttemptVersuch (1–8)
X-Webhook-Signaturet=<Unix-Zeit>,v1=<HMAC-SHA256> über t + "." + Rohdaten mit Ihrem Geheimnis whsec_…

Signatur prüfen

PHP

$payload = file_get_contents('php://input');
$sig = $_SERVER['HTTP_X_WEBHOOK_SIGNATURE'] ?? '';          // t=1767225600,v1=5f1c…
preg_match('/t=(\d+),v1=([a-f0-9]{64})/', $sig, $m);
$expected = hash_hmac('sha256', $m[1] . '.' . $payload, getenv('CRM_WEBHOOK_SECRET'));
if (!$m || !hash_equals($expected, $m[2]) || abs(time() - (int)$m[1]) > 300) { http_response_code(401); exit; }
$event = json_decode($payload, true);                       // ['id' => 'evt_…', 'event' => 'document.paid', 'data' => [...]]
http_response_code(200);                                    // innert 8 Sekunden mit 2xx antworten

Node.js

const crypto = require('crypto');
// Express: app.post('/webhooks/crm', express.raw({ type: 'application/json' }), handler)
function verify(rawBody, header, secret) {
  const [, t, v1] = /t=(\d+),v1=([a-f0-9]{64})/.exec(header || '') || [];
  if (!t || Math.abs(Date.now() / 1000 - t) > 300) return false;
  const exp = crypto.createHmac('sha256', secret).update(t + '.' + rawBody).digest('hex');
  return crypto.timingSafeEqual(Buffer.from(exp), Buffer.from(v1));
}

Python

import hmac, hashlib, re, time
def verify(raw_body: bytes, header: str, secret: str) -> bool:
    m = re.match(r"t=(\d+),v1=([a-f0-9]{64})", header or "")
    if not m or abs(time.time() - int(m[1])) > 300: return False
    exp = hmac.new(secret.encode(), m[1].encode() + b"." + raw_body, hashlib.sha256).hexdigest()
    return hmac.compare_digest(exp, m[2])

Allgemein

Verbindung, Rechte und Auswahllisten

GET/melesen

Schlüssel, Betrieb, Rechte und verfügbare Bereiche

Praktisch zum Testen der Verbindung.

Antwort: Status 200

curl "https://crm.serv24-it.ch/api/v2/me" \
  -H "Authorization: Bearer $CRM_KEY"
GET/metalesen

Auswahllisten (Belegarten, Status, Länder, Regionen, MWST-Sätze, Ereignisse …)

Antwort: Status 200

curl "https://crm.serv24-it.ch/api/v2/meta" \
  -H "Authorization: Bearer $CRM_KEY"

Kunden

Kunden, Kontaktpersonen, Notizen und Kundendokumente · Bereich customers

GET/customerslesen

Kunden auflisten

ParameterOrtTypBeschreibung
searchQueryTextFreitext (Firma, Name, E-Mail, Kundennummer, Ort)
customer_noQueryTextKundennummer
emailQueryTextE-Mail (genau)
ext_refQueryTextIhre Referenz
typeQueryText: person | companyArt
tagQueryTextSchlagwort
countryQueryTextLand
archivedQueryText: false | true | allfalse = aktive (Standard), true = archivierte, all = alle
created_sinceQueryZeitpunktNur Einträge, die ab diesem Zeitpunkt erfasst wurden (ISO 8601)
limit / offsetQueryGanzzahlSeitenweise abrufen (Standard 50, max. 200)
sortQueryTextStandard id · möglich: id, customer_no, company, last_name, city, created_at (mit «-» absteigend)

Antwort: Status 200 · data: Liste von Customer + meta

curl "https://crm.serv24-it.ch/api/v2/customers?search=muster" \
  -H "Authorization: Bearer $CRM_KEY"
POST/customersschreiben

Kunde anlegen

Ort und Kanton/Bundesland werden anhand der PLZ geprüft und ergänzt. Bei fehlender Kundennummer wird die nächste freie vergeben.

Eingabe (JSON)
FeldTypBeschreibung
customer_noTextKundennummer – leer lassen für die nächste freie Nummer
typeText: person | companyPrivatperson oder Firma (Standard: company, wenn «company» gesetzt ist, sonst person)
companyTextFirmenname (Firma: Pflicht, sonst last_name)
salutationTextAnrede, z.B. Herr, Frau
first_nameTextVorname
last_nameTextNachname (Privatperson: Pflicht)
emailE-MailE-Mail-Adresse (Rechnungsversand)
phoneTextTelefon
mobileTextMobile
websiteTextWebseite
streetTextStrasse und Hausnummer
address2TextAdresszusatz, Postfach
zipTextPLZ
cityTextOrt – Schreibweise wird anhand der PLZ korrigiert
regionText · nullKanton / Bundesland / Region – leer = automatisch aus PLZ und Ort
countryTextLand, ISO-3166-Code (CH, LI und EU-Staaten), Standard CH
birth_dateDatum · nullGeburtsdatum (JJJJ-MM-TT)
languageText: de | fr | it | enSprache der Belege
uid_noTextUID (CHE-…)
vat_noTextMWST-Nummer
payment_daysGanzzahl · nullZahlungsfrist in Tagen (leer = Standard des Betriebs)
delivery_channelText: email | postRechnungsversand per E-Mail oder Post
tagsTextSchlagwörter, durch Komma getrennt
notesText (lang)Interne Bemerkungen
ext_refText · nullIhre Referenz im Fremdsystem (frei verwendbar, filterbar)
archivedtrue/falseArchiviert
dunning_stoptrue/falseMahnstopp für alle Rechnungen des Kunden
dunning_stop_untilDatum · nullMahnstopp bis (leer = unbefristet)
dunning_stop_reasonText · nullGrund des Mahnstopps (intern)
contactsListe von ContactKontaktpersonen gleich mitanlegen (Schema Contact)

Antwort: Status 201 · data: Customer

curl -X POST "https://crm.serv24-it.ch/api/v2/customers" \
  -H "Authorization: Bearer $CRM_KEY" \
  -H "Content-Type: application/json" \
  -H "Idempotency-Key: $(uuidgen)" \
  -d '{"type":"company","company":"Muster AG","first_name":"Anna","last_name":"Muster","email":"anna.muster@example.ch","street":"Bahnhofstrasse 1","zip":"8001","city":"Zürich","country":"CH","ext_ref":"ERP-4711","contacts":[{"name":"Peter Beispiel","position":"Buchhaltung","email":"buchhaltung@example.ch"}]}'
GET/customers/{id}lesen

Kunde abrufen (inkl. Kontaktpersonen und offenem Betrag)

ParameterOrtTypBeschreibung
idPfadGanzzahlID

Antwort: Status 200 · data: Customer

curl "https://crm.serv24-it.ch/api/v2/customers/123" \
  -H "Authorization: Bearer $CRM_KEY"
PATCH/customers/{id}schreiben

Kunde ändern (nur übergebene Felder)

ParameterOrtTypBeschreibung
idPfadGanzzahlID
Eingabe (JSON) – nur die zu ändernden Felder
FeldTypBeschreibung
customer_noTextKundennummer – leer lassen für die nächste freie Nummer
typeText: person | companyPrivatperson oder Firma (Standard: company, wenn «company» gesetzt ist, sonst person)
companyTextFirmenname (Firma: Pflicht, sonst last_name)
salutationTextAnrede, z.B. Herr, Frau
first_nameTextVorname
last_nameTextNachname (Privatperson: Pflicht)
emailE-MailE-Mail-Adresse (Rechnungsversand)
phoneTextTelefon
mobileTextMobile
websiteTextWebseite
streetTextStrasse und Hausnummer
address2TextAdresszusatz, Postfach
zipTextPLZ
cityTextOrt – Schreibweise wird anhand der PLZ korrigiert
regionText · nullKanton / Bundesland / Region – leer = automatisch aus PLZ und Ort
countryTextLand, ISO-3166-Code (CH, LI und EU-Staaten), Standard CH
birth_dateDatum · nullGeburtsdatum (JJJJ-MM-TT)
languageText: de | fr | it | enSprache der Belege
uid_noTextUID (CHE-…)
vat_noTextMWST-Nummer
payment_daysGanzzahl · nullZahlungsfrist in Tagen (leer = Standard des Betriebs)
delivery_channelText: email | postRechnungsversand per E-Mail oder Post
tagsTextSchlagwörter, durch Komma getrennt
notesText (lang)Interne Bemerkungen
ext_refText · nullIhre Referenz im Fremdsystem (frei verwendbar, filterbar)
archivedtrue/falseArchiviert
dunning_stoptrue/falseMahnstopp für alle Rechnungen des Kunden
dunning_stop_untilDatum · nullMahnstopp bis (leer = unbefristet)
dunning_stop_reasonText · nullGrund des Mahnstopps (intern)

Antwort: Status 200 · data: Customer

curl -X PATCH "https://crm.serv24-it.ch/api/v2/customers/123" \
  -H "Authorization: Bearer $CRM_KEY" \
  -H "Content-Type: application/json" \
  -d '{"phone":"+41 44 123 45 67","tags":"VIP, Newsletter"}'
DELETE/customers/{id}schreiben

Kunde löschen (nur ohne Belege – sonst archivieren)

ParameterOrtTypBeschreibung
idPfadGanzzahlID

Antwort: Status 204 ohne Inhalt

curl -X DELETE "https://crm.serv24-it.ch/api/v2/customers/123" \
  -H "Authorization: Bearer $CRM_KEY"
GET/customers/{id}/contactslesen

Kontaktpersonen eines Kunden

ParameterOrtTypBeschreibung
idPfadGanzzahlID

Antwort: Status 200 · data: Liste von Contact

curl "https://crm.serv24-it.ch/api/v2/customers/123/contacts" \
  -H "Authorization: Bearer $CRM_KEY"
POST/customers/{id}/contactsschreiben

Kontaktperson anlegen

ParameterOrtTypBeschreibung
idPfadGanzzahlID
Eingabe (JSON)
FeldTypBeschreibung
salutationTextAnrede
name PflichtTextName
positionTextFunktion
emailE-MailE-Mail
phoneTextTelefon
mobileTextMobile

Antwort: Status 201 · data: Contact

curl -X POST "https://crm.serv24-it.ch/api/v2/customers/123/contacts" \
  -H "Authorization: Bearer $CRM_KEY" \
  -H "Content-Type: application/json" \
  -H "Idempotency-Key: $(uuidgen)" \
  -d '{"salutation":"Text","name":"Webdesign Paket"}'
PATCH/contacts/{id}schreiben

Kontaktperson ändern

ParameterOrtTypBeschreibung
idPfadGanzzahlID
Eingabe (JSON) – nur die zu ändernden Felder
FeldTypBeschreibung
salutationTextAnrede
nameTextName
positionTextFunktion
emailE-MailE-Mail
phoneTextTelefon
mobileTextMobile

Antwort: Status 200 · data: Contact

curl -X PATCH "https://crm.serv24-it.ch/api/v2/contacts/123" \
  -H "Authorization: Bearer $CRM_KEY" \
  -H "Content-Type: application/json" \
  -d '{"salutation":"Text","name":"Webdesign Paket"}'
DELETE/contacts/{id}schreiben

Kontaktperson löschen

ParameterOrtTypBeschreibung
idPfadGanzzahlID

Antwort: Status 204 ohne Inhalt

curl -X DELETE "https://crm.serv24-it.ch/api/v2/contacts/123" \
  -H "Authorization: Bearer $CRM_KEY"
GET/customers/{id}/noteslesen

Notizen eines Kunden

ParameterOrtTypBeschreibung
idPfadGanzzahlID

Antwort: Status 200 · data: Liste von Note

curl "https://crm.serv24-it.ch/api/v2/customers/123/notes" \
  -H "Authorization: Bearer $CRM_KEY"
POST/customers/{id}/notesschreiben

Notiz erfassen

ParameterOrtTypBeschreibung
idPfadGanzzahlID
Eingabe (JSON)
FeldTypBeschreibung
note PflichtText (lang)Text

Antwort: Status 201 · data: Note

curl -X POST "https://crm.serv24-it.ch/api/v2/customers/123/notes" \
  -H "Authorization: Bearer $CRM_KEY" \
  -H "Content-Type: application/json" \
  -H "Idempotency-Key: $(uuidgen)" \
  -d '{"note":"Rückruf vereinbart"}'
GET/customers/{id}/fileslesen

Kundendokumente auflisten (Modul Dokumentablage)

ParameterOrtTypBeschreibung
idPfadGanzzahlID

Antwort: Status 200 · data: Liste von File

curl "https://crm.serv24-it.ch/api/v2/customers/123/files" \
  -H "Authorization: Bearer $CRM_KEY"
POST/customers/{id}/filesschreiben

Kundendokument ablegen (Base64)

ParameterOrtTypBeschreibung
idPfadGanzzahlID
Eingabe (JSON)
FeldTypBeschreibung
name PflichtTextDateiname inkl. Endung (pdf, jpg, png, docx, xlsx, zip …)
content_base64 PflichtTextDateiinhalt Base64-kodiert (max. 25 MB)
categoryTextKategorie: Vertrag, Offerte, Korrespondenz, Plan, Foto, Rechnung, Sonstiges
noteTextBemerkung
sharedtrue/falseIm Kundenportal sichtbar

Antwort: Status 201 · data: File

curl -X POST "https://crm.serv24-it.ch/api/v2/customers/123/files" \
  -H "Authorization: Bearer $CRM_KEY" \
  -H "Content-Type: application/json" \
  -H "Idempotency-Key: $(uuidgen)" \
  -d '{"name":"vertrag.pdf","content_base64":"JVBERi0xLjQK…","category":"Vertrag","shared":true}'
GET/customers/{id}/files/{file_id}lesen

Kundendokument herunterladen

ParameterOrtTypBeschreibung
idPfadGanzzahlID
file_idPfadGanzzahlID

Antwort: Datei (application/octet-stream)

curl "https://crm.serv24-it.ch/api/v2/customers/123/files/9" \
  -H "Authorization: Bearer $CRM_KEY" -o datei
DELETE/customers/{id}/files/{file_id}schreiben

Kundendokument löschen

ParameterOrtTypBeschreibung
idPfadGanzzahlID
file_idPfadGanzzahlID

Antwort: Status 204 ohne Inhalt

curl -X DELETE "https://crm.serv24-it.ch/api/v2/customers/123/files/9" \
  -H "Authorization: Bearer $CRM_KEY"

Belege

Offerten, Aufträge, Lieferscheine, Rechnungen, Gutschriften inkl. PDF, Versand, Storno · Bereich documents

GET/documentslesen

Belege auflisten

ParameterOrtTypBeschreibung
typeQueryTextBelegart(en), kommagetrennt: quote, order, delivery, invoice, credit
statusQueryTextStatus, kommagetrennt (z.B. open,partial)
customer_idQueryGanzzahlKunde
numberQueryTextBelegnummer
ext_refQueryTextIhre Referenz
recurring_idQueryGanzzahlAus Abo-Rechnung
overdueQuerytrue/falsetrue = nur überfällige offene Rechnungen
fromQueryDatumBelegdatum ab (JJJJ-MM-TT)
toQueryDatumBelegdatum bis (JJJJ-MM-TT)
created_sinceQueryZeitpunktNur Einträge, die ab diesem Zeitpunkt erfasst wurden (ISO 8601)
limit / offsetQueryGanzzahlSeitenweise abrufen (Standard 50, max. 200)
sortQueryTextStandard -id · möglich: id, date, due_date, number, total, created_at (mit «-» absteigend)

Antwort: Status 200 · data: Liste von Document + meta

curl "https://crm.serv24-it.ch/api/v2/documents?type=invoice&status=open,partial&limit=20" \
  -H "Authorization: Bearer $CRM_KEY"
POST/documentsschreiben

Beleg anlegen (z.B. Rechnung)

Ohne finalize/send entsteht ein Entwurf, der noch geändert werden kann. Positionen mit product_id übernehmen Text, Preis, Einheit und MWST vom Artikel, soweit nicht angegeben.

Eingabe (JSON)
FeldTypBeschreibung
typeText: quote | order | delivery | invoice | creditBelegart: Offerte, Auftragsbestätigung, Lieferschein, Rechnung, Gutschrift (Standard invoice)
customer_id PflichtGanzzahlKunde
titleTextTitel / Betreff
dateDatumBelegdatum (Standard heute)
due_dateDatumFällig am bzw. gültig bis (Standard: Datum + Zahlungsfrist)
delivery_dateDatum · nullLiefer-/Leistungsdatum
languageText: de | fr | it | enSprache (Standard: Sprache des Kunden)
introText (lang)Einleitungstext
footerText (lang)Schlusstext (Standard: Fusstext des Betriebs)
termsText (lang) · nullKonditionen
dunning_stoptrue/falseMahnstopp (nur Rechnungen): keine Mahnungen, keine Gebühren, keine Inkasso-Übergabe – auch bei abgeschlossenen Rechnungen änderbar
dunning_stop_untilDatum · nullMahnstopp bis (leer = bis zur Aufhebung)
dunning_stop_reasonText · nullGrund des Mahnstopps (intern)
ext_refText · nullIhre Referenz im Fremdsystem
items PflichtListe von ItemPositionen (Item) – beim Ändern werden alle Positionen ersetzt (in Listen nicht enthalten)
finalizetrue/falseGleich abschliessen (Nummer vergeben, Status offen)
sendtrue/falseGleich abschliessen und an den Kunden senden (E-Mail bzw. Post gemäss Kunde)

Antwort: Status 201 · data: Document

curl -X POST "https://crm.serv24-it.ch/api/v2/documents" \
  -H "Authorization: Bearer $CRM_KEY" \
  -H "Content-Type: application/json" \
  -H "Idempotency-Key: $(uuidgen)" \
  -d '{"type":"invoice","customer_id":123,"title":"Webseite Relaunch","items":[{"description":"Konzept und Design","qty":8,"unit":"Std.","price":150,"vat_rate":8.1},{"product_id":12,"qty":1}],"send":true}'
GET/documents/{id}lesen

Beleg abrufen (inkl. Positionen und Zahlungen)

ParameterOrtTypBeschreibung
idPfadGanzzahlID

Antwort: Status 200 · data: Document

curl "https://crm.serv24-it.ch/api/v2/documents/123" \
  -H "Authorization: Bearer $CRM_KEY"
PATCH/documents/{id}schreiben

Entwurf ändern (abgeschlossene Belege: nur ext_ref und Mahnstopp)

ParameterOrtTypBeschreibung
idPfadGanzzahlID
Eingabe (JSON) – nur die zu ändernden Felder
FeldTypBeschreibung
typeText: quote | order | delivery | invoice | creditBelegart: Offerte, Auftragsbestätigung, Lieferschein, Rechnung, Gutschrift (Standard invoice)
customer_idGanzzahlKunde
titleTextTitel / Betreff
dateDatumBelegdatum (Standard heute)
due_dateDatumFällig am bzw. gültig bis (Standard: Datum + Zahlungsfrist)
delivery_dateDatum · nullLiefer-/Leistungsdatum
languageText: de | fr | it | enSprache (Standard: Sprache des Kunden)
introText (lang)Einleitungstext
footerText (lang)Schlusstext (Standard: Fusstext des Betriebs)
termsText (lang) · nullKonditionen
dunning_stoptrue/falseMahnstopp (nur Rechnungen): keine Mahnungen, keine Gebühren, keine Inkasso-Übergabe – auch bei abgeschlossenen Rechnungen änderbar
dunning_stop_untilDatum · nullMahnstopp bis (leer = bis zur Aufhebung)
dunning_stop_reasonText · nullGrund des Mahnstopps (intern)
ext_refText · nullIhre Referenz im Fremdsystem
itemsListe von ItemPositionen (Item) – beim Ändern werden alle Positionen ersetzt (in Listen nicht enthalten)

Antwort: Status 200 · data: Document

curl -X PATCH "https://crm.serv24-it.ch/api/v2/documents/123" \
  -H "Authorization: Bearer $CRM_KEY" \
  -H "Content-Type: application/json" \
  -d '{"title":"Webseite Relaunch – Phase 1","due_date":"2026-12-14"}'
DELETE/documents/{id}schreiben

Entwurf löschen (abgeschlossene Belege stornieren)

ParameterOrtTypBeschreibung
idPfadGanzzahlID

Antwort: Status 204 ohne Inhalt

curl -X DELETE "https://crm.serv24-it.ch/api/v2/documents/123" \
  -H "Authorization: Bearer $CRM_KEY"
POST/documents/{id}/finalizeschreiben

Beleg abschliessen (Nummer, QR-Referenz, Status offen)

ParameterOrtTypBeschreibung
idPfadGanzzahlID

Antwort: Status 200 · data: Document

curl -X POST "https://crm.serv24-it.ch/api/v2/documents/123/finalize" \
  -H "Authorization: Bearer $CRM_KEY"
POST/documents/{id}/sendschreiben

Beleg an den Kunden senden (schliesst Entwürfe vorher ab)

Versandweg gemäss Kunde (E-Mail oder Post). Antwort enthält zusätzlich «delivery» mit channel und message.

ParameterOrtTypBeschreibung
idPfadGanzzahlID

Antwort: Status 200 · data: Document

curl -X POST "https://crm.serv24-it.ch/api/v2/documents/123/send" \
  -H "Authorization: Bearer $CRM_KEY"
POST/documents/{id}/cancelschreiben

Beleg stornieren

ParameterOrtTypBeschreibung
idPfadGanzzahlID
Eingabe (JSON)
FeldTypBeschreibung
notifytrue/falseKunde per E-Mail informieren (Standard true)

Antwort: Status 200 · data: Document

curl -X POST "https://crm.serv24-it.ch/api/v2/documents/123/cancel" \
  -H "Authorization: Bearer $CRM_KEY" \
  -H "Content-Type: application/json" \
  -H "Idempotency-Key: $(uuidgen)" \
  -d '{"notify":false}'
POST/documents/{id}/convertschreiben

In andere Belegart umwandeln (Offerte → Auftrag → Lieferschein → Rechnung → Gutschrift)

ParameterOrtTypBeschreibung
idPfadGanzzahlID
Eingabe (JSON)
FeldTypBeschreibung
type PflichtText: order | delivery | invoice | creditZiel-Belegart

Antwort: Status 201 · data: Document

curl -X POST "https://crm.serv24-it.ch/api/v2/documents/123/convert" \
  -H "Authorization: Bearer $CRM_KEY" \
  -H "Content-Type: application/json" \
  -H "Idempotency-Key: $(uuidgen)" \
  -d '{"type":"invoice"}'
GET/documents/{id}/pdflesen

Beleg als PDF

ParameterOrtTypBeschreibung
idPfadGanzzahlID

Antwort: Datei (application/pdf)

curl "https://crm.serv24-it.ch/api/v2/documents/123/pdf" \
  -H "Authorization: Bearer $CRM_KEY" -o datei
GET/documents/{id}/paymentslesen

Zahlungen zu einem Beleg

ParameterOrtTypBeschreibung
idPfadGanzzahlID

Antwort: Status 200 · data: Liste von Payment

curl "https://crm.serv24-it.ch/api/v2/documents/123/payments" \
  -H "Authorization: Bearer $CRM_KEY"

Zahlungen

Zahlungseingänge zu Rechnungen und Gutschriften · Bereich payments

GET/paymentslesen

Zahlungen auflisten

ParameterOrtTypBeschreibung
document_idQueryGanzzahlBeleg
methodQueryTextZahlungsart
fromQueryDatumZahlungsdatum ab (JJJJ-MM-TT)
toQueryDatumZahlungsdatum bis (JJJJ-MM-TT)
limit / offsetQueryGanzzahlSeitenweise abrufen (Standard 50, max. 200)
sortQueryTextStandard -date · möglich: id, date, amount (mit «-» absteigend)

Antwort: Status 200 · data: Liste von Payment + meta

curl "https://crm.serv24-it.ch/api/v2/payments" \
  -H "Authorization: Bearer $CRM_KEY"
POST/paymentsschreiben

Zahlung erfassen

Setzt den Status der Rechnung (teilweise bezahlt / bezahlt) und verbucht die Einnahme. Die Antwort enthält zusätzlich «document» (aktualisierter Beleg).

Eingabe (JSON)
FeldTypBeschreibung
document_id PflichtGanzzahlRechnung oder Gutschrift
dateDatumZahlungsdatum (Standard heute)
amountZahlBetrag (Standard: offener Betrag)
methodTextZahlungsart, z.B. Bank, Bar, TWINT (Standard API)
noteTextBemerkung
booktrue/falseAls Einnahme verbuchen (Standard true)

Antwort: Status 201 · data: Payment

curl -X POST "https://crm.serv24-it.ch/api/v2/payments" \
  -H "Authorization: Bearer $CRM_KEY" \
  -H "Content-Type: application/json" \
  -H "Idempotency-Key: $(uuidgen)" \
  -d '{"document_id":456,"amount":1297.2,"date":"2026-11-14","method":"Bank"}'
GET/payments/{id}lesen

Zahlung abrufen

ParameterOrtTypBeschreibung
idPfadGanzzahlID

Antwort: Status 200 · data: Payment

curl "https://crm.serv24-it.ch/api/v2/payments/123" \
  -H "Authorization: Bearer $CRM_KEY"
DELETE/payments/{id}schreiben

Zahlung löschen (inkl. Buchung)

ParameterOrtTypBeschreibung
idPfadGanzzahlID

Antwort: Status 204 ohne Inhalt

curl -X DELETE "https://crm.serv24-it.ch/api/v2/payments/123" \
  -H "Authorization: Bearer $CRM_KEY"

Artikel

Artikel- und Leistungsstamm · nur verfügbar, wenn das entsprechende Modul im Abo aktiv ist · Bereich products

GET/productslesen

Artikel auflisten

ParameterOrtTypBeschreibung
searchQueryTextFreitext
numberQueryTextArtikelnummer
ext_refQueryTextIhre Referenz
activeQuerytrue/falseNur aktive bzw. inaktive
shopQuerytrue/falseIm Online-Shop
limit / offsetQueryGanzzahlSeitenweise abrufen (Standard 50, max. 200)
sortQueryTextStandard name · möglich: id, name, number, price (mit «-» absteigend)

Antwort: Status 200 · data: Liste von Product + meta

curl "https://crm.serv24-it.ch/api/v2/products" \
  -H "Authorization: Bearer $CRM_KEY"
POST/productsschreiben

Artikel anlegen

Eingabe (JSON)
FeldTypBeschreibung
numberTextArtikelnummer
name PflichtTextBezeichnung
descriptionText (lang)Beschreibung
unitTextEinheit
priceZahlPreis
vat_rateZahlMWST-Satz in Prozent
typeTextproduct (Ware) oder service (Dienstleistung)
account_noText · nullErlöskonto
activetrue/falseIn Belegen auswählbar
shoptrue/falseIm Online-Shop angeboten
shop_textText (lang) · nullText im Online-Shop
ext_refText · nullIhre Referenz im Fremdsystem

Antwort: Status 201 · data: Product

curl -X POST "https://crm.serv24-it.ch/api/v2/products" \
  -H "Authorization: Bearer $CRM_KEY" \
  -H "Content-Type: application/json" \
  -H "Idempotency-Key: $(uuidgen)" \
  -d '{"number":"Text","name":"Webdesign Paket"}'
GET/products/{id}lesen

Artikel abrufen

ParameterOrtTypBeschreibung
idPfadGanzzahlID

Antwort: Status 200 · data: Product

curl "https://crm.serv24-it.ch/api/v2/products/123" \
  -H "Authorization: Bearer $CRM_KEY"
PATCH/products/{id}schreiben

Artikel ändern

ParameterOrtTypBeschreibung
idPfadGanzzahlID
Eingabe (JSON) – nur die zu ändernden Felder
FeldTypBeschreibung
numberTextArtikelnummer
nameTextBezeichnung
descriptionText (lang)Beschreibung
unitTextEinheit
priceZahlPreis
vat_rateZahlMWST-Satz in Prozent
typeTextproduct (Ware) oder service (Dienstleistung)
account_noText · nullErlöskonto
activetrue/falseIn Belegen auswählbar
shoptrue/falseIm Online-Shop angeboten
shop_textText (lang) · nullText im Online-Shop
ext_refText · nullIhre Referenz im Fremdsystem

Antwort: Status 200 · data: Product

curl -X PATCH "https://crm.serv24-it.ch/api/v2/products/123" \
  -H "Authorization: Bearer $CRM_KEY" \
  -H "Content-Type: application/json" \
  -d '{"number":"Text","name":"Webdesign Paket"}'
DELETE/products/{id}schreiben

Artikel löschen (in Belegen verwendet → wird deaktiviert, Antwort 200)

ParameterOrtTypBeschreibung
idPfadGanzzahlID

Antwort: Status 204 ohne Inhalt

curl -X DELETE "https://crm.serv24-it.ch/api/v2/products/123" \
  -H "Authorization: Bearer $CRM_KEY"

Abo-Rechnungen

Wiederkehrende Rechnungen · nur verfügbar, wenn das entsprechende Modul im Abo aktiv ist · Bereich recurring

GET/recurringlesen

Abo-Rechnungen auflisten

ParameterOrtTypBeschreibung
customer_idQueryGanzzahlKunde
activeQuerytrue/falseAktiv
limit / offsetQueryGanzzahlSeitenweise abrufen (Standard 50, max. 200)
sortQueryTextStandard next_date · möglich: id, next_date, title (mit «-» absteigend)

Antwort: Status 200 · data: Liste von Recurring + meta

curl "https://crm.serv24-it.ch/api/v2/recurring" \
  -H "Authorization: Bearer $CRM_KEY"
POST/recurringschreiben

Abo-Rechnung anlegen

Eingabe (JSON)
FeldTypBeschreibung
customer_id PflichtGanzzahlKunde
titleTextTitel
intvText: month | quarter | halfyear | yearIntervall (Standard month)
next_dateDatumNächste Rechnung am (Standard heute)
end_dateDatum · nullEndet am
auto_sendtrue/falseAutomatisch versenden (Standard true)
auto_chargeGanzzahlAutomatische Abbuchung vom hinterlegten Zahlungsmittel: 0 = nein, 1 = am Rechnungsdatum, 2 = am Fälligkeitsdatum
activetrue/falseAktiv
introText (lang)Einleitungstext (Platzhalter {periode})
items PflichtListe von ItemPositionen (Item)

Antwort: Status 201 · data: Recurring

curl -X POST "https://crm.serv24-it.ch/api/v2/recurring" \
  -H "Authorization: Bearer $CRM_KEY" \
  -H "Content-Type: application/json" \
  -H "Idempotency-Key: $(uuidgen)" \
  -d '{"customer_id":123,"title":"Wartungsvertrag","intv":"month","next_date":"2026-11-14","items":[{"description":"Wartung Webseite","qty":1,"unit":"Monat","price":49}]}'
GET/recurring/{id}lesen

Abo-Rechnung abrufen

ParameterOrtTypBeschreibung
idPfadGanzzahlID

Antwort: Status 200 · data: Recurring

curl "https://crm.serv24-it.ch/api/v2/recurring/123" \
  -H "Authorization: Bearer $CRM_KEY"
PATCH/recurring/{id}schreiben

Abo-Rechnung ändern

ParameterOrtTypBeschreibung
idPfadGanzzahlID
Eingabe (JSON) – nur die zu ändernden Felder
FeldTypBeschreibung
customer_idGanzzahlKunde
titleTextTitel
intvText: month | quarter | halfyear | yearIntervall (Standard month)
next_dateDatumNächste Rechnung am (Standard heute)
end_dateDatum · nullEndet am
auto_sendtrue/falseAutomatisch versenden (Standard true)
auto_chargeGanzzahlAutomatische Abbuchung vom hinterlegten Zahlungsmittel: 0 = nein, 1 = am Rechnungsdatum, 2 = am Fälligkeitsdatum
activetrue/falseAktiv
introText (lang)Einleitungstext (Platzhalter {periode})
itemsListe von ItemPositionen (Item)

Antwort: Status 200 · data: Recurring

curl -X PATCH "https://crm.serv24-it.ch/api/v2/recurring/123" \
  -H "Authorization: Bearer $CRM_KEY" \
  -H "Content-Type: application/json" \
  -d '{"customer_id":123,"title":"Webseite Relaunch"}'
DELETE/recurring/{id}schreiben

Abo-Rechnung löschen (bereits erstellte Rechnungen bleiben)

ParameterOrtTypBeschreibung
idPfadGanzzahlID

Antwort: Status 204 ohne Inhalt

curl -X DELETE "https://crm.serv24-it.ch/api/v2/recurring/123" \
  -H "Authorization: Bearer $CRM_KEY"
POST/recurring/{id}/runschreiben

Fällige Rechnungen dieser Abo-Rechnung jetzt erstellen

Erstellt alle Rechnungen bis heute (wie der tägliche Lauf). Antwort: die neu erstellten Rechnungen.

ParameterOrtTypBeschreibung
idPfadGanzzahlID

Antwort: Status 200 · data: Liste von Document

curl -X POST "https://crm.serv24-it.ch/api/v2/recurring/123/run" \
  -H "Authorization: Bearer $CRM_KEY"

Projekte & Zeiten

Projekte und Zeiteinträge · nur verfügbar, wenn das entsprechende Modul im Abo aktiv ist · Bereich projects

GET/projectslesen

Projekte auflisten

ParameterOrtTypBeschreibung
customer_idQueryGanzzahlKunde
statusQueryTextStatus, kommagetrennt
searchQueryTextProjektname
limit / offsetQueryGanzzahlSeitenweise abrufen (Standard 50, max. 200)
sortQueryTextStandard name · möglich: id, name, created_at (mit «-» absteigend)

Antwort: Status 200 · data: Liste von Project + meta

curl "https://crm.serv24-it.ch/api/v2/projects" \
  -H "Authorization: Bearer $CRM_KEY"
POST/projectsschreiben

Projekt anlegen

Eingabe (JSON)
FeldTypBeschreibung
customer_idGanzzahl · nullKunde
name PflichtTextProjektname
rateZahlStundensatz
budget_hoursZahlBudget in Stunden
statusText: active | done | archivedStatus

Antwort: Status 201 · data: Project

curl -X POST "https://crm.serv24-it.ch/api/v2/projects" \
  -H "Authorization: Bearer $CRM_KEY" \
  -H "Content-Type: application/json" \
  -H "Idempotency-Key: $(uuidgen)" \
  -d '{"customer_id":123,"name":"Webdesign Paket"}'
GET/projects/{id}lesen

Projekt abrufen

ParameterOrtTypBeschreibung
idPfadGanzzahlID

Antwort: Status 200 · data: Project

curl "https://crm.serv24-it.ch/api/v2/projects/123" \
  -H "Authorization: Bearer $CRM_KEY"
PATCH/projects/{id}schreiben

Projekt ändern

ParameterOrtTypBeschreibung
idPfadGanzzahlID
Eingabe (JSON) – nur die zu ändernden Felder
FeldTypBeschreibung
customer_idGanzzahl · nullKunde
nameTextProjektname
rateZahlStundensatz
budget_hoursZahlBudget in Stunden
statusText: active | done | archivedStatus

Antwort: Status 200 · data: Project

curl -X PATCH "https://crm.serv24-it.ch/api/v2/projects/123" \
  -H "Authorization: Bearer $CRM_KEY" \
  -H "Content-Type: application/json" \
  -d '{"customer_id":123,"name":"Webdesign Paket"}'
DELETE/projects/{id}schreiben

Projekt löschen (nur ohne verrechnete Zeiten)

ParameterOrtTypBeschreibung
idPfadGanzzahlID

Antwort: Status 204 ohne Inhalt

curl -X DELETE "https://crm.serv24-it.ch/api/v2/projects/123" \
  -H "Authorization: Bearer $CRM_KEY"
GET/time-entrieslesen

Zeiteinträge auflisten

ParameterOrtTypBeschreibung
project_idQueryGanzzahlProjekt
user_idQueryGanzzahlBenutzer
billableQuerytrue/falseVerrechenbar
invoicedQuerytrue/falsetrue = verrechnet, false = noch nicht verrechnet
fromQueryDatumDatum ab (JJJJ-MM-TT)
toQueryDatumDatum bis (JJJJ-MM-TT)
limit / offsetQueryGanzzahlSeitenweise abrufen (Standard 50, max. 200)
sortQueryTextStandard -date · möglich: id, date, hours (mit «-» absteigend)

Antwort: Status 200 · data: Liste von TimeEntry + meta

curl "https://crm.serv24-it.ch/api/v2/time-entries" \
  -H "Authorization: Bearer $CRM_KEY"
POST/time-entriesschreiben

Zeit erfassen

Eingabe (JSON)
FeldTypBeschreibung
project_id PflichtGanzzahlProjekt
user_idGanzzahl · nullBenutzer (Standard: Ersteller des API-Schlüssels)
dateDatumDatum (Standard heute)
hours PflichtZahlStunden
descriptionText (lang)Tätigkeit
billabletrue/falseVerrechenbar (Standard true)

Antwort: Status 201 · data: TimeEntry

curl -X POST "https://crm.serv24-it.ch/api/v2/time-entries" \
  -H "Authorization: Bearer $CRM_KEY" \
  -H "Content-Type: application/json" \
  -H "Idempotency-Key: $(uuidgen)" \
  -d '{"project_id":7,"date":"2026-11-14","hours":1.5,"description":"Besprechung mit Kunde"}'
GET/time-entries/{id}lesen

Zeiteintrag abrufen

ParameterOrtTypBeschreibung
idPfadGanzzahlID

Antwort: Status 200 · data: TimeEntry

curl "https://crm.serv24-it.ch/api/v2/time-entries/123" \
  -H "Authorization: Bearer $CRM_KEY"
PATCH/time-entries/{id}schreiben

Zeiteintrag ändern (nicht verrechnete)

ParameterOrtTypBeschreibung
idPfadGanzzahlID
Eingabe (JSON) – nur die zu ändernden Felder
FeldTypBeschreibung
project_idGanzzahlProjekt
user_idGanzzahl · nullBenutzer (Standard: Ersteller des API-Schlüssels)
dateDatumDatum (Standard heute)
hoursZahlStunden
descriptionText (lang)Tätigkeit
billabletrue/falseVerrechenbar (Standard true)

Antwort: Status 200 · data: TimeEntry

curl -X PATCH "https://crm.serv24-it.ch/api/v2/time-entries/123" \
  -H "Authorization: Bearer $CRM_KEY" \
  -H "Content-Type: application/json" \
  -d '{"project_id":7,"user_id":1,"hours":1.5}'
DELETE/time-entries/{id}schreiben

Zeiteintrag löschen (nicht verrechnete)

ParameterOrtTypBeschreibung
idPfadGanzzahlID

Antwort: Status 204 ohne Inhalt

curl -X DELETE "https://crm.serv24-it.ch/api/v2/time-entries/123" \
  -H "Authorization: Bearer $CRM_KEY"

Einnahmen & Ausgaben

Buchungen, Kategorien und Belege · nur verfügbar, wenn das entsprechende Modul im Abo aktiv ist · Bereich books

GET/transactionslesen

Buchungen auflisten

ParameterOrtTypBeschreibung
typeQueryText: income | expenseEinnahmen oder Ausgaben
categoryQueryTextKategorie
statusQueryTextbooked (Standard), open, all
document_idQueryGanzzahlBeleg
searchQueryTextFreitext
fromQueryDatumDatum ab (JJJJ-MM-TT)
toQueryDatumDatum bis (JJJJ-MM-TT)
limit / offsetQueryGanzzahlSeitenweise abrufen (Standard 50, max. 200)
sortQueryTextStandard -date · möglich: id, date, amount (mit «-» absteigend)

Antwort: Status 200 · data: Liste von Transaction + meta

curl "https://crm.serv24-it.ch/api/v2/transactions" \
  -H "Authorization: Bearer $CRM_KEY"
POST/transactionsschreiben

Buchung erfassen

Eingabe (JSON)
FeldTypBeschreibung
type PflichtText: income | expenseEinnahme oder Ausgabe
dateDatumDatum (Standard heute)
descriptionTextText
categoryTextKategorie (siehe /categories)
amount PflichtZahlBetrag inkl. MWST
vat_rateZahlMWST-Satz in Prozent
tagsText · nullSchlagwörter
account_noText · nullKonto
receiptObjektBeleg: {"name": "quittung.pdf", "content_base64": "…"} (pdf, jpg, png; max. 20 MB)

Antwort: Status 201 · data: Transaction

curl -X POST "https://crm.serv24-it.ch/api/v2/transactions" \
  -H "Authorization: Bearer $CRM_KEY" \
  -H "Content-Type: application/json" \
  -H "Idempotency-Key: $(uuidgen)" \
  -d '{"type":"expense","date":"2026-11-14","description":"Druckerpapier","category":"Büromaterial","amount":54.9,"vat_rate":8.1}'
GET/transactions/{id}lesen

Buchung abrufen

ParameterOrtTypBeschreibung
idPfadGanzzahlID

Antwort: Status 200 · data: Transaction

curl "https://crm.serv24-it.ch/api/v2/transactions/123" \
  -H "Authorization: Bearer $CRM_KEY"
PATCH/transactions/{id}schreiben

Buchung ändern (nur manuelle)

ParameterOrtTypBeschreibung
idPfadGanzzahlID
Eingabe (JSON) – nur die zu ändernden Felder
FeldTypBeschreibung
typeText: income | expenseEinnahme oder Ausgabe
dateDatumDatum (Standard heute)
descriptionTextText
categoryTextKategorie (siehe /categories)
amountZahlBetrag inkl. MWST
vat_rateZahlMWST-Satz in Prozent
tagsText · nullSchlagwörter
account_noText · nullKonto
receiptObjektBeleg ersetzen

Antwort: Status 200 · data: Transaction

curl -X PATCH "https://crm.serv24-it.ch/api/v2/transactions/123" \
  -H "Authorization: Bearer $CRM_KEY" \
  -H "Content-Type: application/json" \
  -d '{"type":"invoice","date":"2026-11-14","amount":324.3}'
DELETE/transactions/{id}schreiben

Buchung löschen (nur manuelle)

ParameterOrtTypBeschreibung
idPfadGanzzahlID

Antwort: Status 204 ohne Inhalt

curl -X DELETE "https://crm.serv24-it.ch/api/v2/transactions/123" \
  -H "Authorization: Bearer $CRM_KEY"
GET/transactions/{id}/receiptlesen

Beleg (PDF/Bild) herunterladen

ParameterOrtTypBeschreibung
idPfadGanzzahlID

Antwort: Datei (application/octet-stream)

curl "https://crm.serv24-it.ch/api/v2/transactions/123/receipt" \
  -H "Authorization: Bearer $CRM_KEY" -o datei
GET/categorieslesen

Kategorien

ParameterOrtTypBeschreibung
typeQueryText: income | expenseArt
limit / offsetQueryGanzzahlSeitenweise abrufen (Standard 50, max. 200)
sortQueryTextStandard name · möglich: name, id (mit «-» absteigend)

Antwort: Status 200 · data: Liste von Category + meta

curl "https://crm.serv24-it.ch/api/v2/categories" \
  -H "Authorization: Bearer $CRM_KEY"
POST/categoriesschreiben

Kategorie anlegen

Eingabe (JSON)
FeldTypBeschreibung
type PflichtText: income | expenseEinnahmen oder Ausgaben
name PflichtTextBezeichnung
account_noText · nullKonto
vat_rateZahl · nullStandard-MWST-Satz

Antwort: Status 201 · data: Category

curl -X POST "https://crm.serv24-it.ch/api/v2/categories" \
  -H "Authorization: Bearer $CRM_KEY" \
  -H "Content-Type: application/json" \
  -H "Idempotency-Key: $(uuidgen)" \
  -d '{"type":"invoice","name":"Webdesign Paket"}'

Lieferantenrechnungen

Kreditoren erfassen und als bezahlt verbuchen · nur verfügbar, wenn das entsprechende Modul im Abo aktiv ist · Bereich bills

GET/billslesen

Lieferantenrechnungen auflisten

ParameterOrtTypBeschreibung
statusQueryTextopen, booked
searchQueryTextFreitext (Lieferant, Nummer, Text)
due_toQueryDatumFällig bis
fromQueryDatumRechnungsdatum ab (JJJJ-MM-TT)
toQueryDatumRechnungsdatum bis (JJJJ-MM-TT)
limit / offsetQueryGanzzahlSeitenweise abrufen (Standard 50, max. 200)
sortQueryTextStandard due_date · möglich: id, bill_date, due_date, amount (mit «-» absteigend)

Antwort: Status 200 · data: Liste von Bill + meta

curl "https://crm.serv24-it.ch/api/v2/bills" \
  -H "Authorization: Bearer $CRM_KEY"
POST/billsschreiben

Lieferantenrechnung erfassen

Eingabe (JSON)
FeldTypBeschreibung
supplier PflichtTextLieferant
supplier_addressText (lang)Adresse des Lieferanten
supplier_ibanTextIBAN des Lieferanten (für den Zahlungsauftrag)
pay_referenceTextQR-/SCOR-Referenz
pay_messageTextMitteilung
bill_noTextRechnungsnummer des Lieferanten
bill_dateDatumRechnungsdatum (Standard heute)
due_dateDatumFällig am (Standard +30 Tage)
currencyText: CHF | EURWährung
amount PflichtZahlBetrag inkl. MWST
vat_rateZahlMWST-Satz (Vorsteuer)
categoryTextKategorie (Standard Fremdleistungen)
descriptionTextText
receiptObjektRechnung als Datei: {"name": "rechnung.pdf", "content_base64": "…"}

Antwort: Status 201 · data: Bill

curl -X POST "https://crm.serv24-it.ch/api/v2/bills" \
  -H "Authorization: Bearer $CRM_KEY" \
  -H "Content-Type: application/json" \
  -H "Idempotency-Key: $(uuidgen)" \
  -d '{"supplier":"Lieferant GmbH","supplier_iban":"CH9300762011623852957","bill_no":"R-2026-104","bill_date":"2026-11-14","due_date":"2026-12-14","amount":540,"vat_rate":8.1,"receipt":{"name":"rechnung.pdf","content_base64":"JVBERi0xLjQK…"}}'
GET/bills/{id}lesen

Lieferantenrechnung abrufen

ParameterOrtTypBeschreibung
idPfadGanzzahlID

Antwort: Status 200 · data: Bill

curl "https://crm.serv24-it.ch/api/v2/bills/123" \
  -H "Authorization: Bearer $CRM_KEY"
PATCH/bills/{id}schreiben

Offene Lieferantenrechnung ändern

ParameterOrtTypBeschreibung
idPfadGanzzahlID
Eingabe (JSON) – nur die zu ändernden Felder
FeldTypBeschreibung
supplierTextLieferant
supplier_addressText (lang)Adresse des Lieferanten
supplier_ibanTextIBAN des Lieferanten (für den Zahlungsauftrag)
pay_referenceTextQR-/SCOR-Referenz
pay_messageTextMitteilung
bill_noTextRechnungsnummer des Lieferanten
bill_dateDatumRechnungsdatum (Standard heute)
due_dateDatumFällig am (Standard +30 Tage)
currencyText: CHF | EURWährung
amountZahlBetrag inkl. MWST
vat_rateZahlMWST-Satz (Vorsteuer)
categoryTextKategorie (Standard Fremdleistungen)
descriptionTextText
receiptObjektDatei ersetzen

Antwort: Status 200 · data: Bill

curl -X PATCH "https://crm.serv24-it.ch/api/v2/bills/123" \
  -H "Authorization: Bearer $CRM_KEY" \
  -H "Content-Type: application/json" \
  -d '{"supplier":"Lieferant GmbH","supplier_address":"Text","amount":324.3}'
DELETE/bills/{id}schreiben

Lieferantenrechnung löschen

ParameterOrtTypBeschreibung
idPfadGanzzahlID

Antwort: Status 204 ohne Inhalt

curl -X DELETE "https://crm.serv24-it.ch/api/v2/bills/123" \
  -H "Authorization: Bearer $CRM_KEY"
POST/bills/{id}/payschreiben

Als bezahlt verbuchen

ParameterOrtTypBeschreibung
idPfadGanzzahlID
Eingabe (JSON)
FeldTypBeschreibung
dateDatumZahlungsdatum (Standard heute)

Antwort: Status 200 · data: Bill

curl -X POST "https://crm.serv24-it.ch/api/v2/bills/123/pay" \
  -H "Authorization: Bearer $CRM_KEY"
GET/bills/{id}/receiptlesen

Rechnungsdatei herunterladen

ParameterOrtTypBeschreibung
idPfadGanzzahlID

Antwort: Datei (application/octet-stream)

curl "https://crm.serv24-it.ch/api/v2/bills/123/receipt" \
  -H "Authorization: Bearer $CRM_KEY" -o datei

Kundenanfragen

Anfragen aus dem Kundenportal beantworten · nur verfügbar, wenn das entsprechende Modul im Abo aktiv ist · Bereich requests

GET/requestslesen

Kundenanfragen auflisten

ParameterOrtTypBeschreibung
statusQueryTextStatus, kommagetrennt
customer_idQueryGanzzahlKunde
kindQueryTextArt
created_sinceQueryZeitpunktNur Einträge, die ab diesem Zeitpunkt erfasst wurden (ISO 8601)
limit / offsetQueryGanzzahlSeitenweise abrufen (Standard 50, max. 200)
sortQueryTextStandard -updated_at · möglich: id, updated_at, created_at (mit «-» absteigend)

Antwort: Status 200 · data: Liste von Request + meta

curl "https://crm.serv24-it.ch/api/v2/requests" \
  -H "Authorization: Bearer $CRM_KEY"
POST/requestsschreiben

Anfrage im Namen eines Kunden eröffnen

Eingabe (JSON)
FeldTypBeschreibung
customer_id PflichtGanzzahlKunde
kindText: question | invoice | change | service | installment | cancel | sim_lost | hosting_changeArt der Anfrage (Standard question)
subjectTextBetreff
statusText: open | progress | answered | done | rejectedStatus
text PflichtText (lang)Erste Nachricht des Kunden

Antwort: Status 201 · data: Request

curl -X POST "https://crm.serv24-it.ch/api/v2/requests" \
  -H "Authorization: Bearer $CRM_KEY" \
  -H "Content-Type: application/json" \
  -H "Idempotency-Key: $(uuidgen)" \
  -d '{"customer_id":123,"kind":"question","text":"Guten Tag, …"}'
GET/requests/{id}lesen

Anfrage abrufen (inkl. Nachrichten)

ParameterOrtTypBeschreibung
idPfadGanzzahlID

Antwort: Status 200 · data: Request

curl "https://crm.serv24-it.ch/api/v2/requests/123" \
  -H "Authorization: Bearer $CRM_KEY"
PATCH/requests/{id}schreiben

Status ändern (Kunde wird informiert)

ParameterOrtTypBeschreibung
idPfadGanzzahlID
Eingabe (JSON) – nur die zu ändernden Felder
FeldTypBeschreibung
status PflichtText: open | progress | answered | done | rejectedNeuer Status

Antwort: Status 200 · data: Request

curl -X PATCH "https://crm.serv24-it.ch/api/v2/requests/123" \
  -H "Authorization: Bearer $CRM_KEY" \
  -H "Content-Type: application/json" \
  -d '{"status":"done"}'
POST/requests/{id}/messagesschreiben

Antworten (Kunde wird per E-Mail/WhatsApp informiert)

ParameterOrtTypBeschreibung
idPfadGanzzahlID
Eingabe (JSON)
FeldTypBeschreibung
text PflichtText (lang)Antwort
statusTextNeuer Status (Standard answered)
authorTextAbsendername (Standard: Name des API-Schlüssels)

Antwort: Status 201 · data: Request

curl -X POST "https://crm.serv24-it.ch/api/v2/requests/123/messages" \
  -H "Authorization: Bearer $CRM_KEY" \
  -H "Content-Type: application/json" \
  -H "Idempotency-Key: $(uuidgen)" \
  -d '{"text":"Guten Tag, die Rechnung wurde korrigiert.","status":"answered"}'

Mahnwesen

Versendete Mahnungen · nur verfügbar, wenn das entsprechende Modul im Abo aktiv ist · Bereich dunning

GET/dunninglesen

Versendete Mahnungen

ParameterOrtTypBeschreibung
document_idQueryGanzzahlRechnung
levelQueryGanzzahlMahnstufe
fromQueryDatumVersanddatum ab (JJJJ-MM-TT)
toQueryDatumVersanddatum bis (JJJJ-MM-TT)
limit / offsetQueryGanzzahlSeitenweise abrufen (Standard 50, max. 200)
sortQueryTextStandard -sent_at · möglich: id, sent_at (mit «-» absteigend)

Antwort: Status 200 · data: Liste von Dunning + meta

curl "https://crm.serv24-it.ch/api/v2/dunning" \
  -H "Authorization: Bearer $CRM_KEY"

Mobile

SIM-Karten, Mobile-Abos und Produkte (nur lesen) · nur verfügbar, wenn das entsprechende Modul im Abo aktiv ist · Bereich mobile

GET/mobile/simslesen

SIM-Karten

ParameterOrtTypBeschreibung
customer_idQueryGanzzahlKunde
msisdnQueryTextRufnummer
iccidQueryTextICCID
goneQuerytrue/falseAuch nicht mehr vorhandene (Standard false)
limit / offsetQueryGanzzahlSeitenweise abrufen (Standard 50, max. 200)
sortQueryTextStandard id · möglich: id, msisdn, created_at (mit «-» absteigend)

Antwort: Status 200 · data: Liste von Sim + meta

curl "https://crm.serv24-it.ch/api/v2/mobile/sims" \
  -H "Authorization: Bearer $CRM_KEY"
GET/mobile/sims/{id}lesen

SIM-Karte abrufen

ParameterOrtTypBeschreibung
idPfadGanzzahlID

Antwort: Status 200 · data: Sim

curl "https://crm.serv24-it.ch/api/v2/mobile/sims/123" \
  -H "Authorization: Bearer $CRM_KEY"
GET/mobile/subscriptionslesen

Mobile-Abos

ParameterOrtTypBeschreibung
customer_idQueryGanzzahlKunde
statusQueryTextStatus, kommagetrennt
sim_idQueryGanzzahlSIM-Karte
limit / offsetQueryGanzzahlSeitenweise abrufen (Standard 50, max. 200)
sortQueryTextStandard id · möglich: id, paid_until, created_at (mit «-» absteigend)

Antwort: Status 200 · data: Liste von MobileSub + meta

curl "https://crm.serv24-it.ch/api/v2/mobile/subscriptions" \
  -H "Authorization: Bearer $CRM_KEY"
GET/mobile/subscriptions/{id}lesen

Mobile-Abo abrufen

ParameterOrtTypBeschreibung
idPfadGanzzahlID

Antwort: Status 200 · data: MobileSub

curl "https://crm.serv24-it.ch/api/v2/mobile/subscriptions/123" \
  -H "Authorization: Bearer $CRM_KEY"
GET/mobile/productslesen

Mobile-Produkte

ParameterOrtTypBeschreibung
activeQuerytrue/falseAktiv
limit / offsetQueryGanzzahlSeitenweise abrufen (Standard 50, max. 200)
sortQueryTextStandard sort · möglich: sort, name, id (mit «-» absteigend)

Antwort: Status 200 · data: Liste von MobileProduct + meta

curl "https://crm.serv24-it.ch/api/v2/mobile/products" \
  -H "Authorization: Bearer $CRM_KEY"

Webhosting

Hosting-Konten und Pakete (nur lesen) · nur verfügbar, wenn das entsprechende Modul im Abo aktiv ist · Bereich hosting

GET/hosting/accountslesen

Hosting-Konten

ParameterOrtTypBeschreibung
customer_idQueryGanzzahlKunde
statusQueryTextStatus
domainQueryTextDomain
limit / offsetQueryGanzzahlSeitenweise abrufen (Standard 50, max. 200)
sortQueryTextStandard id · möglich: id, domain, created_at (mit «-» absteigend)

Antwort: Status 200 · data: Liste von HostingAccount + meta

curl "https://crm.serv24-it.ch/api/v2/hosting/accounts" \
  -H "Authorization: Bearer $CRM_KEY"
GET/hosting/accounts/{id}lesen

Hosting-Konto abrufen

ParameterOrtTypBeschreibung
idPfadGanzzahlID

Antwort: Status 200 · data: HostingAccount

curl "https://crm.serv24-it.ch/api/v2/hosting/accounts/123" \
  -H "Authorization: Bearer $CRM_KEY"
GET/hosting/productslesen

Hosting-Pakete

ParameterOrtTypBeschreibung
activeQuerytrue/falseAktiv
limit / offsetQueryGanzzahlSeitenweise abrufen (Standard 50, max. 200)
sortQueryTextStandard sort · möglich: sort, name (mit «-» absteigend)

Antwort: Status 200 · data: Liste von HostingProduct + meta

curl "https://crm.serv24-it.ch/api/v2/hosting/products" \
  -H "Authorization: Bearer $CRM_KEY"

Web-Dienste

Domains, E-Mail und weitere Web-Dienste (nur lesen) · nur verfügbar, wenn das entsprechende Modul im Abo aktiv ist · Bereich webservices

GET/web-serviceslesen

Web-Dienste (Domains, E-Mail …)

ParameterOrtTypBeschreibung
customer_idQueryGanzzahlKunde
service_nameQueryTextArt
fqdnQueryTextDomain
goneQuerytrue/falseAuch nicht mehr vorhandene (Standard false)
expires_toQueryDatumLäuft ab bis
limit / offsetQueryGanzzahlSeitenweise abrufen (Standard 50, max. 200)
sortQueryTextStandard id · möglich: id, fqdn, expired_at (mit «-» absteigend)

Antwort: Status 200 · data: Liste von WebService + meta

curl "https://crm.serv24-it.ch/api/v2/web-services" \
  -H "Authorization: Bearer $CRM_KEY"
GET/web-services/{id}lesen

Web-Dienst abrufen

ParameterOrtTypBeschreibung
idPfadGanzzahlID

Antwort: Status 200 · data: WebService

curl "https://crm.serv24-it.ch/api/v2/web-services/123" \
  -H "Authorization: Bearer $CRM_KEY"

Cloud-Server

Cloud-Server der Kunden (nur lesen) · nur verfügbar, wenn das entsprechende Modul im Abo aktiv ist · Bereich cloud

GET/cloud-serverslesen

Cloud-Server

ParameterOrtTypBeschreibung
customer_idQueryGanzzahlKunde
statusQueryTextStatus
goneQuerytrue/falseAuch gelöschte (Standard false)
limit / offsetQueryGanzzahlSeitenweise abrufen (Standard 50, max. 200)
sortQueryTextStandard id · möglich: id, name, paid_until (mit «-» absteigend)

Antwort: Status 200 · data: Liste von CloudServer + meta

curl "https://crm.serv24-it.ch/api/v2/cloud-servers" \
  -H "Authorization: Bearer $CRM_KEY"
GET/cloud-servers/{id}lesen

Cloud-Server abrufen

ParameterOrtTypBeschreibung
idPfadGanzzahlID

Antwort: Status 200 · data: CloudServer

curl "https://crm.serv24-it.ch/api/v2/cloud-servers/123" \
  -H "Authorization: Bearer $CRM_KEY"

Online-Shop

Bestellungen aus dem Online-Shop (nur lesen) · nur verfügbar, wenn das entsprechende Modul im Abo aktiv ist · Bereich shop

GET/shop/orderslesen

Shop-Bestellungen

ParameterOrtTypBeschreibung
statusQueryTextStatus, kommagetrennt
customer_idQueryGanzzahlKunde
numberQueryTextBestellnummer
created_sinceQueryZeitpunktNur Einträge, die ab diesem Zeitpunkt erfasst wurden (ISO 8601)
limit / offsetQueryGanzzahlSeitenweise abrufen (Standard 50, max. 200)
sortQueryTextStandard -id · möglich: id, created_at (mit «-» absteigend)

Antwort: Status 200 · data: Liste von ShopOrder + meta

curl "https://crm.serv24-it.ch/api/v2/shop/orders" \
  -H "Authorization: Bearer $CRM_KEY"
GET/shop/orders/{id}lesen

Shop-Bestellung abrufen (inkl. Positionen)

ParameterOrtTypBeschreibung
idPfadGanzzahlID

Antwort: Status 200 · data: ShopOrder

curl "https://crm.serv24-it.ch/api/v2/shop/orders/123" \
  -H "Authorization: Bearer $CRM_KEY"

Webhooks

Webhooks einrichten, testen und Zustellungen einsehen · Bereich webhooks

GET/webhookslesen

Webhooks auflisten

ParameterOrtTypBeschreibung
limit / offsetQueryGanzzahlSeitenweise abrufen (Standard 50, max. 200)
sortQueryTextStandard id · möglich: id (mit «-» absteigend)

Antwort: Status 200 · data: Liste von Webhook + meta

curl "https://crm.serv24-it.ch/api/v2/webhooks" \
  -H "Authorization: Bearer $CRM_KEY"
POST/webhooksschreiben

Webhook anlegen (Antwort enthält einmalig das Signatur-Geheimnis)

Eingabe (JSON)
FeldTypBeschreibung
url PflichtTextEmpfänger-Adresse (https://…)
eventsListeEreignisse, z.B. ["document.paid"] – leer oder ["*"] = alle
descriptionText · nullBezeichnung
activetrue/falseAktiv

Antwort: Status 201 · data: Webhook

curl -X POST "https://crm.serv24-it.ch/api/v2/webhooks" \
  -H "Authorization: Bearer $CRM_KEY" \
  -H "Content-Type: application/json" \
  -H "Idempotency-Key: $(uuidgen)" \
  -d '{"url":"https://example.ch/webhooks/crm","events":["customer.created","document.paid","payment.created"],"description":"ERP-Abgleich"}'
GET/webhooks/{id}lesen

Webhook abrufen

ParameterOrtTypBeschreibung
idPfadGanzzahlID

Antwort: Status 200 · data: Webhook

curl "https://crm.serv24-it.ch/api/v2/webhooks/123" \
  -H "Authorization: Bearer $CRM_KEY"
PATCH/webhooks/{id}schreiben

Webhook ändern (active=true setzt Fehlerzähler zurück)

ParameterOrtTypBeschreibung
idPfadGanzzahlID
Eingabe (JSON) – nur die zu ändernden Felder
FeldTypBeschreibung
urlTextEmpfänger-Adresse (https://…)
eventsListeEreignisse, z.B. ["document.paid"] – leer oder ["*"] = alle
descriptionText · nullBezeichnung
activetrue/falseAktiv

Antwort: Status 200 · data: Webhook

curl -X PATCH "https://crm.serv24-it.ch/api/v2/webhooks/123" \
  -H "Authorization: Bearer $CRM_KEY" \
  -H "Content-Type: application/json" \
  -d '{"url":"https://example.ch/webhooks/crm","description":"Beratung"}'
DELETE/webhooks/{id}schreiben

Webhook löschen

ParameterOrtTypBeschreibung
idPfadGanzzahlID

Antwort: Status 204 ohne Inhalt

curl -X DELETE "https://crm.serv24-it.ch/api/v2/webhooks/123" \
  -H "Authorization: Bearer $CRM_KEY"
POST/webhooks/{id}/testschreiben

Testereignis sofort zustellen

ParameterOrtTypBeschreibung
idPfadGanzzahlID

Antwort: Status 200 · data: Delivery

curl -X POST "https://crm.serv24-it.ch/api/v2/webhooks/123/test" \
  -H "Authorization: Bearer $CRM_KEY"
GET/webhooks/{id}/deliverieslesen

Letzte Zustellungen (30 Tage)

ParameterOrtTypBeschreibung
idPfadGanzzahlID
statusQueryTextpending, done, failed
eventQueryTextEreignis
limit / offsetQueryGanzzahlSeitenweise abrufen (Standard 50, max. 200)
sortQueryTextStandard -id · möglich: id (mit «-» absteigend)

Antwort: Status 200 · data: Liste von Delivery + meta

curl "https://crm.serv24-it.ch/api/v2/webhooks/123/deliveries" \
  -H "Authorization: Bearer $CRM_KEY"
POST/webhooks/{id}/deliveries/{delivery_id}/retryschreiben

Zustellung erneut versuchen

ParameterOrtTypBeschreibung
idPfadGanzzahlID
delivery_idPfadGanzzahlID

Antwort: Status 200 · data: Delivery

curl -X POST "https://crm.serv24-it.ch/api/v2/webhooks/123/deliveries/55/retry" \
  -H "Authorization: Bearer $CRM_KEY"

Datenmodelle

«nur lesen» = wird ausgegeben, beim Schreiben ignoriert. Felder, die hier fehlen, werden nie ausgegeben.

Customer – Kunde
FeldTypBeschreibung
idGanzzahlnur lesen Interne ID
customer_noTextKundennummer – leer lassen für die nächste freie Nummer
typeText: person | companyPrivatperson oder Firma (Standard: company, wenn «company» gesetzt ist, sonst person)
nameTextnur lesen Anzeigename (Firma bzw. Vor- und Nachname)
companyTextFirmenname (Firma: Pflicht, sonst last_name)
salutationTextAnrede, z.B. Herr, Frau
first_nameTextVorname
last_nameTextNachname (Privatperson: Pflicht)
emailE-MailE-Mail-Adresse (Rechnungsversand)
phoneTextTelefon
mobileTextMobile
websiteTextWebseite
streetTextStrasse und Hausnummer
address2TextAdresszusatz, Postfach
zipTextPLZ
cityTextOrt – Schreibweise wird anhand der PLZ korrigiert
regionText · nullKanton / Bundesland / Region – leer = automatisch aus PLZ und Ort
countryTextLand, ISO-3166-Code (CH, LI und EU-Staaten), Standard CH
birth_dateDatum · nullGeburtsdatum (JJJJ-MM-TT)
languageText: de | fr | it | enSprache der Belege
uid_noTextUID (CHE-…)
vat_noTextMWST-Nummer
payment_daysGanzzahl · nullZahlungsfrist in Tagen (leer = Standard des Betriebs)
delivery_channelText: email | postRechnungsversand per E-Mail oder Post
tagsTextSchlagwörter, durch Komma getrennt
notesText (lang)Interne Bemerkungen
ext_refText · nullIhre Referenz im Fremdsystem (frei verwendbar, filterbar)
archivedtrue/falseArchiviert
dunning_stoptrue/falseMahnstopp für alle Rechnungen des Kunden
dunning_stop_untilDatum · nullMahnstopp bis (leer = unbefristet)
dunning_stop_reasonText · nullGrund des Mahnstopps (intern)
addr_statusTextnur lesen Ergebnis der Adressprüfung (ok, suggest, invalid …) – leer = nicht geprüft
created_atZeitpunktnur lesen Erfasst am
open_totalZahl · nullnur lesen Offener Betrag aller Rechnungen (nur in der Einzelabfrage)
contactsListe von Contactnur lesen Kontaktpersonen (Contact) – nur in der Einzelabfrage; beim Anlegen direkt mitgeben möglich
Contact – Kontaktperson
FeldTypBeschreibung
idGanzzahlnur lesen Interne ID
customer_idGanzzahlnur lesen Kunde
salutationTextAnrede
nameTextPflicht Name
positionTextFunktion
emailE-MailE-Mail
phoneTextTelefon
mobileTextMobile
Note – Notiz
FeldTypBeschreibung
idGanzzahlnur lesen Interne ID
customer_idGanzzahlnur lesen Kunde
noteText (lang)Pflicht Text
user_idGanzzahl · nullnur lesen Erfasst von (Benutzer)
created_atZeitpunktnur lesen Erfasst am
File – Kundendokument
FeldTypBeschreibung
idGanzzahlnur lesen Interne ID
customer_idGanzzahlnur lesen Kunde
nameTextPflicht Dateiname
sizeGanzzahlnur lesen Grösse in Bytes
mimeTextnur lesen Dateityp
categoryTextKategorie
noteText · nullBemerkung
sharedtrue/falseIm Kundenportal sichtbar
created_atZeitpunktnur lesen Abgelegt am
Document – Beleg
FeldTypBeschreibung
idGanzzahlnur lesen Interne ID
typeText: quote | order | delivery | invoice | creditBelegart: Offerte, Auftragsbestätigung, Lieferschein, Rechnung, Gutschrift (Standard invoice)
numberText · nullnur lesen Belegnummer – wird beim Abschliessen vergeben
statusTextnur lesen draft, open, partial, paid, sent, accepted, declined, expired, installment, cancelled
customer_idGanzzahlPflicht Kunde
titleTextTitel / Betreff
dateDatumBelegdatum (Standard heute)
due_dateDatumFällig am bzw. gültig bis (Standard: Datum + Zahlungsfrist)
delivery_dateDatum · nullLiefer-/Leistungsdatum
languageText: de | fr | it | enSprache (Standard: Sprache des Kunden)
introText (lang)Einleitungstext
footerText (lang)Schlusstext (Standard: Fusstext des Betriebs)
termsText (lang) · nullKonditionen
referenceText · nullnur lesen QR-/SCOR-Referenz (Rechnungen)
currencyTextnur lesen Währung (CHF)
subtotalZahlnur lesen Zwischensumme
vat_totalZahlnur lesen MWST
totalZahlnur lesen Total
fees_totalZahlnur lesen Mahngebühren
paid_totalZahlnur lesen Bezahlt
balanceZahlnur lesen Offener Betrag
dunning_levelGanzzahlnur lesen Mahnstufe
last_dunningDatum · nullnur lesen Letzte Mahnung
dunning_stoptrue/falseMahnstopp (nur Rechnungen): keine Mahnungen, keine Gebühren, keine Inkasso-Übergabe – auch bei abgeschlossenen Rechnungen änderbar
dunning_stop_untilDatum · nullMahnstopp bis (leer = bis zur Aufhebung)
dunning_stop_reasonText · nullGrund des Mahnstopps (intern)
dunning_stop_atZeitpunkt · nullnur lesen Mahnstopp gesetzt am
parent_idGanzzahl · nullnur lesen Ratenplan: Hauptrechnung
origin_idGanzzahl · nullnur lesen Erstellt aus Beleg
quote_idGanzzahl · nullnur lesen Ursprüngliche Offerte
recurring_idGanzzahl · nullnur lesen Aus Abo-Rechnung
sent_atZeitpunkt · nullnur lesen Versendet am
cancelled_atZeitpunkt · nullnur lesen Storniert am
signed_atZeitpunkt · nullnur lesen Offerte online unterschrieben am
viewsGanzzahlnur lesen Wie oft der Kunde den Beleg abgerufen hat (Online-Link, PDF, Kundenportal)
first_view_atZeitpunkt · nullnur lesen Erster Abruf durch den Kunden
last_view_atZeitpunkt · nullnur lesen Letzter Abruf durch den Kunden
ext_refText · nullIhre Referenz im Fremdsystem
created_atZeitpunktnur lesen Erfasst am
urlText · nullnur lesen Online-Ansicht für den Kunden (nach dem Abschliessen)
itemsListe von ItemPflicht Positionen (Item) – beim Ändern werden alle Positionen ersetzt (in Listen nicht enthalten)
paymentsListe von Paymentnur lesen Zahlungen (Payment) – nur in der Einzelabfrage
Item – Position
FeldTypBeschreibung
posGanzzahlnur lesen Reihenfolge
product_idGanzzahl · nullArtikel – fehlende Angaben (Text, Preis, Einheit, MWST) werden vom Artikel übernommen
descriptionText (lang)Text (Pflicht, ausser bei product_id)
qtyZahlMenge (Standard 1)
unitTextEinheit, z.B. Std., Min., Stk., Pauschal – bei «Min.» ist qty in Minuten und price der Stundensatz
priceZahlEinzelpreis
discountZahlRabatt in Prozent
vat_rateZahlMWST-Satz in Prozent (Standard: Satz des Betriebs; 0 bei nicht MWST-pflichtigen Betrieben)
totalZahlnur lesen Positionstotal
Payment – Zahlung
FeldTypBeschreibung
idGanzzahlnur lesen Interne ID
document_idGanzzahlPflicht Rechnung oder Gutschrift
dateDatumZahlungsdatum (Standard heute)
amountZahlBetrag (Standard: offener Betrag)
methodTextZahlungsart, z.B. Bank, Bar, TWINT (Standard API)
noteTextBemerkung
booktrue/falseAls Einnahme verbuchen (Standard true)
Product – Artikel
FeldTypBeschreibung
idGanzzahlnur lesen Interne ID
numberTextArtikelnummer
nameTextPflicht Bezeichnung
descriptionText (lang)Beschreibung
unitTextEinheit
priceZahlPreis
vat_rateZahlMWST-Satz in Prozent
typeTextproduct (Ware) oder service (Dienstleistung)
account_noText · nullErlöskonto
activetrue/falseIn Belegen auswählbar
shoptrue/falseIm Online-Shop angeboten
shop_textText (lang) · nullText im Online-Shop
ext_refText · nullIhre Referenz im Fremdsystem
Recurring – Abo-Rechnung
FeldTypBeschreibung
idGanzzahlnur lesen Interne ID
customer_idGanzzahlPflicht Kunde
titleTextTitel
intvText: month | quarter | halfyear | yearIntervall (Standard month)
next_dateDatumNächste Rechnung am (Standard heute)
end_dateDatum · nullEndet am
auto_sendtrue/falseAutomatisch versenden (Standard true)
auto_chargeGanzzahlAutomatische Abbuchung vom hinterlegten Zahlungsmittel: 0 = nein, 1 = am Rechnungsdatum, 2 = am Fälligkeitsdatum
activetrue/falseAktiv
introText (lang)Einleitungstext (Platzhalter {periode})
itemsListe von ItemPflicht Positionen (Item)
last_run_atZeitpunkt · nullnur lesen Letzte Rechnung erstellt am
created_atZeitpunktnur lesen Erfasst am
Project – Projekt
FeldTypBeschreibung
idGanzzahlnur lesen Interne ID
customer_idGanzzahl · nullKunde
nameTextPflicht Projektname
rateZahlStundensatz
budget_hoursZahlBudget in Stunden
statusText: active | done | archivedStatus
hours_totalZahlnur lesen Erfasste Stunden
hours_openZahlnur lesen Verrechenbare, noch nicht verrechnete Stunden
created_atZeitpunktnur lesen Erfasst am
TimeEntry – Zeiteintrag
FeldTypBeschreibung
idGanzzahlnur lesen Interne ID
project_idGanzzahlPflicht Projekt
user_idGanzzahl · nullBenutzer (Standard: Ersteller des API-Schlüssels)
dateDatumDatum (Standard heute)
hoursZahlPflicht Stunden
descriptionText (lang)Tätigkeit
billabletrue/falseVerrechenbar (Standard true)
invoice_idGanzzahl · nullnur lesen Verrechnet mit Rechnung
Transaction – Buchung
FeldTypBeschreibung
idGanzzahlnur lesen Interne ID
typeText: income | expensePflicht Einnahme oder Ausgabe
dateDatumDatum (Standard heute)
descriptionTextText
categoryTextKategorie (siehe /categories)
amountZahlPflicht Betrag inkl. MWST
vat_rateZahlMWST-Satz in Prozent
vat_amountZahlnur lesen Darin enthaltene MWST
document_idGanzzahl · nullnur lesen Zu Beleg (automatische Buchung einer Zahlung)
payment_idGanzzahl · nullnur lesen Zu Zahlung
statusTextnur lesen booked = verbucht, open = offene Lieferantenrechnung
tagsText · nullSchlagwörter
account_noText · nullKonto
currencyTextnur lesen Währung
has_receipttrue/falsenur lesen Beleg (PDF/Bild) vorhanden
created_atZeitpunktnur lesen Erfasst am
Bill – Lieferantenrechnung
FeldTypBeschreibung
idGanzzahlnur lesen Interne ID
supplierTextPflicht Lieferant
supplier_addressText (lang)Adresse des Lieferanten
supplier_ibanTextIBAN des Lieferanten (für den Zahlungsauftrag)
pay_referenceTextQR-/SCOR-Referenz
pay_messageTextMitteilung
bill_noTextRechnungsnummer des Lieferanten
bill_dateDatumRechnungsdatum (Standard heute)
due_dateDatumFällig am (Standard +30 Tage)
currencyText: CHF | EURWährung
amountZahlPflicht Betrag inkl. MWST
vat_rateZahlMWST-Satz (Vorsteuer)
vat_amountZahlnur lesen Darin enthaltene MWST
categoryTextKategorie (Standard Fremdleistungen)
descriptionTextText
statusText: open | bookednur lesen open = offen, booked = bezahlt/verbucht
paid_atDatum · nullnur lesen Bezahlt am
has_receipttrue/falsenur lesen Beleg (PDF/Bild) vorhanden
created_atZeitpunktnur lesen Erfasst am
Category – Kategorie
FeldTypBeschreibung
idGanzzahlnur lesen Interne ID
typeText: income | expensePflicht Einnahmen oder Ausgaben
nameTextPflicht Bezeichnung
account_noText · nullKonto
vat_rateZahl · nullStandard-MWST-Satz
Request – Kundenanfrage
FeldTypBeschreibung
idGanzzahlnur lesen Interne ID
numberTextnur lesen Anfrage-Nummer (A-00001)
customer_idGanzzahlPflicht Kunde
kindText: question | invoice | change | service | installment | cancel | sim_lost | hosting_changeArt der Anfrage (Standard question)
subjectTextBetreff
statusText: open | progress | answered | done | rejectedStatus
refText · nullnur lesen Bezug (z.B. Beleg)
last_fromText · nullnur lesen Letzte Nachricht von customer oder staff
created_atZeitpunktnur lesen Eröffnet am
updated_atZeitpunkt · nullnur lesen Zuletzt geändert
closed_atZeitpunkt · nullnur lesen Abgeschlossen am
messagesListe von Messagenur lesen Nachrichten (Message) – nur in der Einzelabfrage
Message – Nachricht
FeldTypBeschreibung
idGanzzahlnur lesen Interne ID
senderTextnur lesen customer oder staff
authorTextnur lesen Name
textText (lang)Pflicht Nachricht
created_atZeitpunktnur lesen Zeitpunkt
Dunning – Mahnung
FeldTypBeschreibung
idGanzzahlnur lesen Interne ID
document_idGanzzahlnur lesen Rechnung
levelGanzzahlnur lesen Mahnstufe
feeZahlnur lesen Gebühr
sent_toText · nullnur lesen Versendet an
sent_atZeitpunktnur lesen Versendet am
Sim – SIM-Karte
FeldTypBeschreibung
idGanzzahlnur lesen Interne ID
iccidTextnur lesen ICCID
msisdnText · nullnur lesen Rufnummer
customer_idGanzzahl · nullnur lesen Kunde
sim_typeText · nullnur lesen SIM oder eSIM
sim_aliasText · nullnur lesen Bezeichnung
stateText · nullnur lesen Zustand
subscription_statusText · nullnur lesen Status beim Anbieter
assigned_atZeitpunkt · nullnur lesen Zugewiesen am
shipped_atZeitpunkt · nullnur lesen Versendet am
gonetrue/falsenur lesen Nicht mehr vorhanden
created_atZeitpunktnur lesen Erfasst am
MobileSub – Mobile-Abo
FeldTypBeschreibung
idGanzzahlnur lesen Interne ID
customer_idGanzzahlnur lesen Kunde
sim_idGanzzahl · nullnur lesen SIM-Karte
product_idGanzzahl · nullnur lesen Abo-Produkt
kindTextnur lesen Art
priceZahlnur lesen Preis
cycleTextnur lesen Abrechnung
start_dateDatum · nullnur lesen Beginn
paid_untilDatum · nullnur lesen Bezahlt bis
autorenewtrue/falsenur lesen Automatische Verlängerung
statusTextnur lesen Status
cancel_effectiveDatum · nullnur lesen Gekündigt auf
created_atZeitpunktnur lesen Erfasst am
MobileProduct – Mobile-Produkt
FeldTypBeschreibung
idGanzzahlnur lesen Interne ID
nameTextnur lesen Bezeichnung
descriptionText (lang) · nullnur lesen Beschreibung
kindTextnur lesen Art
priceZahlnur lesen Preis
cycleTextnur lesen Abrechnung
setup_feeZahlnur lesen Einrichtung
vat_rateZahlnur lesen MWST-Satz
portaltrue/falsenur lesen Im Kundenportal bestellbar
esimtrue/falsenur lesen eSIM möglich
activetrue/falsenur lesen Aktiv
HostingAccount – Hosting-Konto
FeldTypBeschreibung
idGanzzahlnur lesen Interne ID
customer_idGanzzahlnur lesen Kunde
product_idGanzzahl · nullnur lesen Hosting-Paket
usernameText · nullnur lesen Benutzername
domainText · nullnur lesen Hauptdomain
statusTextnur lesen Status
cycleTextnur lesen Abrechnung
priceZahlnur lesen Preis
start_dateDatum · nullnur lesen Beginn
cancel_effectiveDatum · nullnur lesen Gekündigt auf
created_atZeitpunktnur lesen Erfasst am
activated_atZeitpunkt · nullnur lesen Aktiviert am
HostingProduct – Hosting-Paket
FeldTypBeschreibung
idGanzzahlnur lesen Interne ID
nameTextnur lesen Bezeichnung
descriptionText (lang) · nullnur lesen Beschreibung
price_monthZahlnur lesen Preis pro Monat
price_yearZahlnur lesen Preis pro Jahr
setup_feeZahlnur lesen Einrichtung
vat_rateZahlnur lesen MWST-Satz
orderabletrue/falsenur lesen Bestellbar
activetrue/falsenur lesen Aktiv
WebService – Web-Dienst
FeldTypBeschreibung
idGanzzahlnur lesen Interne ID
customer_idGanzzahl · nullnur lesen Kunde
nameText · nullnur lesen Bezeichnung
fqdnText · nullnur lesen Domain
service_nameText · nullnur lesen Art (domain, email, hosting …)
statusText · nullnur lesen Status
expired_atDatum · nullnur lesen Läuft ab am
priceZahl · nullnur lesen Verkaufspreis
cycleText · nullnur lesen Abrechnung
vat_rateZahl · nullnur lesen MWST-Satz
recurring_idGanzzahl · nullnur lesen Abo-Rechnung
gonetrue/falsenur lesen Nicht mehr vorhanden
created_atZeitpunktnur lesen Erfasst am
CloudServer – Cloud-Server
FeldTypBeschreibung
idGanzzahlnur lesen Interne ID
customer_idGanzzahl · nullnur lesen Kunde
nameTextnur lesen Name
server_typeText · nullnur lesen Servertyp
locationText · nullnur lesen Standort
imageText · nullnur lesen Betriebssystem
ipv4Text · nullnur lesen IPv4
ipv6Text · nullnur lesen IPv6
statusText · nullnur lesen Status
backuptrue/falsenur lesen Backups aktiv
priceZahl · nullnur lesen Verkaufspreis
billingText · nullnur lesen Abrechnung
paid_untilDatum · nullnur lesen Bezahlt bis
autorenewtrue/falsenur lesen Automatische Verlängerung
suspendedtrue/falsenur lesen Gesperrt
cancel_atDatum · nullnur lesen Kündigung auf
created_atZeitpunktnur lesen Erfasst am
ShopOrder – Shop-Bestellung
FeldTypBeschreibung
idGanzzahlnur lesen Interne ID
numberText · nullnur lesen Bestellnummer
customer_idGanzzahlnur lesen Kunde
statusTextnur lesen new, awaiting_payment, payment_failed, review, processing, done, error, rejected, cancelled
netZahlnur lesen Netto
totalZahlnur lesen Total
document_idGanzzahl · nullnur lesen Rechnung
paid_atZeitpunkt · nullnur lesen Bezahlt am
approved_atZeitpunkt · nullnur lesen Freigegeben am
rejected_atZeitpunkt · nullnur lesen Abgelehnt am
done_atZeitpunkt · nullnur lesen Ausgeführt am
created_atZeitpunktnur lesen Bestellt am
itemsListe von ShopItemnur lesen Positionen (ShopItem)
ShopItem – Bestellposition
FeldTypBeschreibung
idGanzzahlnur lesen Interne ID
sourceTextnur lesen Herkunft (products, hosting, dienste, cloud, telecom …)
refText · nullnur lesen Referenz
titleTextnur lesen Bezeichnung
qtyZahlnur lesen Menge
netZahlnur lesen Netto
cycleText · nullnur lesen Abrechnung
statusTextnur lesen pending, done, manual, waiting, error, cancelled
done_atZeitpunkt · nullnur lesen Erledigt am
Webhook – Webhook
FeldTypBeschreibung
idGanzzahlnur lesen Interne ID
urlTextPflicht Empfänger-Adresse (https://…)
eventsListeEreignisse, z.B. ["document.paid"] – leer oder ["*"] = alle
descriptionText · nullBezeichnung
activetrue/falseAktiv
failsGanzzahlnur lesen Fehlversuche in Folge
last_atZeitpunkt · nullnur lesen Letzte Zustellung
last_statusGanzzahl · nullnur lesen Letzter HTTP-Status
created_atZeitpunktnur lesen Erfasst am
secretTextnur lesen Signatur-Geheimnis – nur in der Antwort beim Anlegen sichtbar
Delivery – Webhook-Zustellung
FeldTypBeschreibung
idGanzzahlnur lesen Interne ID
eventTextnur lesen Ereignis
statusTextnur lesen pending, done, failed
attemptsGanzzahlnur lesen Versuche
next_atZeitpunkt · nullnur lesen Nächster Versuch
last_codeGanzzahl · nullnur lesen Letzter HTTP-Status
last_errorText · nullnur lesen Letzter Fehler
created_atZeitpunktnur lesen Ausgelöst am
done_atZeitpunkt · nullnur lesen Zugestellt am

Version 1

Die bisherige API unter api.php?r=… (v1) bleibt unverändert erhalten. Für neue Anbindungen bitte v2 verwenden.