Everything the public API serves, in one table. The base URL is
https://api.canverly.com for every route, and the site is always taken from
the API key — there is no site parameter anywhere on this surface.
| Method |
Path |
Scope |
Page |
GET |
/v1/posts/{reference}/seo |
seo:read |
Post SEO |
PATCH |
/v1/posts/{reference}/seo |
seo:write |
Post SEO |
GET |
/v1/sites/me/seo |
seo:read |
Site SEO |
PATCH |
/v1/sites/me/seo |
seo:write |
Site SEO |
| Method |
Path |
Scope |
Page |
GET |
/v1/media |
media:read |
Media |
POST |
/v1/media |
media:write |
Media |
GET |
/v1/media/{id} |
media:read |
Media |
DELETE |
/v1/media/{id} |
media:write |
Media |
POST, GET /admin/api-keys and PATCH, DELETE /admin/api-keys/{id} also
exist, but they are not part of the integrator surface: they authenticate
with a site-owner browser session, not with a ck_ key. See
Keys, scopes & restrictions.
- The key fixes the site.
site_id, org_id and author_id are never read
from a URL, query or body. Sending them changes nothing.
- 404, not 403, for other tenants. A resource that belongs to another site is
indistinguishable from one that does not exist. This is deliberate: a
403
would confirm that someone else’s draft, lead or asset exists.
- Limits are never silently clamped. A
limit outside its documented range
is a 400 with the range in the message, not a quietly truncated page.
- One error envelope:
{ "error": { "code": …, "message": … } }. See
Errors & rate limits.