Ninja Publish — Looper field reference
Every field returned by every provider, with the exact token to paste and a live example pulled from staging. Generated from real provider output.
Store providers return the shapes the existing Cornerstone pages already consume — switch a Looper from JSON to one of these and the layout keeps working. Generic providers return the API's own shapes, for new layouts.
Single-row providers render once; loop their nested arrays with a child Looper set to Provider → Dynamic Content.
Store page providers
np_product
Product buy box. Returns ONE row. Slug comes from /product/{slug}/ or a "slug" param.
Field · Token to paste · Live example
eyebrow{{dc:looper:field key="eyebrow"}}(empty)
title{{dc:looper:field key="title"}}Yard Sign (24x18)
slug{{dc:looper:field key="slug"}}yard-sign-24x18
is_priced{{dc:looper:field key="is_priced"}}0
price{{dc:looper:field key="price"}}Price on request
price_note{{dc:looper:field key="price_note"}}(empty)
compare_at{{dc:looper:field key="compare_at"}}(empty)
has_compare{{dc:looper:field key="has_compare"}}0
cta_label{{dc:looper:field key="cta_label"}}Contact us
cta_href{{dc:looper:field key="cta_href"}}#
total_label{{dc:looper:field key="total_label"}}Line total
total_value{{dc:looper:field key="total_value"}}—
options — nested array. Add a child Looper, Provider → Dynamic Content, value:
{{dc:looper:field key="options"}}options.label{{dc:looper:field key="label"}}Frame color
options.name{{dc:looper:field key="name"}}frame_colour
options.input_type{{dc:looper:field key="input_type"}}radio
options.affects_schedule{{dc:looper:field key="affects_schedule"}}0
options.note{{dc:looper:field key="note"}}Powder-coated finish
options.choices — nested array. Add a child Looper, Provider → Dynamic Content, value:
{{dc:looper:field key="choices"}}options.choices.label{{dc:looper:field key="label"}}White
options.choices.note{{dc:looper:field key="note"}}(empty)
options.choices.value{{dc:looper:field key="value"}}white
options.choices.swatch{{dc:looper:field key="swatch"}}#f4f5f7
options.choices.has_swatch{{dc:looper:field key="has_swatch"}}1
options.choices.price_delta{{dc:looper:field key="price_delta"}}(empty)
options.choices.qty{{dc:looper:field key="qty"}}(empty)
options.choices.unit{{dc:looper:field key="unit"}}(empty)
options.choices.checked_attr{{dc:looper:field key="checked_attr"}}checked
np_product_gallery
Product gallery. ONE row; loop "thumbs" for the thumbnail strip.
Field · Token to paste · Live example
image{{dc:looper:field key="image"}}(empty)
has_image{{dc:looper:field key="has_image"}}0
media_bg{{dc:looper:field key="media_bg"}}#eaf0ff
badge{{dc:looper:field key="badge"}}(empty)
has_badge{{dc:looper:field key="has_badge"}}0
badge_bg{{dc:looper:field key="badge_bg"}}#fff6d9
badge_color{{dc:looper:field key="badge_color"}}#a87b12
thumbs — nested array. Add a child Looper, Provider → Dynamic Content, value: Each row also carries
value_key (“group:value” of the option the image depicts — the gallery’s swap key, emitted as data-np-value).{{dc:looper:field key="thumbs"}}np_product_details
Spec table. ONE row; loop "rows" for label/value pairs.
Field · Token to paste · Live example
heading{{dc:looper:field key="heading"}}Product details
note{{dc:looper:field key="note"}}(empty)
description{{dc:looper:field key="description"}}(empty)
rows — nested array. Add a child Looper, Provider → Dynamic Content, value:
{{dc:looper:field key="rows"}}np_related
Related products. ONE row; loop "items".
Field · Token to paste · Live example
heading{{dc:looper:field key="heading"}}You might also like
note{{dc:looper:field key="note"}}(empty)
items — nested array. Add a child Looper, Provider → Dynamic Content, value:
{{dc:looper:field key="items"}}items.title{{dc:looper:field key="title"}}Branded Notepad Set
items.note{{dc:looper:field key="note"}}Merchandise
items.price{{dc:looper:field key="price"}}$16.00 each
items.image{{dc:looper:field key="image"}}(empty)
items.has_image{{dc:looper:field key="has_image"}}0
items.media_bg{{dc:looper:field key="media_bg"}}#eaf0ff
items.action_label{{dc:looper:field key="action_label"}}View
items.action_href{{dc:looper:field key="action_href"}}np_cart_lines
Cart lines. One row PER LINE — no nested loop needed.
GRID ORDERS fold into one row: sibling cells share a batch, and the folded row has
id = batch:{uuid}, badge “Grid order”, qty = total pieces, options = the cell breakdown, and one Remove for the whole batch. The remove control works through data-np-remove on the Action element (bound via custom atts) — store.js posts it and reloads; batch: ids remove every sibling at once. Editing: link to /product/{slug}/?edit={batch} — the grid pre-fills and the button becomes “Update cart”.Field · Token to paste · Live example
id{{dc:looper:field key="id"}}3
title{{dc:looper:field key="title"}}Branded Notepad Set
options{{dc:looper:field key="options"}}3
qty{{dc:looper:field key="qty"}}3
unit_price{{dc:looper:field key="unit_price"}}$16.00
price{{dc:looper:field key="price"}}$48.00
thumb{{dc:looper:field key="thumb"}}(empty)
thumb_bg{{dc:looper:field key="thumb_bg"}}#eaf0ff
thumb_color{{dc:looper:field key="thumb_color"}}#2a3757
has_action{{dc:looper:field key="has_action"}}1
action_label{{dc:looper:field key="action_label"}}Remove
action_href{{dc:looper:field key="action_href"}}#
has_badge{{dc:looper:field key="has_badge"}}0
badge{{dc:looper:field key="badge"}}Primary
badge_bg{{dc:looper:field key="badge_bg"}}#eef2ff
badge_color{{dc:looper:field key="badge_color"}}#3b4a7a
np_summary
Order summary. ONE row; loop "totals", and "issues" when has_issues is 1.
Field · Token to paste · Live example
title{{dc:looper:field key="title"}}Order summary
totals — nested array. Add a child Looper, Provider → Dynamic Content, value:
{{dc:looper:field key="totals"}}totals.label{{dc:looper:field key="label"}}Subtotal
totals.value{{dc:looper:field key="value"}}$48.00
totals.note{{dc:looper:field key="note"}}(empty)
totals.fg{{dc:looper:field key="fg"}}(empty)
total_label{{dc:looper:field key="total_label"}}Total
total_value{{dc:looper:field key="total_value"}}$48.00
total_note{{dc:looper:field key="total_note"}}3 items
cta_label{{dc:looper:field key="cta_label"}}Checkout
cta_href{{dc:looper:field key="cta_href"}}has_issues{{dc:looper:field key="has_issues"}}0
issues — nested array. Add a child Looper, Provider → Dynamic Content, value:
{{dc:looper:field key="issues"}}foot{{dc:looper:field key="foot"}}(empty)
np_org_brand
Organization brand. Returns ONE row — the signed-in agent’s org identity, and whatever org the admin-bar “Store view” is previewing. Colors fall back to house defaults so pages look finished for an org with no kit yet.
Also available WITHOUT a looper: every storefront page carries
--org-primary, --org-secondary, --org-accent, --org-logo, --org-logo-light and --org-logo-dark as CSS variables on :root — style any element with var(--org-primary) and the store dresses itself per org.In HEADERS and FOOTERS (or anywhere outside a looper) use the DYNAMIC CONTENT token instead — looper tokens only resolve inside a looper, and Cornerstone’s Image Source control never runs shortcodes:
{{dc:np_org_brand:logo}}, {{dc:np_org_brand:color_primary}}, any field below. The group is listed in the token picker as “NP Org Brand”. In plain text content the shortcode also works.Field · Token to paste · Live example
brand_name{{dc:looper:field key="brand_name"}}Demo Realty Group
has_brand{{dc:looper:field key="has_brand"}}1
color_primary{{dc:looper:field key="color_primary"}}#0B4F6C
color_secondary{{dc:looper:field key="color_secondary"}}#01BAEF
color_accent{{dc:looper:field key="color_accent"}}#FBFBFF
logo{{dc:looper:field key="logo"}}https://…/brand-assets/logo.png
logo_light{{dc:looper:field key="logo_light"}}(falls back to logo)
logo_dark{{dc:looper:field key="logo_dark"}}(falls back to logo)
has_logo{{dc:looper:field key="has_logo"}}1
favicon{{dc:looper:field key="favicon"}}(empty)
phone{{dc:looper:field key="phone"}}(214) 555-0100
email{{dc:looper:field key="email"}}hello@demorealty.com
website{{dc:looper:field key="website"}}demorealty.com
address{{dc:looper:field key="address"}}123 Main St
city{{dc:looper:field key="city"}}Rockwall
state{{dc:looper:field key="state"}}TX
zip{{dc:looper:field key="zip"}}75087
license_number{{dc:looper:field key="license_number"}}TX-0123456
Generic API providers
np_products
Raw catalog list, API shape. One row per product. Params: category, tag, search, per_page, page, sort.
Provider params accept dynamic content — the /shop page filters by URL with provider JSON
{"category":"{{dc:url:param key='category'}}","per_page":"48"} (single-quoted dc args: escaped quotes inside the JSON break the token parser). Rows also carry permalink, the built product URL.Field · Token to paste · Live example
id{{dc:looper:field key="id"}}7
type{{dc:looper:field key="type"}}merch
name{{dc:looper:field key="name"}}Branded Notepad Set
slug{{dc:looper:field key="slug"}}branded-notepad-set
sku_root{{dc:looper:field key="sku_root"}}MCH-NPD
description{{dc:looper:field key="description"}}Set of three 50-sheet notepads.
requires_design{{dc:looper:field key="requires_design"}}bool
is_purchasable{{dc:looper:field key="is_purchasable"}}bool
is_downloadable{{dc:looper:field key="is_downloadable"}}bool
categories — nested array. Add a child Looper, Provider → Dynamic Content, value:
{{dc:looper:field key="categories"}}categories.id{{dc:looper:field key="id"}}3
categories.name{{dc:looper:field key="name"}}Merchandise
categories.slug{{dc:looper:field key="slug"}}merchandise
categories.parent_id{{dc:looper:field key="parent_id"}}(empty)
tags — nested array. Add a child Looper, Provider → Dynamic Content, value:
{{dc:looper:field key="tags"}}images — nested array. Add a child Looper, Provider → Dynamic Content, value:
{{dc:looper:field key="images"}}variants — nested array. Add a child Looper, Provider → Dynamic Content, value:
{{dc:looper:field key="variants"}}variants.id{{dc:looper:field key="id"}}17
variants.sku{{dc:looper:field key="sku"}}MCH-NPD-SET
variants.attributes — nested array. Add a child Looper, Provider → Dynamic Content, value:
{{dc:looper:field key="attributes"}}variants.unit_price_cents{{dc:looper:field key="unit_price_cents"}}1600
variants.price_breaks — nested array. Add a child Looper, Provider → Dynamic Content, value:
{{dc:looper:field key="price_breaks"}}variants.price_breaks.min_qty{{dc:looper:field key="min_qty"}}1
variants.price_breaks.unit_price_cents{{dc:looper:field key="unit_price_cents"}}1600
variants.weight_oz{{dc:looper:field key="weight_oz"}}12
from_price_cents{{dc:looper:field key="from_price_cents"}}1600
permalink{{dc:looper:field key="permalink"}}np_categories
Category tree, API shape.
Rows are SUBTREE-AWARE (a parent surfaces for its deepest product), pruned by the industry fence, and follow the admin-bar Store view. Each row also carries nav-ready aliases so the header mega menu consumes it directly:
Field · Token to paste · Live example
id{{dc:looper:field key="id"}}2
name{{dc:looper:field key="name"}}Apparel
slug{{dc:looper:field key="slug"}}apparel
parent_id{{dc:looper:field key="parent_id"}}(empty)
children — nested array. Add a child Looper, Provider → Dynamic Content, value:
{{dc:looper:field key="children"}}text{{dc:looper:field key="text"}}Apparel (alias of name)
url{{dc:looper:field key="url"}}/shop/?category=apparel
items{{dc:looper:field key="items"}}nested array — the children, same aliases (loop with a child Looper, Provider → Dynamic Content)
tint{{dc:looper:field key="tint"}}#E4F4FD (cycled dropdown palette; also tone, accent, pop)
np_product_variants
Variants of one product. Requires a "slug" param.
Field · Token to paste · Live example
id{{dc:looper:field key="id"}}17
sku{{dc:looper:field key="sku"}}MCH-NPD-SET
attributes — nested array. Add a child Looper, Provider → Dynamic Content, value:
{{dc:looper:field key="attributes"}}unit_price_cents{{dc:looper:field key="unit_price_cents"}}1600
price_breaks — nested array. Add a child Looper, Provider → Dynamic Content, value:
{{dc:looper:field key="price_breaks"}}price_breaks.min_qty{{dc:looper:field key="min_qty"}}1
price_breaks.unit_price_cents{{dc:looper:field key="unit_price_cents"}}1600
weight_oz{{dc:looper:field key="weight_oz"}}12
np_cart_items
Cart lines, raw API shape.
Field · Token to paste · Live example
cart_item_id{{dc:looper:field key="cart_item_id"}}3
configuration_id{{dc:looper:field key="configuration_id"}}(empty)
role{{dc:looper:field key="role"}}primary
variant_id{{dc:looper:field key="variant_id"}}17
product_name{{dc:looper:field key="product_name"}}Branded Notepad Set
requires_production{{dc:looper:field key="requires_production"}}bool
variant_attributes — nested array. Add a child Looper, Provider → Dynamic Content, value:
{{dc:looper:field key="variant_attributes"}}user_design_id{{dc:looper:field key="user_design_id"}}(empty)
qty{{dc:looper:field key="qty"}}3
unit_price_cents{{dc:looper:field key="unit_price_cents"}}1600
line_total_cents{{dc:looper:field key="line_total_cents"}}4800
np_orders
Order history. Params: per_page, page, status.
Field · Token to paste · Live example
order_number{{dc:looper:field key="order_number"}}NP-260810-5EB1F6
status{{dc:looper:field key="status"}}paid
total_cents{{dc:looper:field key="total_cents"}}342662
placed_at{{dc:looper:field key="placed_at"}}2026-08-10T20:43:09+00:00
item_count{{dc:looper:field key="item_count"}}1
np_designs
Saved designs. Params: per_page, page, status, template_id.
Field · Token to paste · Live example
id{{dc:looper:field key="id"}}2
name{{dc:looper:field key="name"}}Yard Sign Test — Aug 14, 2026
status{{dc:looper:field key="status"}}saved
template_id{{dc:looper:field key="template_id"}}1
template_name{{dc:looper:field key="template_name"}}Yard Sign Test
builder_ref{{dc:looper:field key="builder_ref"}}(empty)
thumbnail_url{{dc:looper:field key="thumbnail_url"}}(empty)
created_at{{dc:looper:field key="created_at"}}2026-08-14T18:20:42+00:00
updated_at{{dc:looper:field key="updated_at"}}2026-08-14T18:20:42+00:00
np_templates
Templates this org may use.
Field · Token to paste · Live example
id{{dc:looper:field key="id"}}2
name{{dc:looper:field key="name"}}Flyer Test
product_id{{dc:looper:field key="product_id"}}(empty)
builder_ref{{dc:looper:field key="builder_ref"}}wp:103
version{{dc:looper:field key="version"}}2
thumbnail_url{{dc:looper:field key="thumbnail_url"}}(empty)
pages — nested array. Add a child Looper, Provider → Dynamic Content, value:
{{dc:looper:field key="pages"}}pages.key{{dc:looper:field key="key"}}page_1
pages.name{{dc:looper:field key="name"}}Page 1
pages.add_label{{dc:looper:field key="add_label"}}(empty)
pages.component_key{{dc:looper:field key="component_key"}}(empty)
pages.w{{dc:looper:field key="w"}}8.5
pages.h{{dc:looper:field key="h"}}11
pages.addable{{dc:looper:field key="addable"}}bool
pages.max{{dc:looper:field key="max"}}2
