The GraphQL API can be accessed on https://graphql.umbraco.io, it accepts POST requests with the content type application/json. The body must be JSON and contain a query field with the query as a string and an optional variables field containing the variables.
In order to access the data for your Umbraco Heartcore project you need to provide a project identifier (Project Alias) via an HTTP Header or a Querystring parameter.
The Project Alias is an HTTP friendly version of the Project Name under your Umbraco Cloud account.
Access via Umb-Project-Alias header
POST https://graphql.umbraco.io/Umb-Project-Alias:{project-alias}
Authorization
By default the GraphQL API is not protected. This can be enabled through the Backoffice, where API keys for each user in the Backoffice is also managed.
To access the GraphQL API the user must have access to the Content section and have the Browse Node permission.
Access via an Api-Key header
POST https://graphql.umbraco.io/Api-Key:{api-key}
Preview
The GraphQL API supports fetching draft content, this can be done by passing a preview argument to the root query fields.
Fetching draft content requires an API Key to be passed with the request.
query { content(preview: true) { name }}
Persisted queries
The GraphQL API supports persisted queries, running a persisted query can be done using the following payload in the Graphql request:
Documentation on how to filter and order collections with the GraphQL API.
Filtering and Ordering
Documentation for GraphQL filtering in Umbraco Heartcore.
The GraphQL API allows for filtering and ordering root and traversion collections (ancestors, children and descendants).
For information on the different filters available and how the filter and order types are generated see Schema Generation.
Using filters
To start filtering the content, an where argument can be passed to the collection query. E.g. to find all products where it's price is higher than 100 we can write the following query.
Filters can be combined with AND and OR, e.g. if we want to find all content on level 2 or 3 that is updated after 2020-03-13 we write the following query.
We can combine AND, OR and NOT in a single query e.g. if we wan't to get all content on level 1 or 2 that does not start with b or j we can write the following query.
Filtering can also be applied to types returning Content and Media, e.g. if we want all content of type Post where the author name is Rasmus, we can write the following query.
The collection can also return draft content by passing the preview argument with a boolean to the query. Draft content is always protected and requires an Api-Key.
Lets say we want to show all our products that haven't been published, we can write the following query.
We can even add multiple values to the orderBy argument to order by multiple fields. E.g. if we want to order products by price and then by name, we write the following query.
We can also limit the number of results returned by paging. To achieve this one can use first and after to do forward paging and last and before to do backward paging.
The cursor can be obtained by including the cursor field on an edge e.g. to get the first 50 products we can write the following query.
We can then use the cursor from the last item to get items that appear after that one. We can also request the PageInfo object which holds information on the start and end cursors and if there are more pages.
first can only be used in combination withafter, and last can only used with before.
Also hasNextPage is only populated when doing forward paging andasPreviousPage is populated when doing backward paging.
Everything shown up until now can be combined in a single query, the following query will get the first 50 products where the price is greater than 100 and order the result in ascending order by price and then by name.
Documentation for Umbraco Heartcore GraphQL property editors and their types
Supported Property Editors
Below is a list of all the supported built-in Umbraco Property Editors and their GraphQL types. The type may depend on the configuration of the specific Property Editor.
Include labels?: false
GraphQL Type: String
Can be used for filtering: true
Content Picker
Editor Alias: Umbraco.ContentPicker
GraphQL Type: Content
Can be used for filtering: true
Date/Time
Editor Alias: Umbraco.DateTime
GraphQL Type: DateTime
Can be used for filtering: true
Decimal
Editor Alias: Umbraco.Decimal
GraphQL Type: Decimal
Can be used for filtering: true
Dropdown
Editor Alias: Umbraco.DropDown.Flexible
GraphQL Type: [String]
Can be used for filtering: true
Email address
Editor Alias: Umbraco.EmailAddress
GraphQL Type: String
Can be used for filtering: true
File upload
Editor Alias: Umbraco.UploadField
GraphQL Type: String
Can be used for filtering: true
Form Picker
Editor Alias: UmbracoForms.FormPicker
GraphQL Type: JSON
Can be used for filtering: false
Google Maps Single Marker
Editor Alias: Our.Umbraco.GMaps
GraphQL Type: OurUmbracoGMaps
Can be used for filtering: false
Grid layout
The grid editor Data Type in Heartcore is deprecated and will be retired in June 2025 or thereafter. For more information read the following blog post.
Editor Alias: Umbraco.Grid
GraphQL Type: JSON
Can be used for filtering: false
Image Cropper
Editor Alias: Umbraco.ImageCropper
GraphQL Type: ImageCropper
Can be used for filtering: false
Label
Editor Alias: Umbraco.Label
GraphQL Type: String
Can be used for filtering: true
Markdown Editor
Editor Alias: Umbraco.MarkdownEditor
GraphQL Type: HTML
Can be used for filtering: false
Media Picker
Editor Alias: Umbraco.MediaPicker3
Pick Multiple items: true
GraphQL Type: [MediaWithCrops]
Can be used for filtering: false
Pick Multiple items: false
GraphQL Type: MediaWithCrops
Can be used for filtering: false
Media Picker (legacy)
Editor Alias: Umbraco.MediaPicker
Pick Multiple items: true
GraphQL Type: [Media]
Can be used for filtering: true
Pick Multiple items: false
GraphQL Type: Media
Can be used for filtering: true
Multi Url Picker
Editor Alias: Umbraco.MultiUrlPicker
Maximum number of items: 1
GraphQL Type: Link Can be used for filtering: false
Maximum number of items: not 1
GraphQL Type: [Link] Can be used for filtering: false
Multinode Treepicker
Editor Alias: Umbraco.MultiNodeTreePicker
Node type: Content
Maximum number of items: 1
GraphQL Type: Content
Can be used for filtering: true
Node type: Content
Maximum number of items: not 1
GraphQL Type: [Content]
Can be used for filtering: true
Node type: Media
Maximum number of items: 1
GraphQL Type: Media
Can be used for filtering: true
Node type: Media
Maximum number of items: not 1
GraphQL Type: [Media]
Can be used for filtering: true
Node type: Member
Note: The Member editor configuration is not supported in the Multinode Treeepicker and will not be present in the generated schema.
Nested Content
Editor Alias: Umbraco.NestedContent
GraphQL Type: [Element]
Can be used for filtering: false
Numeric
Editor Alias: Umbraco.Integer
GraphQL Type: Int Can be used for filtering: true
Radio button List
Editor Alias: Umbraco.RadioButtonList
GraphQL Type: [String] Can be used for filtering: true
Repeatable textstrings
Editor Alias: Umbraco.MultipleTextstring
GraphQL Type: [String]
Can be used for filtering: true
Rich Text Editor
Editor Alias: Umbraco.TinyMCE
GraphQL Type: HTML
Can be used for filtering: false
Slider
Editor Alias: Umbraco.Slider
Enable Range: true
GraphQL Type DecimalRange
Can be used for filtering: false
Enable Range: false
GraphQL Type Decimal
Can be used for filtering: true
Tags
Editor Alias: Umbraco.Tags
GraphQL Type: [String]
Can be used for filtering: true
Textarea
Editor Alias: Umbraco.TextArea
GraphQL Type: String
Can be used for filtering: true
Textbox
Editor Alias: Umbraco.TextBox
GraphQL Type: String
Can be used for filtering: true
Unsupported Editors
Below is a list of property editors which is not supported in GraphQL and will not be present in the generated schema.
List view
Editor Alias: Umbraco.ListView
Member Picker
Editor Alias: Umbraco.MemberPicker
Member Group Picker
Editor Alias: Umbraco.MemberGroupPicker
User Picker
Editor Alias: Umbraco.UserPicker
Schema Generation
Documentation for Umbraco Heartcore GraphQL schema generation
The GraphQL schema is generated from the Content Types upon creation, and it is generated when a Content Type or a Data Type is changed.
The type name is the Content Type's alias in Pascal Case, e.g. if a Content Type has an alias of product it's GraphQL type name would be Product.
All properties on a Content Type is generated as a field on the GraphQL type. See the Property Editors page for which types the editors are returning.
If a property is marked as Allow varying by culture, a culture argument is added to that field. The argument is optional and will fallback to the parent fields culture or the default culture if none is specified.
The Query type is the entry to the GraphQL API. By default it contains two fields, one to get a single Content item by ID or url and one to get all Content.
typeQuery {""" Get Content by its unique identifier or url. Either id or url must be specified but not both. """ content(""" The unique identifier of the content. """ id: ID,""" The url of the content. """ url: String,""" The culture to fetch the content in. If empty the default culture will be used. """ culture: String""" Specifies if draft content should be returned. Requires the request to be authenticated. """ preview: Boolean ): Content""" Get all Content. """ allContent(""" Specifies the number of edges to return starting from `after` or the first entry if `after` is not specified. """ first: Int,""" Only look at connected edges with cursors greater than the value of `after`. """ after: String,""" Specifies the number of edges to return counting reversely from `before`, or the last entry if `before` is not specified.
""" last: Int,""" Only look at connected edges with cursors smaller than the value of `before`. """ before: String,""" The culture to fetch the value in. If empty the default culture will be used. """ culture: String,""" Specifies if draft content should be returned. Requires the request to be authenticated. """ preview: Boolean""" Filter the returned data. """ where: ContentFilterInput,""" Sort the returned data. """ orderBy: [ContentOrderByInput] ): ContentConnection!}
For each Document Type that is not used as a Composition or marked as an Element Type, two fields will be generated on the Query type. One for getting a single Content item by either it's ID or url and a field for getting all Content of that specific type.
typeBlockGridArea {""" Name of the area. """ alias: String!""" Items in the area. """ items: [BlockGridItem]!""" Number of rows spanned by the area. """ rowSpan: Int!""" Number of columns spanned by the area. """ columnSpan: Int!}
Query
{ contentPage { blocks { items {areas: { alias columnSpan items { title } } } } }}
typeBlockGridItem {""" The content. """ content: Element!""" The settings. """ settings: Element""" Number of rows spanned by the item. """ rowSpan: Int!""" Number of columns spanned by the item. """ columSpan: Int!""" Number of columns in child areas. """ areaGridColumns: Int!""" Number of columns in child areas. """ areas: [BlockGridArea]}
# Represents a range of decimals.typeDecimalRange {""" Maximum value of the range. """ maximum: Decimal!""" Minimum value of the range. """ minimum: Decimal!}
typeImageCropper {""" The predefined crops. """ crops: [ImageCropperCrop]!""" The image url with crop parameters. """ cropUrl(""" The crop alias. """ alias: String""" Change background color of the image. """ backgroundColor: String""" The width of the output image. """ width: Int""" The height of the output image. """ height: Int""" Quality percentage of the output image. """ quality: Int""" The image crop mode. """ cropMode: ImageCropMode""" The image crop anchor. """ cropAnchor: ImageCropAnchor""" Use a dimension as a ratio. """ ratioMode: ImageCropRatioMode""" The format of the output image. """ format: ImageCropFormat""" Use focal point to generate an output image using the focal point instead of the predefined crop if there is one. """ preferFocalPoint: Boolean = false""" If the image should be upscaled to requested dimensions. """ upscale: Boolean = false ): String""" The focal point position. """ focalPoint: ImageCropperFocalPoint!""" The focal point url template. """ focalPointUrlTemplate: String!""" The image url. """ url: String!}
enumImageCropAnchor {""" Anchors the position of the image to the bottom of it's bounding container. """ BOTTOM""" Anchors the position of the image to the bottom left side of it's bounding container. """ BOTTOM_LEFT""" Anchors the position of the image to the bottom right side of it's bounding container. """ BOTTOM_RIGHT""" Anchors the position of the image to the center of it's bounding container. """ CENTER""" Anchors the position of the image to the left of it's bounding container. """ LEFT""" Anchors the position of the image to the right of it's bounding container. """ RIGHT""" Anchors the position of the image to the top of it's bounding container. """ TOP""" Anchors the position of the image to the top left side of it's bounding container. """ TOP_LEFT""" Anchors the position of the image to the top right side of it's bounding container. """ TOP_RIGHT}
enumImageCropMode {""" When upscaling an image the image pixels themselves are not resized, rather the image is padded to fit the given dimensions.
""" BOX_PAD""" Resizes the image to the given dimensions. If the set dimensions do not match the aspect ratio of the original image then the output is cropped to match the new aspect ratio.
""" CROP""" Resizes the image to the given dimensions. If the set dimensions do not match the aspect ratio of the original image then the output is resized to the maximum possible value in each direction while maintaining the original aspect ratio.
""" MAX""" Resizes the image until the shortest side reaches the set given dimension. This will maintain the aspect ratio of the original image. Upscaling is disabled in this mode and the original image will be returned if attempted.
""" MIN""" Passing a single dimension will automatically preserve the aspect ratio of the original image. If the requested aspect ratio is different then the image will be padded to fit.
""" PAD""" Resizes the image to the given dimensions. If the set dimensions do not match the aspect ratio of the original image then the output is stretched to match the new aspect ratio.
""" STRETCH}
"""
The `JSON` scalar type represents JSON values as specified by [ECMA-404](http://www.ecma-international.org/publications/files/ECMA-ST/ECMA-404.pdf).
"""
scalar JSON
type Link {
"""
The name of the Link.
"""
name: String!
"""
The link target.
"""
target: String
"""
The link type.
"""
type: LintType!
"""
The link udi if type is CONTENT or MEDIA.
"""
udi: String
"""
The url.
"""
url: String!
}
type MediaWithCrops {
"""
The predefined crops.
"""
crops: [ImageCropperCrop]!
"""
The image url with crop parameters.
"""
cropUrl(
"""
The crop alias.
"""
alias: String
"""
Change background color of the image.
"""
backgroundColor: String
"""
The width of the output image.
"""
width: Int
"""
The height of the output image.
"""
height: Int
"""
Quality percentage of the output image.
"""
quality: Int
"""
The image crop mode.
"""
cropMode: ImageCropMode
"""
The image crop anchor.
"""
cropAnchor: ImageCropAnchor
"""
Use a dimension as a ratio.
"""
ratioMode: ImageCropRatioMode
"""
The format of the output image.
"""
format: ImageCropFormat
"""
Use focal point to generate an output image using the focal point instead of the predefined crop if there is one.
"""
preferFocalPoint: Boolean = false
"""
If the image should be upscaled to requested dimensions.
"""
upscale: Boolean = false
): String
"""
The focal point position.
"""
focalPoint: ImageCropperFocalPoint!
"""
The focal point url template.
"""
focalPointUrlTemplate: String!
"""
The media
"""
media: Media!
"""
The image url.
"""
url: String!
}
"""
Information about pagination in a connection.
"""
type PageInfo {
"""
When paginating forwards, the cursor to continue.
"""
endCursor: String
"""
When paginating forwards, are there more items?
"""
hasNextPage: Boolean!
"""
When paginating backwards, are there more items?
"""
hasPreviousPage: Boolean!
"""
When paginating backwards, the cursor to continue.
"""
startCursor: String
}
interface Content {
"""
The ancestors.
"""
ancestors(
"""
Specifies the number of edges to return starting from `after` or the first entry if `after` is not specified.
"""
first: Int,
"""
Only look at connected edges with cursors greater than the value of `after`.
"""
after: String,
"""
Specifies the number of edges to return counting reversely from `before`, or the last entry if `before` is not specified.
"""
last: Int,
"""
Only look at connected edges with cursors smaller than the value of `before`.
"""
before: String
"""
The culture to fetch the value in. If empty the contents culture will be used.
"""
culture: String
"""
Filter the returned data.
"""
where: ContentFilterInput,
"""
Sort the returned data.
"""
orderBy: [ContentOrderByInput],
): ContentConnection!
"""
The children.
"""
children(
"""
Specifies the number of edges to return starting from `after` or the first entry if `after` is not specified.
"""
first: Int,
"""
Only look at connected edges with cursors greater than the value of `after`.
"""
after: String,
"""
Specifies the number of edges to return counting reversely from `before`, or the last entry if `before` is not specified.
"""
last: Int,
"""
Only look at connected edges with cursors smaller than the value of `before`.
"""
before: String
"""
The culture to fetch the value in. If empty the contents culture will be used.
"""
culture: String
"""
Filter the returned data.
"""
where: ContentFilterInput,
"""
Sort the returned data.
"""
orderBy: [ContentOrderByInput],
): ContentConnection!
"""
The Content Type alias.
"""
contentTypeAlias: String!
"""
The create date.
"""
createDate: DateTime!
"""
The descendants.
"""
descendants(
"""
Specifies the number of edges to return starting from `after` or the first entry if `after` is not specified.
"""
first: Int,
"""
Only look at connected edges with cursors greater than the value of `after`.
"""
after: String,
"""
Specifies the number of edges to return counting reversely from `before`, or the last entry if `before` is not specified.
"""
last: Int,
"""
Only look at connected edges with cursors smaller than the value of `before`.
"""
before: String
"""
The culture to fetch the value in. If empty the contents culture will be used.
"""
culture: String
"""
Filter the returned data.
"""
where: ContentFilterInput,
"""
Sort the returned data.
"""
orderBy: [ContentOrderByInput],
): ContentConnection!
"""
The unique identifier.
"""
id: ID!
"""
The level.
"""
level: Int!
"""
The name.
"""
name(
"""
The culture to fetch the value in. If empty the contents culture will be used.
"""
culture: String
): String
"""
The parent Content, can be null if content is at root.
"""
parent(
"""
The culture to fetch the value in. If empty the contents culture will be used.
"""
culture: String
): Content
"""
The sort order.
"""
sortOrder: Int!
"""
The update date.
"""
updateDate(
"""
The culture to fetch the value in. If empty the contents culture will be used.
"""
culture: String
): DateTime
"""
The url.
"""
url(
"""
The culture to fetch the value in. If empty the contents culture will be used.
"""
culture: String
): String
}
Content Connection
"""
A connection from an object to a list of objects of type `Content`.
"""
type ContentConnection {
"""
A list of all of the objects returned in the connection.
This is a convenience field provided for quickly exploring the API;
rather than querying for \"{ edges { node } }\" when no edge data is needed, this field can be used instead.
Note that when clients like Relay need to fetch the \"cursor\" field on the edge to enable efficient pagination,
this shortcut cannot be used, "and the full \"{ edges { node } } \" version should be used instead.
"""
items: [Content]!
"""
A list of edges.
"""
edges: [ContentEdge]!
"""
Information to aid in pagination.
"""
pageInfo: PageInfo!
}
Content Edge
"""
An edge in a connection from an object to another object of type `Content`
"""
type ContentEdge {
"""
A cursor for use in pagination.
"""
cursor: String!
"""
The item at the end of the edge.
"""
node: Content
}
Media
interface Media {
"""
The ancestors.
"""
ancestors(
"""
Specifies the number of edges to return starting from `after` or the first entry if `after` is not specified.
"""
first: Int,
"""
Only look at connected edges with cursors greater than the value of `after`.
"""
after: String,
"""
Specifies the number of edges to return counting reversely from `before`, or the last entry if `before` is not specified.
"""
last: Int,
"""
Only look at connected edges with cursors smaller than the value of `before`.
"""
before: String
): MediaConnection!
"""
The children.
"""
children(
"""
Specifies the number of edges to return starting from `after` or the first entry if `after` is not specified.
"""
first: Int,
"""
Only look at connected edges with cursors greater than the value of `after`.
"""
after: String,
"""
Specifies the number of edges to return counting reversely from `before`, or the last entry if `before` is not specified.
"""
last: Int,
"""
Only look at connected edges with cursors smaller than the value of `before`.
"""
before: String
): MediaConnection!
"""
The create date.
"""
createDate: DateTime!
"""
The descendants.
"""
descendants(
"""
Specifies the number of edges to return starting from `after` or the first entry if `after` is not specified.
"""
first: Int,
"""
Only look at connected edges with cursors greater than the value of `after`.
"""
after: String,
"""
Specifies the number of edges to return counting reversely from `before`, or the last entry if `before` is not specified.
"""
last: Int,
"""
Only look at connected edges with cursors smaller than the value of `before`.
"""
before: String
): MediaConnection!
"""
The unique identifier.
"""
id: ID!
"""
The level.
"""
level: Int!
"""
The Media Type alias
"""
mediaTypeAlias: String!
"""
The name.
"""
name: String!
"""
The parent Content, can be null if content is at root.
"""
parent: Media
"""
The sort order.
"""
sortOrder: Int!
"""
The update date.
"""
updateDate: DateTime
"""
The url.
"""
url(
"""
Change the background color of the image.
"""
backgroundColor: String,
"""
The width of the output image.
"""
width: Int,
"""
The height of the output image.
"""
height: Int,
"""
Quality percentage of the output image.
"""
quality: Int,
"""
The image crop mode.
"""
cropMode: ImageCropMode,
"""
The image crop anchor.
"""
cropAnchor: ImageCropAnchor,
"""
Use a dimension as a ratio.
"""
ratioMode: ImageCropRatioMode,
"""
If the image should be upscaled to requested dimensions.
"""
upscale: Boolean = false,
"""
Change the format of the output image.
"""
format: ImageCropFormat
): String
}
Media Connection
"""
A connection from an object to a list of objects of type `Media`.
"""
type MediaConnection {
"""
A list of all of the objects returned in the connection.
This is a convenience field provided for quickly exploring the API;
rather than querying for \"{ edges { node } }\" when no edge data is needed, this field can be used instead.
Note that when clients like Relay need to fetch the \"cursor\" field on the edge to enable efficient pagination,
this shortcut cannot be used, "and the full \"{ edges { node } } \" version should be used instead.
"""
items: [Media]!
"""
A list of edges.
"""
edges: [MediaEdge]!
"""
Information to aid in pagination.
"""
pageInfo: PageInfo!
}
Media Edge
"""
An edge in a connection from an object to another object of type `Media`
"""
type MediaEdge {
"""
A cursor for use in pagination.
"""
cursor: String!
"""
The item at the end of the edge.
"""
node: Media
}
Filtering
For all Document Types a FilterInput type is generated. The name is the type name postfixed by FilterInput e.g. given a type named Product the name will be ProductFilterInput.
Default Filter Fields
To filter the allContent field, ancestors, children and descendants connections the ContentFilterInput is used.
All filter inputs for Content Types will also have the default fields.
"""
A filter input for the type `Content`.
"""
input ContentFilterInput {
"""
All of the filters must match.
"""
AND: [ContentFilterInput]
"""
Some of the filters must match.
"""
OR: [ContentFilterInput]
"""
None of the filters must match.
"""
NOT: [ContentFilterInput]
"""
Field must equal value.
"""
contentTypeAlias: String
"""
Field must match any of the values.
"""
contentTypeAlias_any: [String]
"""
Field must start with the value.
"""
contentTypeAlias_starts_with: String
"""
Field must end with the value.
"""
contentTypeAlias_ends_with: String
"""
Field must contain the value.
"""
contentTypeAlias_contains: String
"""
Field must equal value.
"""
createDate: DateTime
"""
Field must be greater than the value.
"""
createDate_gt: DateTime
"""
Field must be greater than or equal the value.
"""
createDate_gte: DateTime
"""
Field must be less than the value.
"""
createDate_lt: DateTime
"""
Field must be less than or equal the value.
"""
createDate_lte: DateTime
"""
Field must equal value.
"""
id: ID
"""
Field must match any of the values.
"""
id_any: [ID]
"""
Field must equal value.
"""
level: Int
"""
Field must be greater than the value.
"""
level_gt: Int
"""
Field must be greater than or equal the value.
"""
level_gte: Int
"""
Field must be less than the value.
"""
level_lt: Int
"""
Field must be less than or equal the value.
"""
level_lte: Int
"""
Field must match any of the values.
"""
level_any: [Int]
"""
Field must equal value.
"""
name: String
"""
Field must match any of the values.
"""
name_any: [String]
"""
Field must start with the value.
"""
name_starts_with: String
"""
Field must end with the value.
"""
name_ends_with: String
"""
Field must contain the value.
"""
name_contains: String
"""
Field must equal value.
"""
sortOrder: Int
"""
Field must be greater than the value.
"""
sortOrder_gt: Int
"""
Field must be greater than or equal the value.
"""
sortOrder_gte: Int
"""
Field must be less than the value.
"""
sortOrder_lt: Int
"""
Field must be less than or equal the value.
"""
sortOrder_lte: Int
"""
Field must match any of the values.
"""
sortOrder_any: [Int]
"""
Field must equal value.
"""
updateDate: DateTime
"""
Field must be greater than the value.
"""
updateDate_gt: DateTime
"""
Field must be greater than or equal the value.
"""
updateDate_gte: DateTime
"""
Field must be less than the value.
"""
updateDate_lt: DateTime
"""
Field must be less than or equal the value.
"""
updateDate_lte: DateTime
}
Filtering is possible only on non-complex Property Editors like Text Area and Label. Filtering on more complex types like Content Picker and Multi-node Tree Picker has to be done client-side.
Strings
For fields returning String the following filter fields are generated.
The following type will be generated, incl. the fields from the ContentFilterInput.
"""
A filter input for the type `Product`.
"""
input ProductFilterInput {
"""
All of the filters must match.
"""
AND: [ProductFilterInput]
"""
Some of the filters must match.
"""
OR: [ProductFilterInput]
"""
None of the filters must match.
"""
NOT: [ProductFilterInput]
...
"""
Field must equal value.
"""
sku: String
"""
Field must match any of the values.
"""
sku_any: [String]
"""
Field must start with the value.
"""
sku_starts_with: String
"""
Field must end with the value.
"""
sku_ends_with: String
"""
Field must contain the value.
"""
sku_contains: String
...
}
Ints
For fields returning Int or Decimal the following filters are generated.
The type is either Int or Decimal depending on the output type.
The following type will be generated, incl. the fields from the ContentFilterInput.
"""
A filter input for the type `Product`.
"""
input ProductFilterInput {
"""
All of the filters must match.
"""
AND: [ProductFilterInput]
"""
Some of the filters must match.
"""
OR: [ProductFilterInput]
"""
None of the filters must match.
"""
NOT: [ProductFilterInput]
...
"""
Field must equal value.
"""
price: Decimal
"""
Field must be greater than the value.
"""
price_gt: Decimal
"""
Field must be greater than or equal to the value.
"""
price_gte: Decimal
"""
Field must be less than the value.
"""
price_lt: Decimal
"""
Field must be less than or equal to the value.
"""
price_lte: Decimal
"""
Field must match any of the values.
"""
price_any: [Decimal]
...
}
Boolean
For types returning Boolean the following filters are generated.
The following type will be generated, incl. the fields from the ContentFilterInput.
"""
A filter input for the type `Product`.
"""
input ProductFilterInput {
"""
All of the filters must match.
"""
AND: [ProductFilterInput]
"""
Some of the filters must match.
"""
OR: [ProductFilterInput]
"""
None of the filters must match.
"""
NOT: [ProductFilterInput]
....
# Field must equal value.
purchase: Boolean
...
}
The following type will be generated, incl. the fields from the ContentFilterInput.
"""
A filter input for the type `Product`.
"""
input ProductFilterInput {
"""
All of the filters must match.
"""
AND: [ProductFilterInput]
"""
Some of the filters must match.
"""
OR: [ProductFilterInput]
"""
None of the filters must match.
"""
NOT: [ProductFilterInput]
...
"""
Field must equal value.
"""
availableDate: DateTime
"""
Field must be greater than the value.
"""
availableDate_gt: DateTime
"""
Field must be greater than or equal to the value.
"""
availableDate_gte: DateTime
"""
Field must be less than the value.
"""
availableDate_lt: DateTime
"""
Field must be less than or equal to the value.
"""
availableDate_lte: DateTime
...
}
Media
For types returning Media the MediaFilterInput is used.
"""
A filter input for the type `Media`.
"""
input MediaFilterInput {
"""
All of the filters must match.
"""
AND: [MediaFilterInput]
"""
Some of the filters must match.
"""
OR: [MediaFilterInput]
"""
None of the filters must match.
"""
NOT: [MediaFilterInput]
"""
Field must equal value.
"""
mediaTypeAlias: String
"""
Field must match any of the values.
"""
mediaTypeAlias_any: [String]
"""
Field must start with the value.
"""
mediaTypeAlias_starts_with: String
"""
Field must end with the value.
"""
mediaTypeAlias_ends_with: String
"""
Field must contain the value.
"""
mediaTypeAlias_contains: String
"""
Field must equal value.
"""
createDate: DateTime
"""
Field must be greater than the value.
"""
createDate_gt: DateTime
"""
Field must be greater than or equal the value.
"""
createDate_gte: DateTime
"""
Field must be less than the value.
"""
createDate_lt: DateTime
"""
Field must be less than or equal the value.
"""
createDate_lte: DateTime
"""
Field must equal value.
"""
id: ID
"""
Field must match any of the values.
"""
id_any: [ID]
"""
Field must equal value.
"""
level: Int
"""
Field must be greater than the value.
"""
level_gt: Int
"""
Field must be greater than or equal the value.
"""
level_gte: Int
"""
Field must be less than the value.
"""
level_lt: Int
"""
Field must be less than or equal the value.
"""
level_lte: Int
"""
Field must match any of the values.
"""
level_any: [Int]
"""
Field must equal value.
"""
name: String
"""
Field must match any of the values.
"""
name_any: [String]
"""
Field must start with the value.
"""
name_starts_with: String
"""
Field must end with the value.
"""
name_ends_with: String
"""
Field must contain the value.
"""
name_contains: String
"""
Field must equal value.
"""
sortOrder: Int
"""
Field must be greater than the value.
"""
sortOrder_gt: Int
"""
Field must be greater than or equal the value.
"""
sortOrder_gte: Int
"""
Field must be less than the value.
"""
sortOrder_lt: Int
"""
Field must be less than or equal the value.
"""
sortOrder_lte: Int
"""
Field must match any of the values.
"""
sortOrder_any: [Int]
"""
Field must equal value.
"""
updateDate: DateTime
"""
Field must be greater than the value.
"""
updateDate_gt: DateTime
"""
Field must be greater than or equal the value.
"""
updateDate_gte: DateTime
"""
Field must be less than the value.
"""
updateDate_lt: DateTime
"""
Field must be less than or equal the value.
"""
updateDate_lte: DateTime
}
Lists
For types returning [Decimal], [Int] or [String] the following filters are generated.
The type is [Decimal], [Int] or [String] depending on the output type
The following type will be generated, incl. the fields from the ContentFilterInput.
# A filter input for the type `Product`.
input ProductFilterInput {
"""
All of the filters must match.
"""
AND: [ProductFilterInput]
"""
Some of the filters must match.
"""
OR: [ProductFilterInput]
"""
None of the filters must match.
"""
NOT: [ProductFilterInput]
...
"""
Field must match all of the values.
"""
tags_all: [String]
"""
Field must match any of the values.
"""
tags_some: [String]
...
}
Ordering
The result can be ordered by specifying a value for the orderBy argument.
An OrderBy type is generated for all Document Types. The name is the type name postfixed by OrderByInput e.g. given a type named Product the name will be ProductOrderByInput.
Fields returning DateTime, Decimal, Boolean, Int or String can be used to order by.
Default OrderBy Fields
To filter the allContent field, ancestors, children and descendants connections the ContentOrderBy is used.
All order by inputs for Content Types will also have the default fields.
``"""
An order input for the type `Content`.
"""
enum ContentOrderByInput {
"""
Order by `contentTypeAlias` in ascending order.
"""
contentTypeAlias_ASC
"""
Order by `contentTypeAlias` in descending order.
"""
contentTypeAlias_DESC
"""
Order by `createDate` in ascending order.
"""
createDate_ASC
"""
Order by `createDate` in descending order.
"""
createDate_DESC
"""
Order by `level` in ascending order.
"""
level_ASC
"""
Order by `level` in descending order.
"""
level_DESC
"""
Order by `name` in ascending order.
"""
name_ASC
"""
Order by `name` in descending order.
"""
name_DESC
"""
Order by `path` in ascending order.
"""
path_ASC
"""
Order by `path` in descending order.
"""
path_DESC
"""
Order by `sortOrder` in ascending order.
"""
sortOrder_ASC
"""
Order by `sortOrder` in descending order.
"""
sortOrder_DESC
"""
Order by `updateDate` in ascending order.
"""
updateDate_ASC
"""
Order by `updateDate` in descending order.
"""
updateDate_DESC
}`
### Custom OrderBy Fields
Given the following type:
```graphql
Product implements Content {
...
price: Decimal
sku: String
...
}
The following type will be generated, incl. the fields from the ContentOrderByInput.
"""
An order by input for the type `Product`.
"""
enum ProductOrderByInput {
...
"""
Order by `price` in ascending order.
"""
price_ASC
"""
Order by `price` in descending order.
"""
price_DESC
"""
Order by `sku` in ascending order.
"""
sku_ASC
# Order by `sku` in descending order.
sku_DESC
...
}
Default ordering
If you don't specify any order the data returned will be ordered by the path they appear in, in the Umbraco Backoffice tree.
Persisted Queries
Documentation for Persisted queries in Umbraco Heartcore
Persisted queries allow you to store GraphQL queries on the server. This enables clients to execute them by referencing an alias rather than sending the full query each time. this approach streamlines client-server communication and enhances security.
Why use persisted queries?
Reducing the payload size
You minimize the data transmitted over the network by sending only the alias and necessary variables. This reduction in payload size leads to faster request times and is particularly beneficial for mobile applications or environments with limited bandwidth.
Enhanced Security
Persisted queries provide improved security by ensuring that only predefined, server-stored GraphQL queries can be executed, preventing clients from running arbitrary or malicious queries.
To fully benefit from this, the content delivery API must be set to private, and GraphQL must be configured only to allow persisted queries. Without these settings in place, the security advantages of using persisted queries are not realized.
Enable Persisted queries only
In order to fully benefit from the security enhancement that comes with persisted queries you need to enable the Only allow GraphQL persisted queries setting. This can be done from the headless options section within the backoffice
Please be aware this will also disable the execution of queries in the playground.