GraphQL

Usage

Protocol.

GET /core/graphql?query=...

GET /res/graphql?query=...

POST /core/graphql

IDE

GET /core/graphiql

Schema

type Query {
    ads: Ads
    analytics: Analytics
    posts(filters: PostsFilters, slice: PostsSlice): [Post]
    authors(filters: AuthorsFilters, slice: AuthorsSlice): [Author]
    sections(filters: SectionsFilters): [Section]
}

input PostsFilters {
    includedIds: [Int]
    excludedIds: [Int]
    includedStatuses: [PostStatus]
    excludedStatuses: [PostStatus]
    includedSections: [Int]
    excludedSections: [Int]
    includedAuthors: [Int]
    excludedAuthors: [Int]
    includedTags: [String]
    excludedTags: [String]
}

enum PostStatus {
    PUBLISHED
}

input PostsSlice {
    order: PostsOrder
    limit: Int
    allowDuplicates: Boolean  # doesn't work yet
}

enum PostsOrder {
    RATING
    RECENCY
}

interface Particle {
    pages: PageMap!
    title: String
    subtitle: String
    linkOut: LinkOut
    image: Image
    video: Video
    breadcrumbTitle: String
}

type Post implements Particle {
    id: Int
    content: ContentTree
    authors: [Author]
    primarySections: [Section]
    regularSections: [Section]
    primaryTags: [Tag]
    regularTags: [Tag]
    publishedAt: Int
}

input AuthorsSlice {
    order: AuthorsOrder
    limit: Int
}

enum AuthorsOrder {
    TITLE
    RATING
}

input AuthorsFilter {
    includedIds: [Int]!
}

type Author implements Particle {
    id: Int
}

input SectionsFilters {
    includedIds: [Int]!
    excludedIds: [Int]!
    includedPaths: [String]!
    excludedPaths: [String]!
    includedStatuses: [SectionStatus]!
    excludedStatuses: [SectionStatus]!
}

type Section implements Particle {
    id: Int
    slug: String
    path: String
    status: SectionStatus
}

enum SectionStatus {
    PUBLIC
    PRIVATE
    UNLISTED
}

type Tag {
    id: String
    slug: String
    pages: PageMap
    title: String
}

type ContentTree {
    rootRef: String
    tree: [ContentNode]
}

interface ContentNode {
    ref: String
    parentRef: String!
}

type GroupContentNode implements ContentNode {
    layout: ContentLayout
    adsOrder: [Int]!
}

interface ContentLayout {
    kind: ContentLayoutKind
}

enum ContentLayoutKind {
    PLAIN
    LISTICLE
    SLIDESHOW
}

type PlainContentLayout implements ContentLayout {
}

type ListicleContentLayout implements ContentLayout {
    flags: [ListicleContentLayoutFlag]
    numeration: Numeration!
}

enum ListicleContentLayoutFlag {
    ECOMMERCE
    MULTICOLUMN
}

type SlideshowContentLayout implements ContentLayout {
    flags: [SlideshowContentLayoutFlag]
    numeration: Numeration!
}

enum SlideshowContentLayoutFlag {
    COUNTER
    PARALLAX
    FULLSCREEN
    THUMBNAILS
}

type Numeration {
    order: NumerationOrder
}

enum NumerationOrder {
    ASCENDING
    DESCENDING
}

type ParticleContentNode implements Particle, ContentNode {
    id: Int!
}

type MediaContentNode implements ContentNode {
    kind: MediaContentKind
    code: String
    html(device: Device): String
}

enum MediaContentKind {
    TEXT
    IMAGE
}

type Ads {
    head: PlainAd
    body: List[BodyAd]!
    listicle: List[ListicleAd]!
    slideshow: List[SlideshowAd]!
    beforeListicle: List[PlainAd]!
}

interface Ad {
    template(device: Device): String
    isEnabled: Boolean
}

type PlainAd implements Ad {}

type BodyAd implements Ad {
    wordsCount: Int
}

type ListicleAd implements Ad {
    order: List[Int]
    title: String!
}

type SlideshowAd implements Ad {
    order: List[Int]
}

type Analytics {
    adobe: AdobeAnalytics
    google(rm: Boolean = false): GoogleAnalytics
    nielsen: NielsenAnalytics
    parsely: ParselyAnalytics
    comscore: ComscoreAnalytics
    omniture: OmnitureAnalytics
    chartbeat: ChartbeatAnalytics
}

interface AnalyticsConfig {
    accountId: String!
    linkers: JSONString
}

type AdobeAnalytics implements AnalyticsConfig {
    host: String!
    script: String!
}

type GoogleAnalytics implements AnalyticsConfig {
    dimensions: JSONString
}

type NielsenAnalytics implements AnalyticsConfig {
}

type ParselyAnalytics implements AnalyticsConfig {
}

type ComscoreAnalytics implements AnalyticsConfig {
}

type OmnitureAnalytics implements AnalyticsConfig {
    suiteId: String
}

type ChartbeatAnalytics implements AnalyticsConfig {
    useNakedDomain: Boolean!
}

enum Device {
    AMP
}

type Video {
    href: String
}

type Image {
    id: Int
    crops(sizes: List[String]!): [ImageCrop]
    flags: [ImageFlag]
    title: String!
    credit: String!
    altText: String!
}

type ImageCrop {
    size: String
    href: String
}

type ImageFlag {
    ANIMATED
    GIF
}

type LinkOut {
    pages: PageMap
    target: String
}

type PageMap {
    web: Page
    amp: Page
}

type Page {
    href: String
}