How To Write Content API Queries: Example Queries
Content API is a powerful tool for controlling and selecting the content that gets surfaced to readers. All Content API requests are performed in the context of a specific website. If your organization has multiple websites that it manages, your requests to Content API must specify which site will be rendering the content. By mandating a website on each request, Content API is able to gracefully handle content restrictions and circulations on your content.
Content API provides two types of endpoints: direct fetches and searching.
Direct Fetch
Direct fetches should be used when you know exactly which piece of content you want to surface, based on its Arc ID or Canonical URL. These endpoints can only return one piece of content.
GET https://api.{org}.arcpublishing.com/content/v4/_id=ABC123&website=the-herald
GET https://api.{org}.arcpublishing.com/content/v4/website_url=/sports/2021/03/15/team-wins-game&website=the-heraldContent API also provides endpoints that are specific to different content types, /content/v4/stories, /content/v4/galleries, /content/v4/videos. These are also direct fetch endpoints but narrow the retrievable content to just the specified type.
Searching Examples
The /content/v4/search endpoints of Content API allow for more complicated searches that return feeds of multiple content items rather than just one specific item. A few common use cases are listed in this document. For more detailed documentation, see Query Reference.
When searching for content, ensure that the query (q=) values are wrapped in quotes (do not wrap query keys). Some key values often contain certain special characters, which can cause query analysis issues resulting in inconsistent results. For example, a query for q=taxonomy.tags.slug:``national-news will likely return different results compared to q=taxonomy.tags.slug:``“national-news”.
Your use case for building a feed or searching for content may require accessing pages and pages of results. While Content API can support this, as of ElasticSearch 7, there is a hard limit of 10,000 documents in a single result set. We recommend adding a filter for a particular date range that will keep your result set under 10,000. Depending on your organization, the number of days that make sense may vary. By making a series of smaller queries, you can access all of the results and perform any required aggregation in the downstream system.
A count of stories:
https://api.{org}.arcpublishing.com/content/v4/search/published?website=the-herald&q=type:story&size=1&_sourceInclude=_id&track_total_hits=trueThe track_total_hits parameter tracks the true total hit count, even if total count is above 10,000
A feed of stories:
https://api.{org}.arcpublishing.com/content/v4/search/published?website=the-herald&q=type:storyA feed of stories, sorted by most recent and limited to 10:
https://api.{org}.arcpublishing.com/content/v4/search/published?website=the-herald&q=type:story&sort=display_date:desc&size=10A feed of stories in the Politics section:
https://api.{org}.arcpublishing.com/content/v4/search/published?website=the-herald&q=type:story+AND+taxonomy.primary_section._id:"/politics"&sort=display_date:desc&size=10A feed of stories in the Politics section that are tagged with “obama:”
https://api.{org}.arcpublishing.com/content/v4/search/published?website=the-herald&q=type:story+AND+taxonomy.primary_section._id:"/politics"+AND+taxonomy.tags.slug:obama&sort=display_date:desc&size=10A feed of stories in the Politics section limited to those set to display on a specific date range:
https://api.{org}.arcpublishing.com/content/v4/search/published?website=the-herald&q=type:story+AND+taxonomy.primary_section._id:"/politics"+AND+display_date:[2021-01-01+TO+2021-01-05]&sort=display_date:desc&size=10A feed of stories by a certain author:
https://api.{org}.arcpublishing.com/content/v4/search/published?website=the-herald&q=type:story+AND+credits.by._id:john-smith&sort=display_date:desc&size=10A feed of stories that have a video in the body:
In this example, you can sub video for any object that can appear in content_elements: image, gallery, reference, quote, etc.
https://api.{org}.arcpublishing.com/content/v4/search/published?website=the-herald&q=type:story+AND+content_elements.type:video&sort=display_date:desc&size=10A feed of stories, but I don’t actually need anything in content_elements so let’s make that response smaller:
https://api.{org}.arcpublishing.com/content/v4/search/published?website=the-herald&q=type:story+AND+taxonomy.primary_section._id:"/politics"+AND+content_elements.type:reference&sort=display_date:desc&size=10&_sourceExclude=content_elements,related_content,additional_propertiesA feed of stories filtered to a particular year of content:
This query uses DSL query language in the body= query param; the q= param is not used.
https://api.{org}.arcpublishing.com/content/v4/search?website={website_id}&body={"query":{"filtered":{"query":{"term":{"type":"story"}},"filter":{"bool":{"must":[{"range":{"created_date":{"gte":"2017-01-01","lte":"2017-12-31"}}}]}}}}}&size=100A single story based on a search that may return more than one story:
In this example, even though the results of the search are greater than 1, we coerce the response to match that of the direct fetch endpoints listed above.
https://api.{org}.arcpublishing.com/content/v4/search/published?website=the-herald&q=type:story+AND+taxonomy.primary_section._id:"/politics"&sort=display_date:desc&size=10&single=trueA single story, looked up by its source_id:
https://api.{org}.arcpublishing.com/content/v4/search/published?website=the-herald&q=source.source_id:123456789&single=trueA feed of videos:
https://api.{org}.arcpublishing.com/content/v4/search/published?website=the-herald&q=type:video&sort=display_date:desc&size=10A feed of galleries:
https://api.{org}.arcpublishing.com/content/v4/search/published?website=the-herald&q=type:gallery&sort=display_date:desc&size=10