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.