Skip to content

REST API

Base URL: /api Content-Type: application/json Auth: Session cookie (pinteach_session, 30-day expiry)

Public Routes (/api/public/:slug) — No Auth

Section titled “Public Routes (/api/public/:slug) — No Auth”
MethodPathRate LimitDescription
GET/:slugTeacher public profile + services
GET/:slug/servicesActive services list
GET/:slug/services/:serviceSlugService detail
GET/:slug/service-availability30/minAvailable slots for a service
POST/:slug/events60/minTrack analytics events
POST/:slug/widget-event120/minTrack widget events
POST/:slug/trial-session3/hrBook a trial session
POST/:slug/enroll10/minStudent enrollment
GET/:slug/reviewsPublic reviews with stats
POST/:slug/validate-discount10/minValidate a discount code
GET/:slug/widget-cssCustom CSS for widget config (?configId=xxx, returns text/css)
Query params:
serviceId: string (required)
timezone: string (IANA)
start: string (ISO date)
end: string (ISO date)
preferredStart: string (HH:mm, optional)
preferredEnd: string (HH:mm, optional)
preferredDays: string (comma-separated 1-7, optional)
{
"slots": [
{
"startUtc": "2026-02-12T09:00:00Z",
"endUtc": "2026-02-12T10:00:00Z",
"startLocal": "2026-02-12T10:00:00+01:00",
"endLocal": "2026-02-12T11:00:00+01:00",
"isPreferred": true
}
]
}

Student Routes (/api/student) — Student Auth

Section titled “Student Routes (/api/student) — Student Auth”
MethodPathDescription
POST/student/sessionsBook a session
GET/student/sessionsList sessions
GET/student/sessions/:idSession detail
POST/student/sessions/:id/cancelCancel (enforces policy)
POST/student/sessions/:id/rescheduleReschedule
POST/student/sessions/:id/moodSubmit mood
GET/student/sessions/:id/cancellation-previewDry-run cancel
GET/student/sessions/:id/reschedule-previewDry-run reschedule
MethodPathDescription
POST/student/sessions/:id/reviewSubmit review
PATCH/student/reviews/:idUpdate review
DELETE/student/reviews/:idDelete review
MethodPathDescription
POST/student/waitlistJoin waitlist
DELETE/student/waitlist/:serviceIdLeave waitlist
GET/student/waitlist/:serviceIdCheck position
MethodPathDescription
GET/student/privacy/my-dataView data summary
POST/student/privacy/exportDownload export
POST/student/privacy/erasure-requestRequest erasure

Teacher Routes (/api/teacher) — Teacher Auth

Section titled “Teacher Routes (/api/teacher) — Teacher Auth”
MethodPathDescription
GET/teacher/servicesList services
POST/teacher/servicesCreate service
PATCH/teacher/services/:idUpdate service
DELETE/teacher/services/:idSoft-delete
POST/teacher/services/:id/publishPublish
POST/teacher/services/:id/pausePause
POST/teacher/services/:id/archiveArchive
MethodPathDescription
GET/teacher/sessionsList sessions
POST/teacher/sessionsCreate session
POST/teacher/sessions/:id/cancelCancel
POST/teacher/sessions/:id/completeComplete
POST/teacher/sessions/:id/no-show/:studentIdNo-show
PATCH/teacher/sessions/:id/contentUpdate content
POST/teacher/sessions/:id/templatesLink templates
POST/teacher/sessions/:id/resourcesLink resources
MethodPathDescription
GET/teacher/studentsList students
POST/teacher/studentsCreate student
PATCH/teacher/students/:idUpdate student
DELETE/teacher/students/:idSoft-delete
POST/teacher/students/:id/impersonateImpersonate
MethodPathDescription
GET/teacher/dashboard/summaryKPIs + pending trials
GET/teacher/dashboard/smart-actionsSuggested actions
GET/teacher/calendar/weekWeek view data
GET/teacher/calendar/agendaAgenda list
MethodPathDescription
GET/teacher/paymentsPayment history
GET/teacher/payments/kpisRevenue KPIs
POST/teacher/payments/csv-exportCSV export
POST/teacher/payments/refundInitiate refund
MethodPathDescription
GET/POST/teacher/lesson-templatesTemplate CRUD
GET/teacher/lesson-templates/treeFull tree
GET/teacher/materials/:folderId/contentsFolder contents
GET/teacher/materials/searchSearch materials
POST/teacher/materials/moveMove items
GET/POST/teacher/resourcesResource CRUD
POST/teacher/resources/:id/favoriteToggle favorite
MethodPathDescription
GET/teacher/reviewsList reviews
GET/teacher/reviews/statsReview stats
POST/teacher/reviews/:id/respondAdd response
POST/teacher/reviews/importImport external
POST/teacher/reviews/requests/sendSend request
MethodPathDescription
CRUD/teacher/widget-configsWidget management
CRUD/teacher/availability-schedulesSchedules
CRUD/teacher/availability-overridesOverrides
CRUD/teacher/cancellation-policiesPolicies
MethodPathDescription
GET/teacher/audit-logPaginated audit logs
GET/teacher/privacy/exportTeacher data export
POST/teacher/privacy/erase-studentErase student data
GET/teacher/privacy/erasure-requestsList erasure requests
MethodPathDescription
GET/teacher/discount-codesList discount codes
GET/teacher/discount-codes/:idGet discount code detail
GET/teacher/discount-codes/:id/statsUsage stats for a code
POST/teacher/discount-codesCreate discount code
PATCH/teacher/discount-codes/:idUpdate discount code
DELETE/teacher/discount-codes/:idSoft-delete discount code
MethodPathDescription
GET/teacher/scheduled-messagesList scheduled messages
POST/teacher/scheduled-messagesCreate scheduled message (enqueues BullMQ delayed job)
DELETE/teacher/scheduled-messages/:idCancel a pending message (removes BullMQ job)

Signature verified via stripe-signature header. Idempotent via webhook_events.stripeEventId.

Events handled:

  • checkout.session.completed — Confirm enrollment / activate payment
  • invoice.paid — Auto-renew subscription enrollments
  • customer.subscription.deleted — Cancel enrollment
  • charge.refunded — Apply refund
  • charge.dispute.created — Record dispute
Endpoint PatternLimit
POST /auth/magic-link5/hr per IP
POST /public/*/trial-session3/hr per IP
GET /public/*/service-availability30/min per IP
POST /public/*/events60/min per IP
POST /public/*/validate-discount10/min per IP
All authenticated100/min per session