Skip to Content
API ReferenceEntities API

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:

ParameterTypeDescription
includeInlineOnlyBooleanInclude 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:

ParameterTypeDescription
modelKeyString!Entity model key (e.g., “page”, “shopify-product”)
idID!Entity record ID
previewBooleanReturn latest draft instead of published
include[String!]Related fields to resolve
versionIdIDSpecific version ID (dev keys only)
versionNumberIntSpecific version number (dev keys only)
versionStateVersionStateVersion 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:

ParameterTypeDescription
modelKeyString!Entity model key
searchStringFull-text search query (min 2 chars)
limitIntMaximum records to return (default: 50)
offsetIntRecords to skip
filters[FilterInput!]Filter conditions
sortSortInputSort order
previewBooleanReturn latest drafts
include[String!]Related fields to resolve

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:

OperatorDescriptionExample Value
EQEquals"active"
NENot equals"archived"
LTLess than100
GTGreater than50
LTELess than or equal100
GTEGreater than or equal50
LIKEPattern match"%shirt%"
INIn array["a", "b"]
NOT_INNot in array["x", "y"]
IS_NULLIs nullnull
IS_NOT_NULLIs not nullnull

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:

ParameterTypeDescription
modelKeyString!Entity model key
idID!Entity record ID
versionIdIDSpecific 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 } }
Last updated on