Skip to content

Quickstart: In zehn Minuten zum ersten API-Aufruf

Gilt ab Work7 0.2.1 · Stand 15.09.2026

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

  1. Als Administrator in der Work7-App anmelden.
  2. Einstellungen › Integrationen › API & Webhooks öffnen.
  3. Unter API-Schlüssel einen Namen vergeben (zum Beispiel „Buchhaltung“) und die Scopes anhaken, die das Drittsystem braucht. Für diesen Quickstart: core:read und anfragen:write.
  4. 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", "anfragen:write"] },
    "plan": "komplett",
    "modules": ["core", "anfragen", "rapport", "..."],
    "active": [{ "id": "anfragen", "label": "Anfragen" }, { "id": "rapport", "label": "Rapport" }],
    "inactive": [{ "id": "lager", "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/anfragen \
  -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/anfragen', {
  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/anfragen');
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");
}

5. Auf Ereignisse reagieren: Webhook einrichten

Statt zu pollen, lässt du dich benachrichtigen, etwa wenn ein Rapport abgeschlossen oder eine Rechnung bezahlt wurde.

  1. Einstellungen › Integrationen › API & Webhooks, unter Ausgehende Webhooks Name, https-URL und Events wählen (zum Beispiel rapport.completed, invoice.*).
  2. Webhook anlegen. Das Secret wird einmalig angezeigt.
  3. 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.

Work7 · Software für Handwerksbetriebe · Doku-Stand Version 0.2.1 (Build fb6311f-dirty)