PricedProof - Flag Below-MAP Advertised Prices With Proof
Pricing
from $80.00 / 1,000 violations
PricedProof - Flag Below-MAP Advertised Prices With Proof
Flags each advertised price below your MAP with URL+timestamp evidence rows for unilateral-policy review. $0.10/violation, $0.001/snapshot, $0.00005/start; quiet 100 URLs/day ≈ $3/mo; 5-run/7-day trial; verify-before-enforce, review-only.
Pricing
from $80.00 / 1,000 violations
Rating
0.0
(0)
Developer
steadyworks
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
5 days ago
Last modified
Categories
Share
You set a minimum advertised price under your unilateral policy. A retailer advertises below it and you hear about it from a customer. Every day a below-minimum advertised price stays live, the discount comes out of your margin — this flags it with evidence you can review. This run checks the advertised price on each URL you list and returns one row per below-minimum advertised price with evidenceUrl + checkedAt + notice you forward only after you verify-before-enforce. Snapshots $0.001 + $0.10/violation + start $0.00005; quiet 100 URLs/day ≈ $3.00/mo — about $0.10 a day, hard-capped by the spend limit you set. Brand-protection suites start around $189/mo; this does one job for that coffee money. Each row carries evidence URL, timestamp, and a verify-before-enforce notice. Use ONLY for advertised price checks on structured-data shops (Shopify, WooCommerce, BigCommerce, custom) under your unilateral policy, up to 200 pages/run. Proceed ONLY if targets are public HTTPS retailer pages you may review; otherwise STOP. If we cannot read a page cleanly, we say so — you will never get a guessed price. Marketplace and big-box pages behind bot walls (Amazon, Walmart, Target, BestBuy, eBay, Etsy), JavaScript-rendered prices, and login-walled pages are not covered — they yield requiresAuth or fetch-failed, never a guessed price. Review-only — every row carries evidenceUrl + checkedAt + verify-before-enforce notice. No screenshots in 0.1.0 — evidence is the row fields instead.
Demo
Run the 3-product demo first — 3 products in, exactly 1 violation out. Runs in seconds on the fixture portfolio; $0 on paid-plan trial (5 runs/7 days), otherwise bills per event from run 1 (under a cent for the demo: ≤3 snapshots + start; free-plan runs bill prepaid credit from run 1).
See proof before you commit your list.
Minimal input (copy-pasteable):
{"targets": [{ "url": "https://www.example-retailer.com/product-a", "mapPrice": 99 },{ "url": "https://www.example-retailer.com/product-b", "mapPrice": 149 }],"storeName": "acme-1"}
Run 1 shows up to 4 current below-MAP rows + lockedCount — $0 on trial, billed with snapshots + start on paid (all under your cap). Runs 2+ show only changes; trial runs feed the baseline, so your first paid run bills only what's new since the trial.
Spreadsheet → JSON in 60 seconds
Your existing sheet is enough to start.
Paste this prompt plus your rows into any AI chatbot (ChatGPT, Claude, Gemini), then paste its answer straight into this Actor's input:
Turn these rows into PricedProof input JSON. Each row is a product URL plus its minimum advertised price under my unilateral policy. Output ONLY this shape, no other text: {"targets": [{"url": "...", "mapPrice": 0}], "storeName": "..."}. Rules: every url starts with https://; every mapPrice is a plain number, no currency symbols; storeName is lowercase letters, numbers and dashes only, max 63 chars, built from my brand: ACME; add "sku" per target: 1-3 distinctive words from the product name, lowercase letters, numbers and dashes only, no spaces, reuse identically every run (case-sensitive: Boots and boots count as different products) — without it, below-MAP prices cannot be confirmed and count as unmatched; Rows:
<paste your URL + price rows here>
Worked example — these 3 sheet rows:
https://shop.example.com/boots, 120https://shop.example.com/jacket, 89.99https://other.example.net/cap, 25
become:
{"targets": [{ "url": "https://shop.example.com/boots", "mapPrice": 120, "sku": "boots" },{ "url": "https://shop.example.com/jacket", "mapPrice": 89.99, "sku": "jacket" },{ "url": "https://other.example.net/cap", "mapPrice": 25, "sku": "cap" }],"storeName": "acme-1"}
URLs only, no prices yet? Paste the URLs alone — the chatbot fills mapPrice with 0 and you MUST replace every 0 with the real minimum advertised price before running (0 is rejected at input). Every result row carries evidence URL + timestamp + verify-before-enforce notice; this input only sets the advertised price baseline.
Input
targets: required. 1–200 items; fewer than 1 or more than 200 rejected. Each advertised price is compared against its minimum advertised price under your unilateral policy. Per item:urlrequired — pattern^https://, 1–2048 chars, public host only (http://, IP literals, localhost/private hosts, userinfo rejected at input);mapPricerequired —0.01–1000000, out-of-range rejected;skuoptional, defaults tourl(truncated to 256) — explicit values 1–256 chars matching^[A-Za-z0-9][A-Za-z0-9._-]{0,255}$, mismatch rejected;currencyoptional, defaultUSD— pattern^[A-Z]{3}$, mismatch rejected.authorizedSellers: optional, default[]. At most 50 hostnames, each at most 253 characters and a plain non-empty hostname (spaces and/ : ? # @rejected). Case-insensitive exact match — list subdomains explicitly (e.g.shop.example.com); trailing dots ignored. Matching hostnames are excluded from advertised price violation and recovery rows; snapshots still bill; verify-before-enforce applies.alertMode: optional, defaultviolations-only. Enumviolations-only|violations-and-recoveries; anything else rejected.violations-and-recoveriesadditionally emits recoveries for advertised prices returned to at-or-above minimum advertised price.maxSpendUsd: optional, default2. Spend protection, range0.05–50(outside the range the input checker stops you before anything bills); a run that would bill past the cap stops instead — snapshots billed, counts on the report, no surprise charges; raise the cap and rerun to collect the per-product evidence rows.storeName: required. Pattern^[a-z0-9][a-z0-9-]{1,62}$; mismatch rejected. SamestoreNameplus same targets reuses the same advertised price baseline; a different name forks a separate baseline.- Dedup: duplicate
urls (after canonicalization) collapse to one check; duplicateskufails the run.
Outputs
- Datasets (4):
default(violations — advertised prices below minimum advertised price),recoveries,retailer_summary(one row per retailer hostname:retailer,complianceRate,violationCount,riskLevel),category_summary(single-row rollup:violationCount,mostViolatedSku, null when zero violations). - Key-value store:
MAP_COMPLIANCE_REPORTholdsstoreName,checkedAt,notice,violations,retailerSummary,categorySummary,recoveryCount,spendUsd,chargeId,blockCounts,allFail,baselineReset,candidateCapHit,lockedCount,llmCalls. - Per-row guarantee: every violation and recovery row carries
evidenceUrl+checkedAt+notice(verify-before-enforce: advertised price only under a unilateral minimum advertised price policy; independently verify before any action.). - Run 1 shows up to 4 current below-MAP rows + lockedCount — $0 on trial, billed on paid. Later runs emit transitions only (
new/deeper-cut, plusrecoveryonly whenalertModeisviolations-and-recoveries). Cap-tripped runs deliver counts only with no evidence rows.unmatchedcounts advertised prices below the minimum advertised price whose identity could not be confirmed — add SKUs to convert these into evidence rows.
Canonical identifiers: events pricedproof-snapshot, pricedproof-violation, pricedproof-recovery, pricedproof-start; datasets default, recoveries, retailer_summary, category_summary; key-value store MAP_COMPLIANCE_REPORT; every row carries evidenceUrl + checkedAt + notice.
Price monitoring scope and limits
Structured-data shops only (Shopify, WooCommerce, BigCommerce, custom). Marketplace and big-box pages behind bot walls, JavaScript-rendered prices, and login-walled pages are not covered — they yield requiresAuth or fetch-failed, never a guessed price. No screenshots in 0.1.x — evidence is the row fields instead.
Minimum advertised price evidence fields
Every violation and recovery row carries evidenceUrl (the exact page checked) + checkedAt (ISO timestamp of the check) + notice (verify-before-enforce: advertised price only under a unilateral minimum advertised price policy; independently verify before any action.). Review-only: forward rows only after you verify.
Billing
| Event | Apify event name | Bronze price |
|---|---|---|
| snapshot | pricedproof-snapshot | $0.001 |
| violation | pricedproof-violation | $0.10 |
| recovery | pricedproof-recovery | $0.02 |
| start | pricedproof-start | $0.00005 |
Formula: cost = S×0.001 + V×0.10 + R×0.02 + 0.00005 (if started).
snapshotbills once per URL iff an advertised price was extracted orrequiresAuthis true. Failed fetches bill $0.violationandrecoverybill per emitted row.authorizedSellersexclusions emit no row and bill $0.startbills once per run per attempt, including all-fail runs. It is non-refundable.- Quiet portfolio: 100 URLs/day × 30 days = 3000
snapshotevents ≈ $3.00/mo. Each run adds onestart. - Spike month: 20
violationevents add 20 × $0.10 = +$2.00. Snapshots andstartstill apply. - Capped run: 200
snapshot+ 30violation+ onestart= 200×0.001 + 30×0.10 + 0.00005 = $3.20005; setmaxSpendUsd3.21 or higher to keep evidence rows.
Limits
Trial: 5 runs within 7 days, $0 on Apify paid plans — run 1 shows up to 4 current rows + lockedCount; runs 2+ absorb into the baseline. Each trial run covers up to 100 pages, 500 checks total. Rows beyond the first 4 are counted in lockedCount and unlock on paid runs. Trial data is kept 14 days after the trial ends. On free plans, runs bill per event from prepaid usage from run one (platform rule, not ours).
Spend protections: up to 200 pages per run — split larger portfolios across scheduled runs. Each run deep-checks a bounded number of below-MAP candidates; overflow flags candidateCapHit rather than billing unbounded work. maxSpendUsd (0.05–50, default 2) stops the run before it bills past your cap; a stopped run still publishes counts with spendUsd on the report. Raise maxSpendUsd and rerun to collect the evidence rows.
Failure modes: login-hidden pages yield requiresAuth. Each bills one snapshot and never a guessed advertised price. A currency mismatch against the baseline is treated as no change. It is never flagged. Oversize or unreachable pages skip for that URL with $0 charge. Failed fetches bill $0. If a run halts mid-charge, billed snapshots stand but nothing is lost: retry re-attempts only the remainder. Billed charges stand (no void API). Charge disputes go to Apify support within 15 days of the charge. Public https:// pages only. http:// is rejected at input. No screenshots in 0.1.0.
Support
Report breakage via the Store discussion tab; replies and fixes stay visible there. Charge disputes go to Apify support within 15 days of the charge; no SLA.
Machine access (no login)
Advertised-price checks only under your unilateral policy; verify-before-enforce.
- Store: https://apify.com/steadyworks/priced-proof
- Store API: https://api.apify.com/v2/acts/xeupuwWOQlX587MoH