REST API v1

API Documentation

Integriere Calentix-Funnels, Submissions, Leads und den headless Shop in deine Workflows — per REST API, WordPress-Plugin oder Automatisierungstools wie Zapier und Make.com.

Authentifizierung

Alle API-Requests erfordern einen gültigen API-Key im Authorization Header. API-Keys erstellst du unter Konto → API & Integrationen.

Shop Sync API (/api/v1/shop/*) nutzt denselben Bearer-Key. Die Booking API (/api/v1/booking/*) ist user-scoped — kein Site-Pairing nötig, ideal für Kalender-Verwaltung im WordPress-Plugin. Die Storefront API (/api/shop/{storeSlug}/*) ist für Browser-Requests gedacht und authentifiziert sich über site_key plus Origin-Check — kein API-Key im Frontend.

Beispiel-Request
curl -X GET https://calentix.app/api/v1/funnels \
  -H "Authorization: Bearer sk_live_aBcDeFgHiJkLmNoPqRsTuVwXyZ012345"

Wichtig: Behandle deinen API-Key wie ein Passwort. Teile ihn niemals öffentlich und speichere ihn nicht in Client-Side Code.

Base URLs

Admin / Sync API (Funnels, Shop, Booking)
https://calentix.app/api/v1
Storefront API (Browser-Checkout, öffentliche Produktlisten)
https://calentix.app/api/shop/{storeSlug}

Rate Limits

Die API erlaubt maximal 120 Requests pro Minute pro API-Key. Bei Überschreitung wird ein 429 Too Many Requests zurückgegeben.

Requests pro Minute120
Fenster60 Sekunden (rollierend)

Fehlerbehandlung

Fehler werden als JSON mit einem error Objekt zurückgegeben.

Fehler-Response
{
  "error": {
    "message": "Invalid or missing API key",
    "code": "unauthorized"
  }
}
StatusCodeBeschreibung
400invalid_bodyUngültiger Request Body
401unauthorizedFehlender oder ungültiger API-Key
403forbiddenOrigin nicht erlaubt (Storefront) oder kein Zugriff
403module_not_enabledShop-Modul nicht freigeschaltet (Sync + Storefront)
404not_foundRessource nicht gefunden
429rate_limitedRate Limit überschritten
500internal_errorInterner Serverfehler

Booking API — Übersicht

Die Booking API ermöglicht Kalender-Verwaltung und Terminarten-Einbindung über denselben sk_live_-Key wie Funnels und Shop. Im Gegensatz zum Shop ist sie user-scoped — der Key gehört zum Calentix-Konto, nicht zu einer WordPress-Site.

Modul-Gate

Alle Endpoints außer GET /booking/me erfordern das aktive Modul kalender_personal. Sonst 403 module_not_enabled.

Kalender verbinden

OAuth (Google, Microsoft, Zoom) über Connect-URL + Sync, oder CalDAV (iCloud, Nextcloud, Fastmail, Synology) über Discover + Save.

Terminarten einbetten

Terminarten werden im Calentix-Dashboard angelegt. Die API liefert booking_url für iframes oder den WordPress-Shortcode [calentix_booking slug="…"].

Beispiele
# Profil & Kalender (WordPress-Plugin)
curl -X GET https://calentix.app/api/v1/booking/me \
  -H "Authorization: Bearer sk_live_..."

curl -X GET https://calentix.app/api/v1/booking/calendars \
  -H "Authorization: Bearer sk_live_..."

Shop API — Übersicht

Das Calentix Shop-Modul stellt drei Ebenen bereit: Katalog-Sync fürs WordPress-Backend, Echtzeit-Webhooks für CPT-Updates und eine headless Storefront für Warenkorb & Checkout im Browser.

Modul-Gate

Sync API: Alle Endpoints außer GET /shop/me erfordern das aktive Modul shop. Storefront API: alle Endpoints unter /api/shop/{storeSlug}/* prüfen dasselbe Modul am Store-Besitzer. Sonst 403 module_not_enabled.

1. Sync API — /api/v1/shop/*

Authentifizierung per API-Key. Produkte und Kategorien werden site-scoped geliefert — nur was in Calentix für diese WordPress-Site veröffentlicht ist. Pairing registriert neue Sites.

2. Shop Webhooks — Calentix → WordPress

HMAC-signierte POST-Requests an die beim Pairing hinterlegte webhook_url. Events wie shop.product.updated triggern CPT-Sync im Plugin.

3. Storefront API — /api/shop/{storeSlug}/*

Für Browser-Requests vom WordPress-Frontend. Erfordert ?site_key=... und einen erlaubten Origin (registrierte Domain). Checkout validiert Preise serverseitig und liefert Stripe/PayPal-Tokens zurück. Erfordert das aktive Modul shop am Store-Besitzer.

Beispiele
# Sync: Produkte für WordPress abrufen
curl -X GET "https://calentix.app/api/v1/shop/products?site_key=site_abc123" \
  -H "Authorization: Bearer sk_live_..."

# Storefront: Checkout aus dem Browser (Origin-Header wird geprüft)
curl -X POST "https://calentix.app/api/shop/acme-shop/checkout?site_key=site_abc123" \
  -H "Content-Type: application/json" \
  -H "Origin: https://shop.example.com" \
  -d '{"customerEmail":"kunde@beispiel.de","lineItems":[{"productId":"...","quantity":1}]}'
GET/api/v1/funnels

Funnels auflisten

Gibt alle Funnels des authentifizierten Benutzers zurück, inklusive Submission-Count.

Response 200
{
  "data": [
    {
      "id": "550e8400-e29b-41d4-a716-446655440000",
      "name": "Kontaktformular",
      "slug": "kontaktformular",
      "status": "published",
      "description": "Unser Hauptformular",
      "submission_count": 142,
      "created_at": "2026-03-15T10:30:00.000Z",
      "updated_at": "2026-03-28T14:22:00.000Z"
    }
  ]
}
GET/api/v1/funnels/{funnelId}

Funnel abrufen

Gibt einen einzelnen Funnel mit allen Seiten und Feldern zurück.

Pfad-Parameter

funnelIduuidPflicht

Die ID des Funnels

Response 200
{
  "data": {
    "id": "550e8400-e29b-41d4-a716-446655440000",
    "name": "Kontaktformular",
    "slug": "kontaktformular",
    "status": "published",
    "description": null,
    "created_at": "2026-03-15T10:30:00.000Z",
    "updated_at": "2026-03-28T14:22:00.000Z",
    "pages": [
      {
        "id": "...",
        "title": "Kontaktdaten",
        "page_type": "form",
        "page_order": 0,
        "fields": [
          {
            "id": "...",
            "label": "Name",
            "field_type": "text",
            "is_required": true,
            "field_order": 0
          },
          {
            "id": "...",
            "label": "Email",
            "field_type": "email",
            "is_required": true,
            "field_order": 1
          }
        ]
      }
    ]
  }
}
GET/api/v1/funnels/{funnelId}/submissions

Submissions auflisten

Gibt alle Submissions eines Funnels als paginierte Liste zurück. Antworten werden als flaches Key-Value-Objekt (Label → Wert) geliefert.

Pfad-Parameter

funnelIduuidPflicht

Die ID des Funnels

Query-Parameter

limitinteger

Maximale Anzahl (1–100, Default: 25)

offsetinteger

Offset für Pagination (Default: 0)

sinceISO 8601

Nur Submissions nach diesem Zeitpunkt

Response 200
{
  "data": [
    {
      "id": "...",
      "funnel_id": "...",
      "submitted_at": "2026-04-01T12:00:00.000Z",
      "source": "funnel",
      "source_label": null,
      "answers": {
        "Name": "Max Mustermann",
        "Email": "max@beispiel.de",
        "Telefon": "+49 170 1234567"
      },
      "metadata": {}
    }
  ],
  "pagination": {
    "total": 142,
    "limit": 25,
    "offset": 0
  }
}
GET/api/v1/funnels/{funnelId}/submissions/{submissionId}

Submission abrufen

Gibt eine einzelne Submission mit allen Antworten zurück.

Pfad-Parameter

funnelIduuidPflicht

Die ID des Funnels

submissionIduuidPflicht

Die ID der Submission

Response 200
{
  "data": {
    "id": "...",
    "funnel_id": "...",
    "funnel_name": "Kontaktformular",
    "submitted_at": "2026-04-01T12:00:00.000Z",
    "source": "funnel",
    "source_label": null,
    "answers": {
      "Name": "Max Mustermann",
      "Email": "max@beispiel.de",
      "Telefon": "+49 170 1234567"
    },
    "metadata": {}
  }
}
POST/api/v1/funnels/{funnelId}/leads

Lead erstellen

Erstellt einen neuen Lead (Submission) im Funnel. Die Antworten werden als Key-Value-Objekt übergeben.

Pfad-Parameter

funnelIduuidPflicht

Die ID des Funnels

Request Body

answersobjectPflicht

Key-Value-Objekt mit den Lead-Daten, z.B. {"Name": "Max", "Email": "max@beispiel.de"}

source_labelstring

Quellen-Label, z.B. "Zapier Import" (Default: "API")

metadataobject

Optionale Metadaten

Request
{
  "answers": {
    "Name": "Max Mustermann",
    "Email": "max@beispiel.de",
    "Telefon": "+49 170 1234567"
  },
  "source_label": "Zapier"
}
Response 201
{
  "data": {
    "id": "...",
    "funnel_id": "...",
    "funnel_name": "Kontaktformular",
    "submitted_at": "2026-04-01T12:00:00.000Z",
    "source": "api",
    "source_label": "Zapier",
    "answers": {
      "Name": "Max Mustermann",
      "Email": "max@beispiel.de",
      "Telefon": "+49 170 1234567"
    }
  }
}
POST/api/v1/webhooks/subscribe

Webhook-Subscription erstellen

Registriert eine Callback-URL, die bei jedem neuen Event (z.B. neue Submission) per POST benachrichtigt wird. Wird von Zapier und Make.com automatisch aufgerufen.

Request Body

target_urlstring (URL)Pflicht

Die URL, an die Events gesendet werden

funnel_iduuidPflicht

Die ID des Funnels

eventstringPflicht

Event-Typ. Aktuell verfügbar: "submission.created"

Request
{
  "target_url": "https://hooks.zapier.com/hooks/catch/123/abc",
  "funnel_id": "550e8400-e29b-41d4-a716-446655440000",
  "event": "submission.created"
}
Response 201
{
  "data": {
    "id": "...",
    "funnel_id": "550e8400-e29b-41d4-a716-446655440000",
    "target_url": "https://hooks.zapier.com/hooks/catch/123/abc",
    "event": "submission.created"
  }
}
DELETE/api/v1/webhooks/unsubscribe/{subscriptionId}

Webhook-Subscription löschen

Entfernt eine Webhook-Subscription. Wird von Zapier und Make.com beim Deaktivieren eines Zaps/Szenarios automatisch aufgerufen.

Pfad-Parameter

subscriptionIduuidPflicht

Die ID der Subscription

Response 200
{
  "data": {
    "id": "...",
    "deleted": true
  }
}
GET/api/v1/shop/me

Shop-Profil & Modul-Status

Liefert Modul-Status (`bridge_enabled`) und optional Store/Site-Metadaten. Erfordert nur API-Key — auch wenn das Shop-Modul noch nicht freigeschaltet ist. Optional `site_key` für Site-Infos.

Query-Parameter

site_keystring

Site-Key nach Pairing — liefert dann Site-Metadaten mit

Response 200
{
  "data": {
    "user_id": "...",
    "modules": { "shop": true },
    "bridge_enabled": true,
    "store": { "id": "...", "slug": "acme-shop", "name": "Acme Shop" },
    "site": { "id": "...", "site_key": "site_abc123", "domain": "https://shop.example.com" }
  }
}
GET/api/v1/shop/products

Shop-Produkte auflisten

Gibt alle für die verbundene WordPress-Site veröffentlichten Produkte zurück. Erfordert API-Key (Bearer) und `site_key` als Query-Parameter oder Header `X-Calentix-Site-Key`. Mit `updated_since` nur geänderte Produkte (Delta-Sync für Cron/Webhook-Fallback).

Query-Parameter

site_keystringPflicht

Öffentlicher Site-Key nach dem Pairing (z. B. site_abc123)

updated_sinceISO 8601

Nur Produkte mit updatedAt danach

Response 200
{
  "data": [
    {
      "id": "550e8400-e29b-41d4-a716-446655440001",
      "slug": "mein-produkt",
      "name": "Mein Produkt",
      "description": "Kurzbeschreibung",
      "descriptionHtml": "<p>Ausführliche Beschreibung</p>",
      "coverImageUrl": "https://cdn.example.com/cover.jpg",
      "gallery": [],
      "priceCents": 4990,
      "currency": "EUR",
      "taxRateBps": 1900,
      "categories": [
        { "id": "...", "slug": "zubehoer", "name": "Zubehör" }
      ],
      "isActive": true,
      "updatedAt": "2026-06-21T10:30:00.000Z",
      "seoTitle": "Mein Produkt kaufen",
      "seoDescription": "Meta-Beschreibung für Rank Math",
      "focusKeyword": "mein produkt",
      "siteIds": ["..."]
    }
  ]
}
GET/api/v1/shop/products/{productId}

Einzelnes Shop-Produkt abrufen

Liefert ein Produkt per UUID, sofern es auf der angegebenen Site veröffentlicht ist.

Pfad-Parameter

productIduuidPflicht

Produkt-ID aus Calentix

Query-Parameter

site_keystringPflicht

Site-Key der WordPress-Instanz

Response 200
{
  "data": {
    "id": "550e8400-e29b-41d4-a716-446655440001",
    "slug": "mein-produkt",
    "name": "Mein Produkt",
    "priceCents": 4990,
    "currency": "EUR",
    "siteIds": ["..."]
  }
}
GET/api/v1/shop/categories

Shop-Kategorien auflisten

Kategorien, die mindestens ein auf dieser Site publiziertes Produkt haben. Wird vom WordPress-Plugin für die Taxonomie-Synchronisation genutzt.

Query-Parameter

site_keystringPflicht

Site-Key der verbundenen WordPress-Instanz

Response 200
{
  "data": [
    {
      "id": "...",
      "slug": "zubehoer",
      "name": "Zubehör",
      "description": null,
      "parentId": null,
      "sortOrder": 0,
      "isActive": true
    }
  ]
}
GET/api/v1/shop/store

Store & Site abrufen

Kombinierte Metadaten von Shop-Store und verbundener Site — inkl. Store-Settings (Währung, Zahlungsmethoden).

Query-Parameter

site_keystringPflicht

Site-Key aus dem Pairing

Response 200
{
  "data": {
    "store": {
      "id": "...",
      "slug": "acme-shop",
      "name": "Acme Shop",
      "settings": { "currency": "EUR", "paypalEnabled": true }
    },
    "site": {
      "id": "...",
      "siteKey": "site_abc123",
      "name": "Hauptshop",
      "domain": "https://shop.example.com",
      "lastSyncAt": "2026-06-21T09:00:00.000Z"
    }
  }
}
GET/api/v1/shop/sites/me

Site-Metadaten (Alias)

Leichtgewichtige Site-Infos nach Pairing — praktisch für Verbindungstests im WordPress-Plugin.

Query-Parameter

site_keystringPflicht

Site-Key aus dem Pairing

Response 200
{
  "data": {
    "id": "...",
    "siteKey": "site_abc123",
    "domain": "https://shop.example.com",
    "store": { "slug": "acme-shop", "name": "Acme Shop" }
  }
}
GET/api/v1/shop/orders

Shop-Bestellungen auflisten

Bestellungen, die über diese WordPress-Site ausgelöst wurden (`channel=shop`). Nützlich für Backend-Statusanzeigen oder ERP-Anbindungen.

Query-Parameter

site_keystringPflicht

Site-Key der WordPress-Instanz

Response 200
{
  "data": [
    {
      "id": "...",
      "order_number": "SH-2026-00001",
      "status": "paid",
      "total_cents": 4990,
      "subtotal_cents": 4990,
      "discount_cents": 0,
      "currency": "EUR",
      "customer_email": "kunde@beispiel.de",
      "customer_name": "Max Mustermann",
      "coupon_code": null,
      "payment_provider": "stripe",
      "payment_method_brand": "visa",
      "line_item_count": 1,
      "paid_at": "2026-06-21T11:00:00.000Z",
      "created_at": "2026-06-21T10:58:00.000Z"
    }
  ]
}
GET/api/v1/shop/orders/{orderId}

Shop-Bestellung abrufen

Vollständige Bestellung inkl. Positionen, USt-Aufschlüsselung und Rechnungen/Belege mit signierten Download-URLs für das WordPress-Backend.

Pfad-Parameter

orderIduuidPflicht

Bestell-ID

Query-Parameter

site_keystringPflicht

Site-Key der WordPress-Instanz

Response 200
{
  "data": {
    "order": {
      "id": "...",
      "order_number": "SH-2026-00001",
      "status": "paid",
      "customer_name": "Max Mustermann",
      "total_cents": 4990,
      "currency": "EUR"
    },
    "store_name": "Acme Shop",
    "invoices": [
      {
        "id": "...",
        "number": "RG-ANY-2026-0054",
        "kind": "invoice",
        "subkind": "full",
        "download_url": "https://..."
      }
    ],
    "tax_summary": {
      "net_subtotal_cents": 4193,
      "total_tax_cents": 797,
      "gross_total_cents": 4990
    }
  }
}
POST/api/v1/shop/sites/pair

WordPress-Site koppeln

Wird vom Calentix WordPress-Plugin aufgerufen. Registriert eine neue `shop_site` mit Pairing-Code aus dem Calentix-Dashboard (Shop → WordPress-Sites). Der `store_slug` muss mit dem konfigurierten Store übereinstimmen.

Request Body

store_slugstringPflicht

Slug des Shops aus Calentix → Shop → Einstellungen

pairing_codestringPflicht

6-stelliger Code (gültig ca. 10 Minuten)

namestringPflicht

Anzeigename der Site, z. B. "Hauptshop"

domainstring (URL)Pflicht

Normalisierte Site-URL — wird für CORS/Origin-Check verwendet

webhook_urlstring (URL)Pflicht

WordPress-Webhook-Endpoint für Produkt-Events

Request
{
  "store_slug": "acme-shop",
  "pairing_code": "482913",
  "name": "Hauptshop",
  "domain": "https://shop.example.com",
  "webhook_url": "https://shop.example.com/wp-json/calentix/v1/webhook"
}
Response 200
{
  "data": {
    "site_key": "site_abc123",
    "site_id": "...",
    "webhook_secret": "whsec_...",
    "domain": "https://shop.example.com"
  }
}
GET/api/shop/{storeSlug}/products

Storefront: Produkte

Öffentliche Storefront-API für den Browser (WordPress-Frontend). Kein API-Key — stattdessen `site_key` und Origin-Check gegen die beim Pairing hinterlegte Domain. Erfordert das aktive Modul `shop` am Store-Besitzer. CORS-Header werden gesetzt.

Pfad-Parameter

storeSlugstringPflicht

Store-Slug, z. B. acme-shop

Query-Parameter

site_keystringPflicht

Site-Key der WordPress-Instanz

Response 200
{
  "data": [
    {
      "id": "...",
      "slug": "mein-produkt",
      "name": "Mein Produkt",
      "priceCents": 4990,
      "currency": "EUR"
    }
  ]
}
GET/api/shop/{storeSlug}/products/{productSlug}

Storefront: Produkt per Slug

Einzelnes Produkt für Produktseiten im WordPress-Theme. Gleiche Auth-Regeln wie Storefront-Produktliste.

Pfad-Parameter

storeSlugstringPflicht

Store-Slug

productSlugstringPflicht

Produkt-Slug

Query-Parameter

site_keystringPflicht

Site-Key

Response 200
{
  "data": {
    "id": "...",
    "slug": "mein-produkt",
    "name": "Mein Produkt",
    "priceCents": 4990,
    "currency": "EUR",
    "descriptionHtml": "<p>...</p>"
  }
}
GET/api/shop/{storeSlug}/categories

Storefront: Kategorien

Kategorien für Filter/Navigation im WordPress-Frontend.

Pfad-Parameter

storeSlugstringPflicht

Store-Slug

Query-Parameter

site_keystringPflicht

Site-Key

Response 200
{
  "data": [
    { "id": "...", "slug": "zubehoer", "name": "Zubehör" }
  ]
}
POST/api/shop/{storeSlug}/checkout

Storefront: Checkout (Stripe)

Headless Checkout: Calentix validiert Preise serverseitig, legt eine Shop-Order an und gibt `clientSecret` für Stripe Elements zurück. Zahlung läuft über Stripe Connect des Store-Owners.

Pfad-Parameter

storeSlugstringPflicht

Store-Slug

Query-Parameter

site_keystringPflicht

Site-Key

Request Body

customerEmailstringPflicht

E-Mail des Käufers

customerNamestring

Name

lineItemsarrayPflicht

Array aus { productId, quantity }

couponCodestring

Optionaler Rabattcode

Request
{
  "customerEmail": "kunde@beispiel.de",
  "customerName": "Max Mustermann",
  "lineItems": [
    { "productId": "550e8400-e29b-41d4-a716-446655440001", "quantity": 1 }
  ],
  "couponCode": "SOMMER20"
}
Response 200
{
  "data": {
    "orderId": "...",
    "clientSecret": "pi_..._secret_...",
    "stripeAccountId": "acct_...",
    "publishableKey": "pk_live_...",
    "amount": 4990,
    "currency": "eur"
  }
}
POST/api/shop/{storeSlug}/validate-coupon

Storefront: Coupon prüfen

Live-Validierung eines Rabattcodes im Warenkorb, bevor der Checkout abgeschickt wird. Löst den Coupon nicht ein — das passiert atomar nach erfolgreicher Zahlung.

Pfad-Parameter

storeSlugstringPflicht

Store-Slug

Query-Parameter

site_keystringPflicht

Site-Key

Request Body

codestringPflicht

Gutschein-Code

subtotalCentsintegerPflicht

Aktuelles Warenkorb-Subtotal in Cents

currencystringPflicht

ISO-Währung, z. B. EUR

lineItemsarrayPflicht

Cart-Items für Steuer-/Coupon-Berechnung

Request
{
  "code": "SOMMER20",
  "subtotalCents": 4990,
  "currency": "EUR",
  "lineItems": [
    { "productId": "550e8400-e29b-41d4-a716-446655440001", "quantity": 1 }
  ]
}
Response 200
{
  "data": {
    "code": "SOMMER20",
    "discountCents": 998,
    "discountType": "percent",
    "discountValue": 2000
  }
}
GET/api/shop/{storeSlug}/orders/{orderId}

Storefront: Bestellstatus

Status einer Bestellung nach Checkout — nur für Orders der eigenen Site (site_key + storeSlug).

Pfad-Parameter

storeSlugstringPflicht

Store-Slug

orderIduuidPflicht

Order-ID aus Checkout-Response

Query-Parameter

site_keystringPflicht

Site-Key

Response 200
{
  "data": {
    "id": "...",
    "orderNumber": "SH-2026-00001",
    "status": "paid",
    "totalCents": 4992,
    "currency": "EUR",
    "customerEmail": "kunde@beispiel.de"
  }
}
POST/api/shop/{storeSlug}/paypal/create-order

Storefront: PayPal Order anlegen

Alternative zu Stripe: legt Shop-Order an und erstellt eine PayPal-Order auf dem Konto des Store-Owners. Response enthält `paypalOrderId` für das PayPal JS SDK.

Pfad-Parameter

storeSlugstringPflicht

Store-Slug

Query-Parameter

site_keystringPflicht

Site-Key

Request Body

customerEmailstringPflicht

E-Mail

lineItemsarrayPflicht

Warenkorb-Zeilen

couponCodestring

Optionaler Code

Response 200
{
  "data": {
    "orderId": "...",
    "paypalOrderId": "5O190127TN364715T",
    "totalCents": 4990,
    "currency": "EUR"
  }
}
POST/api/shop/{storeSlug}/paypal/capture-order

Storefront: PayPal Capture

Wird nach PayPal-Approval im Browser aufgerufen. Captured die Zahlung und finalisiert die Calentix-Order (idempotent).

Pfad-Parameter

storeSlugstringPflicht

Store-Slug

Query-Parameter

site_keystringPflicht

Site-Key

Request Body

orderIduuid

Calentix-Order-ID (falls bekannt)

paypalOrderIdstringPflicht

PayPal-Order-ID aus dem SDK

Request
{
  "orderId": "...",
  "paypalOrderId": "5O190127TN364715T"
}
Response 200
{
  "data": {
    "orderId": "...",
    "alreadyPaid": false
  }
}
GET/api/v1/booking/me

Booking-Profil abrufen

Liefert Benutzername, Zeitzone, Buchungs-Subdomain und Modul-Status. Erfordert nur einen gültigen API-Key — auch wenn das Kalender-Modul noch nicht freigeschaltet ist (`bridge_enabled: false`). Alle anderen Booking-Endpoints verlangen `kalender_personal`.

Response 200
{
  "data": {
    "user_id": "...",
    "email": "max@beispiel.de",
    "name": "Max Mustermann",
    "username": "max",
    "timezone": "Europe/Berlin",
    "booking_subdomain": "book",
    "modules": {
      "calendar_personal": true,
      "event_types": true,
      "calendar_external_sync": true
    },
    "bridge_enabled": true
  }
}
GET/api/v1/booking/calendars

Kalender auflisten

Alle verbundenen Kalender des API-Key-Inhabers (ohne interne Video-Provider). Enthält Sync-Gesundheit und Primary-Status.

Response 200
{
  "data": [
    {
      "id": "...",
      "provider": "google-calendar",
      "name": "max@gmail.com",
      "is_primary": true,
      "is_active": true,
      "last_synced_at": "2026-06-21T10:00:00.000Z",
      "health": "ok"
    }
  ]
}
POST/api/v1/booking/calendars/connect

OAuth-Kalender verbinden

Erzeugt eine Nango Connect-URL für Google Kalender, Microsoft Outlook oder Zoom. Nach Abschluss im Popup `POST /calendars/sync` aufrufen.

Request Body

providerstringPflicht

google-calendar | microsoft-calendar | zoom

Request
{ "provider": "google-calendar" }
Response 200
{
  "data": {
    "connect_url": "https://auth.calentix.app/oauth/connect/google-calendar?connect_session_token=...",
    "connection_id": "...-google-calendar",
    "provider": "google-calendar"
  }
}
POST/api/v1/booking/calendars/sync

OAuth-Verbindungen importieren

Importiert neue Nango-Verbindungen nach dem OAuth-Popup und startet initialen Kalender-Sync.

Response 200
{
  "data": {
    "new_connections": 1
  }
}
POST/api/v1/booking/calendars/caldav/discover

CalDAV-Kalender suchen

Validiert CalDAV-Zugangsdaten und listet verfügbare Kalender. Provider: apple-calendar, fastmail, nextcloud, synology, caldav.

Request Body

providerstringPflicht

CalDAV-Provider-Key

usernamestringPflicht

Benutzername oder Apple-ID

passwordstringPflicht

Passwort oder App-Passwort

server_urlstring

Pflicht bei nextcloud, synology, caldav

Response 200
{
  "data": {
    "server_url": "https://caldav.icloud.com",
    "calendars": [
      { "url": "https://...", "display_name": "Privat", "ctag": "..." }
    ]
  }
}
POST/api/v1/booking/calendars/caldav

CalDAV-Kalender speichern

Verbindet einen aus Discover gewählten CalDAV-Kalender dauerhaft.

Request Body

providerstringPflicht

CalDAV-Provider-Key

server_urlstringPflicht

Server-URL aus Discover

usernamestringPflicht

Benutzername

passwordstringPflicht

Passwort

calendar_urlstringPflicht

URL des gewählten Kalenders

calendar_namestringPflicht

Anzeigename

Response 200
{
  "data": {
    "id": "...",
    "provider": "apple-calendar",
    "name": "Privat",
    "is_primary": true
  }
}
PATCH/api/v1/booking/calendars/{calendarId}

Kalender aktualisieren

Primary-Kalender setzen oder Kalender aktivieren/deaktivieren.

Pfad-Parameter

calendarIduuidPflicht

Kalender-ID

Request Body

is_primaryboolean

Als Primärkalender markieren

is_activeboolean

Aktiv/Inaktiv schalten

Request
{ "is_primary": true }
Response 200
{ "data": { "updated": true } }
DELETE/api/v1/booking/calendars/{calendarId}

Kalender trennen

Entfernt Kalender-Verbindung inkl. Nango/Watch-Cleanup.

Pfad-Parameter

calendarIduuidPflicht

Kalender-ID

Response 200
{ "data": { "deleted": true } }
GET/api/v1/booking/event-types

Terminarten auflisten

Alle sichtbaren Terminarten mit Buchungs-URLs für WordPress-Embeds.

Response 200
{
  "data": [
    {
      "id": "...",
      "slug": "beratung",
      "title": "Beratungsgespräch",
      "duration_minutes": 30,
      "location_type": "video",
      "is_active": true,
      "booking_url": "https://book.calentix.app/max/beratung"
    }
  ]
}
GET/api/v1/booking/event-types/{slug}

Einzelne Terminart abrufen

Terminart per Slug oder UUID — inkl. Puffer, Vorlauf und booking_url.

Pfad-Parameter

slugstringPflicht

Slug oder UUID

Response 200
{
  "data": {
    "id": "...",
    "slug": "beratung",
    "title": "Beratungsgespräch",
    "duration_minutes": 30,
    "booking_url": "https://book.calentix.app/max/beratung"
  }
}

Webhook-Payloads

Wenn du eine Webhook-Subscription registriert hast, sendet Calentix bei jedem neuen Event einen POST Request mit folgendem Payload an deine target_url:

submission.createdNeue Submission

POST an deine target_url
{
  "id": "550e8400-e29b-41d4-a716-446655440000",
  "event": "submission.created",
  "funnel_id": "...",
  "funnel_name": "Kontaktformular",
  "submitted_at": "2026-04-01T12:00:00.000Z",
  "source": "funnel",
  "answers": {
    "Name": "Max Mustermann",
    "Email": "max@beispiel.de"
  },
  "metadata": {}
}

Timeout: 10 Sekunden. Stell sicher, dass dein Endpoint innerhalb dieser Zeit antwortet.

Retries: Aktuell kein automatisches Retry. Fehlgeschlagene Deliveries werden geloggt.

Content-Type: Alle Payloads werden als application/json gesendet.

Shop Webhooks

Calentix sendet bei Katalog-Änderungen signierte POST-Requests an die Webhook-URL deiner WordPress-Site (beim Pairing hinterlegt). Das Plugin verarbeitet nur Events, deren siteIds die eigene Site enthalten.

shop.product.published
shop.product.updated
shop.product.unpublished
shop.product.deleted
shop.category.created
shop.category.updated
shop.category.deleted

shop.product.updatedProdukt geändert

POST an deine webhook_url
{
  "event": "shop.product.updated",
  "data": {
    "id": "550e8400-e29b-41d4-a716-446655440001",
    "slug": "mein-produkt",
    "name": "Mein Produkt",
    "priceCents": 4990,
    "currency": "EUR",
    "updatedAt": "2026-06-21T10:30:00.000Z",
    "siteIds": ["..."]
  },
  "siteIds": ["..."]
}

Header: Calentix-Signature (HMAC-SHA256, Format t=...,v0=...), Calentix-Event, X-Calentix-Site-Key

Secret: Wird beim Pairing als webhook_secret zurückgegeben und im Plugin gespeichert.

Integrationsbeispiele

Zapier

  1. API-Key unter Konto → API & Integrationen erstellen
  2. In Zapier: "Webhooks by Zapier" als Trigger wählen
  3. Oder: REST Hook Trigger mit Subscribe/Unsubscribe URL
  4. API-Key als Bearer Token im Auth-Header setzen

Make.com

  1. API-Key in Calentix erstellen
  2. In Make: HTTP-Modul oder Custom App nutzen
  3. Base URL: https://calentix.app/api/v1
  4. API-Key als Bearer Token im Auth-Header setzen

WordPress (Calentix Plugin)

  1. Plugin installieren → Tab Verbindung
  2. API-Key, Store-Slug und Pairing-Code eintragen
  3. Produkte werden per Sync API + Webhooks gespiegelt
  4. Checkout über Storefront API (Stripe/PayPal)