Développeurs

Vos données vous appartiennent. Lisez-les et modifiez-les via l'API GraphQL, et recevez un webhook signé dès qu'il se passe quelque chose.

Jetons d'API

Créez un jeton dans le Panneau de configuration, sous Données et intégrations, et choisissez ce qu'il peut lire ou modifier. Envoyez-le comme jeton Bearer au point d'accès /graphql de votre entreprise. Le schéma complet est disponible à /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 } } } }"}'

Portées

Un jeton porte les portées que vous choisissez. Les rapports et les réglages sont en lecture seule ; chaque autre domaine a une portée de lecture et une d'écriture. Le rôle de la personne qui a créé le jeton limite toujours ce qu'il peut atteindre.

  • 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

Chaque envoi comporte un en-tête Appointier-Signature avec un horodatage et un HMAC-SHA256 de l'horodatage et du corps brut, calculé avec le secret de votre point d'accès. Rejetez tout ce qui date de plus de cinq minutes.

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));
}

Événements

  • 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

Un envoi échoué est retenté après 1 minute, 5 minutes, 30 minutes, 2 heures et 12 heures. Après 10 échecs consécutifs, le point de terminaison est suspendu et le propriétaire reçoit un e-mail. Tout envoi peut être rejoué depuis le journal.

Export complet

Les propriétaires peuvent demander un ZIP avec chaque table en CSV et JSON Lines, plus les photos, formulaires signés, PDF de notes et un manifeste avec le nombre de lignes. Le lien arrive par e-mail et reste valable 24 heures.

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

Le même ZIP peut être livré chaque jour ou chaque semaine vers un bucket Amazon S3, un stockage compatible S3 ou un hôte SFTP.

Limites de débit

Chaque jeton peut effectuer 600 requêtes par minute, et chaque réponse comporte X-RateLimit-Limit et X-RateLimit-Remaining.