Public API

What can be called on Zenvy without an account, and nothing else. Everything on this page is read-only, free, and needs no credential.

Machine-readable entry point: /.well-known/api-catalog (API catalog, RFC 9727, application/linkset+json). It links each API below to its OpenAPI 3.1 description, to this page, and to the status endpoint.

What is not public

Zenvy's backend is a set of Supabase Edge Functions. All of them but one require a user session (JWT), a cron secret or a webhook secret: generating a meditation, transcribing a voice note, deleting an account, receiving store or TTS webhooks. They are not listed here and are not meant to be called by third parties. There is no API to generate a meditation without the app.

Daily meditation preview

GET https://pombmggksyuwbmdjudjo.supabase.co/functions/v1/public-preview

The only backend REST endpoint without authentication (the public MCP server is a separate, JSON-RPC surface described by its Server Card at /.well-known/mcp/server-card.json). It returns a signed URL (valid one hour) to the audio of today's generic guided meditation, the shared session every Zenvy account can listen to for free. The app uses it on the sign-up screen so a visitor can hear the product before creating an account.

  • One parameter, lang (fr or en; fr-FR or EN are accepted too). Any other value falls back to en. No identifier, no user, nothing generated. Any method other than GET or POST returns 405.
  • 404 with { "code": "PREVIEW_UNAVAILABLE" } when no session is ready today in that language. There is no fallback on yesterday and no fallback across languages.
  • Responses are cached 5 minutes per language. Browser cross-origin calls are only allowed from getzenvy.app; server-side calls are not restricted.
  • The signed URL exposes the whole WAV file (mono, 16-bit, 24 kHz). The 90-second clip is a bound the app applies, not a guarantee of the API.
  • POST with a JSON body { "lang": "fr" } has the same semantics.
curl "https://pombmggksyuwbmdjudjo.supabase.co/functions/v1/public-preview?lang=fr"

{
  "url": "https://pombmggksyuwbmdjudjo.supabase.co/storage/v1/object/sign/meditations/generic/<id>.wav?token=<jwt>",
  "duration_seconds": 312.4,
  "generic_date": "2026-09-22",
  "language": "fr",
  "expires_in": 3600
}

OpenAPI: /openapi/public-preview.json

Website endpoints

Served by getzenvy.app itself. OpenAPI: /openapi/landing.json.

Article of the day

GET /api/blog/today

The blog post matching today's theme and approach, resolved with the same deterministic UTC algorithm the app and the backend use. 200 with the article, or 404 with the pair and "slug": null when no article exists for it. CDN cache one hour.

curl https://getzenvy.app/api/blog/today

{
  "themeId": "sleep",
  "approachId": "body-scan",
  "slug": "scan-corporel-pour-dormir",
  "title": "…",
  "url": "https://getzenvy.app/blog/scan-corporel-pour-dormir",
  "image": "https://getzenvy.app/images/blog/scan-corporel-pour-dormir/cover.webp"
}

Status

GET /api/status

Live probe of the public backend endpoint, five-second timeout, cached one minute. The site's own endpoints are not probed: if the site is down, this report is down with it. Always 200; read status in the body: ok when every probed service answers as designed (a 404 PREVIEW_UNAVAILABLE counts as healthy: no clip today is not an outage), degraded otherwise. The body lists each service with its HTTP status and latency.

Guides and feeds

Terms

These endpoints are provided as is, without rate guarantee, and may change with a notice on this page. Content is © Linck Labs; the audio preview is meant to be listened to, not redistributed. Questions: getzenvyapp@gmail.com. See also the Terms of Use and the Privacy Policy.