Darstellung
Quickstart: In zehn Minuten zum ersten API-Aufruf
Die Work7 Public API v1 gibt Drittsystemen Zugriff auf Projekte, Kontakte, Rapporte, Angebote, Rechnungen, Zeiten, Termine und Anfragen eines Betriebs. Sie nutzt dieselbe Geschäftslogik wie die Web-App und der WhatsApp-Assistent, Mandantentrennung und Berechtigungen gelten serverseitig.
Basis-URL: https://app.work7.net/api/v1 (Test-System: https://app.test.work7.net/api/v1)
Voraussetzung
Das Modul Public API & Webhooks muss für den Betrieb freigeschaltet sein (Einstellungen › Module). Ist es das nicht, antworten alle Endpunkte mit 403 module_disabled.
1. API-Schlüssel anlegen
- Als Administrator in der Work7-App anmelden.
- Einstellungen › Integrationen › API & Webhooks öffnen.
- Unter API-Schlüssel einen Namen vergeben (zum Beispiel „Buchhaltung“) und die Scopes anhaken, die das Drittsystem braucht. Für diesen Quickstart:
core:readundinquiries:write. - Schlüssel erstellen klicken. Der Schlüssel wird genau einmal angezeigt. Kopieren und sicher ablegen.
Der Schlüssel hat die Form w7_<umgebung>_<prefix>_<secret> — w7_live_… in der Produktivumgebung, w7_test_… in einer Testumgebung. Work7 speichert nur einen Hash, verlorene Schlüssel lassen sich nicht wiederherstellen, nur widerrufen und neu anlegen.
2. Erster Aufruf: Wer bin ich?
GET /me liefert Betrieb, Scopes des Schlüssels und die freigeschalteten Bereiche. Damit prüfst du Zugang und Konfiguration in einem Schritt.
bash
curl https://app.work7.net/api/v1/me \
-H "Authorization: Bearer w7_live_abc12345_..."js
const res = await fetch('https://app.work7.net/api/v1/me', {
headers: { Authorization: `Bearer ${process.env.WORK7_API_KEY}` },
})
if (!res.ok) throw new Error(`HTTP ${res.status}: ${await res.text()}`)
const { data } = await res.json()
console.log(data.companyId, data.key.scopes, data.active.map((m) => m.label))php
<?php
$ch = curl_init('https://app.work7.net/api/v1/me');
curl_setopt_array($ch, [
CURLOPT_RETURNTRANSFER => true,
CURLOPT_HTTPHEADER => ['Authorization: Bearer ' . getenv('WORK7_API_KEY')],
]);
$body = curl_exec($ch);
$status = curl_getinfo($ch, CURLINFO_RESPONSE_CODE);
curl_close($ch);
if ($status !== 200) {
throw new RuntimeException("HTTP $status: $body");
}
$data = json_decode($body, true)['data'];
echo $data['companyId'], PHP_EOL;Antwort:
json
{
"data": {
"companyId": "muster-malerei",
"key": { "id": 3, "name": "Buchhaltung", "prefix": "abc12345", "scopes": ["core:read", "inquiries:write"] },
"plan": "komplett",
"modules": ["core", "inquiries", "site-reports", "..."],
"active": [{ "id": "inquiries", "label": "Anfragen" }, { "id": "site-reports", "label": "Rapport" }],
"inactive": [{ "id": "inventory", "label": "Lager" }]
}
}3. Daten lesen: Projekte auflisten
Listen sind paginiert über limit und offset, durchsuchbar über q.
bash
curl "https://app.work7.net/api/v1/projects?limit=20&status=active" \
-H "Authorization: Bearer $WORK7_API_KEY"js
const res = await fetch('https://app.work7.net/api/v1/projects?limit=20&status=active', {
headers: { Authorization: `Bearer ${process.env.WORK7_API_KEY}` },
})
const { data, pagination } = await res.json()
for (const project of data) console.log(project.id, project.project_number, project.name)
if (pagination.hasMore) {
// nächste Seite: offset = pagination.offset + pagination.limit
}php
<?php
$url = 'https://app.work7.net/api/v1/projects?' . http_build_query(['limit' => 20, 'status' => 'active']);
$ch = curl_init($url);
curl_setopt_array($ch, [
CURLOPT_RETURNTRANSFER => true,
CURLOPT_HTTPHEADER => ['Authorization: Bearer ' . getenv('WORK7_API_KEY')],
]);
$json = json_decode(curl_exec($ch), true);
curl_close($ch);
foreach ($json['data'] as $project) {
echo $project['project_number'], ' ', $project['name'], PHP_EOL;
}4. Daten schreiben: Anfrage anlegen
Typischer Anwendungsfall: Das Kontaktformular der eigenen Website legt direkt eine Anfrage in Work7 an. Der Betrieb sieht sie im Posteingang der Anfragen-Pipeline und, wenn eingerichtet, als WhatsApp-Benachrichtigung.
bash
curl -X POST https://app.work7.net/api/v1/inquiries \
-H "Authorization: Bearer $WORK7_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"title": "Fassade streichen, EFH Dornbirn",
"description": "Ca. 220 m² Putzfassade, Termin ab Mai.",
"source": "website",
"contact_name": "Maria Huber",
"contact_email": "maria.huber@example.at",
"contact_phone": "+43 664 1234567",
"objekt_street": "Marktstraße",
"objekt_house_number": "12",
"objekt_postal_code": "6850",
"objekt_city": "Dornbirn"
}'js
const res = await fetch('https://app.work7.net/api/v1/inquiries', {
method: 'POST',
headers: {
Authorization: `Bearer ${process.env.WORK7_API_KEY}`,
'Content-Type': 'application/json',
},
body: JSON.stringify({
title: 'Fassade streichen, EFH Dornbirn',
description: 'Ca. 220 m² Putzfassade, Termin ab Mai.',
source: 'website',
contact_name: 'Maria Huber',
contact_email: 'maria.huber@example.at',
objekt_postal_code: '6850',
objekt_city: 'Dornbirn',
}),
})
if (res.status !== 201) throw new Error(await res.text())
const { data } = await res.json()
console.log('Anfrage angelegt:', data.anfrage_number ?? data.id)php
<?php
$payload = [
'title' => 'Fassade streichen, EFH Dornbirn',
'description' => 'Ca. 220 m² Putzfassade, Termin ab Mai.',
'source' => 'website',
'contact_name' => 'Maria Huber',
'contact_email' => 'maria.huber@example.at',
'objekt_postal_code' => '6850',
'objekt_city' => 'Dornbirn',
];
$ch = curl_init('https://app.work7.net/api/v1/inquiries');
curl_setopt_array($ch, [
CURLOPT_POST => true,
CURLOPT_RETURNTRANSFER => true,
CURLOPT_HTTPHEADER => [
'Authorization: Bearer ' . getenv('WORK7_API_KEY'),
'Content-Type: application/json',
],
CURLOPT_POSTFIELDS => json_encode($payload),
]);
$body = curl_exec($ch);
$status = curl_getinfo($ch, CURLINFO_RESPONSE_CODE);
curl_close($ch);
if ($status !== 201) {
throw new RuntimeException("Anfrage fehlgeschlagen: HTTP $status $body");
}Kontakt anlegen
Mit dem Scope core:write legt ein Drittsystem Kontakte an, zum Beispiel neue Kunden aus einem Shop oder CRM (seit API 1.21). Der Header Idempotency-Key ist optional: Schickt dein System die Anfrage nach einem Netzwerkfehler mit demselben Schlüssel noch einmal, entsteht kein zweiter Kontakt. Erzeuge den Schlüssel deshalb einmal je Vorgang und nicht bei jedem Versuch neu.
bash
curl -X POST https://app.work7.net/api/v1/contacts \
-H "Authorization: Bearer $WORK7_API_KEY" \
-H "Content-Type: application/json" \
-H "Idempotency-Key: 6f1c2a9e-3b7d-4c55-9a43-0d2e8f61b7aa" \
-d '{
"kind": "organisation",
"company_name": "Huber Bau GmbH",
"email": "office@huber-bau.example",
"postal_code": "6850",
"city": "Dornbirn",
"country": "AT"
}'js
// Schlüssel einmal je Kontakt erzeugen und bei jeder Wiederholung derselben Anlage mitschicken.
const idempotencyKey = crypto.randomUUID()
const body = JSON.stringify({
kind: 'organisation',
company_name: 'Huber Bau GmbH',
email: 'office@huber-bau.example',
postal_code: '6850',
city: 'Dornbirn',
country: 'AT',
})
async function createContact() {
return fetch('https://app.work7.net/api/v1/contacts', {
method: 'POST',
headers: {
Authorization: `Bearer ${process.env.WORK7_API_KEY}`,
'Content-Type': 'application/json',
'Idempotency-Key': idempotencyKey,
},
body,
})
}
let res
try {
res = await createContact()
} catch {
// Netzwerkfehler: mit demselben Schlüssel wiederholen, es entsteht kein zweiter Kontakt.
res = await createContact()
}
if (res.status !== 201) throw new Error(await res.text())
const { data } = await res.json()
console.log('Kontakt angelegt:', data.customer_number, res.headers.get('Location'))Die Antwort ist 201 mit dem Kontakt in data und dem Pfad im Header Location (/api/v1/contacts/<id>). Ändern, archivieren und löschen geht über PATCH bzw. DELETE /contacts/{id}; Details in der API-Referenz.
Projekt anlegen und archivieren
Ebenfalls mit core:write legst du ein Projekt zu einem Kontakt an (seit API 1.21). Ohne project_number vergibt Work7 die Nummer, der Idempotency-Key wirkt wie beim Kontakt.
bash
curl -X POST https://app.work7.net/api/v1/projects \
-H "Authorization: Bearer $WORK7_API_KEY" \
-H "Content-Type: application/json" \
-H "Idempotency-Key: 0b8e4f3a-5c21-4d9e-8f6a-2a7c1e9d4b10" \
-d '{ "name": "Neubau Einfamilienhaus Huber", "kontakt_id": 123, "city": "Dornbirn" }'Gelöscht werden Projekte nicht. Archiviert wird, wie in der App, über einen Statuswechsel:
bash
curl -X PATCH https://app.work7.net/api/v1/projects/456 \
-H "Authorization: Bearer $WORK7_API_KEY" \
-H "Content-Type: application/json" \
-d '{ "status": "archived" }'Alte Pfade
/anfragen heißt jetzt /inquiries (ebenso /kontakte → /contacts, /rapports → /site-reports). Die alten Pfade bleiben als Aliase dauerhaft erreichbar — identische Antworten, kein Redirect. Neue Integrationen sollten die neuen Pfade verwenden.
5. Auf Ereignisse reagieren: Webhook einrichten
Statt zu pollen, lässt du dich benachrichtigen, etwa wenn ein Rapport abgeschlossen oder eine Rechnung bezahlt wurde.
- Einstellungen › Integrationen › API & Webhooks, unter Ausgehende Webhooks Name, öffentlich erreichbare
https-URL und Events wählen (zum Beispielsite_report.completed,invoice.*; alte Namen wierapport.completedwerden weiterhin verstanden). - Webhook anlegen. Das Secret wird einmalig angezeigt.
- Auf deinem Server die Signatur prüfen, bevor du das Ereignis verarbeitest. Code für JavaScript und PHP steht unter Webhooks.
Wie es weitergeht
- Authentifizierung und Scopes: welcher Scope welchen Bereich öffnet, was bei abgeschalteten Modulen passiert.
- API-Referenz: alle Endpunkte mit Parametern, Feldern und Beispielen, interaktiv zum Ausprobieren.
- Webhooks: Events, Payload, Signaturprüfung, Wiederholungen.
- Datenablage: Datei-Uploads von Drittsystemen empfangen (z. B. von ERP-Software).
- Fehler und Limits: Fehlerformat, Statuscodes, Rate-Limit.
- API-Änderungen: was in welcher API-Version neu ist, mit älteren Fassungen der Spezifikation zum Herunterladen.