Headless CMS Comparison - API
API
The APIs vary quite a bit between services. Here is what they all have in common.
- Web Access - Access to published and draft content via HTTPS web requests.
- Queries - Ability to query content based on certain field values and conditions.
- JSON Results - Results are delivered in JSON.
- Images - Serve and process images to resize and otherwise transform image assets.
- Workflow - Ability to query against published/production or draft/staging content.
- Manage Content - Ability to programmatically create, update and delete content entries.
API Queries
One important consideration is how queries are communicated to each API. REST APIs can be awkward and limiting for anything more than basic queries to retrieve a content entry or paginated list of entries based on basic filters. GraphQL helps address some issues, but the current GraphQL APIs still have significant short-comings, especially when compared to SQL.
API | Contentful | Contentstack | Hygraph | Kentico Cloud | webCOMAND |
Query Languages | REST, GraphQL | REST, GraphQL | GraphQL | REST | cQL, cPath |
Create Support | REST | REST | GraphQL | REST | Web Service |
Read Support | REST, GraphQL | REST, GraphQL | GraphQL | REST | Web Service |
Update Support | REST | REST | GraphQL | REST | Web Service |
Delete Support | REST | REST | GraphQL | REST | Web Service |
Select Specific Fields | ■ |
■ |
■ |
■ |
■ |
Query with AND/OR logic | ■ GraphQL only |
■ |
■ |
□ |
■ |
Relationship Depth | no limit | 1 | no limit | no limit | no limit |
Nested Conditions | ■ GraphQL only |
■ |
□ | □ | ■ |
Query Linked Content | ■ | ■ | ■ | □ | ■ |
Query Expressions | □ | □ | □ | □ | ■ |
Query Functions | □ | □ | □ | □ | ■ |
Query Localization | ■ | ■ | ■ | ■ | ■ |
=, != | ■ | ■ | ■ | ■ (missing !=) | ■ |
<, <=, >, >= | ■ | ■ | ■ | ■ | ■ |
IN, NOT IN, ANY | ■ | ■ | ■ | ■ (missing NOT) | ■ |
All, Not All | ■ | □ | □ | ■ (missing NOT) | □ |
CONTAINS, NOT CONTAINS | ■ | ■ (with regex) | ■ | ■ (missing NOT) | ■ (with LIKE) |
STARTS/ENDS WITH | □ | ■ (with regex) | ■ | □ | ■ (with LIKE) |
LIKE | □ | ■ (with regex) | □ | □ | ■ |
ILIKE (case-insensitive) | □ | □ | □ | □ | ■ |
RLIKE / REGEX | □ | ■ | □ | □ | ■ |
BETWEEN / Range | ■ (with and) | ■ (with and) | ■ (with and) | ■ | ■ |
EXISTS / ISNULL | ■ | ■ | ■ | □ | ■ |
Full Text Search (All Fields) |
■ | □ | □ | □ | ■ |
Full Text Search (Specific Fields) |
■ | □ | □ | □ | ■ |
Location (near) | ■ | □ | □ | □ | □ |
Location (rectangle) | ■ | □ | □ | □ | □ |
Location (radius) | ■ | □ | □ | □ | □ |
LIMIT/OFFSET | ■ | ■ | ■ | ■ | ■ |
ORDER BY | ★★★★★ |
★★★☆☆ (only one field) |
★★★★★ |
★★★☆☆ (only one field) |
★★★★★ |
Aggregation (count, min, max, concat) | ☆☆☆☆☆ |
☆☆☆☆☆ |
★★☆☆☆ (count) |
☆☆☆☆☆ |
★★★★★ |
Manage Assets | ■ | ■ | □ | ■ | ■ |
Manage Content Types | ■ | ■ | □ | ■ | ■ |
Manage Users | ■ | ■ | □ | □ | ■ |
Manage User Roles | ■ | ■ | □ | □ | ■ |
Define User Roles | ■ | □ | □ | □ | □ |
Webhooks | ■ | ■ | ■ | ■ | □ (programmable) |
CDN Hosting | ■ | ■ | ■ | ■ | □ |
Total Score | ★★★★☆ | ★★★☆☆ | ★★☆☆☆ | ★☆☆☆☆ | ★★★★☆ |
- API
Contentful organizes programmatic access to content and features into the following APIs.
- Content Delivery (REST) - A read-only API to deliver content to apps, websites and other media as JSON data, images, videos and other media files.
- Content Management (REST) - A read/write API to add, update and delete content.
- Content Preview (REST) - Similar to Content Delivery, except that it will retrieve draft content, instead of just published content. Useful for previewing content in a staging environment before publishing to production.
- Images (REST) - Serves, transforms and optimizes images.
- GraphQL (in beta) - A read-only GraphQL interface to similar functionality provided by the Content Delivery and Content Preview APIs, plus enhanced query capabilities.
- Sync API (REST) - Initially retrieves all content in a space and then subsequent content changes (aka “deltas”) to keep an external copy of a space, optionally restricted to certain content types.
- Query Languages - REST, GraphQL (read-only).
- Read Support - All of the REST APIs and the GraphQL API are used to access content and assets.
- Create Support - New content entries can be created via the REST Content Management API.
- Update Support - Existing content entries can be updated via the REST Content Management API.
- Delete Support - Existing content entries can be removed via the REST Content Management API.
- Query with AND/OR Logic - Supported by the GraphQL API, but not by the REST APIs.
- Nested Conditions - Supported by the GraphQL API, but not by the REST APIs.
- Query Expressions - Expressions like
WHERE Width*Height<MaxPixels
are not supported by any of the APIs. - Query Functions - Functions like DATEADD() and SUBSTR() are not supported.
- Comparison Options - all, in, nin, exists, match, gt, gte, lt, lte, ne, near, within
- Aggregation - Aggregation is not currently supported to gather count, min, max of queried top-level- or sub-content.
- Assets & Content - Assets and Content are managed via the REST Content Management API.
- Schema & Users - Content Types, Users and User Roles are managed via the REST Content Management API.
- API
Contentstack organizes programmatic access to content and features into the following APIs.
- Content Delivery (REST) - Read-only to fetch content.
- Content Management (REST) - Read-write to create/edit/delete entries and assets, manage content types, etc.
- GraphQL Content Delivery (in alpha) - A read-only GraphQL interface to similar functionality provided by the Content Delivery API, plus enhanced capabilities.
- Image Delivery (REST) - Read-only API to retrieve and manipulate images to deliver modified images, including resize, crop, trim, modify device pixel ratio, change quality, etc.
- Change Log - Lists all changes and upgrades introduced in Contentstack APIs.
- Query Languages - REST, GraphQL (read-only).
- Read Support - All of the REST APIs and the GraphQL API are used to access content and assets.
- Create Support - New content entries can be created via the REST Content Management API.
- Update Support - Existing content entries can be updated via the REST Content Management API.
- Delete Support - Existing content entries can be removed via the REST Content Management API.
- Query with AND/OR Logic - Supported by the REST and GraphQL APIs.
- Nested Conditions - Supported by the REST and GraphQL APIs.
- Query Expressions - Expressions like
WHERE Width*Height<MaxPixels
are not supported by any of the APIs. - Query Functions - Functions like DATEADD() and SUBSTR() are not supported.
- Comparison Options - in, nin, exists, regex, gt, gte, lt, lte, ne
- Aggregation - Aggregation is not currently supported to gather count, min, max of queried top-level- or sub-content.
- Assets & Content - Assets and Content are managed via the REST Content Management API.
- Schema & Users - Content Types, Users and User Roles are managed via the REST Content Management API. The API is extensive and supports almost any operation you may want to perform on your account, stack and content. The only missing feature seems to be defining User Roles through the API.
- API
Hygraph has a single GraphQL API. It supports both read (query) and write (mutation) operations. The documentation mentions a "Management API" and that it supports the creation and modification of projects and models, there is no further information.
- GraphQL - A read/write API to deliver and update content.
- Query Languages - GraphQL.
- Read Support - The GraphQL API is used to access content and assets.
- Create Support - New content entries can be created via the GraphQL API.
- Update Support - Existing content entries can be updated via the GraphQL API.
- Delete Support - Existing content entries can be removed via GraphQL API.
- Query with AND/OR Logic - Supported by the GraphQL API.
- Nested Conditions - Supported by the GraphQL API.
- Query Expressions - Expressions like
WHERE Width*Height<MaxPixels
are not supported. - Query Functions - Functions like DATEADD() and SUBSTR() are not supported.
- Comparison Options - equals, not, in, not_in, gt, gte, lt, lte, starts_with, ends_with, contains
- Aggregation - Aggregation is supported to gather count for relationships, but min, max and others are not available.
- Assets & Content - Content is managed via the GraphQL API. Assets can not be managed via API.
- Schema & Users - Management of Models, Users and User Roles is not currently supported via API.
- API
Kentico Cloud organizes programmatic access to content and features into the following APIs.
- Delivery API - Read-only access to content from your web applications and digital devices.
- Content Management API - Manage and publish content in Kentico Cloud.
- Custom Elements API - JavaScript API to implement custom elements and use methods.
- Recommendation API - Provide personalized content recommendations to your users.
- Query Languages - Custom REST filters.
- Read Support - The Delivery and Content Management APIS can access content and assets.
- Create Support - New content entries can be created via the REST Content Management API.
- Update Support - Existing content entries can be updated via the REST Content Management API.
- Delete Support - Existing content entries can be removed via the REST Content Management API.
- Query with AND/OR Logic - Not currently supported.
- Nested Conditions - Not currently supported.
- Query Linked Content - The APIs can not filter on linked content.
- Query Expressions - Expressions like
WHERE Width*Height<MaxPixels
are not supported by any of the APIs. - Query Functions - Functions like DATEADD() and SUBSTR() are not supported.
- Comparison Options - equals, gt, gte, lt, lte, range, in, contains, any, all (suprisingly, NOT is missing).
- Aggregation - Aggregation is not currently supported to gather count, min, max of queried top-level- or sub-content.
- Assets & Content - Assets and Content are managed via the REST Content Management API.
- Schema & Users - Content Types, Users and User Roles are managed via the REST Content Management API. The API is extensive and supports almost any operation you may want to perform on your account, stack and content. The only missing feature seems to be defining User Roles through the API.
- API
While the other services mostly support GraphQL, only webCOMAND provides a query language with capabilities similar to SQL, including capabilities critical to some projects and tasks:
- expressions - WHERE A + B < C
- functions - DATEDIFF(), IF(), ISNULL(), LENGTH(), ROUND(), etc.
- aggregates - AVG(), COUNT(), GROUP_CONCAT(), MIN(), MAX(), SUM()
Another unique difference is that content types, fields, users and other system configuration is managed as content, which means it can be queried and modified via the API just like content. So, there is no need to learn additional API end points, and it supports type introspection (access the schema of an entry as part of a query).
- Query Languages - cQL and cPath
- Read Support - The Get Web Service is used to access content and assets.
- Create Support - The Put Web Service is used to create content and assets.
- Update Support - The Put Web Service is used to update content and assets.
- Delete Support - The Delete Web Service is used to delete content and assets.
- Query with AND/OR Logic - Supported by cQL and cPath.
- Nested Conditions - Supported by cQL and cPath.
- Query Expressions - Expressions like
WHERE Width*Height<MaxPixels
are supported. - Query Functions - Functions like DATEADD() and SUBSTR() are supported.
- Comparison Options - =, !=, >, >=, <, <=, %, IN, NOT IN, LIKE, ILIKE, RLIKE, ISNULL
- Aggregation - COUNT, MIN, MAX, AVG, GROUP_CONCAT are supported.
- Assets & Content - Assets and Content are managed with the Web Services API.
- Schema & Users - Content Types, Users and other settings are managed with the Web Services API.