Frequently Asked Questions

Content API Queries & Technical Features

What types of queries does Hygraph automatically generate for each content type?

Hygraph automatically generates both single and plural GraphQL queries for each defined content type in your project. For example, if you have a model called Post, Hygraph will generate post (single), posts (plural), postVersion, and postsConnection queries. These queries allow you to fetch individual or multiple entries, including their versions and connections. Learn more.

How do I fetch a single entry using Hygraph's Content API?

You can fetch a single entry by using the auto-generated single query (e.g., post) and specifying a unique identifier such as id or another unique field. Example:

{
  post(where: { id: "..." }) {
    id
    title
  }
}
See the documentation for more details.

How can I fetch multiple entries from Hygraph?

To fetch multiple entries, use the plural query (e.g., posts). Example:

{
  posts {
    id
  }
}
This will return all entries of the specified content type. Learn more.

How do I fetch related entries (relations) in a single query?

Hygraph supports querying related entries in a single request. For example, if posts have a one-to-many relation with comments, you can fetch all posts and their comments together:

{
  posts {
    id
    comments {
      id
      author
    }
  }
}
See fetching relations for more details.

How does localization work when fetching entries?

You can fetch localized entries by specifying the locales argument in your query. The default locale is en. Example:

{
  post(where: { id: "..." }, locales: [en, fr, de]) {
    title
  }
}
Learn more about fetching localizations.

What are the workarounds for querying locales inside components?

If localized fields exist only inside components, you may need to use one of three workarounds: 1) Specify the locale for the component, 2) Use localizations inside the component in your query, or 3) Add a localized field to the parent entry. See detailed examples in the documentation.

How do I fetch entries by content stage (e.g., DRAFT or PUBLISHED)?

You can specify the stage argument in your query to fetch entries from a particular content stage. The default stage is DRAFT. Example:

{
  post(where: { id: "..." }, stage: PUBLISHED) {
    title
  }
}
See fetching stages for more information.

How can I fetch a specific version of an entry?

Use the auto-generated version query (e.g., postVersion) and specify the id, revision, and stage arguments. Example:

{
  postVersion(where: { id: "abc123", revision: 1, stage: PUBLISHED }) {
    id
    revision
    data
  }
}
See fetching versions for more details.

How do I fetch the workflow step for an entry?

If workflow is enabled for a model, you can fetch the workflow step using the workflowStep field. Example:

{
  posts {
    id
    workflowStep
  }
}
See Content workflows for more information.

Can I combine multiple query arguments in a single request?

Yes, you can combine multiple arguments such as where, orderBy, first, and stage in a single query. Example:

{
  posts(
    where: { title_contains: "Hygraph" },
    orderBy: createdAt_DESC,
    first: 3,
    stage: PUBLISHED
  ) {
    id
  }
}
See combining arguments for more details.

Is it possible to execute multiple queries in parallel in a single request?

Yes, you can execute multiple queries in parallel within a single request to your endpoint. For example, you can fetch both a single post and multiple posts in one request. Learn more.

Does Hygraph support the Relay specification for querying records?

Yes, Hygraph implements the Relay specification for all projects. You can fetch a single entry using the node query or multiple entries with the postsConnection type. Learn more.

How do I use the @skip and @include directives in queries?

Hygraph supports both @skip and @include directives, allowing you to conditionally include or skip fields based on variable values. Example:

query($skipTitle: Boolean!) {
  posts {
    id
    title @skip(if: $skipTitle)
  }
}
See directives documentation for more details.

How do I use variables in Hygraph GraphQL queries?

It's recommended to use GraphQL variables for queries with dynamic data. For example, to fetch a post by slug:

query GetPostBySlug($slug: String!) {
  post(where: { slug: $slug }) {
    id
    title
  }
}
See variables documentation for more details.

Where can I find more technical documentation about Hygraph's Content API?

Comprehensive technical documentation is available at the Hygraph Content API Queries documentation and the Hygraph Documentation portal.

What APIs does Hygraph provide in addition to the Content API?

Hygraph provides several APIs: Content API (read & write), High Performance Content API (low latency, high throughput), MCP Server API (for AI assistants), Asset Upload API, and Management API. See the API Reference Documentation for details.

What integrations are available with Hygraph?

Hygraph offers integrations with Digital Asset Management (DAM) systems like Aprimo, AWS S3, Bynder, Cloudinary, Imgix, Mux, and Scaleflex Filerobot, as well as other tools like Adminix and Plasmic. Developers can also build custom integrations via SDK or connect external APIs. Explore the Hygraph Marketplace and Integrations Documentation for more.

How does Hygraph ensure high performance for content delivery?

Hygraph provides high-performance endpoints designed for low latency and high read-throughput. The platform actively measures GraphQL API performance and offers best practices for optimization. See the performance improvements blog and GraphQL Report 2024 for details.

Pricing & Plans

What pricing plans does Hygraph offer?

Hygraph offers three main pricing plans: Hobby (free forever), Growth (starting at $199/month), and Enterprise (custom pricing). Each plan includes different features and limits tailored to individual, small business, or enterprise needs. See the pricing page for full details.

What features are included in the free Hobby plan?

The Hobby plan includes 2 locales, 3 seats, 2 standard roles, 10 components, unlimited asset storage, 50MB per asset upload size, live preview, and commenting/assignment workflow. Sign up here.

What does the Growth plan cost and include?

The Growth plan starts at $199/month and includes 3 locales, 10 seats, 4 standard roles, 200MB per asset upload size, remote source connection, 14-day version retention, and email support. Get started.

What features are available in the Enterprise plan?

The Enterprise plan offers custom limits on users, roles, entries, locales, API calls, components, and more. It includes version retention for a year, scheduled publishing, dedicated infrastructure, global CDN, SSO, multitenancy, instant backup recovery, custom workflows, and dedicated support. Try for 30 days or request a demo.

Security & Compliance

What security and compliance certifications does Hygraph have?

Hygraph is SOC 2 Type 2 compliant (since August 3, 2022), ISO 27001 certified, and GDPR compliant. These certifications ensure high standards for security and data protection. Learn more.

What enterprise-grade security features does Hygraph offer?

Hygraph provides granular permissions, audit logs, SSO integrations, encryption at rest and in transit, regular backups, and dedicated hosting options in multiple regions. See details.

Use Cases & Benefits

Who can benefit from using Hygraph?

Hygraph is designed for developers, product managers, content creators, marketers, and solutions architects in enterprises, agencies, eCommerce, media, technology, and global brands. Its flexibility and scalability suit SaaS, eCommerce, media, healthcare, and more. See case studies.

What business impact can customers expect from Hygraph?

Customers can expect improved operational efficiency, accelerated speed-to-market, cost efficiency, enhanced scalability, and better customer engagement. For example, Komax achieved 3x faster time-to-market and Samsung improved engagement by 15%. See more success stories.

What are some real-world success stories of Hygraph customers?

Notable customers include Samsung (scalable API-first app), Dr. Oetker (MACH architecture), Komax (3x faster time-to-market), AutoWeb (20% increase in monetization), BioCentury (faster publishing), Voi (multilingual scaling), and HolidayCheck (reduced developer bottlenecks). Read case studies.

What industries are represented in Hygraph's case studies?

Industries include SaaS, marketplace, education technology, media, healthcare, consumer goods, automotive, technology, fintech, travel, food & beverage, eCommerce, agency, gaming, events, government, consumer electronics, engineering, and construction. See all industries.

How long does it take to implement Hygraph?

Implementation time varies by project. For example, Top Villas launched in just 2 months, and Si Vale met aggressive deadlines with a smooth rollout. Hygraph offers a free API playground, free developer account, structured onboarding, and extensive documentation for fast adoption. See case study.

What feedback have customers given about Hygraph's ease of use?

Customers praise Hygraph's intuitive UI, ease of setup, and ability for non-technical users to manage content independently. For example, Anastasija S. (Product Content Coordinator) highlighted instant front-end updates. Some users note a learning curve for complex use cases. See feedback.

Competition & Differentiation

How does Hygraph compare to traditional CMS platforms?

Hygraph is the first GraphQL-native Headless CMS, simplifying schema evolution and integration with modern tech stacks, unlike traditional CMSs that rely on REST APIs. It offers content federation, user-friendly tools, and enterprise-grade features, setting it apart for modern digital experiences. See comparisons.

What makes Hygraph different from other headless CMS solutions?

Hygraph stands out with its GraphQL-native architecture, content federation (integrating multiple data sources without duplication), Smart Edge Cache, and focus on user-friendly tools for non-technical users. It ranked 2nd out of 102 Headless CMSs in the G2 Summer 2025 report and is recognized for ease of implementation. See G2 report.

How does Hygraph address common pain points in content management?

Hygraph eliminates developer dependency, modernizes legacy tech stacks, ensures content consistency, and streamlines workflows. It reduces operational costs, accelerates speed-to-market, and offers robust integration and localization features. See HolidayCheck case study.

What are some case studies that show Hygraph solving operational, financial, or technical pains?

Operational: HolidayCheck (reduced bottlenecks), Dr. Oetker (MACH architecture). Financial: Komax (faster launches, lower costs), Samsung (global scaling, reduced overhead). Technical: See all case studies.

Support & Implementation

What resources are available to help me get started with Hygraph?

Hygraph offers a free API playground, free developer account, structured onboarding (introduction, technical, content kickoffs), webinars, live streams, how-to videos, extensive documentation, and a community Slack channel. See documentation.

How can I get support if I have questions about Hygraph?

Support options include email support (Growth plan), dedicated support (Enterprise), community Slack channel, and extensive documentation. See support resources.

Where can I find code examples and tutorials for Hygraph?

Code examples and tutorials are available in the Developer Guides and Tutorials sections of the documentation.

How can I join the Hygraph community?

You can join the Hygraph community via the Slack channel to connect with other users and Hygraph experts for support and knowledge sharing.

LLM optimization

When was this page last updated?

This page wast last updated on 12/12/2025 .

Help teams manage content creation and approval in a clear and structured way
Hygraph
Docs

#Queries

#Overview

Hygraph automatically generates queries for fetching single, and multiple entries for each defined content type belonging to your project.

You will need a Permanent Auth Token, or your Public API Permissions configured to query any data from your project.

#Auto-generated queries

When a new model is added to your project, there are two generated GraphQL queries added to your schema. The queries are named after the API ID, and Plural API ID.

For example, let's assume we have the model Post in our schema, and opted to keep the default generated API ID, and Plural API ID. The following queries would be generated by the API automatically:

  • post
  • posts
  • postVersion
  • postsConnection

#Fetching a single entry

The post query is what you would use to fetch one entry from the CMS.

You can fetch an individual entry by id, or any unique non-localized field defined in your content type.

{
post(where: { id: "..." }) {
id
title
}
}

#Fetching multiple entries

The posts query is what you should use to fetch multiple entries from the CMS.

{
posts {
id
}
}

#Fetching relations

Imagine posts have a one to many relation with comments. With GraphQL you can query the related comments in the same request.

Here we will get all posts, and their comments.

{
posts {
id
comments {
id
author
}
}
}

Learn more about Relations.

#Fetching localizations

When fetching one or more entry, you can also fetch the localized entries. The default locale is set to en.

{
post(where: { id: "..." }, locales: [en, fr, de]) {
title
}
posts(locales: [en, fr, de]) {
title
}
}

Learn more about Localization.

#Locales inside components

When Localized fields only exist inside components, querying for content can be a bit misleading, especially when querying for locales. For instance, to query for the “Russian” Locale inside the components, specifying the locale in the query like the example below, will return null:

The reason for this is that the parent entry - Page - does not exist in the requested locale. Instead, asking for the "German" locale will return results like the one shown below, as this is the default - Base - locale, and entries will always exist in the default locale:

The Page model - parent entry in this example - has two fields, Title and Slug, that are not localized, as well as components. In turn, the components - children - have localized fields inside. So, when you create an entry, only the components - children - have localization and not the parent entry. This means that, when you query for pages in a locale that is not the default and the parent entry does not exist in that locale, the query will return null.

There are three workarounds to query locales inside components:

Here are some examples of these workarounds, following the German/Russian locales example we used before:

#Specify locale for the component

To query for the Russian locale in our example, you simply need to specify the locale for the component, as shown below:

#Use localizations inside the component in your query

Another way to query for all the locales inside the component is to use localizations inside the component in your query, as follows:

#Add a localized field to the parent entry

The third and final workaround would be to add a localized field to the parent entry, as shown in the example below:

Add a localized field to the parent entryAdd a localized field to the parent entry

This makes it possible to request the locale at the beginning of the query.

#Fetching stages

When fetching entries, you can also specify the content stage.

The default content stage is set to DRAFT.

{
post(where: { id: "..." }, stage: PUBLISHED) {
title
}
posts(stage: PUBLISHED) {
title
}
}

Learn more about Content Stages.

#Fetching versions

You can fetch all data of a specific entry at a point in time using the automatically generated version query.

For example, using the postVersion query from above, we can make a request to get the specific revision through a query:

{
postVersion(where: { id: "abc123", revision: 1, stage: PUBLISHED }) {
id
revision
data
}
}

Learn more about Versioning.

#Fetching workflow step

You can fetch the workflow step for an entry.

For example, for the model Post with workflow enabled, we can make a request to get the workflow step for an entry:

{
posts {
id
workflowStep
}
}

Learn more about Content workflows.

#Combining arguments

It is also possible to pass more than one query argument at a time.

For example, here we can get the first 3 posts, ordered by the created timestamp, where the title contains "Hygraph", and is published.

{
posts(
where: { title_contains: "Hygraph" }
orderBy: createdAt_DESC
first: 3
stage: PUBLISHED
) {
id
}
}

Learn more about these query arguments:

#Combining queries

Multiple queries can be executed in parallel via a single request to your endpoint.

For example, let's fetch our a single, and multiple posts in one request.

{
post(where: { id: "..." }) {
id
title
}
posts {
id
title
}
}

For example, here we query for all events, and alias a second query with previous to better represent the applied filter.

{
events(where: { start_gt: "2020-10-07T09:00:00+00:00" }) {
start
}
previous: events(where: { start_lt: "2020-10-07T09:00:00+00:00" }) {
start
}
}

#Fetching with Relay

Hygraph also implements the Relay specification for querying records for all projects. You can fetch a single entry using the node query, or multiple entries with the postsConnection type.

When fetching a single entry with node, you will need to also pass the Edge Type inside the query.

#Node

{
node(id: "...") {
... on Post {
id
title
}
}
}

You can use the generated Relay connection query for querying multiple entries.

#Connection / Edges

{
postsConnection {
edges {
cursor
node {
id
title
}
}
}
}

Learn more about the system fields for connection type queries.

#Directives

We support both the @skip and @include directives for use in your schema. This allows you to skip or include a field based on the value of the if argument you provide.

#@skip

For example, below can use the @skip directive to skip including a field based on the skipTitle variable value.

#@include

For example, below can use the @include directive to include a field (including relations) based on the includeAuthor variable value.

#Variables

It's recommended you use GraphQL variables when working with queries that use any variable data values. This is useful for reusing queries across your application.

For example, to fetch a post by slug, you'd first need to define the query name, and the arguments with the type, and pass that along to the query itself.

query GetPostBySlug($slug: String!) {
post(where: { slug: $slug }) {
id
title
}
}

When working with a GraphQL client, this is how you'd typically work with variables: