Zum Hauptinhalt springen

Authentifizierung

Die Woofed CRM API authentifiziert jeden Request mit einem JWT-Bearer-Token. Es gibt nur einen Tokentyp — keine separaten "publishable"- oder "secret"-Keys, kein OAuth-Flow.

So funktioniert's

  1. Sie holen sich einen JWT-Token aus dem Admin-Panel — siehe Leitfaden Token abrufen.
  2. Sie tragen diesen Token im Authorization-Header jedes API-Requests ein:
Authorization: Bearer IHR_TOKEN_HIER
  1. Der Token identifiziert den Benutzer, in dessen Namen der Aufruf erfolgt — alle Berechtigungen, Audit-Logs und Eigentumsregeln verhalten sich also genau so, als hätte dieser Benutzer die Aktion in der UI ausgeführt.
Der Token ist eine Zugangsdaten

Ein Woofed-CRM-Token kann alle Daten lesen und ändern, die der zugehörige Benutzer sehen darf. Behandeln Sie ihn wie ein Passwort.

Token mitsenden

Der Header ist unabhängig von Sprache oder HTTP-Client immer gleich.

curl

curl -X GET "https://app.woofedcrm.com/api/v1/accounts/1/contacts/1" \
-H "Content-Type: application/json" \
-H "Authorization: Bearer IHR_TOKEN_HIER"

JavaScript / fetch

const res = await fetch(
"https://app.woofedcrm.com/api/v1/accounts/1/contacts/1",
{
headers: {
"Content-Type": "application/json",
Authorization: `Bearer ${process.env.WOOFED_TOKEN}`,
},
}
);

Node.js / axios

import axios from "axios";

const woofed = axios.create({
baseURL: "https://app.woofedcrm.com/api/v1/accounts/1",
headers: {
Authorization: `Bearer ${process.env.WOOFED_TOKEN}`,
"Content-Type": "application/json",
},
});

const { data } = await woofed.get("/contacts/1");

Python / requests

import os
import requests

headers = {
"Authorization": f"Bearer {os.environ['WOOFED_TOKEN']}",
"Content-Type": "application/json",
}

r = requests.get(
"https://app.woofedcrm.com/api/v1/accounts/1/contacts/1",
headers=headers,
)
r.raise_for_status()
print(r.json())

Ruby / Net::HTTP

require "net/http"
require "json"

uri = URI("https://app.woofedcrm.com/api/v1/accounts/1/contacts/1")
req = Net::HTTP::Get.new(uri)
req["Authorization"] = "Bearer #{ENV['WOOFED_TOKEN']}"
req["Content-Type"] = "application/json"

res = Net::HTTP.start(uri.hostname, uri.port, use_ssl: true) { |http| http.request(req) }
puts JSON.parse(res.body)

Häufige Authentifizierungsfehler

StatusBedeutungWas prüfen
401 UnauthorizedToken fehlt, ist falsch formatiert oder abgelaufenHeader lautet exakt Authorization: Bearer <token> (Leerzeichen nicht vergessen, keine Anführungszeichen um den Token, keine Whitespaces vor/nach).
403 ForbiddenToken gültig, aber Benutzer hat keinen Zugriff auf die RessourceDer Token-Inhaber gehört zum richtigen Account und hat die nötigen Rechte.
404 Not FoundFalsche account_id in der URL oder Datensatz existiert nicht in diesem AccountDer Token gehört zu einem Benutzer aus demselben Account, der in der URL erscheint.

Sicherheits-Best-Practices

Diese Regeln schützen vor den häufigsten Token-Leaks.

  • Niemals einen Token in clientseitigem Code einbetten. Browser, Mobile Apps und jeder Code, der zum Endgerät ausgeliefert wird, müssen Ihr eigenes Backend ansprechen, das dann mit serverseitig gehaltenem Token Woofed CRM aufruft.
  • Niemals Tokens in Git committen. Verwenden Sie Umgebungsvariablen (.env-Dateien außerhalb der Versionskontrolle, Secret Manager, CI/CD-Secrets, …).
  • Pro Integration einen Token. Wird ein Token geleakt, rotieren Sie nur diese eine Integration, ohne die anderen zu stören.
  • Token beim Offboarding rotieren. Ein Token, der an einen Mitarbeitenden gebunden ist, sollte beim Ausscheiden neu erstellt werden.
  • Immer HTTPS. Die API akzeptiert nur TLS-Verbindungen — erzwingen Sie HTTPS aber auch in jedem Service, der die Aufrufe durchreicht.
  • Nur Server-zu-Server. Senden Sie den Token nicht an Dritte (Chatbots, No-Code-Plattformen, …), denen Sie nicht vollständig vertrauen.
Token speichern

Übliche Muster:

  • Backend-Anwendung — eine Umgebungsvariable WOOFED_TOKEN, von Ihrer Runtime injiziert (Heroku, Render, Fly, Kubernetes-Secret, …).
  • n8n / Make / Zapier — im "Credentials"-Speicher der Plattform ablegen, niemals als Klartext in einem Step.
  • Lokales Skript — eine .env-Datei in .gitignore und mit einer Library wie dotenv laden.

Nächster Schritt

Sie sind bereit, jeden Endpoint aufzurufen. Lesen Sie weiter unter API-Struktur für Antwortformate und Fehlerbehandlung — oder springen Sie direkt zur Endpoint-Referenz.