NP Looper Field Reference

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