Entities API
The Entities API provides a unified interface for querying and managing content records. All content types (pages, products, collections, custom types) are accessed through the same API.
Queries
entityModels
Get available entity models for your project.
query GetEntityModels {
entityModels {
key
name
pluralName
description
editorMode
fields {
key
type
label
required
isTranslatable
}
modes {
records
inline
publicApi
}
}
}Parameters:
| Parameter | Type | Description |
|---|---|---|
includeInlineOnly | Boolean | Include models that can only be used as field types |
entity
Get a single entity record by ID.
query GetEntity($modelKey: String!, $id: ID!) {
entity(modelKey: $modelKey, id: $id) {
id
modelKey
naturalKey
data
translations
metadata
versionNumber
publishedVersionNumber
status
createdAt
updatedAt
}
}Parameters:
| Parameter | Type | Description |
|---|---|---|
modelKey | String! | Entity model key (e.g., “page”, “shopify-product”) |
id | ID! | Entity record ID |
preview | Boolean | Return latest draft instead of published |
include | [String!] | Related fields to resolve |
versionId | ID | Specific version ID (dev keys only) |
versionNumber | Int | Specific version number (dev keys only) |
versionState | VersionState | Version selection mode (dev keys only) |
Example with related entities:
query GetPageWithAuthor {
entity(modelKey: "page", id: "page_123", include: ["author", "category"]) {
id
data
# author and category fields will be fully resolved
}
}entities
List entity records with filtering, search, and pagination.
query ListProducts($limit: Int, $offset: Int, $filters: [FilterInput!]) {
entities(
modelKey: "shopify-product"
limit: $limit
offset: $offset
filters: $filters
sort: { field: "createdAt", direction: DESC }
) {
items {
id
naturalKey
data
status
}
total
hasMore
}
}Parameters:
| Parameter | Type | Description |
|---|---|---|
modelKey | String! | Entity model key |
search | String | Full-text search query (min 2 chars) |
limit | Int | Maximum records to return (default: 50) |
offset | Int | Records to skip |
filters | [FilterInput!] | Filter conditions |
sort | SortInput | Sort order |
preview | Boolean | Return latest drafts |
include | [String!] | Related fields to resolve |
Search
Use the search parameter for full-text search across entity records:
query SearchProducts($query: String!) {
entities(
modelKey: "shopify-product"
search: $query
limit: 20
) {
items {
id
naturalKey
data
}
total
}
}Search matches against:
naturalKey(slug/handle)metadata.name(display name)
Filtering
Use FilterInput to filter results:
query FilteredProducts {
entities(
modelKey: "shopify-product"
filters: [
{ field: "status", operator: EQ, value: "PUBLISHED" }
{ field: "data.price", operator: GTE, value: 100 }
{ field: "data.category", operator: IN, value: ["electronics", "gadgets"] }
]
) {
items {
id
data
}
}
}Filter Operators:
| Operator | Description | Example Value |
|---|---|---|
EQ | Equals | "active" |
NE | Not equals | "archived" |
LT | Less than | 100 |
GT | Greater than | 50 |
LTE | Less than or equal | 100 |
GTE | Greater than or equal | 50 |
LIKE | Pattern match | "%shirt%" |
IN | In array | ["a", "b"] |
NOT_IN | Not in array | ["x", "y"] |
IS_NULL | Is null | null |
IS_NOT_NULL | Is not null | null |
listEntityVersions
List version history for an entity (development keys only).
query GetVersionHistory {
listEntityVersions(entityId: "page_123", limit: 10) {
versions {
id
versionNumber
state
createdAt
createdBy
changeDescription
name
isCurrentDraft
isActive
}
total
hasMore
}
}Mutations
createEntity
Create a new entity record.
mutation CreatePage($data: JSON!, $translations: JSON) {
createEntity(
modelKey: "page"
data: $data
translations: $translations
) {
id
naturalKey
versionNumber
status
}
}Variables:
{
"data": {
"title": "About Us",
"slug": "about",
"content": "Welcome to our company..."
},
"translations": {
"ja-JP": {
"title": "会社概要",
"content": "会社へようこそ..."
}
}
}Required scope: entities:write
updateEntity
Update an existing entity record. Creates a new draft version.
mutation UpdatePage($id: ID!, $data: JSON!) {
updateEntity(
modelKey: "page"
id: $id
data: $data
) {
id
versionNumber
status
}
}Required scope: entities:write
publishEntity
Publish an entity record.
mutation PublishPage($id: ID!) {
publishEntity(modelKey: "page", id: $id) {
id
status
publishedVersionNumber
}
}Parameters:
| Parameter | Type | Description |
|---|---|---|
modelKey | String! | Entity model key |
id | ID! | Entity record ID |
versionId | ID | Specific version to publish (defaults to latest) |
Required scope: entities:publish
unpublishEntity
Unpublish an entity record.
mutation UnpublishPage($id: ID!) {
unpublishEntity(modelKey: "page", id: $id) {
id
status
}
}Required scope: entities:publish
deleteEntity
Soft delete an entity record.
mutation DeletePage($id: ID!) {
deleteEntity(modelKey: "page", id: $id) {
success
message
}
}Required scope: entities:delete
Batch Operations
For bulk operations, use the batch mutations to process multiple records in a single request.
createEntities
Create multiple entity records in a single request (max 100 items).
mutation CreatePages($items: [CreateEntityInput!]!) {
createEntities(modelKey: "page", items: $items) {
results {
success
record {
id
naturalKey
}
error
errorCode
}
successCount
failureCount
}
}Variables:
{
"items": [
{ "data": { "title": "Page 1", "slug": "page-1" } },
{ "data": { "title": "Page 2", "slug": "page-2" } },
{ "data": { "title": "Page 3", "slug": "page-3" } }
]
}Required scope: entities:write
updateEntities
Update multiple entity records in a single request (max 100 items).
mutation UpdatePages($items: [UpdateEntityInput!]!) {
updateEntities(modelKey: "page", items: $items) {
results {
success
record {
id
versionNumber
}
error
errorCode
}
successCount
failureCount
}
}Variables:
{
"items": [
{ "id": "page_1", "data": { "title": "Updated Page 1" } },
{ "id": "page_2", "data": { "title": "Updated Page 2" } }
]
}Required scope: entities:write
Batch Result Handling
Batch operations support partial success. Always check each result:
const { data } = await client.mutate({
mutation: CREATE_ENTITIES,
variables: { items }
});
const { results, successCount, failureCount } = data.createEntities;
// Handle successes
const created = results.filter(r => r.success).map(r => r.record);
// Handle failures
const errors = results
.filter(r => !r.success)
.map((r, i) => ({ index: i, error: r.error, code: r.errorCode }));
if (errors.length > 0) {
console.error(`${failureCount} items failed:`, errors);
}Types Reference
EntityRecord
type EntityRecord {
id: ID!
modelKey: String!
naturalKey: String
data: JSON!
translations: JSON
metadata: JSON
versionNumber: Int!
publishedVersionNumber: Int
status: EntityStatus!
createdAt: DateTime!
updatedAt: DateTime!
}EntityStatus
enum EntityStatus {
DRAFT # Has unpublished changes
PUBLISHED # Published and live
ARCHIVED # Soft deleted
}VersionState
enum VersionState {
ACTIVE # Published version (default)
LATEST # Latest draft
SPECIFIC # Use with versionId/versionNumber
}Examples
Get Page by Slug
query GetPageBySlug($slug: String!) {
entities(
modelKey: "page"
filters: [{ field: "naturalKey", operator: EQ, value: $slug }]
limit: 1
) {
items {
id
data
}
}
}List Published Products
query ListPublishedProducts {
entities(
modelKey: "shopify-product"
filters: [{ field: "status", operator: EQ, value: "PUBLISHED" }]
sort: { field: "updatedAt", direction: DESC }
limit: 20
) {
items {
id
naturalKey
data
metadata
}
total
}
}Create and Publish
mutation CreateAndPublish($data: JSON!) {
# Step 1: Create
created: createEntity(modelKey: "page", data: $data) {
id
}
}
# Then in a second request:
mutation Publish($id: ID!) {
publishEntity(modelKey: "page", id: $id) {
id
status
}
}