Delivery API întoarce conținutul publicat ca JSON. E doar pentru citire, stă în cache la margine și poate fi apelat la fiecare cerere.
https://api.manifolio.com/delivery/v1/{projectId}/
Authorization: Bearer mf_live_cheia_ta_secretaprojectId e id-ul proiectului (un UUID), afișat la Developers → API keys → Connection. Cheia trebuie să fie din același proiect și să aibă scope-ul content:read.
Căi
| Cale | Întoarce |
|---|---|
GET /types | limbile proiectului și tipurile, cu câmpurile lor |
GET /entries/{type} | intrările publicate ale unei colecții, câte o pagină |
GET /entries/{type}/{idOrSlug} | o intrare, după id sau după slug-ul din limba cerută |
GET /singletons/{type} | intrarea unui tip singleton |
Parametri
| Parametru | Exemplu | Ce face |
|---|---|---|
locale | ro | limba răspunsului; câmpurile netraduse cad pe limba principală |
fields | title,slug,date | doar aceste câmpuri; _id, _type, _locale, _publishedAt și _updatedAt vin mereu |
filter[field] | filter[series]=har | egalitate, pe câmpurile de la primul nivel |
filter[field][op] | filter[date][gte]=2026-01-01 | eq, ne, gt, gte, lt, lte, in (listă cu virgulă), exists (true sau false) |
sort | -date | published, updated sau un câmp; cu - în față, descrescător. Implicit -published |
limit | 20 | între 1 și 100, implicit 20 |
cursor | din nextCursor | pagina următoare; un cursor merge doar cu sortarea din care a venit |
populate | 1 | de la 0 la 3: referințele devin intrări întregi, până la adâncimea cerută |
filter, sort, limit și cursor sunt pentru liste; o intrare sau un singleton primesc locale, fields și populate.
Exemple
curl -H "Authorization: Bearer $MANIFOLIO_KEY" \
"https://api.manifolio.com/delivery/v1/$PROJECT/entries/article?locale=ro&fields=title,slug,author&populate=1&limit=10"
curl -H "Authorization: Bearer $MANIFOLIO_KEY" \
"https://api.manifolio.com/delivery/v1/$PROJECT/entries/event?filter[startsAt][gte]=2026-10-01&sort=startsAt"
curl -H "Authorization: Bearer $MANIFOLIO_KEY" \
"https://api.manifolio.com/delivery/v1/$PROJECT/singletons/site_settings"Răspunsuri
O listă:
{
"entries": [
{ "_id": "01a1b2c3-0000-7000-8000-000000000001", "_type": "article", "_locale": "ro",
"_publishedAt": "2026-10-12T09:00:00.000Z", "_updatedAt": "2026-10-12T08:55:00.000Z",
"title": "Primul articol", "slug": "primul-articol" }
],
"nextCursor": "eyJ2IjoxfQ"
}O intrare sau un singleton:
{ "entry": { "_id": "01a1b2c3-0000-7000-8000-000000000001", "_type": "article", "title": "Primul articol" } }O referință rămâne id-ul țintei până ceri populate. O referință spre o intrare nepublicată lipsește din răspuns.
Erori
Erorile au o singură formă: { "error": { "code": "missing_scope", "message": "This key needs the content:read scope." } }.
| Stare | Coduri |
|---|---|
| 400 | invalid_locale, invalid_limit, invalid_fields, invalid_sort, invalid_populate, invalid_filter, invalid_cursor |
| 401 | missing_key, invalid_key, key_revoked |
| 403 | publishable_key, missing_scope |
| 404 | project_not_found, type_not_found, entry_not_found |
Cache
- Răspunsurile stau în cache la margine, sub o cheie care conține versiunea de conținut a proiectului. Publicarea, retragerea, ștergerea sau schimbarea unui tip cresc versiunea, așa că o schimbare publicată se vede de la cererea următoare. Antetul
x-cachespuneHITsauMISS. - Fiecare răspuns are
ETag; dacă îl trimiți înapoi înIf-None-Match, primești304 Not Modified. - Pentru clienții tăi, API-ul trimite
Cache-Control: private, max-age=0, must-revalidate.
Preview API
Aceleași căi, sub /preview/v1/{projectId}/, întorc ultima versiune salvată a fiecărei intrări, inclusiv ciornele. Folosești o cheie cu scope-ul content:preview (cheile de dezvoltare îl au implicit). Răspunsurile de previzualizare nu stau niciodată în cache, iar fiecare intrare are și _status: draft, published sau changed.