Skip navigation

Delivery API

The Delivery API is a read-only REST API that serves published content from your Kentico Kontent projects.

Introduction

Use the API to deliver large amounts of content to your website or app. The content is cached on the CDN level, which makes it quickly available from wherever you are. The Delivery API provides content filtering options that allow you to retrieve only the parts of the content you need.

All requests to the API must be made securely with HTTPS with TLS 1.2.

API requests limits

Requests made to the Delivery API count towards the overall API Calls limit set in our Fair Use Policy.

This does NOT apply to Delivery Preview API calls to preview unpublished content.

Production vs. Preview

You can work with the Delivery API in two ways – either retrieve published versions of content items or preview their yet unpublished versions. In both cases, you use the same methods to request data but with a different base URL.

Retrieve published content items from your project using the production URL:
https://deliver.kontent.ai/<YOUR_PROJECT_ID>/items

Note: To protect your published content, use the Delivery API with secure access enabled.

Preview unpublished content items from your project using the preview URL:
https://preview-deliver.kontent.ai/<YOUR_PROJECT_ID>/items

If you want to preview unpublished content in your project, you need to authorize your request.

  • cURL
curl --request GET \ --url https://preview-deliver.kontent.ai/975bf280-fd91-488c-994c-2f04416e5ee3/items/on_roasts \ --header 'authorization: Bearer <YOUR_PREVIEW_API_KEY>'
  • JavaScript
// Tip: Find more about JS/TS SDKs at https://docs.kontent.ai/javascript const KontentDelivery = require('@kentico/kontent-delivery');   // Create strongly typed models according to https://docs.kontent.ai/strongly-typed-models class Article extends KontentDelivery.ContentItem { constructor() { super(); } }   const deliveryClient = new KontentDelivery.DeliveryClient({ projectId: '975bf280-fd91-488c-994c-2f04416e5ee3', previewApiKey: '<YOUR_PREVIEW_API_KEY>', globalQueryConfig: { usePreviewMode: true, // Queries the Delivery Preview API. }, typeResolvers: [ new KontentDelivery.TypeResolver('article', (rawData) => new Article) ] });   deliveryClient.item('on_roasts') .toObservable() .subscribe(response => console.log(response));
  • TypeScript
// Tip: Find more about JS/TS SDKs at https://docs.kontent.ai/javascript import { ContentItem, DeliveryClient, Elements, TypeResolver } from '@kentico/kontent-delivery';   // Create strongly typed models according to https://docs.kontent.ai/tutorials/develop-apps/get-content/using-strongly-typed-models export class Article extends ContentItem { public title: Elements.TextElement; public summary: Elements.TextElement; public post_date: Elements.DateTimeElement; public teaser_image: Elements.AssetsElement; public related_articles: Article[]; }   const deliveryClient = new DeliveryClient({ projectId: '975bf280-fd91-488c-994c-2f04416e5ee3', previewApiKey: '<YOUR_PREVIEW_API_KEY>', globalQueryConfig: { usePreviewMode: true, // Queries the Delivery Preview API. }, typeResolvers: [ new TypeResolver('article', (rawData) => new Article) ] });   deliveryClient.item<Article>('on_roasts') .toObservable() .subscribe(response => console.log(response));
  • C#
// Tip: Find more about .NET SDKs at https://docs.kontent.ai/net using Kentico.Kontent.Delivery;   // Initializes a delivery client for previewing content IDeliveryClient client = DeliveryClientBuilder .WithOptions(builder => builder .WithProjectId("975bf280-fd91-488c-994c-2f04416e5ee3") .UsePreviewApi("<YOUR_PREVIEW_API_KEY>") .Build()) .Build();   // Generate strongly typed models via https://github.com/Kentico/cloud-generators-net DeliveryItemResponse response = await client.GetItemAsync("on_roasts"); ContentItem item = response.Item;
  • Java
// Tip: Find more about Java/JavaRx SDKs at https://docs.kontent.ai/javaandroid import com.github.kentico.kontent.delivery;   DeliveryClient client = new DeliveryClient("975bf280-fd91-488c-994c-2f04416e5ee3", "<YOUR_PREVIEW_API_KEY>");   ContentItem item = client.getItem("on_roasts").item;
  • Java
// Tip: Find more about Java/JavaRx SDKs at https://docs.kontent.ai/javaandroid import com.kenticocloud.delivery_core.*; import com.kenticocloud.delivery_rx.*;   import io.reactivex.Observer; import io.reactivex.disposables.Disposable; import io.reactivex.functions.Function;   // Prepares an array to hold strongly-typed models List<TypeResolver<?>> typeResolvers = new ArrayList<>();   // Registers the type resolver for articles typeResolvers.add(new TypeResolver<>(Article.TYPE, new Function<Void, Article>() { @Override public Article apply(Void input) { return new Article(); } }));   // Prepares the DeliveryService configuration object String projectId = "975bf280-fd91-488c-994c-2f04416e5ee3"; String previewApiKey = "<YOUR_PREVIEW_API_KEY>";   IDeliveryConfig config = DeliveryConfig.newConfig(projectId) .withTypeResolvers(typeResolvers) .withPreviewApiKey(previewApiKey);   // Initializes a DeliveryService for Java projects IDeliveryService deliveryService = new DeliveryService(config);   // Gets the latest version of an article using a simple request Article article = deliveryService.<Article>item("on_roasts") .get() .getItem();   // Gets the latest version of an article using RxJava2 deliveryService.<Article>item("on_roasts") .getObservable() .subscribe(new Observer<DeliveryItemResponse<Article>>() { @Override public void onSubscribe(Disposable d) { }   @Override public void onNext(DeliveryItemResponse<Article> response) { // Get the article Article item = response.getItem(); }   @Override public void onError(Throwable e) { }   @Override public void onComplete() { } });
  • Swift
// Tip: Find more about Swift SDK at https://docs.kontent.ai/ios import KenticoCloud   let client = DeliveryClient.init(projectId: "975bf280-fd91-488c-994c-2f04416e5ee3", apiKey: "<YOUR_PREVIEW_API_KEY>")   // More about strongly-typed models https://github.com/Kentico/cloud-sdk-swift#using-strongly-typed-models client.getItem(modelType: Article.self, itemName: "on_roasts") { (isSuccess, itemResponse, error) in if isSuccess { if let article = itemResponse.item { // Use your item here } } else { if let error = error { print(error) } } }
  • PHP
<?php // Tip: Find more about PHP SDKs at https://docs.kontent.ai/php   // Defined by Composer to include required libraries require __DIR__ . '/vendor/autoload.php';   use Kentico\Kontent\Delivery\DeliveryClient;   $client = new DeliveryClient('975bf280-fd91-488c-994c-2f04416e5ee3', '<YOUR_PREVIEW_API_KEY>');   $item = $client->getItem('on_roasts');
  • Ruby
require 'delivery-sdk-ruby'   delivery_client = Kentico::Kontent::Delivery::DeliveryClient.new project_id: '975bf280-fd91-488c-994c-2f04416e5ee3', preview_key: '<YOUR_PREVIEW_API_KEY>' delivery_client.item('on_roasts').execute do |response| puts response.to_s end

For the Delivery Preview API, you can use two concurrent API keys, Primary and Secondary. For more details on how to work with the keys, see Previewing unpublished content.

Authentication

By default, the Delivery API does not require authentication. However, if you enable secure access for the Delivery API or use the Delivery Preview API, you need to authenticate your requests with valid API keys.

To work with the Delivery API with secure access enabled or the Delivery Preview API, send your requests over HTTPS using the Authorization header in the following format: Authorization: Bearer <YOUR_API_KEY>. Requests with an incorrect or missing Authorization header will fail with an error.

To get your API key for the API, go to Kentico Kontent -> Project settings -> API keys. The API keys provide access to a single Kentico Kontent project. You will need different API keys for each of your projects.

Errors

Kentico Kontent returns standard HTTP status codes to indicate success or failure of a request. In general, codes in the 2xx range indicate a successful request, codes in the 4xx range indicate errors caused by an incorrect input (for example, providing incorrect API key), and codes in the 5xx range indicate an error on our side.

Error codes summary

Status code

Description

400 Bad Request

The request was not understood. Check your request for a missing required parameter or an invalid query parameter value.

401 Unauthorized

The provided API key is invalid or missing.

403 Forbidden

The provided API key is invalid for the requested project.

404 Not Found

The requested resource doesn't exist. Try checking the resource name for typos.

405 Method Not Allowed

The requested HTTP method is not supported for the specified resource. Try performing a GET request.

500 Internal Server Error

Something went wrong on our side. Try the request again in a few minutes, or contact us.

Resolving errors

For troubleshooting failed requests, the API provides error messages defined in a consumable format to help you identify and fix the issue.

error_code
required
integer <int32> [ 100 .. 500 ]

The specific code for the type of error.

message
required
string

The error message explaining what caused the error.

request_id
required
string

The performed request's unique ID.

specific_code
required
integer <int32>
Copy
Expand all Collapse all
{
  • "message": "string",
  • "request_id": "string",
  • "error_code": 100,
  • "specific_code": 0
}

If you cannot identify and resolve an issue with your API call, you can contact us with the response status and the request ID you get in the error response.

Secure access

The Delivery API does not require authentication by default but you can enable secure access for the project to force authenticated requests.

Premium feature

Secure access to the Delivery API requires a Professional plan or higher.

With secure access, you can use two concurrent API keys, Primary and Secondary. For more details on how to work with the keys, see Securing public access.

As the Delivery API is designed for continuous retrieval of published content, there is no expiration date for the Primary or Secondary API key.

The API keys are scoped per project. This means you need a separate API key for each project in Kentico Kontent. All users within a single project share the same Delivery API keys.

Revoking API keys

The Delivery API with secure access enabled and the Delivery Preview API both use two concurrent API keys, Primary and Secondary. In certain situations, you may need to revoke one of these keys and generate a new one. For example, when you suspect unauthorized key use or when a developer with access to the API key has left your company.

For situations like these, one or both of the API keys can be regenerated. Activating a new key will immediately replace the old key. Requests made with a revoked API key will then receive a 401 Unauthorized HTTP status in the response.

Expiration date and key regeneration

There is no expiration date for the Primary or Secondary API key. However, we recommend that you regenerate the API keys periodically to prevent the keys from being compromised.

Learn more in Securing public access and Previewing unpublished content.

Filtering content

When retrieving content items from your project, you can filter large sets of content items by building query parameters from content elements and system properties. Note that filtering does NOT apply to content items returned within the modular_content collection.

If you want to get only a specific set of elements from content items, use projection when retrieving the items.

Filtering by system values

To filter by system property values, you need to use a query parameter in the system.<property_name> format. The system properties are id, name, codename, language, type, sitemap_locations, and last_modified. For example, to retrieve only content items based on the Article content type, use system.type=article as a query parameter.

Filtering by element values

To filter by content element values, you need to use a query parameter in the elements.<element_codename>=<value> format. For example, to retrieve only content items whose Number element named Price has a value of 16, use elements.price=16 as a query parameter.

Joining multiple query parameters

You can join multiple query parameters using the & character. Queries with two or more filtering query parameters are more restrictive because the individual query parameters are merged with a logical conjunction (AND).

For example, the query system.type=article&elements.persona[contains]=barista will return the content items of the Article type that are tagged with the Barista taxonomy term.

Filtering operators

You can use the following filtering operators with both system properties and element values.

Note that all of the operators are case-sensitive.

Operator

Description

Example

Use with

=

Property value is the same as the specified value.
More in Comparing values.

system.type=article Simple types
[lt]

Property value is less than the specified value.
More in Comparing values.

system.last_modified[lt]=2019-03-01
elements.price[lt]=10

Simple types
[lte]

Property value is less than or equal to the specified value.
More in Comparing values.

system.last_modified[lt]=2019-02-01
elements.price[lte]=4

Simple types
[gt]

Property value is greater than the specified value.
More in Comparing values.

system.last_modified[gt]=2019-01-01
elements.price[gt]=10

Simple types
[gte]

Property value is greater than or equal to the specified value.
More in Comparing values.

system.last_modified[gt]=2019-02-28
elements.price[gt]=10

Simple types
[range]

Property value falls within the specified range of two values, both inclusive.
More in Comparing values.

system.last_modified[range]=2018-02-01,2018-03-31
elements.price[range]=10.5,50

Simple types
[in] Property value is in the specified list of values.

system.type[in]=cafe,coffee
elements.price[in]=8.5,9,10.5

Simple types
[contains]

Property with an array of values contains the specified value.
Note: The [contains] operator cannot be used on strings.

elements.personas[contains]=barista Arrays
[any] Property with an array of values contains at least one value from the specified list of values. elements.personas[any]=barista,coffee_blogger Arrays
[all] Property with an array of values contains all of the specified values. elements.personas[all]=barista,coffee_blogger Arrays

Arrays vs. simple types

You can use the [contains], [any], and [all] filtering operators only on array properties. The supported array properties include the sitemap locations within the system object of content items, and the linked items, multiple choice, and taxonomy elements.

Note: Asset elements are not supported with [contains], [any], and [all] filtering operators.

Comparing values

The [lt], [lte], [gt], [gte], and [range] filtering operators work best with numbers. For example, you can retrieve products with price larger or equal to 15 by using elements.price[gte]=15.

Filtering by date-time values

Properties that store dates are represented as strings. For example, this includes the last_modified system property and date & time content elements.

If you use filtering operators on properties with string values, the Delivery API tries to perform a string comparison. For instance, you can retrieve content items modified during February and March by using a query such as system.last_modified[range]=2018-02-01,2018-04-01, specifying the start date within the range and end date outside the range.

Projection

When getting content items or content types, you can specify which elements to return by using the elements query parameter.

  • For items, the parameter applies to content items returned within both the items array and modular_content collection.
  • For types, the parameter applies to content types returned within the types array.

Examples

By using elements=title as a query parameter, the elements collection in each content item will contain only the element with the codename title, or, if the item doesn't have an element with such codename, the elements collection will be empty.

For multiple elements, you can use a query parameter such as elements=title,summary,related_articles to retrieve only the elements with codenames title, summary, and related_articles.

Note: Projection does not apply to the system properties. This means that you cannot omit the system object from the response using any query.

Linked content and components

Kentico Kontent offers a variety of ways to compose, structure, and cross-reference your content:

  • Linked items elements are used to reference other content items.
  • Rich text elements can also contain content items. Useful for inserting content into a specific point in the text.
  • Rich text elements can contain components.
    • A component is a single-use content item.
    • It has the same structure as a content item.
    • It is based on a specific content type.
    • Unlike a content item, a component only exists inside its Rich text element. Learn more about using components.

When retrieving items using the Delivery API, the contents of all components and content items in rich text and linked items elements are stored as properties in a separate modular_content object within the API response. The properties of the modular_content object (i.e., individual components and items) are not ordered. See linked items and rich text elements for details on how ordering is done within the elements.

When enumerating the items in your project using the Delivery API, the modular_content collection in the response will contain only components, not content items used in linked items elements.

Note: For historical reasons, the object is called "modular_content" instead of "linked_content".

Linked content depth

Content items reference other content items using linked items or rich text elements. These linked items can reference other items recursively. By default, only one level of linked items is returned.

  • If you want to include more than one level of linked items in response, set the depth query parameter to 2 or more.
  • If you want to exclude all linked items, use the depth=0 query parameter.
  • When retrieving content, linked items cannot be filtered.

Components are not affected by the depth parameter as they are an integral part of their Rich text element. They are always present in the response. You can only nest components up to depth level 6.

Content items

Content items represent specific pieces of content based on a specific content type. To retrieve specific items from your project, either provide a codename for one item or filter all items using parameters. By default, the Delivery API returns content items in the default language.

Content item object

elements
required
object

The item's elements with values for the specific language.

Note: The order of the element objects might not match the content element order in the UI.

system
required
object

The content item's system properties.

Copy
Expand all Collapse all
{}

List content items

get /{project_id}/items
See full URL

Delivery API

https://deliver.kontent.ai/{project_id}/items

Delivery Preview API

https://preview-deliver.kontent.ai/{project_id}/items

Retrieve a list of content items in your project. By default, the API returns an unfiltered paginated list of content items that is ordered alphabetically by codename.

If you need to export all content items from your project, we recommend using the Enumerate content item endpoint.

You can change the order by specifying the order query parameter. You can customize pagination by using the skip and limit query parameters.

Filtering content items

Using filtering parameters and operators, you can retrieve a specific set of content items. For example, items tagged with a specific term, items of a specific type, or items modified in the past three days.

path Parameters
project_id
required
string
Example: 975bf280-fd91-488c-994c-2f04416e5ee3

Identifies your project.

query Parameters
depth
integer <int32>
Example: depth=1

Determines the level of nesting for content items that the API returns. By default, only the first level of linked items is returned, which is the same as setting depth=1.

If you want to include more than one level of linked items in response, set the depth query parameter to 2 or more.

If you need to exclude all linked items from the response, set the parameter to 0. Note that components are always present in response. See Linked content and components for more details.

elements
Array of strings
Example: elements=title%2Csummary%2Cpost_date%2Cteaser_image

Determines the elements to retrieve using a comma-separated list of element codenames. The elements query parameter applies to all content items within the response.

If not specified, all elements are retrieved. For more details, see Projection.

includeTotalCount
boolean
Example: includeTotalCount=true

Adds information about the total number of content items matching your query. When set to true, the pagination object returned in the API response contains an additional total_count property.

language
string
Example: language=en-US

Determines which language variant of content items to return. By default, the API returns content in the default language.

Note: If the requested content is not available in the specified language variant, the API follows the language fallbacks as configured in the Localization settings of your project.

limit
integer <int32>
Example: limit=10

Sets the number of items to retrieve in a single request. If the limit parameter is not specified, the API returns all items by default.

If the limit is lower than the total number of items matching your query, the next_page property in the pagination object of the API response will contain a URL to the next page of results.

order
string
Example: order=elements.post_date%5Bdesc%5D

Determines the order of the retrieved content items. By default, the items are sorted alphabetically by their codenames from A to Z in descending order.

To sort content items in ascending order, set the parameter value to <property>[asc] where is the name of the object property you want to sort by. For example, order=elements.title[asc]. Similarly, to sort in descending order, you can use the [desc] modifier. You can sort by properties of both the system and elements objects of content items.

Examples

  • Sort by date – order=system.last_modified[desc]
  • Sort by a content item name – order=system.name[asc]
  • Sort by an element value – order=elements.<element_codename>[asc]
skip
integer <int32>
Example: skip=10

Sets the number of items to skip when requesting a list of objects. If the skip parameter is not specified, the API returns the first page of results.

You can combine the limit and skip parameters to specify page size and page number. For example, using limit=10&skip=10 sets the page size to 10 and gets the second page of results.

header Parameters
X-KC-Wait-For-Loading-New-Content
boolean
Example: false

Determines whether the API waits while fetching content, if the requested content has changed since the last request. This is useful when retrieving changed content in reaction to a webhook call.

By default, when the header is not set, the API serves stale content (if cached by the CDN) while it's fetching the new content to minimize wait time. To always fetch new content, set the header value to true.

Responses

200

A paginated list of content items matching the specified criteria.

Request samples

Copy
curl --request GET \
  --url 'https://deliver.kontent.ai/975bf280-fd91-488c-994c-2f04416e5ee3/items?system.type=article&elements=title%2Csummary%2Cpost_date&order=elements.post_date' \
  --header 'content-type: application/json'

Response samples

application/json
Copy
Expand all Collapse all
{
  • "items":
    [
    • {
      }
    ],
  • "modular_content": { },
  • "pagination":
    {
    • "skip": 0,
    • "limit": 0,
    • "count": 1,
    • "next_page": ""
    }
}

Retrieve a content item

get /{project_id}/items/{item_codename}
See full URL

Delivery API

https://deliver.kontent.ai/{project_id}/items/{item_codename}

Delivery Preview API

https://preview-deliver.kontent.ai/{project_id}/items/{item_codename}

Retrieve a specific content item by specifying its codename.

Note: Any change to a content item name affects the codename. To retrieve an updated content item, adjust its codename in the API request.

path Parameters
item_codename
required
string
Example: on_roasts

Identifies the content item by codename.

project_id
required
string
Example: 975bf280-fd91-488c-994c-2f04416e5ee3

Identifies your project.

query Parameters
depth
integer <int32>
Example: depth=1

Determines the level of nesting for content items that the API returns. By default, only the first level of linked items is returned, which is the same as setting depth=1.

If you want to include more than one level of linked items in response, set the depth query parameter to 2 or more.

If you need to exclude all linked items from the response, set the parameter to 0. Note that components are always present in response. See Linked content and components for more details.

elements
Array of strings
Example: elements=title%2Csummary%2Cpost_date%2Cteaser_image

Determines the elements to retrieve using a comma-separated list of element codenames. The elements query parameter applies to all content items within the response.

If not specified, all elements are retrieved. For more details, see Projection.

language
string
Example: language=en-US

Determines which language variant of content items to return. By default, the API returns content in the default language.

Note: If the requested content is not available in the specified language variant, the API follows the language fallbacks as configured in the Localization settings of your project.

header Parameters
X-KC-Wait-For-Loading-New-Content
boolean
Example: false

Determines whether the API waits while fetching content, if the requested content has changed since the last request. This is useful when retrieving changed content in reaction to a webhook call.

By default, when the header is not set, the API serves stale content (if cached by the CDN) while it's fetching the new content to minimize wait time. To always fetch new content, set the header value to true.

Responses

200

A single content item object.

404

The specified content item is not published or was deleted.

Request samples

Copy
curl --request GET \
  --url 'https://deliver.kontent.ai/975bf280-fd91-488c-994c-2f04416e5ee3/items/on_roasts?elements=title%2Csummary%2Cpost_date%2Cteaser_image%2Crelated_articles' \
  --header 'content-type: application/json'

Response samples

application/json
Copy
Expand all Collapse all
{
  • "item":
    {
    • "system":
      {
      },
    • "elements":
      {
      }
    },
  • "modular_content": { }
}

Enumerate content items

get /{project_id}/items-feed
See full URL

Delivery API

https://deliver.kontent.ai/{project_id}/items-feed

Delivery Preview API

https://preview-deliver.kontent.ai/{project_id}/items-feed

Retrieve a dynamically paginated list of content items in your project. The items are ordered alphabetically by codename.

If the response comes with the X-Continuation header, it means that there are more pages to retrieve. To get the next page of results, send the X-Continuation header with your request as you received it.

This endpoint, unlike the List content items endpoint, guarantees enumerating all items in the specified project. We recommend using this endpoint for warming up your app's cache (i.e., getting all content into the cache after the app starts) or for exporting content of your project.

Filtering content items

Using filtering parameters and operators, you can retrieve a specific set of content items. For example, items tagged with a specific term, items of a specific type, or items modified in the past three days.

path Parameters
project_id
required
string
Example: 975bf280-fd91-488c-994c-2f04416e5ee3

Identifies your project.

query Parameters
elements
Array of strings
Example: elements=title%2Csummary%2Cpost_date%2Cteaser_image

Determines the elements to retrieve using a comma-separated list of element codenames. The elements query parameter applies to all content items within the response.

If not specified, all elements are retrieved. For more details, see Projection.

language
string
Example: language=en-US

Determines which language variant of content items to return. By default, the API returns content in the default language.

Note: If the requested content is not available in the specified language variant, the API follows the language fallbacks as configured in the Localization settings of your project.

order
string
Example: order=elements.post_date%5Bdesc%5D

Determines the order of the retrieved content items. By default, the items are sorted alphabetically by their codenames from A to Z in descending order.

To sort content items in ascending order, set the parameter value to <property>[asc] where is the name of the object property you want to sort by. For example, order=elements.title[asc]. Similarly, to sort in descending order, you can use the [desc] modifier. You can sort by properties of both the system and elements objects of content items.

Examples

  • Sort by date – order=system.last_modified[desc]
  • Sort by a content item name – order=system.name[asc]
  • Sort by an element value – order=elements.<element_codename>[asc]
header Parameters
X-Continuation
string

Determines the next page of results to retrieve. By default, when the header is not set, the API returns the first page of results.

If there are more items to enumerate, the response will come with the X-Continuation header. To get the next page of results, use the X-Continuation header from the response in your request.

X-KC-Wait-For-Loading-New-Content
boolean
Example: false

Determines whether the API waits while fetching content, if the requested content has changed since the last request. This is useful when retrieving changed content in reaction to a webhook call.

By default, when the header is not set, the API serves stale content (if cached by the CDN) while it's fetching the new content to minimize wait time. To always fetch new content, set the header value to true.

Responses

200

A dynamically paginated feed of content items and components.

Request samples

Copy
curl --request GET \
  --url 'https://deliver.kontent.ai/975bf280-fd91-488c-994c-2f04416e5ee3/items-feed?system.type=article&elements=title%2Csummary%2Cpost_date&order=elements.post_date' \
  --header 'content-type: application/json'

Response samples

application/json
Copy
Expand all Collapse all
{
  • "items":
    [
    • {