# Snipe works out of the box with the scraper (no credentials needed). # Set eBay API credentials to unlock full trust scores — # account age and category history signals require the eBay Browse API. # Without credentials the app logs a warning and falls back to the scraper. # ── eBay Developer Keys — Production ────────────────────────────────────────── # From https://developer.ebay.com/my/keys (Production tab) EBAY_APP_ID= EBAY_DEV_ID= EBAY_CERT_ID= # ── eBay Developer Keys — Sandbox ───────────────────────────────────────────── # From https://developer.ebay.com/my/keys (Sandbox tab) EBAY_SANDBOX_APP_ID= EBAY_SANDBOX_DEV_ID= EBAY_SANDBOX_CERT_ID= # ── Active environment ───────────────────────────────────────────────────────── # production | sandbox EBAY_ENV=production # ── eBay OAuth — Authorization Code (user account connection) ───────────────── # Enables paid-tier users to connect their personal eBay account for instant # trust scoring via Trading API GetUser (account age + per-category feedback). # Without this, Snipe falls back to Shopping API + Playwright scraping. # # Setup steps: # 1. Go to https://developer.ebay.com/my/keys → select your Production app # 2. Under "Auth Accepted URL / RuName", create a new entry: # - Callback URL: https://your-domain/api/ebay/callback # (e.g. https://menagerie.circuitforge.tech/snipe/api/ebay/callback) # - Snipe generates the redirect automatically — just register the URL above # 3. Copy the RuName value (looks like "YourName-AppName-PRD-xxx-yyy") # and paste it as EBAY_RUNAME below. # 4. Set EBAY_OAUTH_REDIRECT_URI to the same HTTPS callback URL. # # Self-hosted: your callback URL must be HTTPS and publicly reachable. # EBAY_RUNAME=YourName-AppName-PRD-xxxxxxxx-xxxxxxxx # EBAY_OAUTH_REDIRECT_URI=https://your-domain/api/ebay/callback # ── eBay Account Deletion Webhook ────────────────────────────────────────────── # Register endpoint at https://developer.ebay.com/my/notification — required for # production key activation. Set EBAY_NOTIFICATION_ENDPOINT to the public HTTPS # URL eBay will POST to (e.g. https://snipe.circuitforge.tech/api/ebay/account-deletion). EBAY_NOTIFICATION_TOKEN= EBAY_NOTIFICATION_ENDPOINT= # Set to false during sandbox/registration (no production token available yet). # Set to true once production credentials are active — enforces ECDSA verification. EBAY_WEBHOOK_VERIFY_SIGNATURES=true # ── Database ─────────────────────────────────────────────────────────────────── SNIPE_DB=data/snipe.db # Product identifier reported in cf-orch coordinator analytics for per-app breakdown CF_APP_NAME=snipe # ── Cloud mode (managed / menagerie instance only) ───────────────────────────── # Leave unset for self-hosted / local use. When set, per-user DB isolation # and Heimdall licensing are enabled. compose.cloud.yml sets CLOUD_MODE=true # automatically — only set manually if running without Docker. # CLOUD_MODE=true # CLOUD_DATA_ROOT=/devl/snipe-cloud-data # JWT secret from cf-directus (must match Directus SECRET env var exactly). # DIRECTUS_JWT_SECRET= # Heimdall license server — for tier resolution and free-key auto-provisioning. # HEIMDALL_URL=https://license.circuitforge.tech # HEIMDALL_ADMIN_TOKEN= # ── eBay Affiliate (optional) ───────────────────────────────────────────────── # Set to your eBay Partner Network (EPN) campaign ID to earn commissions on # listing click-throughs. Leave blank for clean /itm/ URLs (no tracking). # Register at https://partnernetwork.ebay.com — self-hosted users can use their # own ID; the CF cloud instance uses CF's campaign ID (disclosed in the UI). # EBAY_AFFILIATE_CAMPAIGN_ID= # ── LLM inference (Search with AI / photo analysis) ────────────────────────── # For self-hosted use, create config/llm.yaml from config/llm.yaml.example. # config/llm.yaml is the preferred way to configure backends (supports cf-orch, # multiple fallback backends, per-backend model selection). # # As a quick alternative, circuitforge-core LLMRouter also auto-detects backends # from these env vars when no llm.yaml is present: # 1. ANTHROPIC_API_KEY → Claude API (cloud; requires Paid tier key) # 2. OPENAI_API_KEY → OpenAI-compatible endpoint # 3. OLLAMA_HOST → local Ollama (default: http://localhost:11434) # Leave all unset to disable LLM features (Search with AI won't be available). # ANTHROPIC_API_KEY= # ANTHROPIC_MODEL=claude-haiku-4-5-20251001 # OPENAI_API_KEY= # OPENAI_BASE_URL=https://api.openai.com/v1 # OPENAI_MODEL=gpt-4o-mini # OLLAMA_HOST=http://localhost:11434 # OLLAMA_MODEL=llava:7b # CF Orchestrator — routes vision/LLM tasks to a cf-orch coordinator for VRAM management. # Self-hosted: point at a local cf-orch coordinator if you have one running. # Cloud (internal): managed coordinator at orch.circuitforge.tech. # Leave unset to run vision tasks inline (no VRAM coordination). # CF_ORCH_URL=http://10.1.10.71:7700 # # cf-orch agent (compose --profile orch) — coordinator URL for the sidecar agent. # Defaults to CF_ORCH_URL if unset. # CF_ORCH_COORDINATOR_URL=http://10.1.10.71:7700 # ── Community DB (optional) ────────────────────────────────────────────────── # When set, seller trust signals (confirmed scammers added to blocklist) are # published to the shared community PostgreSQL for cross-user signal aggregation. # Managed instances: set automatically by cf-orch. Self-hosted: leave unset. # Requires cf-community-postgres container (cf-orch compose stack). # COMMUNITY_DB_URL=postgresql://cf_community:@localhost:5432/cf_community # ── In-app feedback (beta) ──────────────────────────────────────────────────── # When set, a feedback FAB appears in the UI and routes submissions to Forgejo. # Leave unset to silently hide the button (demo/offline deployments). # FORGEJO_API_TOKEN= # FORGEJO_REPO=Circuit-Forge/snipe # FORGEJO_API_URL=https://git.opensourcesolarpunk.com/api/v1