Furries PH Docs
Dashboard
Event Planning System docs

Reference

EPS Data, API, Calendar, and Standards Reference

Organizer and developer reference for planning records, routes, statuses, interoperability, and non-certification claims.

First created Last updated

event-planningapistandardscalendar

API profile

All routes are mounted below /api/planning, require dashboard authentication except the Worker scheduler, return camelCase JSON, and enforce partner/project access. Collection writes are bounded and audited. Versioned records use expectedVersion; canonical change application uses expected timestamps and idempotency keys.

Method and pathPurpose
GET/POST /projectslist or create planning projects
GET/PATCH /projects/:projectIdload workspace or versioned project update
POST /projects/:projectId/link-eventone-time canonical event link
GET /projects/:projectId/event-cataloglive canonical EMS event, tiers, inclusions, add-ons, and shop
POST/PATCH /projects/:projectId/:collection[/resourceId]departments, calendars, work, requirements, meetings, risks, gates, reminders
POST/DELETE /projects/:projectId/dependenciesdependency graph changes with cycle protection
POST/DELETE /projects/:projectId/resource-linksplanning overlay to canonical EMS resource link
GET/POST /projects/:projectId/change-setslist or create reviewed EMS proposals
POST .../review and POST .../applyapprove/reject and atomically apply proposals
POST .../canonical-commandauthorized direct canonical command
GET /projects/:projectId/meetings/:meetingIdmeeting, ordered agenda, and minutes revisions
POST .../agenda and POST .../minutesadd agenda items and immutable minutes revisions
GET /projects/:projectId/calendar.icsauthenticated iCalendar publish/download profile
GET /planning/openapi.jsonmachine-readable OpenAPI 3.1 inventory using JSON Schema 2020-12
POST /projects/:projectId/artifactsSanity-only mediated upload
GET /artifacts/:artifactId/contentauthorized proxy/decrypt stream; never redirects to Sanity
POST .../artifacts/:artifactId/reviewauthorized clean/quarantine decision
POST .../destinations and POST .../testwrite-only destination setup and test
GET /projects/:projectId/my-reminder-channelscurrent user’s mandatory-email baseline plus masked Telegram DM, Discord DM, and verified/consented SMS readiness
POST .../my-reminder-channels/:channel/:actioncurrent-user Telegram/Discord link, verify, test and unlink; SMS start/resend/verify/test/opt-out/unlink
GET /projects/:projectId/delivery-historybounded permission-checked channel attempts and safe delivery dispositions
POST .../notification-outbox/:outboxId/retry or /reconcileauthorized attempt recovery without creating another logical reminder
POST /projects/:projectId/sms-gateway/devices/:deviceId/native-tokenissue, rotate, or revoke a digest-stored online Android device credential
GET/POST /sms-gateway/devices/:deviceId/...token-authenticated preflight, heartbeat, job lease, immediate recheck, and native receipt routes
POST /projects/:projectId/importspreview or atomically apply 1–500 versioned JSON records with digest and idempotency receipt
GET /my-workcross-project tasks, requirements, reviews, and meetings

Common errors are 400 invalid input/application failure, 401 unauthenticated, 403 capability denied, 404 out-of-scope record, and 409 duplicate, cycle, state, or optimistic-version conflict.

Personal reminder routes also return stable safe codes for provider identity mismatch/ambiguity, bot chat or DM unavailable, SMS verification or consent required, country/segment/cost policy blocked, no eligible online device/SIM, lease or challenge expiry, rate limiting, provider failure, and retry exhaustion. Responses and audit payloads mask targets and exclude locator ciphertext, raw provider IDs, access/refresh/bot/native tokens, webhook secrets, full phone numbers, verification codes, and unsafe provider response text.

Import apply requires the exact previewDigest returned for the normalized records plus a UUID idempotencyKey. A stale/missing digest returns IMPORT_PREVIEW_REQUIRED; row validation returns field-specific errors without writes. Import payloads reject Sanity locators, and file evidence is never accepted by the JSON import route.

Key statuses

RecordMain states
Projectconcept, active, readiness, handed_off, paused, cancelled, archived
Requirementdraft, assigned, in_progress, submitted, revision_requested, accepted, waived, expired, cancelled
Meetingdraft, scheduled, in_progress, completed, cancelled
Minutesdraft, review, published, superseded
Change setdraft, submitted, approved, rejected, applied, conflicted, cancelled
Artifact scanpending, clean, quarantined, failed
Personal channel readinessunlinked, pending, ready, blocked, revoked, error
SMS verificationunverified, pending, verified, expired, revoked, blocked
SMS consentnot_granted, granted, withdrawn
SMS gateway jobpending, blocked_device_required, blocked_policy, leased, sent, delivered, sent_unconfirmed, retry_wait, failed, cancelled, suppressed, expired

Reminder records and isolation

Mandatory email is the canonical schedule source. A database fan-out derives separate telegram_dm, discord_dm, and sms reminder rows only for a current ready binding and explicit project preference. Each personal logical key includes the linked identity version. Relink, unlink, opt-out, revocation, terminal work state, or deadline replacement cancels stale scheduled/outbox/SMS work and keeps prior attempts immutable.

Service-owned personal contact, SMS verification, gateway job, and attempt tables have RLS enabled, revoke ordinary anon and authenticated Data API access, and grant service-role access explicitly. Privileged synchronization functions use fixed search paths and service-role-only execution. The API derives partner, project, actor, recipient, destination, and device scope; callers cannot supply a different user’s personal destination.

Phone numbers and direct-message locators are encrypted with purpose-specific API-owned keys. General planning payloads use only masked destinations and safe content. SMS jobs carry an encrypted phone and message only inside the dedicated service-owned queue, plus a payload digest, identity version, cancellation revision, expiry, segment/encoding data, country allowlist, cost ceilings, and pacing policy. Native tokens and challenge codes are stored as digests rather than recoverable secrets.

The Android lease remains online-only and same-partner. Device/SIM selection requires current permission and heartbeat state, a verified active non-roaming SIM, allowed country, segment and cost headroom, unexpired job, and current cancellation/payload values. A native receipt updates channel evidence only; it cannot mutate the associated planning record.

Calendar profile

The authenticated export follows RFC 5545 iCalendar syntax for a bounded publish profile: VCALENDAR, meetings as VEVENT, due work as VTODO, stable UID, SEQUENCE, UTC timestamps, escaped text, status, URL, and line folding. It does not claim CalDAV (RFC 4791), CalDAV Scheduling (RFC 6638), or JSCalendar (RFC 8984) round-trip compatibility yet.

Standards mapping

Standard or guidanceEPS useClaim level
ISO 21502 / ISO 21511lifecycle, work breakdown, dependencies, schedule and change recordsdesign guidance
ISO 20121:2024sustainable event objectives, interested parties, controls, improvementdesign guidance
ISO 31000 / IEC 31010risk context, assessment, treatment and reviewdesign guidance
ISO 22301continuity, exercise, response and recovery evidencedesign guidance
ISO 45001work-related hazard and control promptsdesign guidance
ISO 15489-1record identity, versions, retention, disposal and auditdesign guidance
ISO/IEC 27001access, cryptography, logging, incident and supplier controlsdesign guidance
WCAG 2.2keyboard forms, non-drag alternatives, target sizing, accessible schedule tabletarget AA; not independently certified
OpenAPI 3.1 / JSON Schema 2020-12machine-readable EPS route inventory and versioned import envelopeimplemented in Preview at /api/planning/openapi.json

Feature presence is not ISO certification, legal compliance, or independent conformance. Jurisdictional obligations, including Philippine privacy and accessibility requirements, need qualified review and an effective-dated obligation register.

Completion check

API consumers know the auth, version, idempotency, bounds, error, publication, and Sanity-leak contracts, and standards claims are described as guidance or tested profiles rather than certification.

All docs