Weesify
Développeurs

L’API Weesify

Créez des liens et des codes QR, gardez vos contacts synchronisés et consultez vos pages bio, formulaires, commandes, cours, réservations, événements et statistiques depuis votre propre code. JSON via HTTPS, version 1.

Jetons à portée limitée

Lecture ou écriture, par ressource. Un jeton ne peut jamais faire plus que la personne qui l’a créé.

Des limites claires

Limites de débit par jeton et par forfait, indiquées dans les en-têtes de chaque réponse.

Webhooks signés

HMAC-SHA256 avec horodatage, nouvelles tentatives avec temporisation progressive et journal des envois à partir duquel vous pouvez renvoyer.

OpenAPI 3.1

Un seul document, généré à partir de la même source que cette page. Importez-le dans n’importe quel client.

Authentification

Créez un jeton dans votre espace de travail sous Paramètres → Développeurs (propriétaires et administrateurs). Il n’est affiché qu’une fois : conservez-le dans les secrets de votre serveur, jamais dans une page web ou une application téléchargeable. Envoyez-le dans l’en-tête Authorization :

curl https://weesify.com/api/v1/workspace \
  -H "Authorization: Bearer wsy_your_token"

Un jeton appartient à un seul espace de travail. À chaque appel, il ne peut faire que ce que ses portées autorisent et ce que la personne qui l’a créé peut encore faire : si elle part ou change de rôle, le jeton suit. Révoquez un jeton à tout moment ; il cesse immédiatement de fonctionner.

Vous venez de l’ancienne API Weesify ? Votre ancienne clé API continue de fonctionner ici, comme jeton bearer, pendant 90 jours après la migration, avec la même portée que l’ancienne API. Créez un nouveau jeton d’ici là ; Paramètres → Développeurs indique quand votre ancienne clé expire.

Démarrage rapide

Tout client HTTP convient. Trois appels couvrent l’essentiel : lire, créer en toute sécurité et vérifier votre quota.

# 1. Vos liens les plus récents
curl "https://weesify.com/api/v1/links?limit=5" \
  -H "Authorization: Bearer $WEESIFY_TOKEN"

# 2. En créer un (une nouvelle tentative avec la même clé n’en crée jamais deux)
curl -X POST https://weesify.com/api/v1/links \
  -H "Authorization: Bearer $WEESIFY_TOKEN" \
  -H "Content-Type: application/json" \
  -H "Idempotency-Key: signup-2026-1042" \
  -d '{"destination_url": "https://example.com/offer"}'

# 3. Consulter les en-têtes de limite de débit
curl -i https://weesify.com/api/v1/workspace -H "Authorization: Bearer $WEESIFY_TOKEN"

Chaque réponse est en JSON. Un élément est renvoyé sous la forme {"data": {…}} ; une liste sous la forme {"data": […], "meta": {…}}.

Portées

PortéePermet au jeton de
links:readLiens courts et leur nombre de clics
links:writeCréer, modifier et supprimer des liens courts
qr:readCodes QR et leurs scans
qr:writeCréer, modifier et supprimer des codes QR
contacts:readLes contacts, leurs tags et informations
contacts:writeAjouter, mettre à jour, étiqueter et supprimer des contacts
forms:readLes formulaires et ce que les gens ont envoyé
store:readProduits et commandes (avec les informations des acheteurs)
sites:readYour pages, HTML websites, their files, deployments, domains and usage
sites:writeCreate HTML websites, upload and change files, settings and custom domains
sites:deployPublish HTML websites and roll them back
analytics:readClics et vues dans le temps
events:readÉvénements, dates, types de billets, programme, intervenants, sponsors, exposants et lieux
events:writeCréer et modifier des événements et les faire avancer dans leur cycle de vie
events:attendeesInscriptions, participants, billets et commandes de billets (avec les informations des personnes)
events:checkinScanner les billets et consulter les enregistrements
bookings:readBookable services and bookings (with people’s details)
courses:readCourses and their students’ enrolments and progress
webhooks:readWebhook endpoints and their delivery log
webhooks:writeAdd, change, test and remove webhook endpoints, and send deliveries again
blog:readBlog posts (drafts included) and categories

Requêtes et pages

  • Envoyez des corps JSON avec Content-Type: application/json. Les heures sont au format ISO 8601 en UTC. Les identifiants sont des chaînes de 26 caractères.
  • Les listes sont triées de la plus récente à la plus ancienne, comme {"data": [...], "meta": {"limit": 25, "next_cursor": "…"}}. Passez ?cursor= pour obtenir la page suivante et ?limit= (1–100, 25 par défaut).
  • Les montants sont exprimés dans la plus petite unité (centimes) avec leur devise.

Erreurs

Les erreurs suivent la RFC 7807 (application/problem+json). Les erreurs de validation listent chaque champ sous errors.

{
  "type": "https://weesify.com/developers#errors",
  "title": "Invalid request",
  "status": 422,
  "detail": "Some fields need attention.",
  "errors": { "destination_url": ["Enter a web address."] }
}
StatutMoyens
401Aucun jeton, ou jeton incorrect, expiré ou révoqué
402L’espace de travail est en lecture seule tant qu’aucun forfait n’est choisi, ou lorsqu’une limite du forfait est atteinte
403Le jeton n’a pas la portée requise, la personne qui l’a créé n’a pas le droit de le faire, ou l’accès à l’API n’est pas inclus dans le forfait
404Introuvable dans cet espace de travail, ou cette fonctionnalité est désactivée
400L’Idempotency-Key n’est pas au bon format
409La même clé Idempotency-Key est encore en cours de traitement, ou a été utilisée pour une requête différente
422Quelque chose ne va pas dans la requête
429Trop de requêtes : attendez Retry-After secondes

Limites de requêtes

Chaque jeton peut effectuer 120 requêtes par minute et chaque espace de travail 600, comptées par fenêtres d’une minute. Les forfaits Enterprise et Custom en autorisent davantage. Au-delà de la limite, vous recevez une réponse 429 avec Retry-After : patientez ce nombre de secondes, puis réessayez.

En-têteMoyens
X-RateLimit-LimitRequests a minute this token may make
X-RateLimit-RemainingRequests left this minute
X-RateLimit-ResetUnix time when the minute resets
RateLimitIETF form: limit, remaining, reset (seconds)
RateLimit-PolicyThe policy, e.g. 120;w=60
X-Request-IdThis request’s id, as shown in your request log

Le journal des requêtes de votre espace de travail et votre consommation par rapport à votre forfait se trouvent dans Paramètres → Développeurs → Utilisation et journaux, avec correspondance par X-Request-Id.

Nouvelles tentatives

Envoyez un en-tête Idempotency-Key (1 à 80 lettres, chiffres, tirets, points, deux-points ou tirets bas) avec une requête POST. Si le réseau coupe et que vous réessayez avec la même clé, le même chemin et le même corps dans les 24 heures, vous obtenez à nouveau la réponse d’origine (marquée Idempotent-Replayed: true) et rien n’est exécuté deux fois. Les clés appartiennent au jeton qui les a envoyées. La même clé avec un autre chemin ou un autre corps renvoie une 409.

Weesify CLI

Déployez un dossier vers un site web HTML depuis votre ordinateur ou votre CI, récupérez-le, comparez et revenez en arrière. Un seul fichier Node.js 18+ sans paquets : téléchargez-le et lancez-le.

curl -fsSLo weesify.mjs https://weesify.com/developers/cli/weesify.mjs && node weesify.mjs login
node weesify.mjs init
node weesify.mjs deploy -m "Première version"

SHA-256 du fichier actuel : e98494277685934e20bdfb05c7f9fe5087db5db66d80b2365a4d3f74ed51c8af

Installation sur macOS, Linux ou Windows, toutes les commandes, CI et codes de sortie →

Webhooks

Ajoutez un point de terminaison dans Paramètres → Développeurs → Webhooks (ou avec POST /webhooks) et choisissez des événements. Weesify y envoie du JSON en POST au fil des événements, retente les échecs 6 fois sur environ 21 heures et conserve un journal des envois de 30 jours à partir duquel vous pouvez renvoyer. Après 5 événements consécutifs impossibles à livrer, le point de terminaison est désactivé et les administrateurs de l’espace de travail en sont informés. Répondez avec n’importe quel code 2xx en moins de 5 secondes ; les redirections ne sont pas suivies.

{
  "id": "evt_01j…",
  "event": "order.paid",
  "created_at": "2026-10-31T09:30:00+00:00",
  "workspace": { "id": "01j…" },
  "data": {
    "contact": { "id": "01j…", "email": "ada@example.com", "name": "Ada", "subscribed": true, "tags": [] },
    "details": { "order": "W-1042", "product": "Preset pack" }
  }
}

Vérifiez la signature. L’en-tête X-Weesify-Signature est au format t=<unix time>,v1=<hex>. Calculez le HMAC-SHA256 de t + "." + raw body avec le secret de signature de votre endpoint et comparez-le (en temps constant) avec chaque v1 : pendant un jour après la rotation du secret, il y en a deux. Rejetez tout ce qui date de plus de cinq minutes. L’id de l’événement reste le même lors des nouvelles tentatives, vous pouvez donc ignorer les doublons.

// PHP
$body = file_get_contents('php://input');
parse_str(str_replace(',', '&', $_SERVER['HTTP_X_WEESIFY_SIGNATURE']), $sig);
$expected = hash_hmac('sha256', $sig['t'].'.'.$body, getenv('WEESIFY_WEBHOOK_SECRET'));
if (abs(time() - (int) $sig['t']) > 300 || ! hash_equals($expected, $sig['v1'] ?? '')) {
    http_response_code(400); exit;
}
ÉvénementQuand
contact.createdNouveau contact
contact.updatedCoordonnées modifiées
contact.subscribedAbonné
contact.unsubscribedDésabonné
contact.taggedTag ajouté
contact.untaggedTag retiré
contact.stage_changedÉtape modifiée
form.submittedFormulaire rempli
order.paidCommande payée
order.refundedCommande remboursée
booking.createdNouvelle réservation
booking.cancelledRéservation annulée
course.enrolledÉlève inscrit
course.completedCours terminé
community.joinedA rejoint une communauté
event.createdÉvénement créé
event.publishedÉvénement publié
event.updatedDétails de l’événement modifiés
event.cancelledÉvénement annulé
event.postponedÉvénement reporté
event.completedÉvénement terminé
registration.createdInscription commencée
registration.confirmedInscription confirmée
registration.cancelledInscription annulée
ticket.purchasedBillet acheté
payment.completedPaiement du billet effectué
payment.failedÉchec du paiement du billet
ticket.refundedBillet remboursé
attendee.checked_inParticipant enregistré
session.attendedSession suivie
waitlist.joinedInscrit sur une liste d’attente
feedback.submittedAvis envoyé
post.publishedPost published
post.failedPost failed to publish
site.deployedWebsite published
site.deploy_failedWebsite failed to publish

Espace de travail 1 endpoint

GET/workspaceThe workspace this token belongs to, and the token’s scopes

The workspace this token belongs to, and the token’s scopes.

curl -X GET https://weesify.com/api/v1/workspace \
  -H "Authorization: Bearer wsy_…"

Codes QR 5 endpoints

GET/qr-codesList QR codes

List QR codes. Scope : qr:read.

Requête
campaignOnly this campaign
curl -X GET https://weesify.com/api/v1/qr-codes \
  -H "Authorization: Bearer wsy_…"
POST/qr-codesCreate a QR code

Create a QR code. Scope : qr:write.

Corps
name *
typedynamic (default), url, text, email, phone, sms, wifi, vcard…
target{type: short_link|site, id} for dynamic codes
payloadContent for static types, e.g. {url}
campaign
placementWhere it’s printed
curl -X POST https://weesify.com/api/v1/qr-codes \
  -H "Authorization: Bearer wsy_…" \
  -H "Content-Type: application/json" \
  -d '{"name":"\u2026"}'
GET/qr-codes/{id}One QR code, with SVG and PNG download links

One QR code, with SVG and PNG download links. Scope : qr:read.

curl -X GET https://weesify.com/api/v1/qr-codes/01j… \
  -H "Authorization: Bearer wsy_…"
PATCH/qr-codes/{id}Change a QR code

Change a QR code. Scope : qr:write.

Corps
name
target
campaign
placement
curl -X PATCH https://weesify.com/api/v1/qr-codes/01j… \
  -H "Authorization: Bearer wsy_…" \
  -H "Content-Type: application/json" \
  -d '{"name":"\u2026"}'
DELETE/qr-codes/{id}Delete a QR code

Delete a QR code. Scope : qr:write.

curl -X DELETE https://weesify.com/api/v1/qr-codes/01j… \
  -H "Authorization: Bearer wsy_…"

Contacts 8 endpoints

GET/contactsList contacts

List contacts. Scope : contacts:read.

Requête
emailExact address
tagA tag id
updated_sinceISO 8601
curl -X GET https://weesify.com/api/v1/contacts \
  -H "Authorization: Bearer wsy_…"
POST/contactsAdd a contact

Add a contact. Scope : contacts:write.

Corps
email *
name
phone
company
stagesubscriber, lead, customer, student, member
subscribedtrue only with the person’s consent (it is recorded)
tagsTag names
fieldsCustom fields by key
curl -X POST https://weesify.com/api/v1/contacts \
  -H "Authorization: Bearer wsy_…" \
  -H "Content-Type: application/json" \
  -d '{"email":"\u2026"}'
GET/contacts/{id}One contact

One contact. Scope : contacts:read.

curl -X GET https://weesify.com/api/v1/contacts/01j… \
  -H "Authorization: Bearer wsy_…"
PATCH/contacts/{id}Change a contact; subscribed: false unsubscribes

Change a contact; subscribed: false unsubscribes. Scope : contacts:write.

Corps
email
name
stage
subscribedfalse only
tags
fields
curl -X PATCH https://weesify.com/api/v1/contacts/01j… \
  -H "Authorization: Bearer wsy_…" \
  -H "Content-Type: application/json" \
  -d '{"email":"\u2026"}'
DELETE/contacts/{id}Delete a contact and their history

Delete a contact and their history. Scope : contacts:write.

curl -X DELETE https://weesify.com/api/v1/contacts/01j… \
  -H "Authorization: Bearer wsy_…"
POST/contacts/{id}/tagsTag a contact

Tag a contact. Scope : contacts:write.

Corps
tag *A tag name (made if new)
curl -X POST https://weesify.com/api/v1/contacts/01j…/tags \
  -H "Authorization: Bearer wsy_…" \
  -H "Content-Type: application/json" \
  -d '{"tag":"\u2026"}'
DELETE/contacts/{id}/tags/{tag}Remove a tag

Remove a tag. Scope : contacts:write.

curl -X DELETE https://weesify.com/api/v1/contacts/01j…/tags/01j… \
  -H "Authorization: Bearer wsy_…"
GET/tagsList tags

List tags. Scope : contacts:read.

curl -X GET https://weesify.com/api/v1/tags \
  -H "Authorization: Bearer wsy_…"

Formulaires 3 endpoints

GET/formsList forms

List forms. Scope : forms:read.

curl -X GET https://weesify.com/api/v1/forms \
  -H "Authorization: Bearer wsy_…"
GET/forms/{id}One form

One form. Scope : forms:read.

curl -X GET https://weesify.com/api/v1/forms/01j… \
  -H "Authorization: Bearer wsy_…"
GET/forms/{id}/submissionsWhat people submitted

What people submitted. Scope : forms:read.

Requête
sinceISO 8601
curl -X GET https://weesify.com/api/v1/forms/01j…/submissions \
  -H "Authorization: Bearer wsy_…"

Boutique 4 endpoints

GET/productsList products

List products. Scope : store:read.

curl -X GET https://weesify.com/api/v1/products \
  -H "Authorization: Bearer wsy_…"
GET/products/{id}One product

One product. Scope : store:read.

curl -X GET https://weesify.com/api/v1/products/01j… \
  -H "Authorization: Bearer wsy_…"
GET/ordersList orders, newest first

List orders, newest first. Scope : store:read.

Requête
statuspaid, pending, failed, refunded, cancelled
sinceISO 8601
curl -X GET https://weesify.com/api/v1/orders \
  -H "Authorization: Bearer wsy_…"
GET/orders/{id}One order with its items

One order with its items. Scope : store:read.

curl -X GET https://weesify.com/api/v1/orders/01j… \
  -H "Authorization: Bearer wsy_…"

Pages bio et sites 2 endpoints

GET/sitesList bio pages and sites

List bio pages and sites. Scope : sites:read.

curl -X GET https://weesify.com/api/v1/sites \
  -H "Authorization: Bearer wsy_…"
GET/sites/{id}One bio page or site

One bio page or site. Scope : sites:read.

curl -X GET https://weesify.com/api/v1/sites/01j… \
  -H "Authorization: Bearer wsy_…"

Événements 23 endpoints

GET/eventsList events, newest first

List events, newest first. Scope : events:read.

Requête
statusdraft, published, registration_open, …
starts_afterISO 8601
qName contains
curl -X GET https://weesify.com/api/v1/events \
  -H "Authorization: Bearer wsy_…"
POST/eventsCreate an event (a draft) with its first date and tickets

Create an event (a draft) with its first date and tickets. Scope : events:write.

Corps
name *
timezone *IANA zone, e.g. Europe/London
starts_local *Wall clock in the zone: 2026-11-14T18:30
ends_local *Wall clock in the zone
formatin_person, virtual or hybrid
visibilitypublic, unlisted, private
registration_modeopen, approval, rsvp, invite, external, none
capacityInteger
currencyISO 4217
typeAn event type key
venue_idOne of your venues
recurrence{rule: RRULE}
tickets[{name, kind, price_minor, quantity}]
curl -X POST https://weesify.com/api/v1/events \
  -H "Authorization: Bearer wsy_…" \
  -H "Content-Type: application/json" \
  -d '{"name":"\u2026","timezone":"\u2026","starts_local":"\u2026","ends_local":"\u2026"}'
GET/events/{id}One event

One event. Scope : events:read.

curl -X GET https://weesify.com/api/v1/events/01j… \
  -H "Authorization: Bearer wsy_…"
PATCH/events/{id}Change an event (send only what changes)

Change an event (send only what changes). Scope : events:write.

Corps
name
summary
starts_local
ends_local
timezone
capacity
visibility
venue_id
curl -X PATCH https://weesify.com/api/v1/events/01j… \
  -H "Authorization: Bearer wsy_…" \
  -H "Content-Type: application/json" \
  -d '{"name":"\u2026"}'
POST/events/{id}/statusMove an event through its lifecycle (publish, open registration, cancel…) with the app’s rules

Move an event through its lifecycle (publish, open registration, cancel…) with the app’s rules. Scope : events:write.

Corps
status *published, registration_open, registration_closed, postponed, cancelled, …
reasonFor cancellations
curl -X POST https://weesify.com/api/v1/events/01j…/status \
  -H "Authorization: Bearer wsy_…" \
  -H "Content-Type: application/json" \
  -d '{"status":"\u2026"}'
GET/events/{id}/occurrencesIts dates, with places left

Its dates, with places left. Scope : events:read.

Requête
upcoming1 = only dates that haven’t ended
curl -X GET https://weesify.com/api/v1/events/01j…/occurrences \
  -H "Authorization: Bearer wsy_…"
GET/events/{id}/ticket-typesIts ticket types and prices (minor units)

Its ticket types and prices (minor units). Scope : events:read.

curl -X GET https://weesify.com/api/v1/events/01j…/ticket-types \
  -H "Authorization: Bearer wsy_…"
GET/events/{id}/registrationsRegistrations (buyers), newest first

Registrations (buyers), newest first. Scope : events:attendees.

Requête
statusconfirmed, pending, cancelled, refunded…
emailExact address
curl -X GET https://weesify.com/api/v1/events/01j…/registrations \
  -H "Authorization: Bearer wsy_…"
POST/events/{id}/registrationsRegister someone (same rules as the event page; paid → pay_url)

Register someone (same rules as the event page; paid → pay_url). Scope : events:attendees + events:write.

Corps
tickets *{ticket_type_id: quantity}
email *
name
occurrence_idFor multi-date events
attendees[{name, email}] one per ticket
codePromo or access code
answersRegistration form answers by key
curl -X POST https://weesify.com/api/v1/events/01j…/registrations \
  -H "Authorization: Bearer wsy_…" \
  -H "Content-Type: application/json" \
  -d '{"tickets":"\u2026","email":"\u2026"}'
GET/events/{id}/registrations/{item}One registration

One registration. Scope : events:attendees.

curl -X GET https://weesify.com/api/v1/events/01j…/registrations/01j… \
  -H "Authorization: Bearer wsy_…"
GET/events/{id}/attendeesAttendees (one per ticket) with their ticket number

Attendees (one per ticket) with their ticket number. Scope : events:attendees.

Requête
statusconfirmed, pending, cancelled…
occurrence_id
checked_in1
curl -X GET https://weesify.com/api/v1/events/01j…/attendees \
  -H "Authorization: Bearer wsy_…"
GET/events/{id}/attendees/{item}One attendee

One attendee. Scope : events:attendees.

curl -X GET https://weesify.com/api/v1/events/01j…/attendees/01j… \
  -H "Authorization: Bearer wsy_…"
GET/events/{id}/ticketsTickets: number and status (never the QR payload)

Tickets: number and status (never the QR payload). Scope : events:attendees.

Requête
statusvalid or void
numberWSY-XXXX-XXXX
curl -X GET https://weesify.com/api/v1/events/01j…/tickets \
  -H "Authorization: Bearer wsy_…"
GET/events/{id}/ordersTicket orders (commerce orders for this event)

Ticket orders (commerce orders for this event). Scope : events:attendees (+ events.finance role).

Requête
statuspaid, pending, failed, refunded
curl -X GET https://weesify.com/api/v1/events/01j…/orders \
  -H "Authorization: Bearer wsy_…"
GET/events/{id}/sessionsAgenda sessions

Agenda sessions. Scope : events:read.

curl -X GET https://weesify.com/api/v1/events/01j…/sessions \
  -H "Authorization: Bearer wsy_…"
GET/events/{id}/speakersSpeakers (public profile fields)

Speakers (public profile fields). Scope : events:read.

curl -X GET https://weesify.com/api/v1/events/01j…/speakers \
  -H "Authorization: Bearer wsy_…"
GET/events/{id}/sponsorsSponsors

Sponsors. Scope : events:read.

curl -X GET https://weesify.com/api/v1/events/01j…/sponsors \
  -H "Authorization: Bearer wsy_…"
GET/events/{id}/exhibitorsExhibitors

Exhibitors. Scope : events:read.

curl -X GET https://weesify.com/api/v1/events/01j…/exhibitors \
  -H "Authorization: Bearer wsy_…"
GET/events/{id}/check-insCheck-in scans, with their result

Check-in scans, with their result. Scope : events:checkin.

Requête
resultaccepted, duplicate, invalid…
curl -X GET https://weesify.com/api/v1/events/01j…/check-ins \
  -H "Authorization: Bearer wsy_…"
POST/events/{id}/check-insScan a ticket (verifies the signed QR; idempotent per client_uuid)

Scan a ticket (verifies the signed QR; idempotent per client_uuid). Scope : events:checkin.

Corps
payload *The QR text, WT1.…
client_uuidUUID from your device
directionin or out
session_id
curl -X POST https://weesify.com/api/v1/events/01j…/check-ins \
  -H "Authorization: Bearer wsy_…" \
  -H "Content-Type: application/json" \
  -d '{"payload":"\u2026"}'
GET/events/{id}/check-ins/{item}One check-in

One check-in. Scope : events:checkin.

curl -X GET https://weesify.com/api/v1/events/01j…/check-ins/01j… \
  -H "Authorization: Bearer wsy_…"
GET/venuesYour venues

Your venues. Scope : events:read.

curl -X GET https://weesify.com/api/v1/venues \
  -H "Authorization: Bearer wsy_…"
GET/venues/{id}One venue

One venue. Scope : events:read.

curl -X GET https://weesify.com/api/v1/venues/01j… \
  -H "Authorization: Bearer wsy_…"

Bookings & meetings 3 endpoints

GET/booking-servicesBookable services, with length, capacity and price (minor units)

Bookable services, with length, capacity and price (minor units). Scope : bookings:read.

curl -X GET https://weesify.com/api/v1/booking-services \
  -H "Authorization: Bearer wsy_…"
GET/bookingsBookings, newest first (never the guest’s private meeting link)

Bookings, newest first (never the guest’s private meeting link). Scope : bookings:read.

Requête
statusheld, pending, confirmed, in_progress, cancelled, attended, no_show
service_idOne service
starts_afterISO 8601
starts_beforeISO 8601
curl -X GET https://weesify.com/api/v1/bookings \
  -H "Authorization: Bearer wsy_…"
GET/bookings/{id}One booking

One booking. Scope : bookings:read.

curl -X GET https://weesify.com/api/v1/bookings/01j… \
  -H "Authorization: Bearer wsy_…"

Cours 4 endpoints

GET/coursesCourses, with lesson and student counts

Courses, with lesson and student counts. Scope : courses:read.

curl -X GET https://weesify.com/api/v1/courses \
  -H "Authorization: Bearer wsy_…"
GET/courses/{id}One course

One course. Scope : courses:read.

curl -X GET https://weesify.com/api/v1/courses/01j… \
  -H "Authorization: Bearer wsy_…"
GET/courses/{id}/enrollmentsIts students, with progress (never their private course link)

Its students, with progress (never their private course link). Scope : courses:read.

Requête
statusactive or revoked
completed1 = only students who finished
curl -X GET https://weesify.com/api/v1/courses/01j…/enrollments \
  -H "Authorization: Bearer wsy_…"
GET/enrollments/{id}One enrolment

One enrolment. Scope : courses:read.

curl -X GET https://weesify.com/api/v1/enrollments/01j… \
  -H "Authorization: Bearer wsy_…"

Sites web 20 endpoints

GET/websitesList HTML websites, newest first

List HTML websites, newest first. Scope : sites:read.

Requête
statusdraft, published, unpublished, archived or suspended
curl -X GET https://weesify.com/api/v1/websites \
  -H "Authorization: Bearer wsy_…"
POST/websitesCreate an empty HTML website

Create an empty HTML website. Scope : sites:write.

Corps
name *Up to 120 characters
slugIts address: weesify.com/{slug}/ ([a-z0-9-], 3–63). Shared with pages and short links, so it must be free; from the name if empty
curl -X POST https://weesify.com/api/v1/websites \
  -H "Authorization: Bearer wsy_…" \
  -H "Content-Type: application/json" \
  -d '{"name":"\u2026"}'
GET/websites/{id}One website: status, url (https://weesify.com/{slug}/), files and storage

One website: status, url (https://weesify.com/{slug}/), files and storage. Scope : sites:read.

curl -X GET https://weesify.com/api/v1/websites/01j… \
  -H "Authorization: Bearer wsy_…"
PATCH/websites/{id}Rename it, change its address or homepage, or its routing settings

Rename it, change its address or homepage, or its routing settings. Scope : sites:write.

Corps
name
slugNew weesify.com/{slug}/ address; the old one redirects
homepageA path such as index.html
settings{clean_urls, trailing_slash, spa_fallback, not_found, redirects, headers, noindex}
curl -X PATCH https://weesify.com/api/v1/websites/01j… \
  -H "Authorization: Bearer wsy_…" \
  -H "Content-Type: application/json" \
  -d '{"name":"\u2026"}'
DELETE/websites/{id}Delete a website (disconnects its domains); needs sites:write and the publish permission

Delete a website (disconnects its domains); needs sites:write and the publish permission. Scope : sites:write.

curl -X DELETE https://weesify.com/api/v1/websites/01j… \
  -H "Authorization: Bearer wsy_…"
GET/websites/{id}/filesEvery file in the working draft (or the live site, or one deployment): path, size, sha256, type

Every file in the working draft (or the live site, or one deployment): path, size, sha256, type. Scope : sites:read.

Requête
sourcedraft (default), live or a deployment id
curl -X GET https://weesify.com/api/v1/websites/01j…/files \
  -H "Authorization: Bearer wsy_…"
POST/websites/{id}/filesUpload files (multipart files[] with optional paths[] and dir); blocked types are reported, not stored

Upload files (multipart files[] with optional paths[] and dir); blocked types are reported, not stored. Scope : sites:write.

Corps
files *multipart files[]
pathsmultipart paths[]: each file’s relative path
dirFolder to upload into
curl -X POST https://weesify.com/api/v1/websites/01j…/files \
  -H "Authorization: Bearer wsy_…" \
  -H "Content-Type: application/json" \
  -d '{"files":"\u2026"}'
PUT/websites/{id}/files/{path}Write one file from the raw request body (creates folders as needed)

Write one file from the raw request body (creates folders as needed). Scope : sites:write.

curl -X PUT https://weesify.com/api/v1/websites/01j…/files/{path} \
  -H "Authorization: Bearer wsy_…"
DELETE/websites/{id}/files/{path}Delete a file or folder from the draft

Delete a file or folder from the draft. Scope : sites:write.

curl -X DELETE https://weesify.com/api/v1/websites/01j…/files/{path} \
  -H "Authorization: Bearer wsy_…"
POST/websites/{id}/deploymentsPublish the draft — or send a ZIP as multipart archive to replace the draft and publish it. Needs an approved review when the site requires approval

Publish the draft — or send a ZIP as multipart archive to replace the draft and publish it. Needs an approved review when the site requires approval. Scope : sites:deploy.

Corps
messageShown in the deployment history
archivemultipart ZIP (also needs sites:write)
replaceWith archive: 1 makes the draft exactly the ZIP (files not in it are removed)
curl -X POST https://weesify.com/api/v1/websites/01j…/deployments \
  -H "Authorization: Bearer wsy_…" \
  -H "Content-Type: application/json" \
  -d '{"message":"\u2026"}'
GET/websites/{id}/deploymentsDeployment history, newest first

Deployment history, newest first. Scope : sites:read.

curl -X GET https://weesify.com/api/v1/websites/01j…/deployments \
  -H "Authorization: Bearer wsy_…"
GET/websites/{id}/deployments/{item}One deployment and its status (live, failed, superseded)

One deployment and its status (live, failed, superseded). Scope : sites:read.

curl -X GET https://weesify.com/api/v1/websites/01j…/deployments/01j… \
  -H "Authorization: Bearer wsy_…"
POST/websites/{id}/rollbackMake an earlier deployment live again

Make an earlier deployment live again. Scope : sites:deploy.

Corps
deployment_id *A deployment of this website
curl -X POST https://weesify.com/api/v1/websites/01j…/rollback \
  -H "Authorization: Bearer wsy_…" \
  -H "Content-Type: application/json" \
  -d '{"deployment_id":"\u2026"}'
GET/websites/{id}/domainsCustom domains: state, DNS records to add, HTTPS

Custom domains: state, DNS records to add, HTTPS. Scope : sites:read.

curl -X GET https://weesify.com/api/v1/websites/01j…/domains \
  -H "Authorization: Bearer wsy_…"
POST/websites/{id}/domainsConnect a custom domain (pending until its TXT record verifies)

Connect a custom domain (pending until its TXT record verifies). Scope : sites:write.

Corps
host *e.g. www.yourbrand.com
curl -X POST https://weesify.com/api/v1/websites/01j…/domains \
  -H "Authorization: Bearer wsy_…" \
  -H "Content-Type: application/json" \
  -d '{"host":"\u2026"}'
POST/websites/{id}/domains/{item}/verifyCheck ownership, DNS and HTTPS now

Check ownership, DNS and HTTPS now. Scope : sites:write.

curl -X POST https://weesify.com/api/v1/websites/01j…/domains/01j…/verify \
  -H "Authorization: Bearer wsy_…" \
  -H "Content-Type: application/json" \
  -d '{"name":"\u2026"}'
DELETE/websites/{id}/domains/{item}Disconnect a custom domain

Disconnect a custom domain. Scope : sites:write.

curl -X DELETE https://weesify.com/api/v1/websites/01j…/domains/01j… \
  -H "Authorization: Bearer wsy_…"
POST/websites/{id}/archiveReplace or update the working draft from a ZIP without publishing

Replace or update the working draft from a ZIP without publishing. Scope : sites:write.

Corps
archive *multipart ZIP
replace1: the draft becomes exactly the ZIP; otherwise files are added or overwritten
curl -X POST https://weesify.com/api/v1/websites/01j…/archive \
  -H "Authorization: Bearer wsy_…" \
  -H "Content-Type: application/json" \
  -d '{"archive":"\u2026"}'
GET/websites/{id}/archiveDownload the draft, the live site or one deployment as a ZIP

Download the draft, the live site or one deployment as a ZIP. Scope : sites:read.

Requête
sourcedraft (default), live or a deployment id
curl -X GET https://weesify.com/api/v1/websites/01j…/archive \
  -H "Authorization: Bearer wsy_…"
GET/websites/{id}/usageStorage, bandwidth, views, visits, form submissions and plan limits

Storage, bandwidth, views, visits, form submissions and plan limits. Scope : sites:read.

curl -X GET https://weesify.com/api/v1/websites/01j…/usage \
  -H "Authorization: Bearer wsy_…"

Blog 3 endpoints

GET/blog/postsBlog posts, newest first (drafts included)

Blog posts, newest first (drafts included). Scope : blog:read.

Requête
statusdraft, scheduled, published, archived
category_idOne category
curl -X GET https://weesify.com/api/v1/blog/posts \
  -H "Authorization: Bearer wsy_…"
GET/blog/posts/{id}One post, with its body

One post, with its body. Scope : blog:read.

curl -X GET https://weesify.com/api/v1/blog/posts/01j… \
  -H "Authorization: Bearer wsy_…"
GET/blog/categoriesBlog categories

Blog categories. Scope : blog:read.

curl -X GET https://weesify.com/api/v1/blog/categories \
  -H "Authorization: Bearer wsy_…"

Statistiques 1 endpoint

GET/analytics/summaryViews and clicks per day, with top countries, referrers and devices

Views and clicks per day, with top countries, referrers and devices. Scope : analytics:read.

Requête
days1-90 (30)
subjectsite, short_link or qr_code
subject_idOne of them
curl -X GET https://weesify.com/api/v1/analytics/summary \
  -H "Authorization: Bearer wsy_…"

Webhooks 10 endpoints

GET/webhook-eventsEvery event an endpoint can ask for

Every event an endpoint can ask for. Scope : webhooks:read.

curl -X GET https://weesify.com/api/v1/webhook-events \
  -H "Authorization: Bearer wsy_…"
GET/webhooksYour webhook, Slack and Discord endpoints

Your webhook, Slack and Discord endpoints. Scope : webhooks:read.

curl -X GET https://weesify.com/api/v1/webhooks \
  -H "Authorization: Bearer wsy_…"
POST/webhooksAdd an endpoint; the signing secret is in this answer only

Add an endpoint; the signing secret is in this answer only. Scope : webhooks:write.

Corps
url *https address on a host name (port 443)
events *Event names, e.g. ["order.paid"]
kindwebhook (default), slack or discord
descriptionOnly you see it
curl -X POST https://weesify.com/api/v1/webhooks \
  -H "Authorization: Bearer wsy_…" \
  -H "Content-Type: application/json" \
  -d '{"url":"\u2026","events":"\u2026"}'
GET/webhooks/{id}One endpoint and its health

One endpoint and its health. Scope : webhooks:read.

curl -X GET https://weesify.com/api/v1/webhooks/01j… \
  -H "Authorization: Bearer wsy_…"
PATCH/webhooks/{id}Change its events or description; active: false pauses it, active: true switches it back on

Change its events or description; active: false pauses it, active: true switches it back on. Scope : webhooks:write.

Corps
events
description
activeBoolean
curl -X PATCH https://weesify.com/api/v1/webhooks/01j… \
  -H "Authorization: Bearer wsy_…" \
  -H "Content-Type: application/json" \
  -d '{"events":"\u2026"}'
DELETE/webhooks/{id}Remove an endpoint

Remove an endpoint. Scope : webhooks:write.

curl -X DELETE https://weesify.com/api/v1/webhooks/01j… \
  -H "Authorization: Bearer wsy_…"
POST/webhooks/{id}/testSend a signed “ping” now and get the result

Send a signed “ping” now and get the result. Scope : webhooks:write.

curl -X POST https://weesify.com/api/v1/webhooks/01j…/test \
  -H "Authorization: Bearer wsy_…" \
  -H "Content-Type: application/json" \
  -d '{"name":"\u2026"}'
POST/webhooks/{id}/rotate-secretA new signing secret; the old one keeps signing alongside it for a day

A new signing secret; the old one keeps signing alongside it for a day. Scope : webhooks:write.

curl -X POST https://weesify.com/api/v1/webhooks/01j…/rotate-secret \
  -H "Authorization: Bearer wsy_…" \
  -H "Content-Type: application/json" \
  -d '{"name":"\u2026"}'
GET/webhooks/{id}/deliveriesIts delivery log (30 days), newest first

Its delivery log (30 days), newest first. Scope : webhooks:read.

Requête
statuspending, sending, delivered, failed, dead
curl -X GET https://weesify.com/api/v1/webhooks/01j…/deliveries \
  -H "Authorization: Bearer wsy_…"
POST/webhooks/{id}/deliveries/{item}/redeliverSend a delivery again (same event id)

Send a delivery again (same event id). Scope : webhooks:write.

curl -X POST https://weesify.com/api/v1/webhooks/01j…/deliveries/01j…/redeliver \
  -H "Authorization: Bearer wsy_…" \
  -H "Content-Type: application/json" \
  -d '{"name":"\u2026"}'