API Reference

Offers & galleries

The heart of a review site. One payload carries the review copy, ratings, pros & cons, SEO fields, monetization links and placement — plus an image gallery per offer.

Endpoints

MethodEndpointDescription
GET/sites/:id/offersList offers of a site
POST/sites/:id/offersCreate offer
GET/offers/:oidOffer detail (includes gallery and category ids)
PATCH/offers/:oidUpdate — full object required (see below)
DELETE/offers/:oidDelete offer, its reviews and gallery
PUT/sites/:id/offers/orderBulk rank: {"order": ["uuid", …]} — position in list = rank
GET/offers/:oid/link-checksLink health history (plan-gated: link_health)
POST/offers/:oid/link-checkTrigger a link check now (plan-gated)

The offer payload — every field

Create and update share the same shape. Names are stable — the panel reads exactly these keys.

Basics

FieldTypeDescription
name requiredstringProduct name — shown everywhere, used in H1 fallback.
slugstringURL slug. Empty on create → generated from name. Review page lives at /reviews/:slug/.
statusstringactive (default) | draft | archived. Only active offers render publicly.
urlstringProduct homepage — displayed on the review page (unless hidden in appearance settings) and used by the screenshot worker.
descriptionstring (HTML)The full editorial review — your main content for the offer page.
summarystringShort verdict shown on cards and used as meta description fallback.
custom_headerstringOptional heading replacing the default above the review copy.
custom_top10_textstringOverride blurb shown in toplist cards instead of the summary.
ribbon_textstringBadge on the card, e.g. "Editor's Choice". Empty = no ribbon.
author_iduuid|nullReviewer byline — reference an author from Articles & authors.
logostring|nullLogo image URL (from the media library). Empty → card falls back to the first gallery image, then to a monogram.

Categories & ranking

FieldTypeDescription
category_idsuuid[]Categories this offer belongs to. Drives category pages and "top rated in this category" modules.
rankintPosition in toplists (1 = best). Bulk-reorder everything at once with PUT /sites/:id/offers/order.

Affiliate & monetization

FieldTypeDescription
affiliate_urlstringWhere CTA clicks land (through our click tracker). Never exposed raw in public HTML.
affiliate_url_mobilestringMobile-only destination override. Empty = same as desktop.
affiliate_networkstringLabel for your own reporting, e.g. "Segpay", "PartnerStack".
link_slotsstring[]Placements: toplink, spotlight, carousel, popular, footer. An offer can sit in several.
do_followboolDefault false → outbound links get rel="nofollow sponsored". Set true for editorial followed links.
availabilitystringauto (default — offer hides itself when link health reports dead), force_available (always show), force_unavailable (always hide — page shows "check these instead" alternatives).

Ratings & reviews

FieldTypeDescription
rating_editorialfloat|nullYour score (0–5, one decimal). Shown as stars and in schema.org markup; drives "editorial" sort.
allow_reviewsboolDefault true. False hides the review form and existing reviews on the offer page.
noindex_negative_reviewsboolNegative review pages get noindex — keeps complaint content out of Google while staying transparent on-site.
price_labelstringFree-form price hint on cards, e.g. "from $2.99/mo".

Pros & cons

FieldTypeDescription
prosstring[]Bullet list rendered with ✓ marks. [] hides the block.
consstring[]Bullet list rendered with ✕ marks. Honest cons lift conversion — don't skip them.
JSON
"pros": ["Zero-knowledge AES-256 encryption", "98.4% autofill success in our tests"],
"cons": ["Free tier limited to one device type", "No monthly billing on the cheapest tier"]

Info sections (key facts table)

Label/value rows rendered as the "Key facts" table on the offer page. Shape matters — it's key/value, not title/body:

JSON
"info_sections": [
  {"key": "Platforms", "value": "Windows, macOS, Linux, iOS, Android"},
  {"key": "Security audit", "value": "Independently audited by Cure53 (2025)"}
]

SEO

FieldTypeDescription
meta_titlestring<title> override. Empty → "{name} Review — {site title}".
meta_descriptionstringMeta description override. Empty → summary.
custom_h1stringH1 override on the review page.
search_volumeint|nullMonthly searches you target — internal planning field, shown in the panel's SEO views.

Read-only (computed by us)

rating_average, rating_count (from approved consumer reviews), link_status, link_checked_at, expired, created_at. Sent in responses; ignored in writes.

Updates replace the whole record

PATCH is full-update. The stored offer is replaced by what you send — omitted optional fields become empty, not unchanged. Always GET /offers/:oid first, modify the object, send it back. Scripts that PATCH only {"rank": 2} will wipe the description, pros, cons and SEO fields.
Safe update pattern
OFFER=$(curl -s $API/offers/$OID -H "Authorization: Bearer $KEY")
echo "$OFFER" | jq '.rank = 2' | curl -s -X PATCH $API/offers/$OID \
  -H "Authorization: Bearer $KEY" -H 'Content-Type: application/json' -d @-

Link health

We check affiliate destinations on a schedule. An offer on availability: auto with a dead link hides itself from public pages until the link recovers — no manual babysitting.

  • GET /offers/:oid/link-checks — history of checks (status, HTTP code, latency, timestamp).
  • POST /offers/:oid/link-check — run one right now, e.g. after the merchant fixes their side.
  • GET /sites/:id/link-health — site-wide summary for dashboards.