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(froren;fr-FRorENare accepted too). Any other value falls back toen. No identifier, no user, nothing generated. Any method other than GET or POST returns405. 404with{ "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.
POSTwith 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
/llms.txtand/en/llms.txt: what Zenvy is and is not, stable product facts, key pages and the most recent articles, for AI answer engines (llmstxt.org)./blog/feed.xmland/en/blog/feed.xml: RSS 2.0 feeds of the blog, full text, 30 most recent articles./sitemap.xml: every indexable page.
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.