Skip to main content

Pricing

The Retail Digitals Image API is priced in credits. Buy credits up front, spend them on API calls. No monthly base fee for Standard tier — pay only for what you use.

Cost formula

Every GET /products/{barcode} charges the sum of two independent parts:

credits = Σ(scope_rate × scopes_with_data) + (per_image_rate × image_variants_that_exist)

Two query parameters control what the API attempts to return:

  • include= picks metadata scopes to request. Each scope has an independent, admin-set price. Valid values: info, hechshers, nutrition, ingredients, catalog_meta, image_meta, images. product_meta is a legacy alias for all 5 fine-grained scopes at once — it is not a flat bundle rate; it simply requests those 5 scopes and each is billed independently, same as listing them explicitly.

    Omit include= and every scope is requested — same as info,hechshers,nutrition,ingredients,catalog_meta,image_meta,images.

  • variants= picks which image variants to request. Valid values: front, back, front_clean, back_clean. Omit variants= and every available variant is requested.

Per-scope billing

You are only billed for a scope or image variant if it actually returns data for that barcode. A requested scope that comes back empty (null, an empty array, or no active image row) costs nothing — the cost above is computed from what was found, not from what was asked for. Catalogue coverage is partial (roughly 20–37% of barcodes per scope), so this matters: a ?include=nutrition call on a barcode with no nutrition data is always free, whether or not you checked first.

This is unconditional — it applies the same way whether or not you use the metadata availability endpoints. Those endpoints exist to save you a wasted network round-trip on a sync of thousands of barcodes, not to change what you're charged on any single call.

All rates are admin-set. Fetch GET /pricing at daemon startup and cache the values by action key. Never hard-code prices.

Metadata scope pricing keys

include= valueRate key in /pricingWhat you get
infoproducts.get.infobrand, product_name, description, category, weight, country of origin, manufacturer, distributor, bracha, boolean dietary flags
hechshersproducts.get.hechshersArray of kosher certifications with agency, logo slug, dairy/meat/pareve, extra designations
nutritionproducts.get.nutritionFull nutrition facts (serving size, calories, macros, vitamins, DVs)
ingredientsproducts.get.ingredientsIngredient text, contains/may-contain statements, structured allergens list
catalog_metaproducts.get.catalog_metaCatalog-authored: department, subcategory, web_description. Also delivers catalog overrides for category and product_description when set.
product_meta (legacy alias)Requests all 5 fine-grained scopes above; each is billed independently at its own rate, same as listing them explicitly. Kept for back-compat, not a discount.
image_metaproducts.get.image_metaPer-variant availability metadata: photo date, resolution, ownership
imagesproducts.get.per_imageSigned image URL, charged per URL returned

Metadata availability pricing keys

Coverage is partial — roughly 20–37% of barcodes carry any given scope — so a large sync benefits from checking what exists before fetching it. These endpoints tell you what exists first. They return booleans only, never metadata values. See Metadata availability.

EndpointRate key in /pricingWhat you get
GET /metadata/{barcode}metadata.get.per_barcodeField-level availability for one barcode, plus worth_requesting — the exact include= scopes that would return data
POST /metadata/bulk-checkmetadata.bulk_check.per_barcodeScope-level availability for up to 500 barcodes per call
POST /metadata/bulk-check with fields: truemetadata.bulk_check.fields.per_barcodeAs above, broken down to individual fields
GET /metadata/productsmetadata.products.listBarcodes filtered by metadata they have (has=) or lack (missing=), by scope or by field
GET /metadata-fieldsmetadata.fields.catalogueCatalogue of every valid scope and field, with optional coverage counts
Check before you fetch — saves round-trips, not credits

GET /products/{barcode} never charges for a scope that comes back empty, so prefiltering doesn't change what a sync costs. What it saves is the network round-trip: on a 500-barcode nutrition sync where only ~22% of the catalogue has nutrition, prefiltering with POST /metadata/bulk-check means you make roughly 110 follow-up calls instead of 500 — the other ~390 would have been free include=nutrition responses, but still a full HTTP round-trip each.

Cheapest patterns for common use cases

I want...CallCost
Text-only sync of just nutrition?include=nutrition1 × nutrition rate
Category + brand for a POS index?include=info1 × info rate
E-commerce PDP with catalog copy + hechshers?include=info,hechshers,catalog_metainfo + hechshers + catalog_meta rates
One image URL (front only)?include=images&variants=front1 × per_image_rate
Full record (default)(no params)Sum of every scope and image variant that actually has data — never more, never a flat bundle rate
Requesting fewer scopes never costs more

?include=info charges at most the products.get.info rate, and nothing if that barcode has no info data. Listing only the scopes you actually consume keeps response payloads smaller and requests faster, even though an unneeded scope that comes back empty wouldn't have cost you anything either.

variants= alone does nothing without include=images

Sending variants=front without include=images doesn't request any image URLs at all — variants= only filters an images request that's already present. And since include= defaults to every scope when omitted, dropping include= entirely still requests (and bills for, if data exists) every metadata scope alongside the image.

Verify meta.credits_debited on every response.

Tiers

TierMonthly baseIncluded creditsRate limitsSupport
Standard$0Pay as you go60 rpm · 10k rpdEmail, 48h SLA
EnterpriseCustomCustom bundleCustomDedicated Slack, 4h SLA, uptime credits

All delivered images carry the same globally-configured commercial watermark.

Credit prices

100 credits = $1.00 USD. Volume discounts:

PackagePriceEffective rate
500 credits$5.00100 / $1.00
5,000 credits$45.00111 / $1.00 (10% off)
50,000 credits$375.00133 / $1.00 (25% off)
500,000 credits$3,000.00166 / $1.00 (40% off)

Credits do not expire. Refunds available within 30 days of purchase for unused credits — contact api@retaildigitals.com for the details.

Per-action costs

Live prices — fetched from /api/v1/pricing in real time. Admin changes are reflected here immediately on reload.

Failed calls (4xx / 5xx) are not charged. Live prices always available at GET /pricing — we recommend hitting this at daemon startup rather than hard-coding.

Sample cost calculations

These worked examples use the current live prices above. Update as you like.

Tip: For catalog sync, cache aggressively. Product metadata changes rarely — a weekly full refresh + hourly bulk-check for new arrivals typically runs under $10/month.

Only pay for what you display

?include=images returns URLs for every available variant by default — up to 4 per barcode (front, back, front_clean, back_clean). Add ?variants=front to fetch only the variant you actually render. What each call charges (at current admin-set rates):

CallAvailable variantsCharged
?include=images44 × per_image_rate
?include=images&variants=front4 available, front requested1 × per_image_rate
?include=images&variants=front,back4 available, 2 requested2 × per_image_rate
?include=product_meta,images&variants=frontmetadata + front onlyper_scope_rate + per_image_rate

If your integration only ever renders one image variant, adding variants= cuts your per-product cost by up to 75%.

Enterprise: fixed-price contracts

Enterprise customers can convert to fixed monthly pricing based on projected volume, with included credit bundles + uptime credits + dedicated support. Contact api@retaildigitals.com to discuss.

Pricing change policy

We rarely change prices, and when we do:

  • Base credit price: 60-day notice via email + changelog
  • Per-action prices: 30-day notice
  • Grandfathering: Prepaid credits keep their purchase-time redemption rate

We commit to never raising prices during your prepaid credit balance's redemption window.

Buying credits

  • Dashboard: images.retaildigitals.com/billing
  • Payment methods: Visa, MC, Amex, ACH (Enterprise only)
  • Auto-recharge available — set a floor, top up automatically to a target balance
  • Invoices generated monthly; NET-30 available for Enterprise