Entwickler

Ihre Daten gehören Ihnen. Lesen und ändern Sie sie über die GraphQL-API und erhalten Sie einen signierten Webhook, sobald etwas passiert.

API-Tokens

Erstellen Sie im Kontrollzentrum unter Daten & Integrationen ein Token und legen Sie fest, was es lesen oder ändern darf. Senden Sie es als Bearer-Token an den /graphql-Endpunkt Ihres Unternehmens. Das vollständige Schema finden Sie unter /graphql/schema.

curl https://your-business.appointier.com/graphql \
  -H "Authorization: Bearer $APPOINTIER_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"query":"{ customers(first: 5) { edges { node { firstName lastName email } } } }"}'

Scopes

Ein Token trägt die Scopes, die Sie wählen. Berichte und Einstellungen sind nur lesbar, jeder andere Bereich hat einen Lese- und einen Schreib-Scope. Die Rolle der Person, die das Token erstellt hat, begrenzt weiterhin, worauf es zugreifen kann.

  • read
  • write
  • customers.read
  • customers.write
  • appointments.read
  • appointments.write
  • catalog.read
  • catalog.write
  • packages.read
  • packages.write
  • sales.read
  • sales.write
  • invoices.read
  • invoices.write
  • reports.read
  • settings.read

Webhooks

Jede Zustellung enthält einen Appointier-Signature-Header mit einem Zeitstempel und einem HMAC-SHA256 aus Zeitstempel und unverändertem Body, berechnet mit dem Secret Ihres Endpunkts. Weisen Sie alles ab, was älter als fünf Minuten ist.

import crypto from "node:crypto";

export function verify(body, header, secret, toleranceSeconds = 300) {
  const parts = Object.fromEntries(header.split(",").map((part) => part.split("=")));
  const age = Math.abs(Date.now() / 1000 - Number(parts.t));
  if (age > toleranceSeconds) return false;

  const expected = crypto
    .createHmac("sha256", secret)
    .update(`${parts.t}.${body}`)
    .digest("hex");

  return crypto.timingSafeEqual(Buffer.from(expected), Buffer.from(parts.v1));
}

Ereignisse

  • appointment.created
  • appointment.updated
  • appointment.canceled
  • appointment.completed
  • appointment.no_show
  • customer.created
  • customer.updated
  • sale.completed
  • sale.voided
  • package.sold
  • package.redeemed
  • package.reversed
  • invoice.paid

Eine fehlgeschlagene Zustellung wird nach 1 Minute, 5 Minuten, 30 Minuten, 2 Stunden und 12 Stunden wiederholt. Nach 10 Fehlschlägen in Folge wird der Endpunkt pausiert, und der Inhaber erhält eine E-Mail. Jede Zustellung lässt sich aus dem Protokoll erneut senden.

Vollständiger Export

Inhaber können eine ZIP-Datei anfordern, die jede Tabelle als CSV und JSON Lines enthält, dazu Fotos, unterschriebene Formulare, Notiz-PDFs und ein Manifest mit Zeilenzahlen. Der Link kommt per E-Mail und gilt 24 Stunden.

  • customers
  • appointments
  • catalog
  • staff
  • locations
  • packages
  • memberships
  • gift_cards
  • forms
  • notes
  • products
  • sales
  • invoices
  • payments
  • notifications
  • audits

Dieselbe ZIP-Datei kann jeden Tag oder jede Woche an einen Amazon S3 Bucket, einen S3-kompatiblen Speicher oder einen SFTP-Host geliefert werden.

Ratenlimits

Jedes Token kann 600 Anfragen pro Minute stellen, und jede Antwort enthält X-RateLimit-Limit und X-RateLimit-Remaining.