> ## Documentation Index
> Fetch the complete documentation index at: https://docs.shopsniffer.com/docs/llms.txt
> Use this file to discover all available pages before exploring further.

# Changelog

Recent changes to the ShopSniffer API, platform, and pricing — organized by release date.

## Overview

This changelog tracks notable changes to the ShopSniffer API, platform features, pricing, and documentation. Breaking changes (rare — we aim for backward compatibility) are explicitly flagged.

**Stripe billing + single_report metadata + heat graph**

- **Stripe subscription billing** is now wired through the Better Auth Stripe plugin. Two plans are live: `single_report` ($9.99) and `pro_monthly` ($29.99).
  - **Single report metadata fix** ensures Stripe webhook handlers correctly link completed checkouts to user accounts.
  - **365-day change heat graph** added to `GET /api/store-detail/:slug/analytics` for dashboard visualizations.
  - **Universal plan card** on the pricing page consolidates Free, Single Report, and Pro Monthly into a single comparison.
  - **Onboarding UX** improvements for first-time users signing up via email/password.

**Admin user ID migration to Better Auth**

- **Admin user ID** is now sourced from Better Auth sessions instead of the old Clerk user ID format. Admin endpoints (`src/api/admin.ts`) verify against the `ADMIN_USER_IDS` env var using Better Auth session IDs.
  - No user-visible change — this completes the migration scaffolding for a future clean removal of Clerk-era identifiers.

**Email/password auth + hardcoded baseURL removal**

- **Email/password auth** is now enabled on Better Auth alongside Google OAuth. Users can sign up with a traditional email + password combo.
  - **Hardcoded localhost baseURL removed** from the Better Auth config. The base URL is now driven by the `BETTER_AUTH_URL` environment variable, which fixes redirect loops in production.

**Better Auth route handler fix**

- **`apiRouter.all("/auth/*")`** now catches all HTTP methods for the Better Auth handler. Previously only GET was mounted, which broke sign-in POST requests.

**OpenTelemetry dependency**

- Added `@opentelemetry/api` as a peer dependency required by Better Auth. No runtime behavior change; this was purely a dependency resolution fix.

**Better Auth migration — user-facing**

- **Breaking for local-dev integrators:** Auth moved from Clerk to [Better Auth](https://www.better-auth.com). The API surface is the same (`/api/auth/*`) and external clients using API keys or x402 are unaffected.
  - **Session cookies** replace Clerk JWTs for browser-based auth. Existing users were migrated transparently on first sign-in.
  - **Email/password + Google OAuth** are supported at launch.
  - **Stripe billing** integrated via the Better Auth Stripe plugin (completed in the 2026-04-12 release).

**Inventory events & velocity tracking**

- **`GET /api/store-detail/:slug/inventory`** returns store-level inventory summary with estimated daily sales, total units sold in the last 30 days, and recent restocks.
  - **`GET /api/store-detail/:slug/inventory/events`** returns a paginated feed of sale and restock events across the whole store.
  - **`GET /api/store-detail/:slug/inventory/product/:shopifyId`** returns per-product inventory history and events.
  - Requires the store to expose `inventory_quantity` on variant JSON — stores that hide inventory report `total_inventory: 0`.

**Snapshot compare endpoint**

- **`GET /api/store-detail/:slug/compare`** does a side-by-side diff of any two job snapshots for a tracked store. Returns added, removed, and changed items by type with up to 500 items per category.
  - Uses D1 JOINs rather than D1's `bind` parameter list, which avoids hitting D1's max-parameter limits on large stores.

**Cloudflare Workflows pipeline**

- Replaced the ad-hoc queue-based scraper with a durable **Cloudflare Workflows** pipeline (`ScrapeShopWorkflow`) with per-step retries and exponential backoff. Jobs survive worker crashes and resume from the last completed step.
  - Added `MonitorShopsWorkflow`, `AutoPublishBlogWorkflow`, `AutoPublishReportsWorkflow`, and `CleanupSnapshotsWorkflow` on cron triggers. See [monitoring workflows](/monitoring-workflows).

**x402 payment protocol**

- **`POST /api/jobs`** accepts [x402](https://www.x402.org) payment via `X-PAYMENT` header. Send an unauthenticated request to receive a 402 Payment Required response with USDC-on-Base payment details, then retry with a signed proof.
  - Enables fully account-free per-request payments for autonomous AI agents. See [x402 payment](/x402-payment) and the [x402 tutorial](/guides/pay-with-x402).

**Job progress WebSocket**

- **`GET /api/ws/:jobId`** provides real-time job progress via WebSocket backed by a Cloudflare Durable Object. Replaces the need to poll `/api/jobs/:id/status` during a running scrape.
  - Push-based updates with sub-second latency and no rate limits on the connection.

**Public store directory + SEO content**

- Public directory at `https://shopsniffer.com/stores` lists every analyzed store.
  - Reports older than 30 days are auto-published as SEO content via `AutoPublishReportsWorkflow`.
  - `GET /api/stores` paginated browse and `GET /api/stores/:slug` full store page data endpoints.

## Next steps

**[API overview](/api)**

Browse the current API reference.
  **[FAQ](/faq)**

Common questions about the platform.