Query API Guidelines
Master GraphQL querying in BaseHub with comprehensive examples for layout and primitive blocks, filtering, ordering, and variants.
The Query API is GraphQL-based, allowing you to fetch content from your BaseHub repository using GraphQL queries.
Layout Blocks
These blocks typically contain other nested blocks. They're key to giving the repository a tree-like structure. They're all objects and share some common GraphQL keys:
_title: string
_slug: string, auto generated based on the title
_sys: object containing system fields like apiNamePath, createdAt, hash, id, idPath, lastModifiedAt, slug, slugPath, title
Document
A single document/page, for example "homepage", or "about page", or something more generic like "globals" or "settings".
Component
Like a document, but used to reutilize structures/schemas, like a "CTA", or even a section like "Features Grid Section", or a "Callout" to be used within a Rich Text block. It's quite flexible.
Instance
Which practically targets a Component and sticks to its structure.
List
Meant to be used for listing things. Gets its columns by targeting a Component and using it as "template". Has rows (instances), which are the actual items in the list. Useful for things like "Blog Posts", "Authors", "Categories", "Testimonials", etc.
List blocks have a GraphQL object with the following keys:
items: array of rows returned after applying sorts, filters, and pagination
item: grabs the first item from the items array
_meta: contains totalCount and filteredCount
List blocks receive optional arguments:
orderBy: enum for sorting (e.g.,
createdAt__DESC)filter: object for filtering based on field types
first: number, takes the first N items
skip: number, skips N items
Query Examples
Get the first 10 posts
{
posts(first: 10) {
items {
_id
_title
date
excerpt
body {
json {
content
}
}
}
}
}Get a specific post by slug
{
posts(filter: { _sys_slug: { eq: "my-blog-post-slug" } }) {
items {
_id
_title
date
excerpt
body {
json {
content
}
}
}
}
}Reference Blocks
Can target an Instance or a Component. Reference blocks take the structure of the component(s) they target:
If
acceptedTypeshas just one component id, it takes that component's structureIf
acceptedTypeshas multiple component ids, it becomes a union
Single Reference Type
{
demo {
author {
_title
xUsername
bio {
json {
content
}
}
}
}
}Multiple Reference Types (Union)
{
demo {
author {
... on Author {
_title
xUsername
bio {
json {
content
}
}
}
... on ExternalPerson {
_title
linkedinUrl
company
role
}
}
}
}Primitive Blocks
These blocks typically contain the largest parts of the content. An important prop is the isRequired prop, which makes the field nullable or non-nullable accordingly.
Text, Number, Boolean
Self explanatory primitive types.
Date
ISO date string.
Select
If multiple={true}, it returns an array of strings. Else, it returns a single string.
Media
An object with the following properties:
url: string (can receive args: width, height, format, quality, blur)
alt: string (nullable)
width, height: number (nullable)
blurDataURL: string (nullable)
mimeType, fileName: string
Rich Text
Rich text blocks have a GraphQL object with the following keys:
json: contains
content(JSON definition) and optionalblocksarraymarkdown: string representation
html: HTML representation
plainText: plain text representation
readingTime: number in minutes
Rich Text Examples
{
about {
subtitle {
json {
content
}
}
}
}Code Snippet
An object with code and language string properties.
Color
An object with hex, rgb, and hsl string properties.
Variant Sets
The variant set block is used to have different values for the same block. Different variants are defined inside a variant set block.
Get variant set information
{
settings {
languages {
variants {
id
isDefault
label
apiName
}
}
}
}Query specific variant
{
chapters {
items {
lessons(variants: { languages: es }) {
items {
transcription {
plainText
}
video {
url
}
}
}
}
}
}Common Errors
Missing items wrapper
❌ Incorrect:
{
posts(filter: { _sys_slug: { eq: "my-blog-post-slug" } }) {
_id
_title
date
}
}✅ Correct:
{
posts(filter: { _sys_slug: { eq: "my-blog-post-slug" } }) {
items {
_id
_title
date
}
}
}Missing content in rich text
❌ Incorrect:
{
about {
subtitle {
json
}
}
}✅ Correct:
{
about {
subtitle {
json {
content
}
}
}
}Incorrect variant placement
❌ Incorrect (variants on primitive blocks):
{
chapters {
items {
lessons {
items {
transcription(variants: { languages: es }) {
plainText
}
}
}
}
}
}✅ Correct (variants on layout blocks):
{
chapters {
items {
lessons(variants: { languages: es }) {
items {
transcription {
plainText
}
}
}
}
}
}