API-Dokumentation
Version 1 · REST · JSON
Die Einfach-Projektiert REST API ermöglicht den programmatischen Zugriff auf Ihre Projekte, Aufgaben und Meilensteine. Alle Endpunkte geben und empfangen JSON und erfordern eine Authentifizierung per API-Token.
Authentifizierung
Die API verwendet Bearer-Token-Authentifizierung (Laravel Sanctum). Erstellen Sie Ihren persönlichen Zugriffstoken in der Anwendung unter Profil → API-Token.
Token im Request übergeben
Fügen Sie den Token als Authorization-Header bei jedem API-Request hinzu:
Accept: application/json
Content-Type: application/json
Beispiel (curl)
-H "Authorization: Bearer ep_abc123..." \
-H "Accept: application/json"
Basis-URL
Alle in dieser Dokumentation genannten Endpunkte sind relativ zu dieser Basis-URL.
Fehlercodes
| Code | Bedeutung |
|---|---|
| 200 | Erfolg |
| 201 | Ressource erstellt |
| 204 | Erfolg, kein Inhalt (z. B. nach DELETE) |
| 401 | Nicht authentifiziert – Token fehlt oder ungültig |
| 403 | Keine Berechtigung für diese Ressource |
| 404 | Ressource nicht gefunden |
| 422 | Validierungsfehler – Antwort enthält errors-Objekt |
Validierungsfehler (422)
"message": "The name field is required.",
"errors": {
"name": ["Der Name ist erforderlich."]
}
}
Benutzer
Gibt die Daten des authentifizierten Benutzers zurück.
Antwort 200
"id": 1,
"name": "Max Mustermann",
"email": "max@beispiel.de"
}
Projekte
Gibt alle Projekte zurück, bei denen der authentifizierte Benutzer Mitglied ist.
Antwort 200
"data": [
{
"id": 1,
"name": "Website-Relaunch",
"slug": "website-relaunch",
"description": "Neugestaltung der Unternehmenswebsite",
"color": "#1b3c82",
"status": "aktiv",
"start_date": "2026-01-01",
"end_date": "2026-06-30",
"is_template": false,
"tasks_count": 12,
"created_at": "2026-01-01T10:00:00+00:00",
"updated_at": "2026-05-15T14:30:00+00:00"
}
]
}
Parameter
| Feld | Typ | Beschreibung | |
|---|---|---|---|
name | string | Pflicht | Projektname (max. 255 Zeichen) |
color | string | Pflicht | Hex-Farbcode, z. B. #1b3c82 |
description | string | Optional | Beschreibung (max. 5000 Zeichen) |
status | string | Optional | planung · aktiv · pausiert · abgeschlossen · archiviert |
start_date | date | Optional | Format: YYYY-MM-DD |
end_date | date | Optional | Format: YYYY-MM-DD, muss ≥ start_date sein |
is_template | boolean | Optional | Als Vorlage markieren |
Beispiel-Request
-H "Authorization: Bearer ep_abc123..." \
-H "Content-Type: application/json" \
-d '{
"name": "Website-Relaunch",
"color": "#1b3c82",
"status": "planung"
}'
Rückgabe: 201 – Projektobjekt (siehe Listenformat oben)
Gibt ein einzelnes Projekt zurück. Rückgabe: 200 mit Projektobjekt.
Alle Felder sind optional (PATCH-Semantik). Nur übergebene Felder werden geändert.
Rückgabe: 200 mit dem aktualisierten Projektobjekt.
Soft-löscht das Projekt. Nur der Eigentümer kann ein Projekt löschen. Rückgabe: 204
Aufgaben
Aufgaben sind immer einem Projekt zugeordnet. Für Index/Erstellen wird die Projekt-ID in der URL übergeben. Für Abrufen/Aktualisieren/Löschen wird direkt die Aufgaben-ID verwendet (Shallow Routing).
Gibt alle Aufgaben eines Projekts zurück, sortiert nach sort_order.
Antwort 200
"data": [
{
"id": 42,
"title": "Design-Konzept erstellen",
"description": null,
"status": "in_arbeit",
"priority": "hoch",
"phase_id": 3,
"phase": "Phase 1: Konzeption",
"assignee_id": 5,
"assignee": "Anna Schmidt",
"start_date": "2026-02-01",
"due_date": "2026-02-15",
"estimated_hours": "8.00",
"completed_at": null,
"sort_order": 1,
"created_at": "2026-01-20T09:00:00+00:00",
"updated_at": "2026-02-03T11:45:00+00:00"
}
]
}
| Feld | Typ | Beschreibung | |
|---|---|---|---|
title | string | Pflicht | Aufgabentitel (max. 255 Zeichen) |
description | string | Optional | Beschreibung |
status | string | Optional | offen · in_arbeit · review · erledigt (Standard: offen) |
priority | string | Optional | niedrig · mittel · hoch · dringend (Standard: mittel) |
phase_id | integer | Optional | ID einer Phase im gleichen Projekt |
assignee_id | integer | Optional | Benutzer-ID des Zuständigen |
start_date | date | Optional | Format: YYYY-MM-DD |
due_date | date | Optional | Format: YYYY-MM-DD |
estimated_hours | number | Optional | Geschätzter Aufwand in Stunden |
Rückgabe: 201 mit dem erstellten Aufgabenobjekt
Gibt eine einzelne Aufgabe zurück, inkl. Phase, Zuständigen, Tags, Unteraufgaben und Abhängigkeiten. Rückgabe: 200
Alle Felder optional (identisch mit Erstellen). Rückgabe: 200 mit aktualisiertem Objekt.
Soft-löscht die Aufgabe. Rückgabe: 204
Meilensteine
Gibt alle Meilensteine eines Projekts zurück, sortiert nach Fälligkeitsdatum.
Antwort 200
"data": [
{
"id": 7,
"name": "Beta-Launch",
"description": "Interne Testphase abgeschlossen",
"due_date": "2026-04-01",
"reached_at": null,
"is_reached": false,
"is_overdue": false,
"created_at": "2026-01-05T08:00:00+00:00"
}
]
}
| Feld | Typ | Beschreibung | |
|---|---|---|---|
name | string | Pflicht | Meilensteinname (max. 255 Zeichen) |
due_date | date | Pflicht | Fälligkeitsdatum YYYY-MM-DD |
description | string | Optional | Beschreibung (max. 2000 Zeichen) |
Rückgabe: 201 mit dem erstellten Meilensteiobjekt
Rückgabe: 200 mit Meilensteiobjekt (wie Listenformat oben).
| Feld | Typ | Beschreibung | |
|---|---|---|---|
name | string | Optional | |
description | string | Optional | |
due_date | date | Optional | |
reached_at | datetime | Optional | ISO 8601 – setzen um als erreicht zu markieren, null zum Zurücksetzen |
Rückgabe: 200 mit aktualisiertem Objekt.
Rückgabe: 204
Meine Aufgaben
Gibt alle Aufgaben zurück, die dem authentifizierten Benutzer zugewiesen sind – über alle Projekte hinweg.
Query-Parameter
| Parameter | Typ | Beschreibung | |
|---|---|---|---|
status | string | Optional | offen · in_arbeit · review · erledigt |
prioritaet | string | Optional | niedrig · mittel · hoch · dringend |
projekt_id | integer | Optional | Nur Aufgaben dieses Projekts |
ueberfaellig | boolean | Optional | true → nur überfällige Aufgaben |
Antwort 200
"data": [
{
"id": 42,
"title": "Landingpage fertigstellen",
"description": "<p>Alle Texte einpflegen</p>",
"status": "in_arbeit",
"priority": "hoch",
"due_date": "2026-06-15",
"is_overdue": false,
"project": {
"id": 1,
"name": "Website-Relaunch",
"slug": "website-relaunch",
"color": "#1b3c82",
"status": "aktiv"
},
"phase": "Phase 2",
"estimated_hours": 4.5,
"completed_at": null,
"created_at": "2026-06-01T09:00:00+00:00",
"updated_at": "2026-06-05T14:23:00+00:00"
}
],
"meta": {
"total": 38,
"per_page": 50,
"current_page": 1,
"last_page": 1
}
}
Sortierung: In Arbeit → Review → Offen → Erledigt, dann nach Fälligkeitsdatum. Paginiert mit 50 Einträgen pro Seite.
Einfach-Formular Webhook
Dieser Endpunkt empfängt Formular-Einreichungen von
Einfach-Formular
und fügt den Teilnehmer automatisch als Projektmitglied hinzu.
Der Endpunkt erfordert keine Bearer-Token-Authentifizierung –
die Verifizierung erfolgt über den token-Query-Parameter.
Basis-URL: https://einfach-projektiert.de (kein /api/v1-Prefix)
Payload-Felder
| Feld | Typ | Beschreibung | |
|---|---|---|---|
email | string | Pflicht | E-Mail-Adresse des Teilnehmers |
name | string | Optional | Vollständiger Name (alternativ: vorname + nachname) |
vorname | string | Optional | |
nachname | string | Optional | |
telefon | string | Optional | Festnetz |
mobil | string | Optional | Mobilnummer |
firma | string | Optional | Unternehmen |
position | string | Optional | Berufsbezeichnung |
abteilung | string | Optional | |
strasse | string | Optional | Straße + Hausnummer |
plz | string | Optional | Postleitzahl |
ort | string | Optional | Stadt |
land | string | Optional | |
webseite | url | Optional | |
nachricht | string | Optional | Freitext aus dem Formular |
rolle | string | Optional | betrachter · kommentator · bearbeiter – überschreibt Token-Standard |
Beispiel-Request (curl)
"https://einfach-projektiert.de/webhook/formular/1?token=abc123..." \
-H "Content-Type: application/json" \
-d '{
"email": "max@mustermann.de",
"vorname": "Max",
"nachname": "Mustermann",
"firma": "Muster GmbH",
"telefon": "+49 30 123456",
"ort": "Hamburg"
}'
Antwort 200
"ok": true,
"message": "Teilnehmer wurde angelegt und dem Projekt hinzugefügt.",
"data": {
"user_id": 47,
"name": "Max Mustermann",
"email": "max@mustermann.de",
"already_member": false,
"account_created": true
}
}
Wenn der Benutzer noch kein Konto hat, wird eines erstellt und eine E-Mail zum Passwort-Setzen versandt.
Bei "already_member": true wird keine Rolle geändert.
Ungültiges Token → 401