Desarrolladores

Sus datos son suyos. Léalos y modifíquelos a través de la API GraphQL, y reciba un webhook firmado cuando ocurra algo.

Tokens de API

Cree un token en el Panel de control, en Datos e integraciones, y elija qué puede leer o modificar. Envíelo como token Bearer al endpoint /graphql de su negocio. El esquema completo está en /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 } } } }"}'

Permisos

Un token lleva los permisos que elijas. Los informes y los ajustes son de solo lectura; cada una de las demás áreas tiene un permiso de lectura y otro de escritura. El rol de la persona que creó el token sigue limitando lo que puede alcanzar.

  • 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

Cada entrega incluye una cabecera Appointier-Signature con una marca de tiempo y un HMAC-SHA256 de la marca de tiempo y el cuerpo sin procesar, calculado con el secreto de su endpoint. Rechace todo lo que tenga más de cinco minutos.

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

Eventos

  • 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

Una entrega fallida se reintenta al cabo de 1 minuto, 5 minutos, 30 minutos, 2 horas y 12 horas. Tras 10 fallos consecutivos, el endpoint se pausa y el propietario recibe un email. Cualquier entrega puede reenviarse desde el registro.

Exportación completa

Los propietarios pueden pedir un ZIP con todas las tablas en CSV y JSON Lines, además de fotos, formularios firmados, notas en PDF y un manifiesto con el número de filas. El enlace llega por email y funciona 24 horas.

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

El mismo ZIP puede entregarse cada día o cada semana en un bucket de Amazon S3, un almacén compatible con S3 o un servidor SFTP.

Límites de uso

Cada token puede hacer 600 solicitudes por minuto, y cada respuesta incluye X-RateLimit-Limit y X-RateLimit-Remaining.