Weesify
Pembangun

API Weesify

Cipta pautan dan kod QR, selaraskan kenalan, dan baca halaman bio, borang, pesanan, kursus, tempahan, acara dan analitik anda daripada kod anda sendiri. JSON melalui HTTPS, versi 1.

Token berskop

Baca atau tulis, mengikut sumber. Token tidak pernah melakukan lebih daripada orang yang membuatnya.

Had yang jelas

Had kadar bagi setiap token dan setiap pelan, dilaporkan dalam pengepala pada setiap jawapan.

Webhook bertandatangan

HMAC-SHA256 dengan cap masa, dicuba semula dengan backoff, dengan log penghantaran yang boleh anda hantar semula.

OpenAPI 3.1

Satu dokumen, dijana daripada sumber yang sama dengan halaman ini. Import ke mana-mana klien.

Pengesahan

Buat token dalam ruang kerja anda di bawah Tetapan → Pembangun (pemilik dan pentadbir). Ia ditunjukkan sekali sahaja, jadi simpannya dalam rahsia pelayan anda, jangan sekali-kali dalam halaman web atau aplikasi yang dimuat turun orang. Hantarkannya dalam pengepala Authorization:

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

Token dimiliki oleh satu ruang kerja. Pada setiap panggilan ia hanya boleh melakukan apa yang dibenarkan oleh skopnya dan apa yang masih boleh dilakukan oleh orang yang menciptanya: jika mereka keluar atau peranan mereka berubah, token akan mengikut. Batalkan token bila-bila masa; ia berhenti berfungsi serta-merta.

Datang daripada API Weesify lama? Kunci API lama anda terus berfungsi di sini, sebagai token pembawa, selama 90 hari selepas perpindahan, dengan capaian yang sama seperti API lama. Buat token baharu sebelum itu; Tetapan → Pembangun menunjukkan bila kunci lama anda tamat.

Mula pantas

Mana-mana klien HTTP boleh digunakan. Tiga panggilan merangkumi asas: baca, cipta dengan selamat dan semak had anda.

# 1. Pautan terbaru anda
curl "https://weesify.com/api/v1/links?limit=5" \
  -H "Authorization: Bearer $WEESIFY_TOKEN"

# 2. Cipta satu (percubaan semula dengan kunci yang sama tidak akan mencipta dua)
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. Lihat pengepala had kadar
curl -i https://weesify.com/api/v1/workspace -H "Authorization: Bearer $WEESIFY_TOKEN"

Setiap jawapan ialah JSON. Satu item datang sebagai {"data": {…}}; senarai sebagai {"data": […], "meta": {…}}.

Skop

SkopMembenarkan token
links:readPautan pendek dan bilangan kliknya
links:writeCipta, ubah dan padam pautan pendek
qr:readKod QR dan imbasannya
qr:writeCipta, ubah dan padam kod QR
contacts:readKenalan, tag dan butiran mereka
contacts:writeTambah, kemas kini, tag dan padam kenalan
forms:readBorang dan apa yang dihantar orang
store:readProduk dan pesanan (dengan butiran pembeli)
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:readKlik dan tontonan dari semasa ke semasa
events:readAcara, tarikh, jenis tiket, agenda, penceramah, penaja, peserta pameran dan tempat
events:writeCipta dan ubah acara serta gerakkan melalui kitaran hayatnya
events:attendeesPendaftaran, peserta, tiket dan pesanan tiket (dengan butiran orang)
events:checkinImbas tiket dan baca daftar masuk
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

Permintaan dan halaman

  • Hantar badan JSON dengan Content-Type: application/json. Masa dalam ISO 8601 dalam UTC. ID ialah rentetan 26 aksara.
  • Senarai dipaparkan dari yang terbaharu sebagai {"data": [...], "meta": {"limit": 25, "next_cursor": "…"}}. Hantar ?cursor= untuk mendapatkan halaman seterusnya dan ?limit= (1–100, lalai 25).
  • Wang adalah dalam unit terkecil (sen) bersama mata wangnya.

Ralat

Ralat menggunakan RFC 7807 (application/problem+json). Ralat pengesahan menyenaraikan setiap medan di bawah errors.

{
  "type": "https://weesify.com/developers#errors",
  "title": "Invalid request",
  "status": 422,
  "detail": "Some fields need attention.",
  "errors": { "destination_url": ["Enter a web address."] }
}
StatusBermaksud
401Tiada token, atau ia salah, tamat tempoh atau dibatalkan
402Ruang kerja adalah baca sahaja sehingga pelan dipilih, atau had pelan dicapai
403Token tidak mempunyai skop itu, orang yang membuatnya tidak boleh melakukan ini, atau akses API tiada dalam pelan
404Tidak ditemui dalam ruang kerja ini, atau ciri tersebut dimatikan
400Idempotency-Key tidak dalam format yang betul
409Idempotency-Key yang sama masih diproses, atau telah digunakan untuk permintaan lain
422Ada sesuatu yang tidak betul dalam permintaan
429Terlalu banyak permintaan: tunggu selama Retry-After saat

Had kadar

Setiap token boleh membuat 120 permintaan seminit dan setiap ruang kerja 600, dikira dalam tetingkap satu minit. Pelan Enterprise dan Custom membenarkan lebih banyak. Melebihi had, anda mendapat 429 dengan Retry-After: tunggu seberapa saat itu dan cuba lagi.

PengepalaBermaksud
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

Log permintaan ruang kerja anda dan penggunaan berbanding pelan anda berada di Tetapan → Pembangun → Penggunaan & log, dipadankan mengikut X-Request-Id.

Cubaan semula

Hantar pengepala Idempotency-Key (1–80 huruf, digit, sengkang, titik, titik bertindih atau garis bawah) bersama POST. Jika rangkaian terputus dan anda mencuba semula dengan kunci, laluan dan kandungan yang sama dalam masa 24 jam, anda mendapat jawapan asal sekali lagi (ditandai Idempotent-Replayed: true) dan tiada apa dijalankan dua kali. Kunci milik token yang menghantarnya. Kunci yang sama dengan laluan atau kandungan lain mendapat 409.

Weesify CLI

Deploy folder ke laman web HTML daripada komputer atau CI anda, tarik semula, bandingkan dan undur. Satu fail Node.js 18+ tanpa pakej: muat turun dan jalankannya.

curl -fsSLo weesify.mjs https://weesify.com/developers/cli/weesify.mjs && node weesify.mjs login
node weesify.mjs init
node weesify.mjs deploy -m "Versi pertama"

SHA-256 fail semasa: e98494277685934e20bdfb05c7f9fe5087db5db66d80b2365a4d3f74ed51c8af

Pasang pada macOS, Linux atau Windows, setiap arahan, CI dan kod keluar →

Webhook

Tambah titik akhir dalam Tetapan → Pembangun → Webhook (atau dengan POST /webhooks) dan pilih acara. Weesify melakukan POST JSON kepadanya apabila sesuatu berlaku, mencuba semula kegagalan sebanyak 6 kali dalam masa kira-kira 21 jam, dan menyimpan log penghantaran 30 hari yang boleh anda hantar semula. Selepas 5 acara berturut-turut tidak dapat dihantar, titik akhir dimatikan dan pentadbir ruang kerja dimaklumkan. Jawab dengan mana-mana 2xx dalam 5 saat; ubah hala tidak diikuti.

{
  "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" }
  }
}

Semak tandatangan. Pengepala X-Weesify-Signature ialah t=<unix time>,v1=<hex>. Kira HMAC-SHA256 bagi t + "." + raw body dengan rahsia tandatangan titik akhir anda dan bandingkannya (dalam masa malar) dengan mana-mana v1: selama sehari selepas anda menukar rahsia, terdapat dua. Tolak apa-apa yang lebih lama daripada lima minit. id acara kekal sama semasa cubaan semula, jadi anda boleh mengabaikan ulangan.

// 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;
}
AcaraBila
contact.createdKenalan baharu
contact.updatedButiran hubungan diubah
contact.subscribedDilanggan
contact.unsubscribedDinyahlanggan
contact.taggedTag ditambah
contact.untaggedTag dialih keluar
contact.stage_changedPeringkat ditukar
form.submittedBorang dijawab
order.paidPesanan dibayar
order.refundedPesanan dibayar balik
booking.createdTempahan baharu
booking.cancelledTempahan dibatalkan
course.enrolledPelajar didaftarkan
course.completedKursus selesai
community.joinedMenyertai komuniti
event.createdAcara dicipta
event.publishedAcara diterbitkan
event.updatedButiran acara diubah
event.cancelledAcara dibatalkan
event.postponedAcara ditangguhkan
event.completedAcara selesai
registration.createdPendaftaran dimulakan
registration.confirmedPendaftaran disahkan
registration.cancelledPendaftaran dibatalkan
ticket.purchasedTiket dibeli
payment.completedPembayaran tiket selesai
payment.failedBayaran tiket gagal
ticket.refundedTiket dibayar balik
attendee.checked_inPeserta telah mendaftar masuk
session.attendedSesi dihadiri
waitlist.joinedMenyertai senarai menunggu
feedback.submittedMaklum balas dihantar
post.publishedPost published
post.failedPost failed to publish
site.deployedWebsite published
site.deploy_failedWebsite failed to publish

Ruang kerja 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_…"

Kod QR 5 endpoints

GET/qr-codesList QR codes

List QR codes. Skop: qr:read.

Pertanyaan
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. Skop: qr:write.

Badan
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. Skop: 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. Skop: qr:write.

Badan
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. Skop: qr:write.

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

Kenalan 8 endpoints

GET/contactsList contacts

List contacts. Skop: contacts:read.

Pertanyaan
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. Skop: contacts:write.

Badan
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. Skop: 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. Skop: contacts:write.

Badan
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. Skop: 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. Skop: contacts:write.

Badan
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. Skop: contacts:write.

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

List tags. Skop: contacts:read.

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

Borang 3 endpoints

GET/formsList forms

List forms. Skop: forms:read.

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

One form. Skop: 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. Skop: forms:read.

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

Kedai 4 endpoints

GET/productsList products

List products. Skop: store:read.

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

One product. Skop: 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. Skop: store:read.

Pertanyaan
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. Skop: store:read.

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

Halaman bio & laman 2 endpoints

GET/sitesList bio pages and sites

List bio pages and sites. Skop: 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. Skop: sites:read.

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

Acara 23 endpoints

GET/eventsList events, newest first

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

Pertanyaan
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. Skop: events:write.

Badan
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. Skop: 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). Skop: events:write.

Badan
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. Skop: events:write.

Badan
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. Skop: events:read.

Pertanyaan
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). Skop: 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. Skop: events:attendees.

Pertanyaan
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). Skop: events:attendees + events:write.

Badan
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. Skop: 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. Skop: events:attendees.

Pertanyaan
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. Skop: 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). Skop: events:attendees.

Pertanyaan
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). Skop: events:attendees (+ events.finance role).

Pertanyaan
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. Skop: 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). Skop: events:read.

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

Sponsors. Skop: events:read.

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

Exhibitors. Skop: 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. Skop: events:checkin.

Pertanyaan
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). Skop: events:checkin.

Badan
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. Skop: events:checkin.

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

Your venues. Skop: events:read.

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

One venue. Skop: 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). Skop: 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). Skop: bookings:read.

Pertanyaan
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. Skop: bookings:read.

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

Kursus 4 endpoints

GET/coursesCourses, with lesson and student counts

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

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

One course. Skop: 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). Skop: courses:read.

Pertanyaan
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. Skop: courses:read.

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

Laman web 20 endpoints

GET/websitesList HTML websites, newest first

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

Pertanyaan
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. Skop: sites:write.

Badan
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. Skop: 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. Skop: sites:write.

Badan
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. Skop: 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. Skop: sites:read.

Pertanyaan
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. Skop: sites:write.

Badan
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). Skop: 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. Skop: 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. Skop: sites:deploy.

Badan
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. Skop: 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). Skop: 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. Skop: sites:deploy.

Badan
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. Skop: 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). Skop: sites:write.

Badan
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. Skop: 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. Skop: 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. Skop: sites:write.

Badan
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. Skop: sites:read.

Pertanyaan
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. Skop: 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). Skop: blog:read.

Pertanyaan
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. Skop: blog:read.

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

Blog categories. Skop: blog:read.

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

Analitik 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. Skop: analytics:read.

Pertanyaan
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_…"

Webhook 10 endpoints

GET/webhook-eventsEvery event an endpoint can ask for

Every event an endpoint can ask for. Skop: 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. Skop: 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. Skop: webhooks:write.

Badan
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. Skop: 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. Skop: webhooks:write.

Badan
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. Skop: 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. Skop: 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. Skop: 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. Skop: webhooks:read.

Pertanyaan
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). Skop: 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"}'