{"openapi":"3.1.0","info":{"title":"Google Maps Scraper API","version":"0.2.0"},"paths":{"/sample":{"get":{"summary":"Get Sample","description":"Ten example listings and a few numbers for one category in one city.\n{\"found\": false} when the store has no sample for it yet.","operationId":"get_sample_sample_get","parameters":[{"required":true,"schema":{"type":"string","title":"Category"},"name":"category","in":"query"},{"required":true,"schema":{"type":"string","title":"City"},"name":"city","in":"query"},{"required":false,"schema":{"type":"string","title":"State","default":""},"name":"state","in":"query"},{"required":false,"schema":{"type":"string","title":"Country","default":"us"},"name":"country","in":"query"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/sample/index":{"get":{"summary":"Sample Index","description":"Every category and city the store can answer for, without the listings,\nso a page can offer only choices that will return something.\n\n\"no_website\" is how many no-website examples that sample holds (0 to 10).\nThe first results of a search are mostly businesses with a site, so many\nsamples hold none, and the no-website tool offers only those that do.","operationId":"sample_index_sample_index_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/":{"get":{"summary":"Root","operationId":"root__get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/health":{"get":{"summary":"Health","operationId":"health_health_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/fields":{"get":{"summary":"List Fields","description":"Return the v2 field catalog + presets so the frontend can build its picker.\n\nStays usable unauthenticated (it is just a catalog), but when a caller does\npresent credentials we also return the fields THEIR plan is entitled to.\nThe picker needs that to default to \"everything I can actually get\" rather\nthan pre-ticking fields the backend will silently drop — which is how the\nStarter plan ended up advertising `hours` it could never deliver.\n\nEntitlement is resolved through plan_benefits, the same admin-editable\ntable clamp_fields_to_plan() uses, so the picker cannot drift from\nenforcement.","operationId":"list_fields_fields_get","parameters":[{"required":false,"schema":{"type":"string","title":"Authorization"},"name":"authorization","in":"header"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api-keys":{"get":{"summary":"List Api Keys Route","description":"List all API keys for the authenticated user (hashes never returned).","operationId":"list_api_keys_route_api_keys_get","parameters":[{"required":false,"schema":{"type":"string","title":"Authorization"},"name":"authorization","in":"header"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"summary":"Create Api Key Route","description":"Create a new API key. Returns the raw key ONCE — it is never stored\nin plaintext and cannot be retrieved again.","operationId":"create_api_key_route_api_keys_post","parameters":[{"required":false,"schema":{"type":"string","title":"Authorization"},"name":"authorization","in":"header"}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateApiKeyRequest"}}},"required":true},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api-keys/{key_id}":{"delete":{"summary":"Delete Api Key Route","description":"Delete (revoke) an API key by id. Only the owning user can delete it.","operationId":"delete_api_key_route_api_keys__key_id__delete","parameters":[{"required":true,"schema":{"type":"string","title":"Key Id"},"name":"key_id","in":"path"},{"required":false,"schema":{"type":"string","title":"Authorization"},"name":"authorization","in":"header"}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/jobs/local-start":{"post":{"summary":"Local Start","description":"Register a local scrape job. Enterprise only.\nReturns {job_id, cities: [{city, state}, ...]} so the CLI knows where to scrape.","operationId":"local_start_jobs_local_start_post","parameters":[{"required":false,"schema":{"type":"string","title":"Authorization"},"name":"authorization","in":"header"}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/LocalStartRequest"}}},"required":true},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/jobs/{job_id}/progress":{"patch":{"summary":"Local Progress","description":"Non-fatal progress ping from the CLI. Updates the Supabase row so the\ndashboard can show live progress for local jobs.","operationId":"local_progress_jobs__job_id__progress_patch","parameters":[{"required":true,"schema":{"type":"string","title":"Job Id"},"name":"job_id","in":"path"},{"required":false,"schema":{"type":"string","title":"Authorization"},"name":"authorization","in":"header"}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/LocalProgressRequest"}}},"required":true},"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/jobs/{job_id}/local-complete":{"post":{"summary":"Local Complete","description":"Multipart upload endpoint called by the CLI after scraping is done.\nStores the CSV in Supabase Storage and deducts credits atomically.","operationId":"local_complete_jobs__job_id__local_complete_post","parameters":[{"required":true,"schema":{"type":"string","title":"Job Id"},"name":"job_id","in":"path"},{"required":false,"schema":{"type":"string","title":"Authorization"},"name":"authorization","in":"header"}],"requestBody":{"content":{"multipart/form-data":{"schema":{"$ref":"#/components/schemas/Body_local_complete_jobs__job_id__local_complete_post"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/jobs/{job_id}/local-fail":{"post":{"summary":"Local Fail","description":"CLI reports a fatal scrape error. Marks the job failed with no credit charge.","operationId":"local_fail_jobs__job_id__local_fail_post","parameters":[{"required":true,"schema":{"type":"string","title":"Job Id"},"name":"job_id","in":"path"},{"required":false,"schema":{"type":"string","title":"Authorization"},"name":"authorization","in":"header"}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/LocalFailRequest"}}},"required":true},"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/scheduled-scrapes":{"get":{"summary":"List Scheduled Scrapes Route","operationId":"list_scheduled_scrapes_route_scheduled_scrapes_get","parameters":[{"required":false,"schema":{"type":"string","title":"Authorization"},"name":"authorization","in":"header"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"summary":"Create Scheduled Scrape Route","operationId":"create_scheduled_scrape_route_scheduled_scrapes_post","parameters":[{"required":false,"schema":{"type":"string","title":"Authorization"},"name":"authorization","in":"header"}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ScheduledScrapeRequest"}}},"required":true},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/scheduled-scrapes/{schedule_id}":{"delete":{"summary":"Delete Scheduled Scrape Route","operationId":"delete_scheduled_scrape_route_scheduled_scrapes__schedule_id__delete","parameters":[{"required":true,"schema":{"type":"string","title":"Schedule Id"},"name":"schedule_id","in":"path"},{"required":false,"schema":{"type":"string","title":"Authorization"},"name":"authorization","in":"header"}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"patch":{"summary":"Update Scheduled Scrape Route","operationId":"update_scheduled_scrape_route_scheduled_scrapes__schedule_id__patch","parameters":[{"required":true,"schema":{"type":"string","title":"Schedule Id"},"name":"schedule_id","in":"path"},{"required":false,"schema":{"type":"string","title":"Authorization"},"name":"authorization","in":"header"}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ScheduledScrapeRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/scheduled-scrapes/{schedule_id}/toggle":{"patch":{"summary":"Toggle Scheduled Scrape Route","operationId":"toggle_scheduled_scrape_route_scheduled_scrapes__schedule_id__toggle_patch","parameters":[{"required":true,"schema":{"type":"string","title":"Schedule Id"},"name":"schedule_id","in":"path"},{"required":false,"schema":{"type":"string","title":"Authorization"},"name":"authorization","in":"header"}],"requestBody":{"content":{"application/json":{"schema":{"type":"object","title":"Body"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/purge-deleted-accounts":{"post":{"summary":"Purge Deleted Accounts","description":"Hard-delete every account whose 30-day deletion grace period has\nelapsed. Intended to be called by a daily scheduled job.","operationId":"purge_deleted_accounts_admin_purge_deleted_accounts_post","parameters":[{"required":false,"schema":{"type":"string","title":"Authorization"},"name":"authorization","in":"header"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/cities":{"get":{"summary":"List Cities","description":"Return every city in the given comma-separated states/regions. Used by the frontend city picker.","operationId":"list_cities_cities_get","parameters":[{"required":true,"schema":{"type":"string","title":"States"},"name":"states","in":"query"},{"required":false,"schema":{"type":"string","title":"Country","default":"us"},"name":"country","in":"query"},{"required":false,"schema":{"type":"string","title":"Authorization"},"name":"authorization","in":"header"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/regions":{"get":{"summary":"List Regions","description":"Return all available regions (states/counties/provinces) for a country.","operationId":"list_regions_regions_get","parameters":[{"required":false,"schema":{"type":"string","title":"Country","default":"us"},"name":"country","in":"query"},{"required":false,"schema":{"type":"string","title":"Authorization"},"name":"authorization","in":"header"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/resume-check":{"get":{"summary":"Resume Check","description":"Check if there's an incomplete prior scrape we could resume.","operationId":"resume_check_resume_check_get","parameters":[{"required":true,"schema":{"type":"string","title":"Query"},"name":"query","in":"query"},{"required":true,"schema":{"type":"string","title":"States"},"name":"states","in":"query"},{"required":false,"schema":{"type":"integer","title":"Max Results Per City","default":60},"name":"max_results_per_city","in":"query"},{"required":false,"schema":{"type":"string","title":"Authorization"},"name":"authorization","in":"header"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/jobs/{job_id}/resume":{"post":{"summary":"Resume Job","description":"Continue a scrape that stopped, failed, or was interrupted by a restart.\n\nBacks the dashboard's \"Continue scraping\" button. Replaying the config from\nthe browser would resume with whatever is in the form right now, which is\nnot necessarily what the job ran with -- the stored request is. Everything\nelse (credit check, per-plan concurrency, checkpoint skipping) is the\nnormal /scrape path, so a resume can't sidestep a limit.","operationId":"resume_job_jobs__job_id__resume_post","parameters":[{"required":true,"schema":{"type":"string","title":"Job Id"},"name":"job_id","in":"path"},{"required":false,"schema":{"type":"string","title":"Authorization"},"name":"authorization","in":"header"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ScrapeResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/scrape":{"post":{"summary":"Start Scrape","operationId":"start_scrape_scrape_post","parameters":[{"required":false,"schema":{"type":"string","title":"Authorization"},"name":"authorization","in":"header"}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ScrapeRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ScrapeResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/scrape/{job_id}/stop":{"post":{"summary":"Stop Scrape","operationId":"stop_scrape_scrape__job_id__stop_post","parameters":[{"required":true,"schema":{"type":"string","title":"Job Id"},"name":"job_id","in":"path"},{"required":false,"schema":{"type":"string","title":"Authorization"},"name":"authorization","in":"header"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/jobs/{job_id}":{"get":{"summary":"Get Job","operationId":"get_job_jobs__job_id__get","parameters":[{"required":true,"schema":{"type":"string","title":"Job Id"},"name":"job_id","in":"path"},{"required":false,"schema":{"type":"string","title":"Authorization"},"name":"authorization","in":"header"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/jobs":{"get":{"summary":"List Jobs","operationId":"list_jobs_jobs_get","parameters":[{"required":false,"schema":{"type":"integer","title":"Limit","default":20},"name":"limit","in":"query"},{"required":false,"schema":{"type":"string","title":"Authorization"},"name":"authorization","in":"header"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/checkout":{"post":{"summary":"Stripe Checkout","operationId":"stripe_checkout_checkout_post","parameters":[{"required":false,"schema":{"type":"string","title":"Authorization"},"name":"authorization","in":"header"}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CheckoutRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/topup":{"post":{"summary":"Stripe Topup","operationId":"stripe_topup_topup_post","parameters":[{"required":false,"schema":{"type":"string","title":"Authorization"},"name":"authorization","in":"header"}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CheckoutRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/billing-portal":{"post":{"summary":"Stripe Portal","operationId":"stripe_portal_billing_portal_post","parameters":[{"required":false,"schema":{"type":"string","title":"Authorization"},"name":"authorization","in":"header"}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PortalRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/campaigns/{campaign_id}/enrich":{"post":{"summary":"Enrich Campaign","description":"Start an on-demand email + social enrichment pass over this campaign's\nscraped leads. Runs in the background; progress is written to the\ncampaign_enrichment table (the client polls it directly).","operationId":"enrich_campaign_campaigns__campaign_id__enrich_post","parameters":[{"required":true,"schema":{"type":"string","title":"Campaign Id"},"name":"campaign_id","in":"path"},{"required":false,"schema":{"type":"string","title":"Authorization"},"name":"authorization","in":"header"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/campaigns/{campaign_id}/to-crm":{"post":{"summary":"Import Campaign To Crm","description":"Import this campaign's scraped leads into the CRM leads table (background).\nExisting leads are skipped so stages/tags/notes are never reset.","operationId":"import_campaign_to_crm_campaigns__campaign_id__to_crm_post","parameters":[{"required":true,"schema":{"type":"string","title":"Campaign Id"},"name":"campaign_id","in":"path"},{"required":false,"schema":{"type":"string","title":"Authorization"},"name":"authorization","in":"header"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/jobs/{job_id}/send-webhook":{"post":{"summary":"Send Webhook Manual","description":"Manually fire a webhook for a completed/stopped job.","operationId":"send_webhook_manual_jobs__job_id__send_webhook_post","parameters":[{"required":true,"schema":{"type":"string","title":"Job Id"},"name":"job_id","in":"path"},{"required":false,"schema":{"type":"string","title":"Authorization"},"name":"authorization","in":"header"}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/WebhookTriggerRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/stripe/webhook":{"post":{"summary":"Stripe Webhook","operationId":"stripe_webhook_stripe_webhook_post","parameters":[{"required":false,"schema":{"type":"string","title":"Stripe-Signature"},"name":"stripe-signature","in":"header"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/jobs/{job_id}/download-url":{"post":{"summary":"Get Signed Download Url","description":"Returns a short-lived signed URL.\nPreferred path: Supabase Storage signed URL (survives Railway redeploys).\nFallback: local-file signed URL if storage upload hasn't happened yet.","operationId":"get_signed_download_url_jobs__job_id__download_url_post","parameters":[{"required":true,"schema":{"type":"string","title":"Job Id"},"name":"job_id","in":"path"},{"required":false,"schema":{"type":"string","title":"Fmt","default":"csv"},"name":"fmt","in":"query"},{"required":false,"schema":{"type":"string","title":"Authorization"},"name":"authorization","in":"header"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/jobs/{job_id}/download":{"get":{"summary":"Download Results","description":"Download a job's results in CSV, XLSX, or JSON.\n\nfmt: \"csv\" (default), \"xlsx\", or \"json\". The scrape is always stored as\nCSV on disk; xlsx/json are converted on the fly with pandas.\nAccepts a valid signed link (u/e/s query params), or an Authorization:\nBearer key or session token, as the API docs show.","operationId":"download_results_jobs__job_id__download_get","parameters":[{"required":true,"schema":{"type":"string","title":"Job Id"},"name":"job_id","in":"path"},{"required":false,"schema":{"type":"string","title":"U","default":""},"name":"u","in":"query"},{"required":false,"schema":{"type":"integer","title":"E","default":0},"name":"e","in":"query"},{"required":false,"schema":{"type":"string","title":"S","default":""},"name":"s","in":"query"},{"required":false,"schema":{"type":"string","title":"Fmt","default":"csv"},"name":"fmt","in":"query"},{"required":false,"schema":{"type":"string","title":"Authorization"},"name":"authorization","in":"header"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}}},"components":{"schemas":{"Body_local_complete_jobs__job_id__local_complete_post":{"properties":{"rows_written":{"type":"string","title":"Rows Written"},"csv_file":{"type":"string","format":"binary","title":"Csv File"}},"type":"object","required":["rows_written","csv_file"],"title":"Body_local_complete_jobs__job_id__local_complete_post"},"CheckoutRequest":{"properties":{"price_id":{"type":"string","title":"Price Id"},"success_url":{"type":"string","title":"Success Url"},"cancel_url":{"type":"string","title":"Cancel Url"},"trial":{"type":"boolean","title":"Trial","default":false}},"type":"object","required":["price_id","success_url","cancel_url"],"title":"CheckoutRequest"},"CreateApiKeyRequest":{"properties":{"name":{"type":"string","maxLength":100,"minLength":1,"title":"Name","default":"My API Key"}},"type":"object","title":"CreateApiKeyRequest"},"HTTPValidationError":{"properties":{"detail":{"items":{"$ref":"#/components/schemas/ValidationError"},"type":"array","title":"Detail"}},"type":"object","title":"HTTPValidationError"},"LocalFailRequest":{"properties":{"error":{"type":"string","maxLength":500,"title":"Error","default":"Unknown error"}},"type":"object","title":"LocalFailRequest"},"LocalProgressRequest":{"properties":{"cities_done":{"type":"integer","minimum":0.0,"title":"Cities Done"},"cities_total":{"type":"integer","minimum":0.0,"title":"Cities Total"},"rows_written":{"type":"integer","minimum":0.0,"title":"Rows Written"},"last_city":{"type":"string","maxLength":200,"title":"Last City"}},"type":"object","required":["cities_done","cities_total","rows_written"],"title":"LocalProgressRequest"},"LocalStartRequest":{"properties":{"query":{"type":"string","maxLength":500,"minLength":1,"title":"Query"},"states":{"type":"string","maxLength":2000,"minLength":1,"title":"States"},"cities":{"type":"string","maxLength":5000,"title":"Cities"},"preset":{"type":"string","maxLength":64,"title":"Preset","default":"core"},"fields":{"type":"string","maxLength":1000,"title":"Fields"},"name":{"type":"string","maxLength":200,"title":"Name"},"campaign_id":{"type":"string","maxLength":64,"title":"Campaign Id"},"max_results_per_city":{"type":"integer","maximum":500.0,"minimum":1.0,"title":"Max Results Per City","default":60},"min_rating":{"type":"number","title":"Min Rating"},"min_reviews":{"type":"integer","title":"Min Reviews"},"max_reviews":{"type":"integer","title":"Max Reviews"},"require_website":{"type":"boolean","title":"Require Website"},"require_phone":{"type":"boolean","title":"Require Phone"}},"type":"object","required":["query","states"],"title":"LocalStartRequest"},"PortalRequest":{"properties":{"return_url":{"type":"string","title":"Return Url"}},"type":"object","required":["return_url"],"title":"PortalRequest"},"ScheduledScrapeRequest":{"properties":{"name":{"type":"string","maxLength":200,"minLength":1,"title":"Name","default":"My Schedule"},"query":{"type":"string","maxLength":500,"minLength":1,"title":"Query"},"states":{"type":"string","maxLength":2000,"minLength":1,"title":"States"},"cities":{"type":"string","maxLength":5000,"title":"Cities"},"preset":{"type":"string","maxLength":64,"title":"Preset","default":"core"},"max_results_per_city":{"type":"integer","maximum":500.0,"minimum":1.0,"title":"Max Results Per City","default":60},"cron_expr":{"type":"string","maxLength":100,"minLength":1,"title":"Cron Expr"},"timezone":{"type":"string","maxLength":60,"title":"Timezone","default":"America/New_York"},"enabled":{"type":"boolean","title":"Enabled","default":true},"min_rating":{"type":"number","title":"Min Rating"},"min_reviews":{"type":"integer","title":"Min Reviews"},"max_reviews":{"type":"integer","title":"Max Reviews"},"require_website":{"type":"boolean","title":"Require Website","default":false},"require_phone":{"type":"boolean","title":"Require Phone","default":false}},"type":"object","required":["query","states","cron_expr"],"title":"ScheduledScrapeRequest"},"ScrapeRequest":{"properties":{"query":{"type":"string","maxLength":500,"minLength":1,"title":"Query"},"states":{"type":"string","maxLength":2000,"minLength":1,"title":"States"},"cities":{"type":"string","maxLength":5000,"title":"Cities"},"max_results_per_city":{"type":"integer","maximum":500.0,"minimum":1.0,"title":"Max Results Per City","default":60},"max_total_results":{"type":"integer","maximum":1000000.0,"minimum":1.0,"title":"Max Total Results"},"workers":{"type":"integer","maximum":100.0,"minimum":1.0,"title":"Workers","default":4},"category_filter":{"type":"string","maxLength":200,"title":"Category Filter"},"related_categories":{"type":"string","maxLength":1000,"title":"Related Categories"},"resume_job_id":{"type":"string","maxLength":64,"title":"Resume Job Id"},"preset":{"type":"string","maxLength":64,"title":"Preset"},"fields":{"type":"string","maxLength":1000,"title":"Fields"},"webhook_url":{"type":"string","maxLength":2048,"title":"Webhook Url"},"webhook_fields":{"items":{},"type":"array","title":"Webhook Fields"},"webhook_trigger":{"type":"string","maxLength":20,"title":"Webhook Trigger","default":"manual"},"campaign_id":{"type":"string","maxLength":64,"title":"Campaign Id"},"name":{"type":"string","maxLength":200,"title":"Name"},"country":{"type":"string","maxLength":20,"title":"Country","default":"us"},"min_rating":{"type":"number","title":"Min Rating"},"min_reviews":{"type":"integer","title":"Min Reviews"},"max_reviews":{"type":"integer","title":"Max Reviews"},"require_website":{"type":"boolean","title":"Require Website","default":false},"exclude_website":{"type":"boolean","title":"Exclude Website","default":false},"require_phone":{"type":"boolean","title":"Require Phone","default":false},"exclude_phone":{"type":"boolean","title":"Exclude Phone","default":false}},"type":"object","required":["query","states"],"title":"ScrapeRequest"},"ScrapeResponse":{"properties":{"job_id":{"type":"string","title":"Job Id"},"status":{"type":"string","title":"Status"},"message":{"type":"string","title":"Message"},"resumed_from":{"type":"string","title":"Resumed From"}},"type":"object","required":["job_id","status","message"],"title":"ScrapeResponse"},"ValidationError":{"properties":{"loc":{"items":{"anyOf":[{"type":"string"},{"type":"integer"}]},"type":"array","title":"Location"},"msg":{"type":"string","title":"Message"},"type":{"type":"string","title":"Error Type"}},"type":"object","required":["loc","msg","type"],"title":"ValidationError"},"WebhookTriggerRequest":{"properties":{"webhook_url":{"type":"string","title":"Webhook Url"},"webhook_fields":{"items":{},"type":"array","title":"Webhook Fields"}},"type":"object","required":["webhook_url"],"title":"WebhookTriggerRequest"}}}}