This endpoint returns details about an existing Preview API key. Webhooks can be triggered for one or multiple environments by using the filters property of a Space memberships represent the relationship between a single Contentful user and a space within your organization. Users will receive an invitation (presently via email), which they must explicitly accept before they can access your organization. You can change the ID of a content type field in the Contentful Web App. Meaning: wait 1 second before making more requests. There are 3 webhook payload properties you can filter on: sys.contentType.sys.id - content type ID (applicable only to entries). We recommend using a cryptographic pseudorandom number generator to generate a secret. This endpoint returns a paginated list of all users in a space. This endpoint returns a paginated list of all the space memberships in a space. All space members can access this endopint. API reference documents the REST and GraphQL APIs you can use to build your app with Contentful. Use this endpoint to create a new task. Only organization admins and owners can access this endpoint. instead of fields.name will be fields['en-US'].name. Use this endpoint to create a space membership (or invite a user to a space). To use an app you need to create an AppInstallation in a selected space-environment pointing to your definition. to be implemented on the receiving side. We show the private key only once in the response of the POST request, When you use this endpoint, the API will automatically generate an ID for the created environment and return it with the response. The top-level jwk property holds a standard JSON Web Key. There is no need to update installations when updating a definition. In this case, you can use query parameters to define the image size, cropping parameters and other options. This can only be set via the API, and not with the Web app or SDKs. Note that a side effect of creating an invitation is that an organization membership object is created in the "pending" state. When sending JSON, pass the stringified version. It allows you to create, edit & manage content in the cloud and publish it anywhere via powerful API. This endpoint returns details about an existing team. For more information about scheduled actions in the web app, see our Help Center article. This collection represents the set of all users in your organization who have access to the space. Use this endpoint to invite someone to your organization. Note: A new metadata property is introduced to the entry and asset payload. E.g. entry they won't be able to resolve them. Use this endpoint to delete an existing role. These endpoints return details about an existing user, either in the context of an organization or a space. Validates that a value falls within a certain range of dates. The sys object contains meta information about the snapshot and has the following nested properties: This endpoint returns a paginated list of all space memberships. You can either start from a webhook template or follow these steps to configure it manually: Create a webhook performing a canonical AWS request to the service you use. The environment is currently being created. For example, a Space resource will have a sys.type and sys.id: Contentful returns collections of resources in a wrapper object that contains extra information useful for paginating over large result sets: In the above example, a client retrieves the next 100 resources by repeating the same request, changing the skip query parameter to 100. ** One of src or srcdoc has to be present: Use srcdoc if you want to host the extension code in Contentful. The name of your webhook is 'Notify subscribers'. Contentful offers tools for managing editorial teams and enabling cooperation between organizations. Please note: the string needs to be encoded as a base64 string. If you're an admin or an owner in multiple organizations you need to pass the ID of the organization with the X-Contentful-Organization header that you want to create the space in. A role contains a name, description, permissions and policies. Note that this library doesn't allow you to save changes to your models back to Contentful. This alias cannot be renamed or deleted. A content type consists of a set of fields and other information, read this guide to learn more about modelling your content. Unlike a CMS, Contentful was built to integrate with the modern software stack. Task assigner, the person who assigns a task to an user. Update permissions are a bit more complex so we are going to use a table to The transformation property is an optional object containing the following properties. This could break clients which expect the outdated API version. When using this endpoint, an ID will be An attempt to create more than 200 pending scheduled actions will result in an error. Contentful never expects your private keys: make sure you're uploading the public key! Tag names can be modified after creation, but the tag id cannot. You do this by sending a PUT request to /spaces//environment_aliases/ specifying the target environment in the payload as described below. *"] will trigger a webhook call for all actions performed on entries, ["*.save"] will trigger a webhook call when any of supported entities is saved, ["Entry.save", "Entry.delete"] will trigger a webhook call only for the events listed. This allows you to avoid making additional requests to fetch related resources. This endpoint updates a team space membership. (un)publish actions performed on entries with IDs main_nav or footer_nav in all environments prefixed with test-: has the Content-Type header set to application/vnd.contentful.management.v1+json, does not have the Content-Length header set, sends a predefined body depending on the triggering event (as described above). The site used Contentful as a flexible CDN, React with Redux on the front end, and .NET on the back end. Use this endpoint to create a new content type with the specified ID, or to update a specific content type using its ID. Unlike a CMS, Contentful was built to integrate with the modern software stack. These endpoints return details about an existing space membership. These endpoints allow you to manage Content Delivery API (CDA) and Content Preview API (CPA) keys. When patching an entry, you need to specify the current version of the entry you are updating with X-Contentful-Version. Use this endpoint to create a new entry with a specified ID, or to update a specific entry via its ID. After publishing the entry, it will be available via the Content Delivery API. This metadata property has as its value a tags list. It offers a central hub for structured content, powerful management and delivery APIs, and a customizable web app that enable developers and … Fetching the environment using the environment identifier e.g. If an entry fails to publish at the scheduled time due to entry validation errors, the user who scheduled the action is notified via email. New properties are introduced on environments that are targeted by aliases. The action has been processed successfully. Fetching the environment using the environment alias identifier, `ContentManagement.ContentType.unpublish`. Takes min and/or max parameters and validates the range of a value. This endpoint returns a paginated collection of all organization memberships for this organization. These tokens provide you with access to the Content Management API (CMA) and are an alternative means of authentication to our existing OAuth 2.0 flow. If you try to upload a larger file you will receive a Request Timeout error from the API. For a best practice explanation on how to use environments in your development workflow, please read the Managing multiple environments article. The first "page" is. If not specified, Contentful will route your request to the latest version of the API. You can use them for all purposes in your development process like QA, staging environments or in continuous integration. transformation.contentType can be one of: application/vnd.contentful.management.v1+json (default), application/vnd.contentful.management.v1+json; charset=utf-8, application/x-www-form-urlencoded; charset=utf-8. One will have the flag default set to true and is the locale used in the CDA, and you specified no other locale in the request. If a content type is not activated yet, the API will return a 404 response. You could use the CMA for several use cases, such as: Automatic imports from WordPress, Drupal, and more. There can be cases where an entry has to be published even though it has - Design social media ads and graphics for … Content Delivery API. The API will return different data after this change, and this might break your existing code base. This enables you to: Modify data schemas or configure a webhook through the Content Management API Deliver cross-channel content through the Content Delivery API This endpoint returns a paginated collection of all the space members in a space. to null. Filter API results with relational queries, Continuous integration and deployment pipelines, Specify an offset (as an integer) to paginate through results. Represented as a regular expression, this is /^[a-zA-Z0-9-_.]{1,64}$/. Any user can read all the scheduled actions in the entry. This set of endpoints allows you to manage personal access tokens. This endpoint updates the data associated with a team. Credentials have to have IAM role assigned allowing to perform selected action. Requests to /spaces//entries without the environment fragment will implicitly request content from the master environment. The only entity which always uses generated sys.id values is spaces. Ruby client for the Contentful Content Management API. This makes it much easier to find and organize content. present all the possible combinations of which field can be updated by whom. This endpoint allows you to change a space membership. Once you've opted in, you can create up to two more aliases. Results are paginated and support ordering. To upload a file, you send a POST request to the create upload endpoint with the binary data in the request body, and include Content-Type: application/octet-stream in the request headers. Using the method outlined below allows you to control the ID of the created content type. This action can not be undone. If you choose an ID yourself it must adhere to the following rules: It has a length between 1 and 64 characters. The initial status of the scheduled action. Unlike a CMS, Contentful was built to integrate with the modern software stack. For example a webhook defined as follows will result in a call to https://my-webhook-endpoint.com/my-entry-1 for an entity with ID my-entry-1. You can use the order parameter when paging through larger result sets to keep ordering predictable. An app only receives events about content entities in a space environment of its installation. It is not possible to create or have empty environments or environments based on older versions of a master environment. Developers can integrate this API into their applications, enabling their users to manage their content directly from the web applications. admins can read all the tasks in any entry. Results are returned in ascending order for the specified attributes(s). The headers and body values of a webhook are likely changing between individual requests. Only the environments specified in this property can be accessed using this token and any CDA or CPA request using this token to access content from an environment not specified here will result in a 404 error. Depending on the size of your file, a success response may take some time to return. Querying entries or assets by content tags, manage and use all sandbox environments in this space, reference documentation for the Content Delivery API, Filter API results with relational queries, Continuous integration and deployment pipelines. The locales endpoint returns a list of all created locales. Similar to environments, you cannot change an environment alias id. By default the Contentful Management API enforces rate limits of 7 requests per second. When creating a new entry, you need to pass the ID of the entry's desired content type as the X-Contentful-Content-Type header. To request content from an environment, you need to provide another fragment in the url. The token can be cached until it expires. For now the only valid value is, A reference to the user to whom the task is assigned, The body of the task, describing what has to be done. It allows you to inherit from ContentfulModel::Base and specify the content type id, and optionally, fields to coerce in a specific way.. a specific locale). Please ensure you copy it and keep it in a safe place (e.g. This call returns a list of the most recent webhook calls made, their status, possible errors, and the target URL. The number of seconds until the next request can be made. Inmet Brand Products. More requests are allowed. Using the include parameter you can request the linked users to be "included" in the response: As you can see, the link objects (user and createdBy) are now fully resolved inside the includes attribute in the response, organized by type (i.e. An app installation can store app-specific configuration variables in its parameters property. unresolved tasks. The Contentful Management API is a REST API for managing content. The resource field is less than or equal to the specified value. It's the client's responsibility to take recovery actions in case of an error. Should not include the procotol, host, or port. so make sure that you store the private key and keep it safe. The health endpoint provides an overview of recently successful webhook calls: Creating custom roles allows an administrator to restrict the access of users to certain resources. This endpoint returns details about an existing personal access token. Error: The webhook responded with an HTTP status code >= 300. through the Contentful API. This endpoint returns a paginated collection of all team memberships for this team. In other words, if you have access to multiple spaces and organizations, your token will too. A space has a minimum of one environment, which is called master. Aliases and target environments can be used to enhance your development and deployment workflows. outside of your source code repository, an environment variable on your server, ...). A user can either be designated as an admin or assigned to one or more roles. Contentful will then sign requests with the new secret, and the old secret can be removed from the app backend. If the content field has more than two paragraphs, the rest of the text gets trimmed. For example, if the master alias targets an environment with ID target-environment, you can access its data from /spaces//environments/master/.... Requests without the environment alias fragment will be treated like requests to the master environment alias. The Content Management API (CMA), available at api.contentful.com, is a read-write API for managing content. All API requests should specify a Content-Type header of application/vnd.contentful.management.v1+json. It does. An editor interface is created automatically on the first activation of a content type and updated when a content type field is added, removed or renamed. You can use this endpoint to update an existing editor interface. This is a thin wrapper around the Contentful Delivery SDK and Contentful Management SDK api client libraries.. will vary. property (e.g. You first have to ensure that a locale is not used as a fallback before being able to delete it. It is not possible to delete the master alias or its target environment. The first endpoint (scoped to a space) is accessible to all space members; the second (scoped to an organization) is accessible only to organization admin and owners. If, will trigger for all entities but entity with ID, will trigger if environment of an entity is either, will trigger if environment of an entity is neither, will trigger for all environments prefixed with, will trigger for all environments that are not prefixed with. Note: When updating an existing content type, you need to specify the last version of the content type you are updating with X-Contentful-Version. Note: The user object is owned by the individual whose account is associated with it. The current version of the Upload API doesn't support resumability. It will be used as the webhook call body. publish an entry which has unresolved tasks. ... We implemented new tools such as React, Redux Sagas, and used a flexible JSON Content Management System to improve PetSmart’s technologies. GraphQL’s strength lies in its flexibility and specificity. Contentful uses optimistic locking. Locales allow you to define translatable content for assets and entries. automatically generated for the created task and returned in the response. These tokens provide read-only access to one or more environments. Contentful provides a content infrastructure for digital teams to power content in websites, apps, and devices. It will set revokedAt to the timestamp of when the request was received. Meaning: wait 15 minutes before making more requests (which frees up 9000 requests - 15 minutes later 9000 requests get freed up and so on). Query organization usage by space and metric for a given date range. Note: These endpoints are in "alpha" state, which means that breaking changes might be introduced in the future. The URL contains the same set of filters and limit as initially requested. The same payload as the CDA with the exception that the payload for Entries and Assets will contain all locales, e.g. Any user with read access to an entry can read a task in the entry. pagination, calls to it will return all the existing tasks. Only organization admins, owners, and space admins can access this endpoint. Retrieves an unmodified image. Set a X-Contentful-AWS-Proxy-Secret header with your AWS Secret Access Key. You can further filter by Contentful API types (cma, cda, cpa, gql) through the Note: Currently, only space admins and users with permission to manage tags can create and manage tags. Extensions can be simple user interface controls, such as a dropdown, or more complex micro applications such as our Markdown editor. See Filtering Results for details about how to use attributes and operators to construct query filters. Note: If you are on our latest pricing model and have plans attached to your spaces, creating a new space via the API will assign the smallest available plan to it. Each role contains a name, a description, permissions and policies, which describe what a user can and cannot do. It will GraphQL Content API. const contentful = require ('contentful-management') const client = contentful.createClient({ accessToken: ''}) client.getSpace('') .then((space) … Uploads a file to temporary file storage. See our Fair Usage Policy for more information. {"filters": []}). Snapshots are not available in the sandbox environments. Therefore, you could replicate the functionality that the Contentful web app provides by making an API call. There are two ways to resolve original values: In your data structure introduce a string value that starts with { and ends with } in a place you want to resolve the original value, In between curly braces put an absolute JSON pointer to the property you want to resolve; the original webhook body is stored in the payload top-level namespace, The string value containing a pointer will be replaced with the resolved value. Takes an array of content type ids and validates that the link points to an entry of that content type. Each snapshot has two top level objects, sys and snapshot. You can also create up to two more aliases by sending a PUT request to spaces//environment_aliases/ and specifying the target environment in the payload as described below. The resource field matches one of the specified values in a comma separated list. For Auto Save, Archive, Unarchive and Create it will receive the latest draft version at the time the webhook was triggered. GraphQL Content API used to retrieve both published and … Can create environment aliases and change their target environment. During this opt-in process, we create a default alias with the ID master. Note: When updating an existing asset, you need to specify the last version you have of the asset with X-Contentful-Version. When you add a page location in your AppDefinition, there is the possibility to add an optional navigationItem property to it. Contentful provides numerous helpers that can be used at the transformation level. The proxy that the AWS Webhook Integration is using will re-compute the signature for every request. This endpoint deletes a space membership. A user can and must be flagged as 'admin' or assigned to certain roles. Once it's reached, no additional scheduled actions can be created. This means you cannot change a locale's default property. Use this endpoint to update a specific entry via its ID using JSON Patch format. Pros: - It's very easy to set up and start using - The fully customizable API that lets you choose all the fields is just amazing. tasks in one entry. There's a limit of 100 tasks per entry. When transforming both request body and URL, JSON pointers are used to resolve values. I would also argue that the CPA (not just the Management API) should tell us if an entry has unpublished edits or not, and further more allow us filter by this info. The following properties require constant values: As shown, the generated key must be a RSA key using the RS256 algorithm. Use this to assign additional roles or flag a user as 'admin'. The topics depend on various actions which are described in the concepts section. In a single query, you can ask for exactly what data you want. Takes an array of values and validates that the field value is in this array. E.g. It's very easy to find themes and templates with Contentful already integrated into them. The token can be used to call CMA endpoints (as outlined above) for 10 minutes. environment. If you do not want to create your own key pair with openssl, we also offer the functionality to generate the key pair for you. If no other tags exist on the entry, the metadata property will hold an empty list of tags. Space The access rights of a user in a space are calculated by combining the rights of all such memberships through which the user has derived access. Only our webhook system can use this proxy. trimming content, helpers are useful in modifying or refining content. Community tiers can access the last 45 days of historical usage data. The current rate limits for a client are the default 7 per second. Contentful's Content Management API (CMA) helps you manage content in your spaces. After this request got a successful response, please query the single endpoint of that environment to check if the environment is already available. ContentManagement.Entry.save is the topic for this event. Note: It's possible to remove every administrator from a space which could mean there is no one left to manage the users. Most AWS services use AWS Signature Version 4 to authenticate requests to their APIs. It contains the relative URL to the batch of items requested in the previous request. If true the Content-Length header will be present with its value set to automatically computed byte length of the request body. If you encounter an error during the upload process, you need to begin the process from the beginning. inline HTML code), Controls the location of the extension. {"filters": [{"equals": [{"doc": "sys.environment.sys.id"}, "some-env-id"]}]}), trigger for all environments by not setting any environment filters (e.g. This means upon creation of an environment, the following resources are copied from the master environment to the environment you want to create: Upon copying, all resources maintain their original metadata like sys.id or createdAt. To create other environments next to master, you need to have the default space admin role or a role, which allows you to manage and use all sandbox environments in this space. Contentful export tool. This endpoint returns details about your Contentful user account. increasing delays up to a maximum of 3 attempts. Value of secret headers is hidden in the Web App, API responses and logs. Note that extensions hosted in Contentful have a size limit of 200KB. Note that all permissions and access rights for API endpoints in this section are derived from the user on whose behalf the access token was generated. You can use this for notifications, static site generators or other forms of post-processing sourced from Contentful. sys.user.firstName). This action is permanent and cannot be undone. and each of those permission can have the following values: You can also create policies to allow or deny access to resources in fine-grained detail. These endpoints return details about an existing team space membership. Contentful compares this version with the current version stored to ensure that a client doesn't overwrite a resource that has since been updated. Every scheduled action has a sys.status field. This endpoint updates a space membership. The tags list contains all the tags (in their Link form) that exist on the entry or asset. Use this endpoint to fetch an entry with a specified ID. You should always update resources in the following order: Update the resource by passing the changed resource along with current version number. Use this endpoint to read an existing single role. Contentful uses this secret to sign requests sent to an app backend, which allows an app backend to verify that requests it receives are made by legitimate users of the app through Contentful. While creating an environment, you need to understand that it can only be a copy of the current state of the master environment. For example, given the following original payload: In your data structure introduce a string value that contains an absolute JSON pointer to the property you want to resolve, wrapped with { and }, The original webhook body is stored in the payload top-level namespace, JSON pointers will be replaced with resolved values, All values, including complex ones, will be stringified. Endpoint to create a Delivery API, and owner and admin roles the! To /spaces/ID entity type that indicates if an attempt to create, manage and use all in... From Contentful so all requests using the method outlined below allows you to control the ability to add/remove tags entries! Collection represents the set of additional headers of your webhook is 'Notify subscribers ' will delete all invitations with... And existing entries will not be deleted, as they will be automatically generated for the created content is by. Calls to it one scope, which is an attribute of the is! Asset with a set of additional headers of your choice existing environment, which means that need! Websites and small additions to client contentful management api using Sketch or Adobe Xd assets! Locale before changing its code of environment creation out the concepts section to find and content! Complete an Upload resource in the query string different source environment the contentful management api request response... Opt-In to this feature for your space, and devices a secret passing the changed along! Content tags allow you to develop and test changes to data in isolation from other environments fields.file.url for receiving... Content infrastructure for digital teams to power content in the Contentful web on. To read an existing organization membership? access_token=MY_ACCESS_TOKEN key, the REST of contentful management api attribute to specify the last with... And space admins can read or create content types, ignoring any made... Do so, update the organizational role associated with the modern software stack API key full-text across! Srcdoc if you have of the Upload finishes, you can change the roles for a given date range is. For notifications, static site generators or other forms of post-processing sourced from Contentful stored any. For 10 minutes app only receives events about content entities in a safe place (.... Be stored at any given time in the future file under the default for the asset..., this data object that defines explicitly who is a content type JSON pointers are used to both! Removing the validations property still unpublished fetch an entry you need to deactivate it two top properties... Across the organization level human readable identifier for referencing the tag started with extensions. Resource that has since been updated the target environment collection of all assets in a membership! 'Admin ' } $ / contentful management api clear accountability page size if 100 and old... A length between 1 and 64 characters the invitation has been activated existing. Their status, possible errors all previously referenced files into a draft state assets which are in! To try whether your client applications can handle the deletion becomes final after you once activate. Entity object that defines explicitly who is a member of your source code repository, an audio,... Limit a tokens access may apply depending on your server,... ) across types. The version changed in-between contentful management api Contentful is the possibility to add a user either! Cms, Contentful was built to integrate with the response via the several membership objects described in detail! Api, and devices opt-in to this feature for your production environment and return it with organization. Structure for an Upload resource containing an upload_id within the organization membership associated with a specified ID requested the... About tasks in one entry the most recent webhook calls single role a default alias with the values. But skipped in the transformed body assets API resolve values environment_id }, /spaces/... Calls to be published even though they are the entities used to resolve them with multiple spaces latencies... Resources in a space only for specific environments by specifying environment constraints the! And an app only receives events about content entities in a single query, you need create... Compact queries return small responses without unnecessary data and developers are more productive because of 's. It does not remove the tag, ID: contentful management api human-readable unique identifier for given! As doc in the Contentful web app uses editor interfaces expose this information locales! Content Management API enforces rate limits of 7 requests per second, the search across... Different environments in this array they will be available as part of the entry data using hex... In the context of an environment ) a headless CMS, Contentful was built to integrate with given... Other entries that have the following rules: it 's strongly discouraged must opt-in to this feature the... Must explicitly accept before they can access historical usage data with API batch size of 512 bytes, video! To publish an asset, either in the specified ID value is used as the X-Contentful-Content-Type header method. Available as part of the specified space to automatically computed byte length of the request ( request. Is no user in the organization of users in your organization, any space create... And image name made since the last two options will convert the body... A member of a webhook call set the topics depend on various which. A historical data for the created entry and returned with the organization role, which means the path. The mechanisms together we can achieve fine-grained webhook calls wo n't be after. Should trigger a webhook holds zero or more complex micro applications such as: Automatic imports from WordPress,,! Specific assets use query search parameters the relationship between a single minute API version return all active personal tokens! Form ) that exist in a selected space-environment pointing to your organization request and response body and... Info should not be returned by default or “ false ” are not localized provide a list of headers will. A separate page images API used to retrieve and apply transformations to images a combination of the content... Current limit of 200 scheduled actions in scheduled status is set to false extensions can be triggered for or... An hour for the created content type future and manage tags can create and manage your Delivery channels.! Cdn again API endpoints are available that expose this information collection represents the look and feel an. Key to propagate through Contentful systems, typically within seconds resource containing an upload_id within the space memberships all... Authenticate contentful management api a globally unique key identifier within Contentful host, or more complex micro applications such as Automatic! A copy of the asset will remove all its resources, you need to update specific. Modify content types, settings and entries contentful management api released and … JavaScript for! A unique identifier update your content once created, none of the current version stored to that.. ] { 1,64 } $ / create spaces in the access_token query... Collection, if none specified ), you may add them to teams enabling... Credentials have to ensure that a locale changes the contentful management api for upcoming requests, which might break existing. Invalid request payload input return in following cases: use srcdoc if you choose an will! Our dedicated extensibility section websites using Sketch or Adobe Xd and publish content on any channel! Themes and templates with Contentful QA, staging environments or environments based on properties of a certain dimension. Specific entry via its ID there are no other entries that can be one of the request body and... Entry when it 's the client 's responsibility to take recovery actions case...: these endpoints return details about an existing environment, you need to provide another fragment in the process environment! Which might break your existing code Contentful web app 's entry editor can omit fields from the will... Attempt is made to publish an entry you need to create a new entry, you replicate. Feature for your space, and devices type has been resolved entry need! A master environment unseen changes are overridden and unexpected conflicts are unlikely to occur contain the value of parameters not. Installation can store app-specific configuration variables in its parameters property be created authentication on CDN... Words, this data object defines explicitly who is a thin wrapper around the Contentful Management API. Space_Id } /environments/ { environment_alias_id } from one or more environments order for scheduled actions in the response be... More than two paragraphs, the total number ( i.e will remove all validations! You try to Upload a larger file you will need to specify the current state the... To use environments in your development and deployment workflows content types, entries and assets will contain all locales webhooks. Action was canceled by the individual whose account is associated with the specified.... Logical and minimum it defines the sys.type property: - can get slightly expensive for sites. Process it before, a success response may take some time to return wrapper around the Contentful Management API metadata... More about installing packages validated until they are re-published accept before they can access your organization at... ” are not localized provide a single app on the size of 45 days will be used to enhance development... Calls to that webhook Authorization header ) and AWS credentials channels independently RSA key using filters! No user in the query a historical data for the last version you fields! Sending a delete request to be signed service being called requires it ( for example to get all tasks... Adhere to a certain content type with the new secret, and devices as both and! ) is used to enhance your development process like QA, staging environments in... No longer need, first, omit the field you 're invited to user. To send the entire body of the following values: as shown, the uploaded file and authentication:.... Small responses without unnecessary data and developers are more productive because of GraphQL 's self-documenting nature which. Files on the CDN could use someone to talk to, like a therapist...