{"name":"Content Delivery API","version":"1.0","baseUrl":"https://contentapi.hormona.io","description":"A read-only, Contentful-compatible delivery API. Point an existing Contentful integration at this base URL, swap the space id and access token, and your requests keep working — same paths, same search parameters, same response shapes, same error bodies.","authentication":{"header":"Authorization: Bearer <api_key>","queryParameter":"access_token=<api_key>","note":"API keys are generated in the dashboard under Organization settings → API keys. A key grants read access to every space of its organization. Keys are shown once at generation time and stored only as hashes."},"endpoints":[{"id":"get-space","method":"GET","path":"/spaces/{space_id}","title":"Get a space","description":"The space's name and locale codes.","exampleResponse":{"sys":{"type":"Space","id":"{space_id}"},"name":"My space","locales":["en-US","sv-SE"]}},{"id":"get-environment","method":"GET","path":"/spaces/{space_id}/environments/{environment_id}","title":"Get an environment","description":"One environment of the space. Every other path also works without the /environments segment, in which case the master environment is assumed.","exampleResponse":{"sys":{"type":"Environment","id":"master","space":{"sys":{"type":"Link","linkType":"Space","id":"{space_id}"}}},"name":"master"}},{"id":"get-content-types","method":"GET","path":"/spaces/{space_id}/environments/{environment_id}/content_types","title":"Get the content model","description":"All content types of the environment, in a collection envelope. Supports limit and skip.","exampleResponse":{"sys":{"type":"Array"},"total":1,"skip":0,"limit":100,"items":[{"sys":{"type":"ContentType","id":"blogPost","revision":3},"name":"Blog Post","description":null,"displayField":"title","fields":[{"id":"title","name":"Title","type":"Symbol","localized":true,"required":true,"disabled":false,"omitted":false,"validations":[]}]}]}},{"id":"get-content-type","method":"GET","path":"/spaces/{space_id}/environments/{environment_id}/content_types/{content_type_id}","title":"Get a single content type","description":"One content type by id."},{"id":"get-entries","method":"GET","path":"/spaces/{space_id}/environments/{environment_id}/entries","title":"Get all entries","description":"Published entries of the environment. Accepts the full search parameter set — filtering, full-text search, ordering, pagination, field selection, locales and link resolution.","parameters":"search","exampleRequest":"/spaces/{space_id}/entries?content_type=blogPost&fields.rating[gte]=3&order=-sys.createdAt&limit=10","exampleResponse":{"sys":{"type":"Array"},"total":42,"skip":0,"limit":10,"items":[{"metadata":{"tags":[]},"sys":{"space":{"sys":{"type":"Link","linkType":"Space","id":"{space_id}"}},"id":"5KsDBWseXY6QegucYAoacS","type":"Entry","createdAt":"2026-01-10T09:12:00.000Z","updatedAt":"2026-02-02T14:30:00.000Z","environment":{"sys":{"type":"Link","linkType":"Environment","id":"master"}},"publishedVersion":4,"revision":4,"contentType":{"sys":{"type":"Link","linkType":"ContentType","id":"blogPost"}},"locale":"en-US"},"fields":{"title":"Hello world","rating":5,"author":{"sys":{"type":"Link","linkType":"Entry","id":"2Fg9aQyzRimIoIuqekoiqW"}}}}],"includes":{"Entry":[{"sys":{"type":"Entry","id":"2Fg9aQyzRimIoIuqekoiqW","contentType":{"sys":{"type":"Link","linkType":"ContentType","id":"author"}}},"fields":{"name":"Alice Example"}}]}}},{"id":"get-entry","method":"GET","path":"/spaces/{space_id}/environments/{environment_id}/entries/{entry_id}","title":"Get a single entry","description":"One published entry by id. Supports the locale parameter. Draft-only entries return 404."},{"id":"get-assets","method":"GET","path":"/spaces/{space_id}/environments/{environment_id}/assets","title":"Get all assets","description":"Assets of the space. Supports search parameters including mimetype_group.","parameters":"search","exampleRequest":"/spaces/{space_id}/assets?mimetype_group=image&order=-sys.createdAt"},{"id":"get-asset","method":"GET","path":"/spaces/{space_id}/environments/{environment_id}/assets/{asset_id}","title":"Get a single asset","description":"One asset by id, with its file url, size and MIME type.","exampleResponse":{"metadata":{"tags":[]},"sys":{"type":"Asset","id":"7Ljbes4WjYSQMuiWUUuYQk","revision":1,"locale":"en-US"},"fields":{"title":"Team photo","file":{"url":"https://firebasestorage.googleapis.com/…/team.jpg","fileName":"team.jpg","contentType":"image/jpeg","details":{"size":128512,"image":{"width":1600,"height":900}}}}}},{"id":"get-locales","method":"GET","path":"/spaces/{space_id}/environments/{environment_id}/locales","title":"Get all locales","description":"The locales of the space, marking the default and fallback codes.","exampleResponse":{"sys":{"type":"Array"},"total":2,"skip":0,"limit":100,"items":[{"code":"en-US","name":"en-US","default":true,"fallbackCode":null,"sys":{"id":"en-US","type":"Locale","version":1}},{"code":"sv-SE","name":"sv-SE","default":false,"fallbackCode":"en-US","sys":{"id":"sv-SE","type":"Locale","version":1}}]}}],"searchParameters":[{"name":"content_type","appliesTo":["entries"],"description":"Filter entries by content type id. Required whenever you filter, order or select on fields."},{"name":"select","appliesTo":["entries","assets"],"description":"Comma-separated projection of properties to return, up to depth 2.","example":"select=sys.id,fields.title"},{"name":"order","appliesTo":["entries","assets"],"description":"Comma-separated sort attributes; prefix an attribute with - for descending.","example":"order=-sys.createdAt,sys.id"},{"name":"limit","appliesTo":["entries","assets"],"description":"Page size. Default 100, maximum 1000.","example":"limit=25"},{"name":"skip","appliesTo":["entries","assets"],"description":"Pagination offset. Default 0.","example":"skip=50"},{"name":"include","appliesTo":["entries"],"description":"Depth of linked entry/asset resolution into includes.Entry and includes.Asset. Default 1, maximum 10, 0 disables.","example":"include=2"},{"name":"locale","appliesTo":["entries","assets"],"description":"Locale code to resolve fields in, or * to return every locale as a map.","example":"locale=sv-SE"},{"name":"query","appliesTo":["entries"],"description":"Full-text search across all text fields of all locales. Every whitespace-separated term must match somewhere.","example":"query=design system"},{"name":"links_to_entry","appliesTo":["entries"],"description":"Only entries that contain a link to the given entry id.","example":"links_to_entry=5KsDBWseXY6QegucYAoacS"},{"name":"links_to_asset","appliesTo":["entries"],"description":"Only entries that contain a link to the given asset id.","example":"links_to_asset=7Ljbes4WjYSQMuiWUUuYQk"},{"name":"mimetype_group","appliesTo":["assets"],"description":"Filter assets by MIME group: image, video, audio, plaintext, richtext, markup, code, pdfdocument, archive, spreadsheet, presentation, attachment.","example":"mimetype_group=image"}],"operators":[{"operator":"(equality)","description":"Exact match. On array fields it matches when the array contains the value.","example":"fields.title=Hello%20world"},{"operator":"[ne]","description":"Not equal.","example":"fields.status[ne]=archived"},{"operator":"[in]","description":"Matches any of the comma-separated values.","example":"fields.category[in]=news,press"},{"operator":"[nin]","description":"Matches none of the comma-separated values.","example":"fields.category[nin]=news,press"},{"operator":"[all]","description":"Array field must contain all comma-separated values.","example":"fields.tags[all]=flowers,accessories"},{"operator":"[exists]","description":"Whether the field has a value (true/false).","example":"fields.subtitle[exists]=true"},{"operator":"[lt] [lte] [gt] [gte]","description":"Range comparisons on numbers and ISO 8601 dates.","example":"sys.createdAt[gte]=2026-01-01T00:00:00Z"},{"operator":"[match]","description":"Case-insensitive full-text search scoped to one field (plain text of rich text included).","example":"fields.body[match]=roadmap"},{"operator":"[near]","description":"On Location fields: sorts results by distance to lat,lon.","example":"fields.center[near]=59.33,18.06"},{"operator":"[within]","description":"On Location fields: bounding box lat1,lon1,lat2,lon2 or circle lat,lon,radiusKm.","example":"fields.center[within]=59,17,60,19"}],"errors":[{"id":"BadRequest","status":400,"description":"A parameter has an invalid value (e.g. limit above 1000, unknown locale)."},{"id":"InvalidQuery","status":400,"description":"Unknown query parameter, malformed operator, or a fields query without content_type."},{"id":"AccessTokenInvalid","status":401,"description":"Missing or unknown API key."},{"id":"NotFound","status":404,"description":"The resource does not exist, or the key's organization has no access to it."},{"id":"NotImplemented","status":501,"description":"The endpoint exists in Contentful but is not supported here (currently /sync)."},{"id":"ServerError","status":500,"description":"Unexpected server error."}],"notSupported":["/sync (synchronization)","GraphQL","cursor-based pagination (cursor / pageNext / pagePrev)"]}