Développeurs

API Hello Veyora

Disponible avec la formule Business. Créez vos clés dans Intégrations ; chaque clé n’accède qu’aux données de votre entreprise et seulement avec les permissions que vous lui donnez.

Authentification

Authorization: Bearer vey_VOTRE_CLE
  • 401 — clé absente, invalide, révoquée, ou formule Business inactive.
  • 403 — la clé n’a pas la permission requise.
  • 400 — données envoyées invalides (le détail est dans la réponse).
GET
/api/public/v1/contacts
contacts:read

Lister les contacts

Renvoie les contacts du CRM de votre entreprise, du plus récent au plus ancien.

  • limit — 1 à 200 (défaut 50)
curl -X GET "https://helloveyora.com/api/public/v1/contacts?limit=10" \
  -H "Authorization: Bearer vey_VOTRE_CLE"

Réponse

{
  "data": [
    { "id": "…", "first_name": "Marie", "last_name": "Durand", "email": "marie@exemple.fr", "phone": null,
      "company_name": "Exemple SARL", "kind": "prospect", "status": "nouveau", "created_at": "…", "updated_at": "…" }
  ]
}

Essayer

POST
/api/public/v1/contacts
contacts:write

Créer un contact

Ajoute un contact au CRM. Prénom ou nom obligatoire ; kind vaut prospect, client ou contact.

curl -X POST "https://helloveyora.com/api/public/v1/contacts" \
  -H "Authorization: Bearer vey_VOTRE_CLE" \
  -H "Content-Type: application/json" \
  -d '{ "first_name": "Marie", "last_name": "Durand", "email": "marie@exemple.fr", "company_name": "Exemple SARL", "kind": "prospect" }'

Réponse

{ "data": { "id": "…", "first_name": "Marie", "…": "…" } }   // 201 Created

Essayer

Attention : cette requête crée un vrai contact dans votre CRM.

GET
/api/public/v1/documents
documents:read

Lister devis et factures

Lecture seule. Filtrez par type avec kind.

  • limit — 1 à 200 (défaut 50)
  • kind — type de document (ex. facture, devis)
curl -X GET "https://helloveyora.com/api/public/v1/documents?limit=10" \
  -H "Authorization: Bearer vey_VOTRE_CLE"

Réponse

{
  "data": [
    { "id": "…", "kind": "facture", "number": "F-2026-001", "customer_name": "Exemple SARL", "issue_date": "2026-10-01",
      "due_date": "2026-10-31", "total_ht": 100, "total_tva": 20, "total_ttc": 120, "amount_paid": 0, "currency": "EUR", "status": "…" }
  ]
}

Essayer

Webhooks sortants

Événements : contact.created, document.created. Chaque envoi est un POST JSON avec les en-têtes X-Veyora-Event et X-Veyora-Signature: sha256=… (HMAC SHA-256 du corps brut avec la clé de signature du webhook). Répondez par un code 2xx ; sinon l’envoi est noté « Échec » dans le journal et peut être relancé.

{
  "event": "contact.created",
  "created_at": "2026-10-01T12:00:00Z",
  "data": { "id": "…", "first_name": "Marie", "last_name": "Durand", "email": "marie@exemple.fr", "kind": "prospect", "status": "nouveau" }
}

Vérifier la signature (Node.js) :

import { createHmac, timingSafeEqual } from "node:crypto";

const raw = await request.text();
const expected = "sha256=" + createHmac("sha256", process.env.VEYORA_WEBHOOK_SECRET).update(raw).digest("hex");
const given = request.headers.get("x-veyora-signature") ?? "";
const valid = given.length === expected.length && timingSafeEqual(Buffer.from(given), Buffer.from(expected));