{"openapi":"3.1.0","info":{"title":"Omnis Signal","description":"Scraper Hub API","version":"1.0.0"},"paths":{"/api/v1/health/":{"get":{"tags":["health"],"summary":"Health Check","operationId":"health_check_api_v1_health__get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/v1/sources/":{"get":{"tags":["sources"],"summary":"List Sources","operationId":"list_sources_api_v1_sources__get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"items":{"additionalProperties":true,"type":"object"},"type":"array","title":"Response List Sources Api V1 Sources  Get"}}}}}},"post":{"tags":["sources"],"summary":"Create Source","operationId":"create_source_api_v1_sources__post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SourceCreate"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Create Source Api V1 Sources  Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/sources/{source_id}":{"patch":{"tags":["sources"],"summary":"Update Source","operationId":"update_source_api_v1_sources__source_id__patch","parameters":[{"name":"source_id","in":"path","required":true,"schema":{"type":"integer","title":"Source Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SourceUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Update Source Api V1 Sources  Source Id  Patch"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/sources/{source_id}/scrape":{"post":{"tags":["sources"],"summary":"Run Source Scrape","operationId":"run_source_scrape_api_v1_sources__source_id__scrape_post","parameters":[{"name":"source_id","in":"path","required":true,"schema":{"type":"integer","title":"Source Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/sources/realtime":{"post":{"tags":["sources"],"summary":"Run Realtime Scrape All","operationId":"run_realtime_scrape_all_api_v1_sources_realtime_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/v1/manual-scrape/":{"post":{"tags":["manual-scrape"],"summary":"Manual Scrape","operationId":"manual_scrape_api_v1_manual_scrape__post","requestBody":{"content":{"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/Body_manual_scrape_api_v1_manual_scrape__post"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/records/":{"get":{"tags":["records"],"summary":"List Records","description":"List extracted records with optional filtering.","operationId":"list_records_api_v1_records__get","parameters":[{"name":"category","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Filter by category (telecom, banking)","title":"Category"},"description":"Filter by category (telecom, banking)"},{"name":"entity_name","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Filter by entity name","title":"Entity Name"},"description":"Filter by entity name"},{"name":"subcategory","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Filter by subcategory","title":"Subcategory"},"description":"Filter by subcategory"},{"name":"min_confidence","in":"query","required":false,"schema":{"anyOf":[{"type":"number","maximum":1.0,"minimum":0.0},{"type":"null"}],"description":"Minimum confidence score to include","title":"Min Confidence"},"description":"Minimum confidence score to include"},{"name":"verified_only","in":"query","required":false,"schema":{"type":"boolean","description":"Only return verified high-confidence records","default":false,"title":"Verified Only"},"description":"Only return verified high-confidence records"},{"name":"has_price_only","in":"query","required":false,"schema":{"type":"boolean","description":"Only return records with a detected price","default":false,"title":"Has Price Only"},"description":"Only return records with a detected price"},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":1000,"minimum":1,"description":"Maximum number of records to return","default":100,"title":"Limit"},"description":"Maximum number of records to return"},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","minimum":0,"description":"Number of records to skip","default":0,"title":"Offset"},"description":"Number of records to skip"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/RecordResponse"},"title":"Response List Records Api V1 Records  Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/records/quality-summary":{"get":{"tags":["records"],"summary":"Quality Summary","operationId":"quality_summary_api_v1_records_quality_summary_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Quality Summary Api V1 Records Quality Summary Get"}}}}}}},"/api/v1/records/{record_id}":{"get":{"tags":["records"],"summary":"Get Record","description":"Get a specific extracted record by ID.","operationId":"get_record_api_v1_records__record_id__get","parameters":[{"name":"record_id","in":"path","required":true,"schema":{"type":"integer","title":"Record Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RecordResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/webhook-targets/":{"get":{"tags":["webhook-targets"],"summary":"List Webhook Targets","operationId":"list_webhook_targets_api_v1_webhook_targets__get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}},"post":{"tags":["webhook-targets"],"summary":"Create Webhook Target","operationId":"create_webhook_target_api_v1_webhook_targets__post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/WebhookTargetCreate"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/webhook-targets/{target_id}":{"patch":{"tags":["webhook-targets"],"summary":"Update Webhook Target","operationId":"update_webhook_target_api_v1_webhook_targets__target_id__patch","parameters":[{"name":"target_id","in":"path","required":true,"schema":{"type":"integer","title":"Target Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/WebhookTargetUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/WebhookTargetResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["webhook-targets"],"summary":"Delete Webhook Target","operationId":"delete_webhook_target_api_v1_webhook_targets__target_id__delete","parameters":[{"name":"target_id","in":"path","required":true,"schema":{"type":"integer","title":"Target Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/webhook-targets/{target_id}/replay-failed":{"post":{"tags":["webhook-targets"],"summary":"Replay Failed Deliveries","description":"Replay failed webhook deliveries for a specific target.","operationId":"replay_failed_deliveries_api_v1_webhook_targets__target_id__replay_failed_post","parameters":[{"name":"target_id","in":"path","required":true,"schema":{"type":"integer","title":"Target Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/webhook-targets/replay-all-failed":{"post":{"tags":["webhook-targets"],"summary":"Replay All Failed Deliveries","description":"Replay all failed webhook deliveries.","operationId":"replay_all_failed_deliveries_api_v1_webhook_targets_replay_all_failed_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/v1/delivery-attempts/":{"get":{"tags":["delivery-attempts"],"summary":"List Delivery Attempts","operationId":"list_delivery_attempts_api_v1_delivery_attempts__get","parameters":[{"name":"target_id","in":"query","required":false,"schema":{"type":"integer","title":"Target Id"}},{"name":"record_id","in":"query","required":false,"schema":{"type":"integer","title":"Record Id"}},{"name":"status","in":"query","required":false,"schema":{"$ref":"#/components/schemas/DeliveryStatus"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":1000,"default":100,"title":"Limit"}},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","default":0,"title":"Offset"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"type":"object","additionalProperties":true},"title":"Response List Delivery Attempts Api V1 Delivery Attempts  Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/organizations":{"get":{"tags":["organizations"],"summary":"List Organizations","description":"List all organizations with optional filters.","operationId":"list_organizations_api_v1_organizations_get","parameters":[{"name":"category","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Category"}},{"name":"search","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Search"}},{"name":"scrape_status","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Scrape Status"}},{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1,"title":"Page"}},{"name":"page_size","in":"query","required":false,"schema":{"type":"integer","maximum":200,"minimum":1,"default":50,"title":"Page Size"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/organizations/stats":{"get":{"tags":["organizations"],"summary":"Org Stats","description":"Return aggregate stats across all organizations.","operationId":"org_stats_api_v1_organizations_stats_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/v1/organizations/{slug}":{"get":{"tags":["organizations"],"summary":"Get Organization","description":"Get full organization profile by slug.","operationId":"get_organization_api_v1_organizations__slug__get","parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string","title":"Slug"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/organizations/{slug}/changes":{"get":{"tags":["organizations"],"summary":"Get Org Changes","description":"Get change history for an organization.","operationId":"get_org_changes_api_v1_organizations__slug__changes_get","parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string","title":"Slug"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/organizations/{slug}/trigger-scrape":{"post":{"tags":["organizations"],"summary":"Trigger Scrape","description":"Trigger a fresh scrape for a single organization.","operationId":"trigger_scrape_api_v1_organizations__slug__trigger_scrape_post","parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string","title":"Slug"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/catalog/sectors":{"get":{"tags":["catalog"],"summary":"List all live sectors","description":"Returns all sectors with status=live.","operationId":"list_sectors_api_v1_catalog_sectors_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/v1/catalog/sectors/{slug}/categories":{"get":{"tags":["catalog"],"summary":"Get categories for a sector","description":"Returns all categories under a given sector slug.","operationId":"get_sector_categories_api_v1_catalog_sectors__slug__categories_get","parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string","title":"Slug"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/catalog/categories/{category_id}/schema":{"get":{"tags":["catalog"],"summary":"Get attribute schema for a category","description":"Returns the attribute schema fields contract for a category.","operationId":"get_category_schema_api_v1_catalog_categories__category_id__schema_get","parameters":[{"name":"category_id","in":"path","required":true,"schema":{"type":"string","title":"Category Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/catalog/providers":{"get":{"tags":["catalog"],"summary":"List all providers","description":"Returns providers listed in the catalog.","operationId":"list_providers_api_v1_catalog_providers_get","parameters":[{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":500,"default":100,"title":"Limit"}},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","default":0,"title":"Offset"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/catalog/ingest":{"post":{"tags":["catalog"],"summary":"Mode A Direct Ingestion","description":"Mode A Direct Ingestion Endpoint:\nAutomated scrapers land product data directly into Provider + Listing + ListingPriceHistory.","operationId":"ingest_listing_api_v1_catalog_ingest_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/IngestPayload"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/IngestResult"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/catalog/listings":{"get":{"tags":["catalog"],"summary":"Query listings","description":"Query scraped product listings with filters on sector, category, provider, and status.","operationId":"list_listings_api_v1_catalog_listings_get","parameters":[{"name":"sector","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Sector slug","title":"Sector"},"description":"Sector slug"},{"name":"category","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Category slug","title":"Category"},"description":"Category slug"},{"name":"provider","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Provider name or ID","title":"Provider"},"description":"Provider name or ID"},{"name":"status","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Listing status","default":"published","title":"Status"},"description":"Listing status"},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":200,"default":50,"title":"Limit"}},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","default":0,"title":"Offset"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/catalog/listings/{listing_id}":{"get":{"tags":["catalog"],"summary":"Get a single listing","description":"Returns details for a specific listing_id.","operationId":"get_listing_api_v1_catalog_listings__listing_id__get","parameters":[{"name":"listing_id","in":"path","required":true,"schema":{"type":"string","title":"Listing Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/catalog/listings/{listing_id}/price-history":{"get":{"tags":["catalog"],"summary":"Get price trend history","description":"Returns previous price snapshots for sparkline and price-drop features.","operationId":"get_price_history_api_v1_catalog_listings__listing_id__price_history_get","parameters":[{"name":"listing_id","in":"path","required":true,"schema":{"type":"string","title":"Listing Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/catalog/scrape-queue":{"post":{"tags":["catalog"],"summary":"Submit a scraped item for review","description":"Submits a scraped candidate for human vetting (Mode B).","operationId":"submit_scrape_item_api_v1_catalog_scrape_queue_post","requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ScrapeItemSubmitRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"get":{"tags":["catalog"],"summary":"List pending scraped items","description":"Returns candidates awaiting admin review.","operationId":"list_scrape_queue_api_v1_catalog_scrape_queue_get","parameters":[{"name":"status","in":"query","required":false,"schema":{"type":"string","default":"pending","title":"Status"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":200,"default":50,"title":"Limit"}},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","default":0,"title":"Offset"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/catalog/scrape-queue/{item_id}/approve":{"patch":{"tags":["catalog"],"summary":"Approve a candidate into a listing","description":"Approves a pending ScrapedItem, transferring its extracted_data directly into the Listing table.","operationId":"approve_scraped_item_api_v1_catalog_scrape_queue__item_id__approve_patch","parameters":[{"name":"item_id","in":"path","required":true,"schema":{"type":"string","title":"Item Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/catalog/scrape-queue/{item_id}/reject":{"patch":{"tags":["catalog"],"summary":"Reject a candidate","description":"Rejects a pending ScrapedItem with a reason.","operationId":"reject_scraped_item_api_v1_catalog_scrape_queue__item_id__reject_patch","parameters":[{"name":"item_id","in":"path","required":true,"schema":{"type":"string","title":"Item Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RejectionRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/catalog/banking/fee-hierarchy":{"get":{"tags":["catalog"],"summary":"Get 3-level banking fee hierarchy","description":"Returns the full 3-level fee tree (fee_category -> subcategory -> revenue_line).","operationId":"get_banking_fee_hierarchy_api_v1_catalog_banking_fee_hierarchy_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/v1/catalog/banking/flat-categories":{"get":{"tags":["catalog"],"summary":"Get flat consumer banking categories","description":"Returns the 4 flat consumer categories (savings, current, nostro FCA, banks).","operationId":"get_banking_flat_categories_api_v1_catalog_banking_flat_categories_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/v1/catalog/banking/banks":{"get":{"tags":["catalog"],"summary":"Get Zimbabwean banks directory and channels","description":"Returns all 23 banks with USSD codes, channel capabilities, and directory listing.","operationId":"get_banking_banks_directory_api_v1_catalog_banking_banks_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/v1/catalog/banking/ingest-fee":{"post":{"tags":["catalog"],"summary":"Ingest fee into revenue line","description":"Automated fee ingestion into a specific revenue line.","operationId":"ingest_banking_fee_api_v1_catalog_banking_ingest_fee_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BankingFeeIngestRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/catalog/banking/run-scraper":{"post":{"tags":["catalog"],"summary":"Trigger automated banking scraper","description":"Executes the automated Zimbabwean banking charges and fee scraper.","operationId":"trigger_banking_scraper_api_v1_catalog_banking_run_scraper_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/v1/catalog/education/categories":{"get":{"tags":["catalog"],"summary":"Get education categories and schemas","description":"Returns the 3 education categories (primary, secondary, university) with schemas.","operationId":"get_education_categories_api_v1_catalog_education_categories_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/v1/catalog/education/institutions":{"get":{"tags":["catalog"],"summary":"Get education institutions and listings","description":"Returns educational institutions and their fee listings.","operationId":"get_education_institutions_api_v1_catalog_education_institutions_get","parameters":[{"name":"category","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Filter by category slug","title":"Category"},"description":"Filter by category slug"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/catalog/education/ingest":{"post":{"tags":["catalog"],"summary":"Ingest education fee listing","description":"Automated ingestion of education fee listing with normalisation.","operationId":"ingest_education_listing_api_v1_catalog_education_ingest_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/EducationListingIngestRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/catalog/education/run-scraper":{"post":{"tags":["catalog"],"summary":"Trigger automated education scraper","description":"Executes the automated education fees and tuition scraper.","operationId":"trigger_education_scraper_api_v1_catalog_education_run_scraper_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/v1/catalog/food/categories":{"get":{"tags":["catalog"],"summary":"Get Food & Drink categories and schemas","description":"Returns the 2 food categories (fast-food, casual-dining) with schemas.","operationId":"get_food_categories_api_v1_catalog_food_categories_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/v1/catalog/food/items":{"get":{"tags":["catalog"],"summary":"Get restaurants and menu listings (alias)","description":"Returns restaurant chains and their active menu listings.","operationId":"get_food_restaurants_api_v1_catalog_food_items_get","parameters":[{"name":"category","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Filter by category slug (fast-food, casual-dining)","title":"Category"},"description":"Filter by category slug (fast-food, casual-dining)"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/catalog/food/restaurants":{"get":{"tags":["catalog"],"summary":"Get restaurants and menu listings","description":"Returns restaurant chains and their active menu listings.","operationId":"get_food_restaurants_api_v1_catalog_food_restaurants_get","parameters":[{"name":"category","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Filter by category slug (fast-food, casual-dining)","title":"Category"},"description":"Filter by category slug (fast-food, casual-dining)"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/catalog/food/ingest":{"post":{"tags":["catalog"],"summary":"Ingest a menu item listing","description":"Automated ingestion of a single restaurant menu item into the catalog.","operationId":"ingest_food_menu_item_api_v1_catalog_food_ingest_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/FoodMenuIngestRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/catalog/food/run-scraper":{"post":{"tags":["catalog"],"summary":"Trigger automated Food & Drink scraper","description":"Executes the automated Food & Drink restaurant menu scraper.","operationId":"trigger_food_scraper_api_v1_catalog_food_run_scraper_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/v1/catalog/hotels/category":{"get":{"tags":["catalog"],"summary":"Get Hotels category and schema","description":"Returns the hotel-stays category with its 5 attribute schema fields.","operationId":"get_hotels_category_api_v1_catalog_hotels_category_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/v1/catalog/hotels/stays":{"get":{"tags":["catalog"],"summary":"Get hotel room rate listings (alias)","description":"Returns all hotel room listings with night rates and amenities.","operationId":"get_hotels_listings_api_v1_catalog_hotels_stays_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/v1/catalog/hotels/listings":{"get":{"tags":["catalog"],"summary":"Get hotel room rate listings","description":"Returns all hotel room listings with night rates and amenities.","operationId":"get_hotels_listings_api_v1_catalog_hotels_listings_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/v1/catalog/hotels/ingest":{"post":{"tags":["catalog"],"summary":"Ingest a hotel room listing","description":"Automated ingestion of a hotel room rate into the catalog.","operationId":"ingest_hotel_room_api_v1_catalog_hotels_ingest_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/HotelRoomIngestRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/catalog/hotels/run-scraper":{"post":{"tags":["catalog"],"summary":"Trigger automated Hotels scraper","description":"Executes the automated Zimbabwean hotel room rate scraper.","operationId":"trigger_hotels_scraper_api_v1_catalog_hotels_run_scraper_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/v1/catalog/retail/categories":{"get":{"tags":["catalog"],"summary":"Get all 25 Retail categories and schemas","description":"Returns all 25 retail categories with the common 12-field attribute schema.","operationId":"get_retail_categories_api_v1_catalog_retail_categories_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/v1/catalog/retail/products":{"get":{"tags":["catalog"],"summary":"Get retail product listings","description":"Returns retail commodity products with unit prices and supplier info.","operationId":"get_retail_products_api_v1_catalog_retail_products_get","parameters":[{"name":"category","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Filter by category slug","title":"Category"},"description":"Filter by category slug"},{"name":"brand","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Filter by brand","title":"Brand"},"description":"Filter by brand"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/catalog/retail/ingest":{"post":{"tags":["catalog"],"summary":"Ingest a retail product listing","description":"Automated ingestion of a retail commodity with unit-price calculation.","operationId":"ingest_retail_product_api_v1_catalog_retail_ingest_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RetailProductIngestRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/catalog/retail/run-scraper":{"post":{"tags":["catalog"],"summary":"Trigger automated Retail scraper","description":"Executes the automated Retail & Groceries commodity scraper.","operationId":"trigger_retail_scraper_api_v1_catalog_retail_run_scraper_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/v1/catalog/telecom/categories":{"get":{"tags":["catalog"],"summary":"Get all 8 Telecom bundle categories and schemas","description":"Returns all 8 telecom categories with the 6-field attribute schema.","operationId":"get_telecom_categories_api_v1_catalog_telecom_categories_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/v1/catalog/telecom/bundles":{"get":{"tags":["catalog"],"summary":"Get mobile data and bundle listings","description":"Returns telecom bundle offers with validity, data allowance, and price per GB.","operationId":"get_telecom_bundles_api_v1_catalog_telecom_bundles_get","parameters":[{"name":"category","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Filter by category slug","title":"Category"},"description":"Filter by category slug"},{"name":"operator","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Filter by operator (Econet, NetOne, Telecel)","title":"Operator"},"description":"Filter by operator (Econet, NetOne, Telecel)"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/catalog/telecom/ingest":{"post":{"tags":["catalog"],"summary":"Ingest a telecom bundle listing","description":"Automated ingestion of a telecom bundle with operator normalisation and price_per_gb calculation.","operationId":"ingest_telecom_bundle_api_v1_catalog_telecom_ingest_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TelecomBundleIngestRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/catalog/telecom/run-scraper":{"post":{"tags":["catalog"],"summary":"Trigger automated Telecom scraper","description":"Executes the automated Telecom mobile data and bundle scraper.","operationId":"trigger_telecom_scraper_api_v1_catalog_telecom_run_scraper_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/v1/catalog/transport/categories":{"get":{"tags":["catalog"],"summary":"Get all 8 Transport categories and schemas","description":"Returns all 8 transport categories with the common 16-field attribute schema.","operationId":"get_transport_categories_api_v1_catalog_transport_categories_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/v1/catalog/transport/services":{"get":{"tags":["catalog"],"summary":"Get transport services and fares","description":"Returns transport operator services with gazetted fares and route coverage.","operationId":"get_transport_services_api_v1_catalog_transport_services_get","parameters":[{"name":"category","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Filter by category slug","title":"Category"},"description":"Filter by category slug"},{"name":"province","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Filter by province/district/route","title":"Province"},"description":"Filter by province/district/route"},{"name":"ownership","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Filter by ownership (state, private, cooperative, franchise)","title":"Ownership"},"description":"Filter by ownership (state, private, cooperative, franchise)"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/catalog/transport/ingest":{"post":{"tags":["catalog"],"summary":"Ingest a transport route/service listing","description":"Automated ingestion of a transport operator service with fare mapping.","operationId":"ingest_transport_service_api_v1_catalog_transport_ingest_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TransportServiceIngestRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/catalog/transport/run-scraper":{"post":{"tags":["catalog"],"summary":"Trigger automated Transport scraper","description":"Executes the automated Transport transit fare scraper.","operationId":"trigger_transport_scraper_api_v1_catalog_transport_run_scraper_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/v1/reports/send-4h-digest":{"get":{"tags":["reports"],"summary":"Send 4H Report Endpoint","description":"Trigger the 4-hour comprehensive product and service price digest email.","operationId":"send_4h_report_endpoint_api_v1_reports_send_4h_digest_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}},"post":{"tags":["reports"],"summary":"Send 4H Report Endpoint","description":"Trigger the 4-hour comprehensive product and service price digest email.","operationId":"send_4h_report_endpoint_api_v1_reports_send_4h_digest_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/v1/reports/send-12h-digest":{"get":{"tags":["reports"],"summary":"Send 12H Report Endpoint","description":"Backward-compatible endpoint for triggering price digest email.","operationId":"send_12h_report_endpoint_api_v1_reports_send_12h_digest_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}},"post":{"tags":["reports"],"summary":"Send 12H Report Endpoint","description":"Backward-compatible endpoint for triggering price digest email.","operationId":"send_12h_report_endpoint_api_v1_reports_send_12h_digest_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/v1/subscribers":{"get":{"tags":["subscribers"],"summary":"List Subscribers","description":"List all registered report subscribers.","operationId":"list_subscribers_api_v1_subscribers_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}},"post":{"tags":["subscribers"],"summary":"Add Subscriber","description":"Add a new report email subscriber or update an existing one.","operationId":"add_subscriber_api_v1_subscribers_post","requestBody":{"content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Payload"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/subscribers/{subscriber_id}":{"delete":{"tags":["subscribers"],"summary":"Delete Subscriber","description":"Remove a subscriber by ID.","operationId":"delete_subscriber_api_v1_subscribers__subscriber_id__delete","parameters":[{"name":"subscriber_id","in":"path","required":true,"schema":{"type":"integer","title":"Subscriber Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/market-data/":{"get":{"tags":["Market Data (v2)"],"summary":"Get Market Data","operationId":"get_market_data_api_v2_market_data__get","security":[{"APIKeyHeader":[]}],"parameters":[{"name":"category","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Filter by category","title":"Category"},"description":"Filter by category"},{"name":"entity_name","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Filter by entity","title":"Entity Name"},"description":"Filter by entity"},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":50,"title":"Limit"}},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","minimum":0,"default":0,"title":"Offset"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedMarketData"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/market-data/latest-by-sector":{"get":{"tags":["Market Data (v2)"],"summary":"Get Latest Market Data By Sector","operationId":"get_latest_market_data_by_sector_api_v2_market_data_latest_by_sector_get","security":[{"APIKeyHeader":[]}],"parameters":[{"name":"categories","in":"query","required":false,"schema":{"anyOf":[{"type":"array","items":{"type":"string"}},{"type":"null"}],"description":"Optional list of sectors to include","title":"Categories"},"description":"Optional list of sectors to include"},{"name":"limit_per_category","in":"query","required":false,"schema":{"type":"integer","maximum":50,"minimum":1,"description":"Maximum latest records to return per sector","default":10,"title":"Limit Per Category"},"description":"Maximum latest records to return per sector"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/LatestMarketDataBySector"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/export/matrix":{"get":{"summary":"Export Matrix Excel","description":"Generates an all-inclusive multi-sector Excel workbook with Master Sheet (95+ rows) and 8 dedicated sector tabs.","operationId":"export_matrix_excel_export_matrix_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/export/matrix.xlsx":{"get":{"summary":"Export Matrix Excel","description":"Generates an all-inclusive multi-sector Excel workbook with Master Sheet (95+ rows) and 8 dedicated sector tabs.","operationId":"export_matrix_excel_export_matrix_xlsx_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/export/send-12h-report":{"get":{"summary":"Trigger 4H Report","operationId":"trigger_4h_report_export_send_12h_report_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/export/send-4h-report":{"get":{"summary":"Trigger 4H Report","operationId":"trigger_4h_report_export_send_4h_report_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/prices":{"get":{"summary":"Standardized Price Matrix","operationId":"standardized_price_matrix_prices_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/matrix":{"get":{"summary":"Standardized Price Matrix","operationId":"standardized_price_matrix_matrix_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/":{"get":{"summary":"Dashboard","operationId":"dashboard__get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/sources":{"get":{"summary":"Sources","operationId":"sources_sources_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/manual-scrape":{"get":{"summary":"Manual Scrape","operationId":"manual_scrape_manual_scrape_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/data-quality":{"get":{"summary":"Data Quality","operationId":"data_quality_data_quality_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/records":{"get":{"summary":"Records","operationId":"records_records_get","parameters":[{"name":"category","in":"query","required":false,"schema":{"type":"string","title":"Category"}},{"name":"market","in":"query","required":false,"schema":{"type":"string","title":"Market"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/zimbabwe":{"get":{"summary":"Zimbabwe Records","operationId":"zimbabwe_records_zimbabwe_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/export/records":{"get":{"summary":"Export Records","operationId":"export_records_export_records_get","parameters":[{"name":"category","in":"query","required":false,"schema":{"type":"string","title":"Category"}},{"name":"market","in":"query","required":false,"schema":{"type":"string","title":"Market"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/organizations":{"get":{"summary":"Org List","operationId":"org_list_organizations_get","parameters":[{"name":"category","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Category"}},{"name":"search","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Search"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/organizations/{slug}":{"get":{"summary":"Org Profile","operationId":"org_profile_organizations__slug__get","parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string","title":"Slug"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/catalog":{"get":{"summary":"Product Catalog","operationId":"product_catalog_catalog_get","parameters":[{"name":"category","in":"query","required":false,"schema":{"type":"string","title":"Category"}},{"name":"brand","in":"query","required":false,"schema":{"type":"string","title":"Brand"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/services-catalog":{"get":{"summary":"Services Catalog","operationId":"services_catalog_services_catalog_get","parameters":[{"name":"category","in":"query","required":false,"schema":{"type":"string","title":"Category"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/intelligence":{"get":{"summary":"Intelligence Dashboard","operationId":"intelligence_dashboard_intelligence_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/apis":{"get":{"summary":"Apis Page","operationId":"apis_page_apis_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/export/api-docs":{"get":{"summary":"Export Api Docs","operationId":"export_api_docs_export_api_docs_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/v1/health":{"get":{"summary":"Health Check","operationId":"health_check_api_v1_health_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/health":{"get":{"summary":"Health Check","operationId":"health_check_api_health_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/health":{"get":{"summary":"Health Check","operationId":"health_check_health_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}}},"components":{"schemas":{"BankingFeeIngestRequest":{"properties":{"bank_name":{"type":"string","title":"Bank Name"},"revenue_line_slug":{"type":"string","title":"Revenue Line Slug"},"listing_name":{"type":"string","title":"Listing Name"},"price":{"type":"number","title":"Price"},"currency":{"type":"string","title":"Currency","default":"USD"},"attributes":{"additionalProperties":true,"type":"object","title":"Attributes","default":{}},"source_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Source Url"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description"}},"type":"object","required":["bank_name","revenue_line_slug","listing_name","price"],"title":"BankingFeeIngestRequest"},"Body_manual_scrape_api_v1_manual_scrape__post":{"properties":{"url":{"type":"string","title":"Url"},"category":{"type":"string","title":"Category"},"extractor_type":{"type":"string","title":"Extractor Type","default":"auto"},"store_result":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Store Result"},"content":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Content"}},"type":"object","required":["url","category"],"title":"Body_manual_scrape_api_v1_manual_scrape__post"},"DeliveryStatus":{"type":"string","enum":["pending","success","failed","dead_letter"],"title":"DeliveryStatus"},"EducationListingIngestRequest":{"properties":{"institution_name":{"type":"string","title":"Institution Name"},"category_slug":{"type":"string","title":"Category Slug"},"listing_name":{"type":"string","title":"Listing Name"},"price":{"type":"number","title":"Price"},"currency":{"type":"string","title":"Currency","default":"USD"},"attributes":{"additionalProperties":true,"type":"object","title":"Attributes","default":{}},"source_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Source Url"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description"}},"type":"object","required":["institution_name","category_slug","listing_name","price"],"title":"EducationListingIngestRequest"},"FoodMenuIngestRequest":{"properties":{"restaurant_name":{"type":"string","title":"Restaurant Name"},"category_slug":{"type":"string","title":"Category Slug"},"menu_item_name":{"type":"string","title":"Menu Item Name"},"price":{"type":"number","title":"Price"},"currency":{"type":"string","title":"Currency","default":"USD"},"attributes":{"additionalProperties":true,"type":"object","title":"Attributes","default":{}},"source_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Source Url"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description"}},"type":"object","required":["restaurant_name","category_slug","menu_item_name","price"],"title":"FoodMenuIngestRequest"},"HTTPValidationError":{"properties":{"detail":{"items":{"$ref":"#/components/schemas/ValidationError"},"type":"array","title":"Detail"}},"type":"object","title":"HTTPValidationError"},"HotelRoomIngestRequest":{"properties":{"hotel_name":{"type":"string","title":"Hotel Name"},"room_name":{"type":"string","title":"Room Name"},"price_per_night":{"type":"number","title":"Price Per Night"},"currency":{"type":"string","title":"Currency","default":"USD"},"attributes":{"additionalProperties":true,"type":"object","title":"Attributes","default":{}},"source_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Source Url"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description"},"images":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Images","default":[]}},"type":"object","required":["hotel_name","room_name","price_per_night"],"title":"HotelRoomIngestRequest"},"IngestPayload":{"properties":{"sector_slug":{"type":"string","title":"Sector Slug","description":"Sector slug, e.g. 'banking'"},"category_slug":{"type":"string","title":"Category Slug","description":"Category slug, e.g. 'current_accounts'"},"provider_name":{"type":"string","title":"Provider Name","description":"Provider name, e.g. 'CBZ'"},"listing_name":{"type":"string","title":"Listing Name","description":"Product/fee name, e.g. 'Gold Savings Account'"},"price":{"type":"number","title":"Price","description":"Price value"},"currency":{"type":"string","title":"Currency","description":"Currency code","default":"USD"},"source_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Source Url","description":"The scraped page URL"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description","description":"Product description"},"attributes":{"additionalProperties":true,"type":"object","title":"Attributes","description":"Schema attributes"}},"type":"object","required":["sector_slug","category_slug","provider_name","listing_name","price"],"title":"IngestPayload"},"IngestResult":{"properties":{"listing_id":{"type":"string","title":"Listing Id"},"provider_id":{"type":"string","title":"Provider Id"},"action":{"type":"string","title":"Action"},"validation_warnings":{"items":{"type":"string"},"type":"array","title":"Validation Warnings","default":[]}},"type":"object","required":["listing_id","provider_id","action"],"title":"IngestResult"},"LatestMarketDataBySector":{"properties":{"sectors":{"items":{"$ref":"#/components/schemas/SectorMarketData"},"type":"array","title":"Sectors"}},"type":"object","required":["sectors"],"title":"LatestMarketDataBySector"},"MarketDataResponse":{"properties":{"id":{"type":"integer","title":"Id"},"entity_name":{"type":"string","title":"Entity Name"},"category":{"type":"string","title":"Category"},"subcategory":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Subcategory"},"title":{"type":"string","title":"Title"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description"},"price_value":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Price Value"},"price_currency":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Price Currency"},"captured_at":{"type":"string","format":"date-time","title":"Captured At"},"source_url":{"type":"string","title":"Source Url"}},"type":"object","required":["id","entity_name","category","subcategory","title","description","price_value","price_currency","captured_at","source_url"],"title":"MarketDataResponse"},"PaginatedMarketData":{"properties":{"total":{"type":"integer","title":"Total"},"limit":{"type":"integer","title":"Limit"},"offset":{"type":"integer","title":"Offset"},"data":{"items":{"$ref":"#/components/schemas/MarketDataResponse"},"type":"array","title":"Data"}},"type":"object","required":["total","limit","offset","data"],"title":"PaginatedMarketData"},"RecordResponse":{"properties":{"id":{"type":"integer","title":"Id"},"snapshot_id":{"type":"integer","title":"Snapshot Id"},"entity_name":{"type":"string","title":"Entity Name"},"category":{"type":"string","title":"Category"},"subcategory":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Subcategory"},"title":{"type":"string","title":"Title"},"item_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Item Name"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description"},"price_value":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Price Value"},"price_currency":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Price Currency"},"billing_period":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Billing Period"},"unit_value":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Unit Value"},"unit_type":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Unit Type"},"eligibility":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Eligibility"},"effective_date":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Effective Date"},"captured_at":{"type":"string","title":"Captured At"},"source_url":{"type":"string","title":"Source Url"},"confidence_score":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Confidence Score"},"quality_status":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Quality Status"},"is_verified":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Is Verified"},"has_price":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Has Price"}},"type":"object","required":["id","snapshot_id","entity_name","category","subcategory","title","item_name","description","price_value","price_currency","billing_period","unit_value","unit_type","eligibility","effective_date","captured_at","source_url","confidence_score","quality_status","is_verified","has_price"],"title":"RecordResponse"},"RejectionRequest":{"properties":{"reason":{"type":"string","title":"Reason","description":"Reason for rejecting this item"}},"type":"object","required":["reason"],"title":"RejectionRequest"},"RetailProductIngestRequest":{"properties":{"supplier_name":{"type":"string","title":"Supplier Name"},"category_slug":{"type":"string","title":"Category Slug"},"product_name":{"type":"string","title":"Product Name"},"price":{"type":"number","title":"Price"},"currency":{"type":"string","title":"Currency","default":"USD"},"attributes":{"additionalProperties":true,"type":"object","title":"Attributes","default":{}},"source_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Source Url"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description"}},"type":"object","required":["supplier_name","category_slug","product_name","price"],"title":"RetailProductIngestRequest"},"ScrapeItemSubmitRequest":{"properties":{"source_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Source Url"},"category_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Category Id"},"raw_content":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Raw Content"},"extracted_data":{"additionalProperties":true,"type":"object","title":"Extracted Data"},"confidence":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Confidence"},"suggested_provider_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Suggested Provider Id"},"suggested_listing_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Suggested Listing Id"},"triggered_by":{"type":"string","title":"Triggered By","default":"admin_manual"}},"type":"object","required":["extracted_data"],"title":"ScrapeItemSubmitRequest"},"SectorMarketData":{"properties":{"category":{"type":"string","title":"Category"},"latest_records":{"items":{"$ref":"#/components/schemas/MarketDataResponse"},"type":"array","title":"Latest Records"}},"type":"object","required":["category","latest_records"],"title":"SectorMarketData"},"SourceCreate":{"properties":{"name":{"type":"string","title":"Name"},"category":{"type":"string","title":"Category"},"base_url":{"type":"string","title":"Base Url"},"schedule":{"type":"string","title":"Schedule"}},"type":"object","required":["name","category","base_url"],"title":"SourceCreate"},"SourceUpdate":{"properties":{"name":{"type":"string","title":"Name"},"category":{"type":"string","title":"Category"},"base_url":{"type":"string","title":"Base Url"},"schedule":{"type":"string","title":"Schedule"}},"type":"object","title":"SourceUpdate"},"TelecomBundleIngestRequest":{"properties":{"operator_name":{"type":"string","title":"Operator Name"},"category_slug":{"type":"string","title":"Category Slug"},"bundle_name":{"type":"string","title":"Bundle Name"},"price":{"type":"number","title":"Price"},"currency":{"type":"string","title":"Currency","default":"USD"},"attributes":{"additionalProperties":true,"type":"object","title":"Attributes","default":{}},"source_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Source Url"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description"}},"type":"object","required":["operator_name","category_slug","bundle_name","price"],"title":"TelecomBundleIngestRequest"},"TransportServiceIngestRequest":{"properties":{"operator_name":{"type":"string","title":"Operator Name"},"category_slug":{"type":"string","title":"Category Slug"},"service_name":{"type":"string","title":"Service Name"},"fare_gazetted":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Fare Gazetted"},"fare_estimate":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Fare Estimate"},"price":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Price"},"currency":{"type":"string","title":"Currency","default":"USD"},"attributes":{"additionalProperties":true,"type":"object","title":"Attributes","default":{}},"source_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Source Url"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description"}},"type":"object","required":["operator_name","category_slug","service_name"],"title":"TransportServiceIngestRequest"},"ValidationError":{"properties":{"loc":{"items":{"anyOf":[{"type":"string"},{"type":"integer"}]},"type":"array","title":"Location"},"msg":{"type":"string","title":"Message"},"type":{"type":"string","title":"Error Type"},"input":{"title":"Input"},"ctx":{"type":"object","title":"Context"}},"type":"object","required":["loc","msg","type"],"title":"ValidationError"},"WebhookTargetCreate":{"properties":{"name":{"type":"string","minLength":1,"title":"Name"},"url":{"type":"string","minLength":1,"format":"uri","title":"Url"},"secret":{"type":"string","minLength":16,"title":"Secret"},"is_active":{"type":"boolean","title":"Is Active","default":true}},"type":"object","required":["name","url","secret"],"title":"WebhookTargetCreate"},"WebhookTargetResponse":{"properties":{"id":{"type":"integer","title":"Id"},"name":{"type":"string","title":"Name"},"url":{"type":"string","title":"Url"},"is_active":{"type":"boolean","title":"Is Active"},"created_at":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Created At"},"updated_at":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Updated At"}},"type":"object","required":["id","name","url","is_active","created_at","updated_at"],"title":"WebhookTargetResponse"},"WebhookTargetUpdate":{"properties":{"name":{"anyOf":[{"type":"string","minLength":1},{"type":"null"}],"title":"Name"},"url":{"anyOf":[{"type":"string","minLength":1,"format":"uri"},{"type":"null"}],"title":"Url"},"secret":{"anyOf":[{"type":"string","minLength":16},{"type":"null"}],"title":"Secret"},"is_active":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Is Active"}},"type":"object","title":"WebhookTargetUpdate"}},"securitySchemes":{"APIKeyHeader":{"type":"apiKey","in":"header","name":"X-API-Key"}}}}