{"openapi":"3.1.0","info":{"title":"clsw-api","version":"0.1.0"},"paths":{"/health":{"get":{"tags":["health"],"summary":"Health","operationId":"health_health_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Health Health Get"}}}}}}},"/ghl/token":{"get":{"tags":["ghl:tokens"],"summary":"Get Token","operationId":"get_token_ghl_token_get","security":[{"APIKeyHeader":[]}],"parameters":[{"name":"company_id","in":"query","required":true,"schema":{"type":"string","title":"Company Id"}},{"name":"location_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Location Id"}},{"name":"token_type","in":"query","required":false,"schema":{"type":"string","pattern":"^(access_token|refresh_token)$","default":"access_token","title":"Token Type"}},{"name":"api_key","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Api Key"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Get Token Ghl Token Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/ghl/locations":{"get":{"tags":["ghl:locations"],"summary":"List Locations","operationId":"list_locations_ghl_locations_get","security":[{"APIKeyHeader":[]}],"parameters":[{"name":"company_id","in":"query","required":true,"schema":{"type":"string","title":"Company Id"}},{"name":"include_archived","in":"query","required":false,"schema":{"type":"boolean","default":false,"title":"Include Archived"}},{"name":"api_key","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Api Key"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response List Locations Ghl Locations Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/ghl/location":{"get":{"tags":["ghl:locations"],"summary":"Get Location","operationId":"get_location_ghl_location_get","security":[{"APIKeyHeader":[]}],"parameters":[{"name":"company_id","in":"query","required":true,"schema":{"type":"string","title":"Company Id"}},{"name":"location_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Location Id"}},{"name":"location_name","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Location Name"}},{"name":"api_key","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Api Key"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Get Location Ghl Location Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/ghl/tokens/refresh":{"post":{"tags":["ghl:tokens"],"summary":"Trigger Refresh Token","operationId":"trigger_refresh_token_ghl_tokens_refresh_post","security":[{"APIKeyHeader":[]}],"parameters":[{"name":"company_id","in":"query","required":true,"schema":{"type":"string","title":"Company Id"}},{"name":"location_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Location Id"}},{"name":"api_key","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Api Key"}}],"responses":{"202":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Trigger Refresh Token Ghl Tokens Refresh Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/ghl/tokens/refresh-all":{"post":{"tags":["ghl:tokens"],"summary":"Trigger Refresh All Tokens","operationId":"trigger_refresh_all_tokens_ghl_tokens_refresh_all_post","security":[{"APIKeyHeader":[]}],"parameters":[{"name":"company_id","in":"query","required":true,"schema":{"type":"string","title":"Company Id"}},{"name":"api_key","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Api Key"}}],"responses":{"202":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Trigger Refresh All Tokens Ghl Tokens Refresh All Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/ghl/tokens/mint":{"post":{"tags":["ghl:tokens"],"summary":"Trigger Mint Token","operationId":"trigger_mint_token_ghl_tokens_mint_post","security":[{"APIKeyHeader":[]}],"parameters":[{"name":"company_id","in":"query","required":true,"schema":{"type":"string","title":"Company Id"}},{"name":"location_id","in":"query","required":true,"schema":{"type":"string","title":"Location Id"}},{"name":"api_key","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Api Key"}}],"responses":{"202":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Trigger Mint Token Ghl Tokens Mint Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/ghl/locations/sync":{"post":{"tags":["ghl:locations"],"summary":"Trigger Sync Locations","operationId":"trigger_sync_locations_ghl_locations_sync_post","security":[{"APIKeyHeader":[]}],"parameters":[{"name":"company_id","in":"query","required":true,"schema":{"type":"string","title":"Company Id"}},{"name":"api_key","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Api Key"}}],"responses":{"202":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Trigger Sync Locations Ghl Locations Sync Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/ghl/webhooks/ghl":{"post":{"tags":["ghl:webhooks"],"summary":"Ghl Marketplace Webhook","operationId":"ghl_marketplace_webhook_ghl_webhooks_ghl_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Ghl Marketplace Webhook Ghl Webhooks Ghl Post"}}}}}}},"/ghl/media/files":{"get":{"tags":["ghl:media"],"summary":"List Media Files","operationId":"list_media_files_ghl_media_files_get","security":[{"APIKeyHeader":[]}],"parameters":[{"name":"location_id","in":"query","required":true,"schema":{"type":"string","title":"Location Id"}},{"name":"type","in":"query","required":false,"schema":{"type":"string","pattern":"^(file|folder)$","default":"file","title":"Type"}},{"name":"sort_by","in":"query","required":false,"schema":{"type":"string","default":"updatedAt","title":"Sort By"}},{"name":"sort_order","in":"query","required":false,"schema":{"type":"string","pattern":"^(asc|desc)$","default":"desc","title":"Sort Order"}},{"name":"offset","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Offset"}},{"name":"limit","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Limit"}},{"name":"query","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Query"}},{"name":"parent_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Parent Id"}},{"name":"fetch_all","in":"query","required":false,"schema":{"type":"boolean","default":false,"title":"Fetch All"}},{"name":"api_key","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Api Key"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response List Media Files Ghl Media Files Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/ghl/media/upload":{"post":{"tags":["ghl:media"],"summary":"Upload Media From Url","description":"Upload a file from a public URL into the GHL media library.\n\nReturns ``{\"fileId\": str, \"url\": str}`` — ``url`` is the permanent GHL-hosted URL.\nCall this immediately after Runware generation; Runware URLs expire.","operationId":"upload_media_from_url_ghl_media_upload_post","security":[{"APIKeyHeader":[]}],"parameters":[{"name":"location_id","in":"query","required":true,"schema":{"type":"string","title":"Location Id"}},{"name":"url","in":"query","required":true,"schema":{"type":"string","title":"Url"}},{"name":"name","in":"query","required":true,"schema":{"type":"string","title":"Name"}},{"name":"parent_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Parent Id"}},{"name":"api_key","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Api Key"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Upload Media From Url Ghl Media Upload Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/ghl/media/file":{"delete":{"tags":["ghl:media"],"summary":"Delete Media File","operationId":"delete_media_file_ghl_media_file_delete","security":[{"APIKeyHeader":[]}],"parameters":[{"name":"location_id","in":"query","required":true,"schema":{"type":"string","title":"Location Id"}},{"name":"file_id","in":"query","required":true,"schema":{"type":"string","title":"File Id"}},{"name":"api_key","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Api Key"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Delete Media File Ghl Media File Delete"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"put":{"tags":["ghl:media"],"summary":"Rename Media File","operationId":"rename_media_file_ghl_media_file_put","security":[{"APIKeyHeader":[]}],"parameters":[{"name":"location_id","in":"query","required":true,"schema":{"type":"string","title":"Location Id"}},{"name":"file_id","in":"query","required":true,"schema":{"type":"string","title":"File Id"}},{"name":"name","in":"query","required":true,"schema":{"type":"string","title":"Name"}},{"name":"api_key","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Api Key"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Rename Media File Ghl Media File Put"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/ghl/media/folder":{"post":{"tags":["ghl:media"],"summary":"Create Media Folder","operationId":"create_media_folder_ghl_media_folder_post","security":[{"APIKeyHeader":[]}],"parameters":[{"name":"location_id","in":"query","required":true,"schema":{"type":"string","title":"Location Id"}},{"name":"name","in":"query","required":true,"schema":{"type":"string","title":"Name"}},{"name":"parent_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Parent Id"}},{"name":"api_key","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Api Key"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Create Media Folder Ghl Media Folder Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/ghl/media/bulk-rename":{"put":{"tags":["ghl:media"],"summary":"Bulk Rename Media Files","description":"Rename multiple files. Body: [{\"id\": \"...\", \"name\": \"...\"}]","operationId":"bulk_rename_media_files_ghl_media_bulk_rename_put","security":[{"APIKeyHeader":[]}],"parameters":[{"name":"location_id","in":"query","required":true,"schema":{"type":"string","title":"Location Id"}},{"name":"api_key","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Api Key"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"array","items":{"type":"object","additionalProperties":true},"title":"Files"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Bulk Rename Media Files Ghl Media Bulk Rename Put"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/ghl/media/bulk-delete":{"put":{"tags":["ghl:media"],"summary":"Bulk Delete Media Files","operationId":"bulk_delete_media_files_ghl_media_bulk_delete_put","security":[{"APIKeyHeader":[]}],"parameters":[{"name":"location_id","in":"query","required":true,"schema":{"type":"string","title":"Location Id"}},{"name":"status_action","in":"query","required":false,"schema":{"type":"string","pattern":"^(Trash|Restore|Delete)$","default":"Trash","title":"Status Action"}},{"name":"api_key","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Api Key"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"array","items":{"type":"string"},"title":"File Ids"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Bulk Delete Media Files Ghl Media Bulk Delete Put"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/ghl/custom-values":{"get":{"tags":["ghl:custom-values"],"summary":"List Ghl Custom Values","description":"Live read-through of ALL custom values for a location — the Custom Values Explorer.\n\nOne GHL API call, no cache. Each item is normalized to expose GHL's real\n``fieldKey`` slug so operators can search by name, key, AND value.\n\nReturns ``{\"customValues\": [{\"id\", \"name\", \"key\", \"value\", \"folder\"}]}``","operationId":"list_ghl_custom_values_ghl_custom_values_get","security":[{"APIKeyHeader":[]}],"parameters":[{"name":"location_id","in":"query","required":true,"schema":{"type":"string","title":"Location Id"}},{"name":"api_key","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Api Key"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response List Ghl Custom Values Ghl Custom Values Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["ghl:custom-values"],"summary":"Create Ghl Custom Value","description":"Create a new custom value on a location.\n\nBody: ``{\"location_id\", \"name\", \"value\"}``. The ``value`` travels in the JSON\nbody so it can be arbitrarily long (URLs, paragraphs).\n\nReturns ``{\"customValue\": {\"id\": str, \"name\": str, \"value\": str, ...}}``","operationId":"create_ghl_custom_value_ghl_custom_values_post","security":[{"APIKeyHeader":[]}],"parameters":[{"name":"api_key","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Api Key"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateCustomValueRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Create Ghl Custom Value Ghl Custom Values Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/ghl/custom-values/bulk-upsert":{"post":{"tags":["ghl:custom-values"],"summary":"Bulk Upsert Ghl Custom Values","description":"Create or update multiple custom values by name.\n\nBody format: ``[{\"name\": str, \"value\": str}, ...]``\n\nReturns ``{\"created\": int, \"updated\": int, \"errors\": list[str]}``\n\nNotes:\n    Fetches the current custom-value list once, then resolves each item\n    to a create or update call. All calls are dispatched concurrently.\n    Individual failures are captured as error strings rather than propagating.","operationId":"bulk_upsert_ghl_custom_values_ghl_custom_values_bulk_upsert_post","security":[{"APIKeyHeader":[]}],"parameters":[{"name":"location_id","in":"query","required":true,"schema":{"type":"string","title":"Location Id"}},{"name":"api_key","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Api Key"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"array","items":{"type":"object","additionalProperties":true},"title":"Items"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Bulk Upsert Ghl Custom Values Ghl Custom Values Bulk Upsert Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/ghl/custom-values/bulk-upsert-async":{"post":{"tags":["ghl:custom-values"],"summary":"Bulk Upsert Ghl Custom Values Async","description":"Enqueue a throttled bulk custom-value upsert; poll the returned batch_id for status.\n\nReturns ``{\"batch_id\": str}`` immediately (202). Use\n``GET /ghl/custom-values/batches/{batch_id}`` to poll progress.","operationId":"bulk_upsert_ghl_custom_values_async_ghl_custom_values_bulk_upsert_async_post","security":[{"APIKeyHeader":[]}],"parameters":[{"name":"api_key","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Api Key"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BulkUpsertAsyncRequest"}}}},"responses":{"202":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Bulk Upsert Ghl Custom Values Async Ghl Custom Values Bulk Upsert Async Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/ghl/custom-values/batches/{batch_id}":{"get":{"tags":["ghl:custom-values"],"summary":"Get Custom Value Batch","description":"Return the status and results for an async bulk-upsert batch.\n\nReturns the full batch record. 404 if the batch_id is not found.","operationId":"get_custom_value_batch_ghl_custom_values_batches__batch_id__get","security":[{"APIKeyHeader":[]}],"parameters":[{"name":"batch_id","in":"path","required":true,"schema":{"type":"string","title":"Batch Id"}},{"name":"api_key","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Api Key"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Get Custom Value Batch Ghl Custom Values Batches  Batch Id  Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/ghl/custom-values/bulk-delete-async":{"post":{"tags":["ghl:custom-values"],"summary":"Bulk Delete Ghl Custom Values Async","description":"Enqueue a throttled bulk custom-value delete; poll the returned batch_id for status.\n\nReturns ``{\"batch_id\": str}`` immediately (202). Use\n``GET /ghl/custom-values/batches/{batch_id}`` to poll progress.\nThe ``created`` field of the batch record carries the running deleted count.","operationId":"bulk_delete_ghl_custom_values_async_ghl_custom_values_bulk_delete_async_post","security":[{"APIKeyHeader":[]}],"parameters":[{"name":"api_key","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Api Key"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BulkDeleteAsyncRequest"}}}},"responses":{"202":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Bulk Delete Ghl Custom Values Async Ghl Custom Values Bulk Delete Async Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/ghl/custom-value":{"get":{"tags":["ghl:custom-values"],"summary":"Get Ghl Custom Value","description":"Fetch a single custom value by ID.\n\nReturns ``{\"customValue\": {\"id\": str, \"name\": str, \"value\": str, ...}}``","operationId":"get_ghl_custom_value_ghl_custom_value_get","security":[{"APIKeyHeader":[]}],"parameters":[{"name":"location_id","in":"query","required":true,"schema":{"type":"string","title":"Location Id"}},{"name":"custom_value_id","in":"query","required":true,"schema":{"type":"string","title":"Custom Value Id"}},{"name":"api_key","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Api Key"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Get Ghl Custom Value Ghl Custom Value Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"put":{"tags":["ghl:custom-values"],"summary":"Update Ghl Custom Value","description":"Update an existing custom value by ID.\n\nBody: ``{\"location_id\", \"custom_value_id\", \"value\", \"name\"?}``. The ``value``\ntravels in the JSON body so it can be arbitrarily long (URLs, paragraphs).\n\nReturns ``{\"customValue\": {\"id\": str, \"name\": str, \"value\": str, ...}}``","operationId":"update_ghl_custom_value_ghl_custom_value_put","security":[{"APIKeyHeader":[]}],"parameters":[{"name":"api_key","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Api Key"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateCustomValueRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Update Ghl Custom Value Ghl Custom Value Put"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["ghl:custom-values"],"summary":"Delete Ghl Custom Value","description":"Delete a custom value by ID.\n\nReturns the raw GHL response dict.","operationId":"delete_ghl_custom_value_ghl_custom_value_delete","security":[{"APIKeyHeader":[]}],"parameters":[{"name":"location_id","in":"query","required":true,"schema":{"type":"string","title":"Location Id"}},{"name":"custom_value_id","in":"query","required":true,"schema":{"type":"string","title":"Custom Value Id"}},{"name":"api_key","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Api Key"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Delete Ghl Custom Value Ghl Custom Value Delete"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/ghl/custom-values/update-by-name":{"post":{"tags":["ghl:custom-values"],"summary":"Update Custom Value By Name","operationId":"update_custom_value_by_name_ghl_custom_values_update_by_name_post","security":[{"APIKeyHeader":[]}],"parameters":[{"name":"api_key","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Api Key"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateByNameRequest"}}}},"responses":{"202":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Update Custom Value By Name Ghl Custom Values Update By Name Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/ghl/location/clear":{"post":{"tags":["ghl:location"],"summary":"Clear Location Data","description":"Clear all media files and custom values from a location.\n\nThis is a synchronous, destructive operation. Deleted items cannot be recovered.\nReturns summary of deleted items and any errors encountered.","operationId":"clear_location_data_ghl_location_clear_post","security":[{"APIKeyHeader":[]}],"parameters":[{"name":"location_id","in":"query","required":true,"schema":{"type":"string","title":"Location Id"}},{"name":"api_key","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Api Key"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Clear Location Data Ghl Location Clear Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/cv/jobs":{"post":{"tags":["cv"],"summary":"Create Cv Job","operationId":"create_cv_job_cv_jobs_post","security":[{"APIKeyHeader":[]}],"parameters":[{"name":"api_key","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Api Key"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CvJobRequest"}}}},"responses":{"202":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Create Cv Job Cv Jobs Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"get":{"tags":["cv"],"summary":"List Cv Jobs","operationId":"list_cv_jobs_cv_jobs_get","security":[{"APIKeyHeader":[]}],"parameters":[{"name":"company_name","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Company Name"}},{"name":"status","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Status"}},{"name":"api_key","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Api Key"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response List Cv Jobs Cv Jobs Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/cv/jobs/preview-sheet":{"post":{"tags":["cv"],"summary":"Preview Cv Sheet","description":"Parse a Google Sheets CV workbook and return a preview without creating a job.\n\nFetches the sheet, parses it into an input_payload, auto-resolves the GHL\nlocation by company name (or uses the caller-supplied location_id), and runs\nthe validation guard.  Read-only — no DB writes, no background tasks.","operationId":"preview_cv_sheet_cv_jobs_preview_sheet_post","security":[{"APIKeyHeader":[]}],"parameters":[{"name":"api_key","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Api Key"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PreviewSheetRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Preview Cv Sheet Cv Jobs Preview Sheet Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/cv/jobs/{job_id}":{"get":{"tags":["cv"],"summary":"Get Cv Job","operationId":"get_cv_job_cv_jobs__job_id__get","security":[{"APIKeyHeader":[]}],"parameters":[{"name":"job_id","in":"path","required":true,"schema":{"type":"string","title":"Job Id"}},{"name":"api_key","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Api Key"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Get Cv Job Cv Jobs  Job Id  Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["cv"],"summary":"Delete Cv Job","operationId":"delete_cv_job_cv_jobs__job_id__delete","security":[{"APIKeyHeader":[]}],"parameters":[{"name":"job_id","in":"path","required":true,"schema":{"type":"string","title":"Job Id"}},{"name":"api_key","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Api Key"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Delete Cv Job Cv Jobs  Job Id  Delete"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/cv/jobs/{job_id}/items":{"get":{"tags":["cv"],"summary":"List Cv Job Items","operationId":"list_cv_job_items_cv_jobs__job_id__items_get","security":[{"APIKeyHeader":[]}],"parameters":[{"name":"job_id","in":"path","required":true,"schema":{"type":"string","title":"Job Id"}},{"name":"status","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Status"}},{"name":"api_key","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Api Key"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response List Cv Job Items Cv Jobs  Job Id  Items Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/cv/jobs/{job_id}/items/{item_id}":{"get":{"tags":["cv"],"summary":"Get Cv Job Item","operationId":"get_cv_job_item_cv_jobs__job_id__items__item_id__get","security":[{"APIKeyHeader":[]}],"parameters":[{"name":"job_id","in":"path","required":true,"schema":{"type":"string","title":"Job Id"}},{"name":"item_id","in":"path","required":true,"schema":{"type":"string","title":"Item Id"}},{"name":"api_key","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Api Key"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Get Cv Job Item Cv Jobs  Job Id  Items  Item Id  Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/cv/jobs/{job_id}/retry":{"post":{"tags":["cv"],"summary":"Retry Cv Job","operationId":"retry_cv_job_cv_jobs__job_id__retry_post","security":[{"APIKeyHeader":[]}],"parameters":[{"name":"job_id","in":"path","required":true,"schema":{"type":"string","title":"Job Id"}},{"name":"api_key","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Api Key"}}],"responses":{"202":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Retry Cv Job Cv Jobs  Job Id  Retry Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/cv/jobs/{job_id}/delete":{"post":{"tags":["cv"],"summary":"Delete Cv Job Selective","operationId":"delete_cv_job_selective_cv_jobs__job_id__delete_post","security":[{"APIKeyHeader":[]}],"parameters":[{"name":"job_id","in":"path","required":true,"schema":{"type":"string","title":"Job Id"}},{"name":"api_key","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Api Key"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CvJobDeleteRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Delete Cv Job Selective Cv Jobs  Job Id  Delete Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/cv/jobs/purge":{"post":{"tags":["cv"],"summary":"Purge Cv Jobs","operationId":"purge_cv_jobs_cv_jobs_purge_post","security":[{"APIKeyHeader":[]}],"parameters":[{"name":"api_key","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Api Key"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CvPurgeRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Purge Cv Jobs Cv Jobs Purge Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/cv/jobs/sample":{"post":{"tags":["cv"],"summary":"Create Cv Sample Job","operationId":"create_cv_sample_job_cv_jobs_sample_post","security":[{"APIKeyHeader":[]}],"parameters":[{"name":"api_key","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Api Key"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CvSampleJobRequest"}}}},"responses":{"202":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Create Cv Sample Job Cv Jobs Sample Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/cv/jobs/custom":{"post":{"tags":["cv"],"summary":"Create Cv Custom Job","operationId":"create_cv_custom_job_cv_jobs_custom_post","security":[{"APIKeyHeader":[]}],"parameters":[{"name":"api_key","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Api Key"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CvCustomJobRequest"}}}},"responses":{"202":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Create Cv Custom Job Cv Jobs Custom Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/runware/generate":{"post":{"tags":["runware"],"summary":"Runware Generate","description":"Generate an image with Runware and optionally upload it to GHL.\n\n- With ``location_id``: generates + uploads → returns ``{runware_url, file_id, ghl_url}``\n- Without ``location_id``: generates only → returns ``{runware_url}``\n\nCall this immediately; Runware CDN URLs expire shortly after generation.","operationId":"runware_generate_runware_generate_post","security":[{"APIKeyHeader":[]}],"parameters":[{"name":"prompt","in":"query","required":true,"schema":{"type":"string","title":"Prompt"}},{"name":"name","in":"query","required":true,"schema":{"type":"string","title":"Name"}},{"name":"location_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Location Id"}},{"name":"model","in":"query","required":false,"schema":{"type":"string","default":"runware:100@1","title":"Model"}},{"name":"width","in":"query","required":false,"schema":{"type":"integer","default":1024,"title":"Width"}},{"name":"height","in":"query","required":false,"schema":{"type":"integer","default":1024,"title":"Height"}},{"name":"output_format","in":"query","required":false,"schema":{"type":"string","pattern":"^(WEBP|PNG|JPG)$","default":"WEBP","title":"Output Format"}},{"name":"negative_prompt","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Negative Prompt"}},{"name":"steps","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Steps"}},{"name":"seed","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Seed"}},{"name":"parent_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Parent Id"}},{"name":"api_key","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Api Key"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Runware Generate Runware Generate Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/runware/models":{"get":{"tags":["runware"],"summary":"Runware Models","operationId":"runware_models_runware_models_get","security":[{"APIKeyHeader":[]}],"parameters":[{"name":"api_key","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Api Key"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Runware Models Runware Models Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/openai/models":{"get":{"tags":["openai"],"summary":"Openai Models","operationId":"openai_models_openai_models_get","security":[{"APIKeyHeader":[]}],"parameters":[{"name":"api_key","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Api Key"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Openai Models Openai Models Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/openai/text":{"post":{"tags":["openai"],"summary":"Openai Generate Text","description":"Generate text from *prompt* using an OpenAI chat model.\n\nReturns ``{\"text\": str}``.","operationId":"openai_generate_text_openai_text_post","security":[{"APIKeyHeader":[]}],"parameters":[{"name":"prompt","in":"query","required":true,"schema":{"type":"string","title":"Prompt"}},{"name":"system_prompt","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"System Prompt"}},{"name":"model","in":"query","required":false,"schema":{"type":"string","default":"gpt-4o-mini","title":"Model"}},{"name":"max_tokens","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Max Tokens"}},{"name":"temperature","in":"query","required":false,"schema":{"type":"number","default":0.7,"title":"Temperature"}},{"name":"api_key","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Api Key"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Openai Generate Text Openai Text Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/openai/image":{"post":{"tags":["openai"],"summary":"Openai Generate Image","description":"Generate an image with OpenAI and optionally upload it to GHL.\n\n- With ``location_id``: generates + uploads → returns ``{model, openai_url, file_id, ghl_url}``\n- Without ``location_id``: generates only → returns ``{model, openai_url}``\n\nModel notes:\n- ``gpt-image-1`` — best quality, base64 only (uploaded via multipart), supports WEBP/transparent\n- ``dall-e-3``    — returns public URL (fastest GHL upload path), supports size/style\n- ``dall-e-2``    — cheapest, public URL","operationId":"openai_generate_image_openai_image_post","security":[{"APIKeyHeader":[]}],"parameters":[{"name":"prompt","in":"query","required":true,"schema":{"type":"string","title":"Prompt"}},{"name":"name","in":"query","required":true,"schema":{"type":"string","title":"Name"}},{"name":"location_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Location Id"}},{"name":"model","in":"query","required":false,"schema":{"type":"string","default":"gpt-image-1","title":"Model"}},{"name":"size","in":"query","required":false,"schema":{"type":"string","default":"1024x1024","title":"Size"}},{"name":"quality","in":"query","required":false,"schema":{"type":"string","default":"auto","title":"Quality"}},{"name":"output_format","in":"query","required":false,"schema":{"type":"string","pattern":"^(webp|png|jpeg)$","default":"webp","title":"Output Format"}},{"name":"style","in":"query","required":false,"schema":{"anyOf":[{"type":"string","pattern":"^(vivid|natural)$"},{"type":"null"}],"title":"Style"}},{"name":"background","in":"query","required":false,"schema":{"anyOf":[{"type":"string","pattern":"^(transparent|opaque|auto)$"},{"type":"null"}],"title":"Background"}},{"name":"parent_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Parent Id"}},{"name":"api_key","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Api Key"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Openai Generate Image Openai Image Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/ghl/cancel-location":{"post":{"tags":["ghl:cancellation"],"summary":"Cancel Location","operationId":"cancel_location_ghl_cancel_location_post","security":[{"APIKeyHeader":[]}],"parameters":[{"name":"api_key","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Api Key"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CancellationWebhookPayload"}}}},"responses":{"202":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Cancel Location Ghl Cancel Location Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/ghl/locations/zzz":{"post":{"tags":["ghl:locations"],"summary":"Zzz Rename Location","operationId":"zzz_rename_location_ghl_locations_zzz_post","security":[{"APIKeyHeader":[]}],"parameters":[{"name":"api_key","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Api Key"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ZzzRenamePayload"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Zzz Rename Location Ghl Locations Zzz Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/ghl/locations/zzz/revert":{"post":{"tags":["ghl:locations"],"summary":"Zzz Revert Location","operationId":"zzz_revert_location_ghl_locations_zzz_revert_post","security":[{"APIKeyHeader":[]}],"parameters":[{"name":"api_key","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Api Key"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ZzzRenamePayload"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Zzz Revert Location Ghl Locations Zzz Revert Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/executions":{"get":{"tags":["executions"],"summary":"List Executions","description":"List recent job executions, newest first.","operationId":"list_executions_executions_get","security":[{"APIKeyHeader":[]}],"parameters":[{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":500,"minimum":1,"default":50,"title":"Limit"}},{"name":"api_key","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Api Key"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response List Executions Executions Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/executions/{execution_id}":{"get":{"tags":["executions"],"summary":"Get Execution","description":"Full execution detail with all captured log lines.","operationId":"get_execution_executions__execution_id__get","security":[{"APIKeyHeader":[]}],"parameters":[{"name":"execution_id","in":"path","required":true,"schema":{"type":"string","title":"Execution Id"}},{"name":"api_key","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Api Key"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Get Execution Executions  Execution Id  Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/executions/{execution_id}/cancel":{"post":{"tags":["executions"],"summary":"Cancel Execution","description":"Request cancellation of a running execution.\n\nReturns 200 {\"status\": \"cancelling\"} if the task was found and cancelled.\nReturns 409 if the execution is already in a terminal state or not owned by\nthis instance.\nReturns 404 if the execution_id is not found at all.","operationId":"cancel_execution_executions__execution_id__cancel_post","security":[{"APIKeyHeader":[]}],"parameters":[{"name":"execution_id","in":"path","required":true,"schema":{"type":"string","title":"Execution Id"}},{"name":"api_key","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Api Key"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Cancel Execution Executions  Execution Id  Cancel Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/twilio/numbers/search":{"get":{"tags":["twilio:numbers"],"summary":"Twilio Search Numbers","description":"Search for available local phone numbers on a Twilio subaccount.\n\nTries strategies in order (area_code → city → state) and stops at the first\nthat returns results.  Response includes matched_by and tried for diagnostics.","operationId":"twilio_search_numbers_twilio_numbers_search_get","security":[{"APIKeyHeader":[]}],"parameters":[{"name":"subaccount_sid","in":"query","required":true,"schema":{"type":"string","title":"Subaccount Sid"}},{"name":"area_code","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Area Code"}},{"name":"country","in":"query","required":false,"schema":{"type":"string","default":"US","title":"Country"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":20,"minimum":1,"default":5,"title":"Limit"}},{"name":"city","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"City"}},{"name":"state","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"State"}},{"name":"api_key","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Api Key"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Twilio Search Numbers Twilio Numbers Search Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/twilio/numbers/purchase":{"post":{"tags":["twilio:numbers"],"summary":"Twilio Purchase Number","description":"Purchase a specific phone number (E.164) on a Twilio subaccount.","operationId":"twilio_purchase_number_twilio_numbers_purchase_post","security":[{"APIKeyHeader":[]}],"parameters":[{"name":"api_key","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Api Key"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/NumberPurchaseRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Twilio Purchase Number Twilio Numbers Purchase Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/twilio/numbers/acquire":{"post":{"tags":["twilio:numbers"],"summary":"Twilio Acquire Number","description":"Acquire a phone number with preferred area code polling + geographic fallback.\n\nPolls the preferred area_code for up to poll_timeout_seconds, then falls\nback to city/state search.  Handles purchase races transparently.","operationId":"twilio_acquire_number_twilio_numbers_acquire_post","security":[{"APIKeyHeader":[]}],"parameters":[{"name":"api_key","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Api Key"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/NumberAcquireRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Twilio Acquire Number Twilio Numbers Acquire Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/twilio/addresses":{"post":{"tags":["twilio:addresses"],"summary":"Twilio Create Address","description":"Create an E911 address record on a Twilio subaccount.","operationId":"twilio_create_address_twilio_addresses_post","security":[{"APIKeyHeader":[]}],"parameters":[{"name":"api_key","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Api Key"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AddressCreateRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Twilio Create Address Twilio Addresses Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/twilio/addresses/link":{"post":{"tags":["twilio:addresses"],"summary":"Twilio Link Address","description":"Link an E911 address to an IncomingPhoneNumber on a Twilio subaccount.","operationId":"twilio_link_address_twilio_addresses_link_post","security":[{"APIKeyHeader":[]}],"parameters":[{"name":"api_key","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Api Key"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AddressLinkRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Twilio Link Address Twilio Addresses Link Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/twilio/messaging-services":{"post":{"tags":["twilio:messaging"],"summary":"Twilio Create Messaging Service","description":"Create a Twilio messaging service on a subaccount.","operationId":"twilio_create_messaging_service_twilio_messaging_services_post","security":[{"APIKeyHeader":[]}],"parameters":[{"name":"api_key","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Api Key"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/MessagingServiceCreateRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Twilio Create Messaging Service Twilio Messaging Services Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/twilio/messaging-services/add-number":{"post":{"tags":["twilio:messaging"],"summary":"Twilio Add Number To Service","description":"Add an IncomingPhoneNumber to a Twilio messaging service.","operationId":"twilio_add_number_to_service_twilio_messaging_services_add_number_post","security":[{"APIKeyHeader":[]}],"parameters":[{"name":"api_key","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Api Key"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AddNumberRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Twilio Add Number To Service Twilio Messaging Services Add Number Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/twilio/brands/register":{"post":{"tags":["twilio:brands"],"summary":"Twilio Register Brand","description":"Run the full A2P brand registration sequence (TrustHub CP + TP + BrandRegistration).\n\nSynchronous — blocks ~30-60 s while making ~17 sequential Twilio API calls.\nBrand APPROVAL is asynchronous (days); poll via GET /twilio/brands/{sid}/status.\nRequires twilio_cp_policy_sid, twilio_tp_policy_sid, twilio_primary_cp_sid in settings.","operationId":"twilio_register_brand_twilio_brands_register_post","security":[{"APIKeyHeader":[]}],"parameters":[{"name":"api_key","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Api Key"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BrandRegistrationRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Twilio Register Brand Twilio Brands Register Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/twilio/brands/{brand_registration_sid}/status":{"get":{"tags":["twilio:brands"],"summary":"Twilio Brand Status","description":"Fetch current A2P brand registration status from Twilio.","operationId":"twilio_brand_status_twilio_brands__brand_registration_sid__status_get","security":[{"APIKeyHeader":[]}],"parameters":[{"name":"brand_registration_sid","in":"path","required":true,"schema":{"type":"string","title":"Brand Registration Sid"}},{"name":"subaccount_sid","in":"query","required":true,"schema":{"type":"string","title":"Subaccount Sid"}},{"name":"api_key","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Api Key"}},{"name":"X-Twilio-Subaccount-Token","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Twilio-Subaccount-Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Twilio Brand Status Twilio Brands  Brand Registration Sid  Status Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/twilio/campaigns":{"post":{"tags":["twilio:campaigns"],"summary":"Twilio Create Campaign","description":"Create a 10DLC (UsAppToPerson) campaign for a messaging service.","operationId":"twilio_create_campaign_twilio_campaigns_post","security":[{"APIKeyHeader":[]}],"parameters":[{"name":"api_key","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Api Key"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CampaignCreateRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Twilio Create Campaign Twilio Campaigns Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/twilio/campaigns/{messaging_service_sid}/{campaign_sid}/status":{"get":{"tags":["twilio:campaigns"],"summary":"Twilio Campaign Status","description":"Fetch current 10DLC campaign status from Twilio.","operationId":"twilio_campaign_status_twilio_campaigns__messaging_service_sid___campaign_sid__status_get","security":[{"APIKeyHeader":[]}],"parameters":[{"name":"messaging_service_sid","in":"path","required":true,"schema":{"type":"string","title":"Messaging Service Sid"}},{"name":"campaign_sid","in":"path","required":true,"schema":{"type":"string","title":"Campaign Sid"}},{"name":"subaccount_sid","in":"query","required":true,"schema":{"type":"string","title":"Subaccount Sid"}},{"name":"api_key","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Api Key"}},{"name":"X-Twilio-Subaccount-Token","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Twilio-Subaccount-Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Twilio Campaign Status Twilio Campaigns  Messaging Service Sid   Campaign Sid  Status Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/twilio/ghl/connect":{"post":{"tags":["twilio:provisioning"],"summary":"Twilio Ghl Connect","description":"Preserve client-phone CVs and update the location's Twilio-number CV.\n\nIf provisioning_id is provided, the DB record is updated to state=completed.\nThe GHL profile phone and native Twilio credentials are never modified.","operationId":"twilio_ghl_connect_twilio_ghl_connect_post","security":[{"APIKeyHeader":[]}],"parameters":[{"name":"api_key","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Api Key"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/GhlConnectRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Twilio Ghl Connect Twilio Ghl Connect Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/twilio/provision":{"post":{"tags":["twilio:provisioning"],"summary":"Twilio Provision","description":"Full provisioning pipeline: phone number + E911 + messaging service + A2P brand registration.\n\nRuns in the background. Poll GET /twilio/provisioning/{id} for status.\nStops at messaging_service_created if business_ein or policy SIDs are not set.","operationId":"twilio_provision_twilio_provision_post","security":[{"APIKeyHeader":[]}],"parameters":[{"name":"api_key","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Api Key"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProvisionRequest"}}}},"responses":{"202":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Twilio Provision Twilio Provision Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/twilio/poll/brands":{"post":{"tags":["twilio:provisioning"],"summary":"Twilio Poll Brands","description":"Poll Twilio for brand registration approval on all brand_pending records.\n\nOnly updates the provisioning state (approved brands advance to brand_approved);\ncampaign creation is a separate manual step.\nWire to n8n cron (every 10 min) to replace the Status Poller workflow.","operationId":"twilio_poll_brands_twilio_poll_brands_post","security":[{"APIKeyHeader":[]}],"parameters":[{"name":"api_key","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Api Key"}}],"responses":{"202":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Twilio Poll Brands Twilio Poll Brands Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/twilio/poll/campaigns":{"post":{"tags":["twilio:provisioning"],"summary":"Twilio Poll Campaigns","description":"Poll Twilio for campaign verification on all campaign_submitted records.\n\nOnly updates the provisioning state (verified campaigns advance to campaign_active);\nthe GHL connect is a separate manual step.\nWire to n8n cron (every 10 min) to replace the Status Monitor workflow.","operationId":"twilio_poll_campaigns_twilio_poll_campaigns_post","security":[{"APIKeyHeader":[]}],"parameters":[{"name":"api_key","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Api Key"}}],"responses":{"202":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Twilio Poll Campaigns Twilio Poll Campaigns Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/twilio/subaccounts":{"get":{"tags":["twilio:provisioning"],"summary":"Twilio List Subaccounts","description":"List all Twilio subaccounts with full info, LEFT-JOINed with DB provisioning state.","operationId":"twilio_list_subaccounts_twilio_subaccounts_get","security":[{"APIKeyHeader":[]}],"parameters":[{"name":"api_key","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Api Key"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Twilio List Subaccounts Twilio Subaccounts Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/twilio/provisioning":{"get":{"tags":["twilio:provisioning"],"summary":"Twilio List Provisioning","description":"List provisioning records, optionally filtered by state.","operationId":"twilio_list_provisioning_twilio_provisioning_get","security":[{"APIKeyHeader":[]}],"parameters":[{"name":"state","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"State"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":200,"minimum":1,"default":50,"title":"Limit"}},{"name":"api_key","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Api Key"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Twilio List Provisioning Twilio Provisioning Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/twilio/provisioning/readiness":{"get":{"tags":["twilio:provisioning"],"summary":"Twilio Provisioning Readiness","operationId":"twilio_provisioning_readiness_twilio_provisioning_readiness_get","security":[{"APIKeyHeader":[]}],"parameters":[{"name":"location_id","in":"query","required":true,"schema":{"type":"string","title":"Location Id"}},{"name":"subaccount_sid","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Subaccount Sid"}},{"name":"subaccount_friendly_name","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Subaccount Friendly Name"}},{"name":"website_override","in":"query","required":false,"schema":{"type":"boolean","default":false,"title":"Website Override"}},{"name":"api_key","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Api Key"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Twilio Provisioning Readiness Twilio Provisioning Readiness Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/twilio/provisioning/{provisioning_id}":{"get":{"tags":["twilio:provisioning"],"summary":"Twilio Get Provisioning","description":"Get a single provisioning record by ID.","operationId":"twilio_get_provisioning_twilio_provisioning__provisioning_id__get","security":[{"APIKeyHeader":[]}],"parameters":[{"name":"provisioning_id","in":"path","required":true,"schema":{"type":"string","title":"Provisioning Id"}},{"name":"api_key","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Api Key"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Twilio Get Provisioning Twilio Provisioning  Provisioning Id  Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/twilio/provisioning/{provisioning_id}/resume":{"post":{"tags":["twilio:provisioning"],"summary":"Twilio Resume Provisioning","description":"Resume a provisioning run from a given milestone (or auto-detect the next incomplete one).\n\nIf website_override is provided in the body, persists it to the record before resuming.","operationId":"twilio_resume_provisioning_twilio_provisioning__provisioning_id__resume_post","security":[{"APIKeyHeader":[]}],"parameters":[{"name":"provisioning_id","in":"path","required":true,"schema":{"type":"string","title":"Provisioning Id"}},{"name":"api_key","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Api Key"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ResumeRequest"}}}},"responses":{"202":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Twilio Resume Provisioning Twilio Provisioning  Provisioning Id  Resume Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/cron/actions":{"get":{"tags":["cron"],"summary":"List Registered Actions","description":"List all registered action keys and their descriptions.","operationId":"list_registered_actions_cron_actions_get","security":[{"APIKeyHeader":[]}],"parameters":[{"name":"api_key","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Api Key"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response List Registered Actions Cron Actions Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/cron/jobs":{"get":{"tags":["cron"],"summary":"List Cron Jobs","description":"List all cron jobs and their current status.","operationId":"list_cron_jobs_cron_jobs_get","security":[{"APIKeyHeader":[]}],"parameters":[{"name":"api_key","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Api Key"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response List Cron Jobs Cron Jobs Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["cron"],"summary":"Create Cron Job","description":"Create a new cron job. Validates action_key against the registry and cron_expr syntax.","operationId":"create_cron_job_cron_jobs_post","security":[{"APIKeyHeader":[]}],"parameters":[{"name":"api_key","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Api Key"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CronJobCreateRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Create Cron Job Cron Jobs Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/cron/jobs/{key}":{"get":{"tags":["cron"],"summary":"Get Cron Job","description":"Get a single cron job by its slug key.","operationId":"get_cron_job_cron_jobs__key__get","security":[{"APIKeyHeader":[]}],"parameters":[{"name":"key","in":"path","required":true,"schema":{"type":"string","title":"Key"}},{"name":"api_key","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Api Key"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Get Cron Job Cron Jobs  Key  Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"put":{"tags":["cron"],"summary":"Update Cron Job","description":"Update a cron job. Recomputes next_run_at when cron_expr changes.","operationId":"update_cron_job_cron_jobs__key__put","security":[{"APIKeyHeader":[]}],"parameters":[{"name":"key","in":"path","required":true,"schema":{"type":"string","title":"Key"}},{"name":"api_key","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Api Key"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CronJobUpdateRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Update Cron Job Cron Jobs  Key  Put"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["cron"],"summary":"Delete Cron Job","description":"Delete a cron job by its slug key.","operationId":"delete_cron_job_cron_jobs__key__delete","security":[{"APIKeyHeader":[]}],"parameters":[{"name":"key","in":"path","required":true,"schema":{"type":"string","title":"Key"}},{"name":"api_key","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Api Key"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Delete Cron Job Cron Jobs  Key  Delete"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/cron/jobs/{key}/run":{"post":{"tags":["cron"],"summary":"Trigger Cron Job","description":"Trigger an immediate run of a cron job. Logs a job_executions row like a scheduled run.","operationId":"trigger_cron_job_cron_jobs__key__run_post","security":[{"APIKeyHeader":[]}],"parameters":[{"name":"key","in":"path","required":true,"schema":{"type":"string","title":"Key"}},{"name":"api_key","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Api Key"}}],"responses":{"202":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Trigger Cron Job Cron Jobs  Key  Run Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/instantly/accounts":{"get":{"tags":["instantly"],"summary":"List Instantly Accounts","description":"List all Instantly sending accounts from the DB.","operationId":"list_instantly_accounts_instantly_accounts_get","security":[{"APIKeyHeader":[]}],"parameters":[{"name":"api_key","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Api Key"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response List Instantly Accounts Instantly Accounts Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["instantly"],"summary":"Register Instantly Account","description":"Register (upsert) an Instantly sending account.\n\nIdempotent: re-posting with the same label updates the row.\nTracked in /executions as job 'instantly_account_register'.","operationId":"register_instantly_account_instantly_accounts_post","security":[{"APIKeyHeader":[]}],"parameters":[{"name":"label","in":"query","required":true,"schema":{"type":"string","title":"Label"}},{"name":"workspace_uuid","in":"query","required":true,"schema":{"type":"string","title":"Workspace Uuid"}},{"name":"api_key_env","in":"query","required":true,"schema":{"type":"string","title":"Api Key Env"}},{"name":"campaign_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Campaign Id"}},{"name":"buffer_target","in":"query","required":false,"schema":{"type":"integer","default":500,"title":"Buffer Target"}},{"name":"is_active","in":"query","required":false,"schema":{"type":"boolean","default":true,"title":"Is Active"}},{"name":"api_key","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Api Key"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Register Instantly Account Instantly Accounts Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/instantly/accounts/{label}":{"patch":{"tags":["instantly"],"summary":"Update Instantly Account","description":"Update mutable fields on an Instantly sending account.\n\nOnly the fields explicitly provided (non-None) are applied.\nReturns 400 if no fields are provided; 404 if label is not found.\n\nNote: no DELETE endpoint is provided — deactivate accounts with is_active=false\ninstead.  Leads reference instantly_accounts(id) via FK, so hard deletes would\nbreak referential integrity.\n\nTracked in /executions as job 'instantly_account_update'.","operationId":"update_instantly_account_instantly_accounts__label__patch","security":[{"APIKeyHeader":[]}],"parameters":[{"name":"label","in":"path","required":true,"schema":{"type":"string","title":"Label"}},{"name":"workspace_uuid","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Workspace Uuid"}},{"name":"api_key_env","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Api Key Env"}},{"name":"campaign_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Campaign Id"}},{"name":"buffer_target","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Buffer Target"}},{"name":"is_active","in":"query","required":false,"schema":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Is Active"}},{"name":"api_key","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Api Key"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Update Instantly Account Instantly Accounts  Label  Patch"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/instantly/campaigns":{"get":{"tags":["instantly"],"summary":"List Instantly Campaigns","description":"List cached campaign rows from DB (may be empty until Phase 3 sync runs).","operationId":"list_instantly_campaigns_instantly_campaigns_get","security":[{"APIKeyHeader":[]}],"parameters":[{"name":"api_key","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Api Key"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response List Instantly Campaigns Instantly Campaigns Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/instantly/leads":{"get":{"tags":["instantly"],"summary":"List Instantly Leads","description":"List leads with optional status filter and a status summary.\n\nQuery params:\n    instantly_status: Filter by status (new|uploaded|active|completed|replied|bounced|...).\n    limit:            Max rows to return (default 100).\n    offset:           Pagination offset (default 0).","operationId":"list_instantly_leads_instantly_leads_get","security":[{"APIKeyHeader":[]}],"parameters":[{"name":"instantly_status","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Instantly Status"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","default":100,"title":"Limit"}},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","default":0,"title":"Offset"}},{"name":"api_key","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Api Key"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response List Instantly Leads Instantly Leads Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/instantly/feeder/run":{"post":{"tags":["instantly"],"summary":"Trigger Instantly Feeder","description":"Trigger the Instantly feeder to top up evergreen campaigns with new leads.\n\nOptional query param:\n    account_label: Run only for this account label (default: all active accounts).\n\nReturns 202 immediately; the job runs in the background and is tracked in\n/executions.","operationId":"trigger_instantly_feeder_instantly_feeder_run_post","security":[{"APIKeyHeader":[]}],"parameters":[{"name":"account_label","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Account Label"}},{"name":"api_key","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Api Key"}}],"responses":{"202":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Trigger Instantly Feeder Instantly Feeder Run Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/instantly/archive/run":{"post":{"tags":["instantly"],"summary":"Trigger Instantly Archive","description":"Trigger the Instantly archive job to move completed-no-reply leads to a list.\n\nMoves leads out of each evergreen campaign into a per-account \"Completed Leads\"\nlist, reclaiming the 25,000-lead lifetime quota.  Replied / interested leads are\nNOT touched (FILTER_COMPLETED_NO_REPLY is used exclusively).\n\nOptional query params:\n    account_label: Run only for this account label (default: all active accounts).\n    limit:         Cap the number of leads moved per account.\n    dry_run:       Report what would happen without making any move calls.\n\nReturns 202 immediately; the job runs in the background and is tracked in\n/executions.","operationId":"trigger_instantly_archive_instantly_archive_run_post","security":[{"APIKeyHeader":[]}],"parameters":[{"name":"account_label","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Account Label"}},{"name":"limit","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Limit"}},{"name":"dry_run","in":"query","required":false,"schema":{"type":"boolean","default":false,"title":"Dry Run"}},{"name":"api_key","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Api Key"}}],"responses":{"202":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Trigger Instantly Archive Instantly Archive Run Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/instantly/campaigns/{campaign_id}/live":{"get":{"tags":["instantly"],"summary":"Instantly Campaign Live","description":"Live read of a campaign's status from the Instantly API (not cached DB).\n\nResolves the account API key by campaign_id; 404 if campaign is unknown.","operationId":"instantly_campaign_live_instantly_campaigns__campaign_id__live_get","security":[{"APIKeyHeader":[]}],"parameters":[{"name":"campaign_id","in":"path","required":true,"schema":{"type":"string","title":"Campaign Id"}},{"name":"api_key","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Api Key"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Instantly Campaign Live Instantly Campaigns  Campaign Id  Live Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/instantly/accounts/{label}/quota":{"get":{"tags":["instantly"],"summary":"Instantly Account Quota","description":"Live read of an account's plan / quota details from the Instantly API.\n\nResolves the account by label; 404 if not found.","operationId":"instantly_account_quota_instantly_accounts__label__quota_get","security":[{"APIKeyHeader":[]}],"parameters":[{"name":"label","in":"path","required":true,"schema":{"type":"string","title":"Label"}},{"name":"api_key","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Api Key"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Instantly Account Quota Instantly Accounts  Label  Quota Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/instantly/campaigns/{campaign_id}/activate":{"post":{"tags":["instantly"],"summary":"Instantly Campaign Activate","description":"Activate an Instantly campaign (move from paused/draft to active).\n\nTracked in /executions as job 'instantly_campaign_activate'.","operationId":"instantly_campaign_activate_instantly_campaigns__campaign_id__activate_post","security":[{"APIKeyHeader":[]}],"parameters":[{"name":"campaign_id","in":"path","required":true,"schema":{"type":"string","title":"Campaign Id"}},{"name":"api_key","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Api Key"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Instantly Campaign Activate Instantly Campaigns  Campaign Id  Activate Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/instantly/campaigns/{campaign_id}/pause":{"post":{"tags":["instantly"],"summary":"Instantly Campaign Pause","description":"Pause an active Instantly campaign.\n\nTracked in /executions as job 'instantly_campaign_pause'.","operationId":"instantly_campaign_pause_instantly_campaigns__campaign_id__pause_post","security":[{"APIKeyHeader":[]}],"parameters":[{"name":"campaign_id","in":"path","required":true,"schema":{"type":"string","title":"Campaign Id"}},{"name":"api_key","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Api Key"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Instantly Campaign Pause Instantly Campaigns  Campaign Id  Pause Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/instantly/campaigns/{campaign_id}/evergreen":{"post":{"tags":["instantly"],"summary":"Instantly Campaign Set Evergreen","description":"Set (or clear) the is_evergreen flag on an Instantly campaign.\n\nQuery param:\n    value: true (default) to enable evergreen, false to disable.\n\nTracked in /executions as job 'instantly_campaign_set_evergreen'.","operationId":"instantly_campaign_set_evergreen_instantly_campaigns__campaign_id__evergreen_post","security":[{"APIKeyHeader":[]}],"parameters":[{"name":"campaign_id","in":"path","required":true,"schema":{"type":"string","title":"Campaign Id"}},{"name":"value","in":"query","required":false,"schema":{"type":"boolean","default":true,"title":"Value"}},{"name":"api_key","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Api Key"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Instantly Campaign Set Evergreen Instantly Campaigns  Campaign Id  Evergreen Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/instantly/campaigns/{campaign_id}/sync":{"post":{"tags":["instantly"],"summary":"Instantly Campaign Sync","description":"Fetch live campaign status + analytics and store in instantly_campaigns.\n\nCalls get_campaign() + campaign_lead_counts() (analytics), then upserts\nthe cached row with raw analytics JSON.  Returns the synced row.\n\nTracked in /executions as job 'instantly_campaign_sync'.","operationId":"instantly_campaign_sync_instantly_campaigns__campaign_id__sync_post","security":[{"APIKeyHeader":[]}],"parameters":[{"name":"campaign_id","in":"path","required":true,"schema":{"type":"string","title":"Campaign Id"}},{"name":"api_key","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Api Key"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Instantly Campaign Sync Instantly Campaigns  Campaign Id  Sync Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/instantly/campaigns/{campaign_id}/add-leads":{"post":{"tags":["instantly"],"summary":"Instantly Campaign Add Leads","description":"Manual counterpart of the feeder: bulk-add up to *limit* new leads to this campaign.\n\nPulls leads with instantly_status='new' for the campaign's account from the DB,\nuploads them via bulk_add_leads (skip_if_in_workspace=True), and marks them\nuploaded.  Returns counts.\n\nQuery param:\n    limit: Maximum leads to pull and upload in this call (default 100).\n\nTracked in /executions as job 'instantly_campaign_add_leads'.","operationId":"instantly_campaign_add_leads_instantly_campaigns__campaign_id__add_leads_post","security":[{"APIKeyHeader":[]}],"parameters":[{"name":"campaign_id","in":"path","required":true,"schema":{"type":"string","title":"Campaign Id"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","default":100,"title":"Limit"}},{"name":"api_key","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Api Key"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Instantly Campaign Add Leads Instantly Campaigns  Campaign Id  Add Leads Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/leads/scrape":{"post":{"tags":["leads"],"summary":"Trigger Lead Scrape","description":"Trigger a lead-scrape run — pull pending search_queries and call gmaps-runner.\n\nOptional query param:\n    batch_size: Max pending queries to process (default 50).\n\nReturns 202 immediately; the job runs in the background and is tracked\nin /executions as job 'lead_scrape'.","operationId":"trigger_lead_scrape_leads_scrape_post","security":[{"APIKeyHeader":[]}],"parameters":[{"name":"batch_size","in":"query","required":false,"schema":{"type":"integer","default":50,"title":"Batch Size"}},{"name":"api_key","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Api Key"}}],"responses":{"202":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Trigger Lead Scrape Leads Scrape Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/leads/verify":{"post":{"tags":["leads"],"summary":"Trigger Lead Verify","description":"Trigger an ELV email-verification run on unverified leads.\n\nOptional query param:\n    batch_size: Max unverified leads to process (default 1000).\n\nReturns 202 immediately; the job runs in the background and is tracked\nin /executions as job 'verify_leads'.","operationId":"trigger_lead_verify_leads_verify_post","security":[{"APIKeyHeader":[]}],"parameters":[{"name":"batch_size","in":"query","required":false,"schema":{"type":"integer","default":1000,"title":"Batch Size"}},{"name":"api_key","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Api Key"}}],"responses":{"202":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Trigger Lead Verify Leads Verify Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/search-queries":{"get":{"tags":["leads"],"summary":"List Search Queries","description":"List search_queries with optional status filter and a status summary.\n\nQuery params:\n    status: Filter by status (pending|scraping|scraped|processed|failed).\n    limit:  Max rows to return (default 100).\n    offset: Pagination offset (default 0).","operationId":"list_search_queries_search_queries_get","security":[{"APIKeyHeader":[]}],"parameters":[{"name":"status","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Status"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","default":100,"title":"Limit"}},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","default":0,"title":"Offset"}},{"name":"api_key","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Api Key"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response List Search Queries Search Queries Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["leads"],"summary":"Register Search Queries","description":"Register search queries for gosom scraping (idempotent upsert).\n\nAccepts two shapes:\n- ``items``: explicit list of ``{query, city, state, zip?, priority?}`` dicts.\n- ``niches`` × ``metros``: cartesian product — each niche × each\n  \"City, ST\" metro entry is expanded into one query row.\n\nTracked in /executions as job 'search_queries_register'.","operationId":"register_search_queries_search_queries_post","security":[{"APIKeyHeader":[]}],"parameters":[{"name":"api_key","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Api Key"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SearchQueriesRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Register Search Queries Search Queries Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/gmaps/health":{"get":{"tags":["leads"],"summary":"Gmaps Runner Health","description":"Proxy GET /health to the gmaps-runner sidecar (live check).\n\nReturns 200 with the sidecar's health payload, or 503 if unreachable.","operationId":"gmaps_runner_health_gmaps_health_get","security":[{"APIKeyHeader":[]}],"parameters":[{"name":"api_key","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Api Key"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Gmaps Runner Health Gmaps Health Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/proxy/refresh":{"post":{"tags":["proxy"],"summary":"Trigger Refresh Proxies","operationId":"trigger_refresh_proxies_proxy_refresh_post","security":[{"APIKeyHeader":[]}],"parameters":[{"name":"rotate","in":"query","required":false,"schema":{"type":"boolean","default":false,"title":"Rotate"}},{"name":"auth_method","in":"query","required":false,"schema":{"type":"string","default":"username","title":"Auth Method"}},{"name":"country_codes","in":"query","required":false,"schema":{"type":"string","default":"us","title":"Country Codes"}},{"name":"api_key","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Api Key"}}],"responses":{"202":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Trigger Refresh Proxies Proxy Refresh Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/proxies":{"get":{"tags":["proxy"],"summary":"List Proxies","operationId":"list_proxies_proxies_get","security":[{"APIKeyHeader":[]}],"parameters":[{"name":"api_key","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Api Key"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response List Proxies Proxies Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/keywords":{"get":{"tags":["keywords"],"summary":"List Keywords Endpoint","description":"List all keywords with status and scrape / net-new-lead metrics.","operationId":"list_keywords_endpoint_keywords_get","security":[{"APIKeyHeader":[]}],"parameters":[{"name":"api_key","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Api Key"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response List Keywords Endpoint Keywords Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["keywords"],"summary":"Add Keyword Endpoint","description":"Register a new keyword and seed ~36k search_queries from the grid.\n\nReturns 202 immediately; the seeding runs in the background and is tracked\nin /executions as job 'add_keyword'.","operationId":"add_keyword_endpoint_keywords_post","security":[{"APIKeyHeader":[]}],"parameters":[{"name":"api_key","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Api Key"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AddKeywordRequest"}}}},"responses":{"202":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Add Keyword Endpoint Keywords Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/keywords/{keyword}/pause":{"post":{"tags":["keywords"],"summary":"Pause Keyword Endpoint","description":"Pause a keyword — its pending search_queries are excluded from the scrape queue.","operationId":"pause_keyword_endpoint_keywords__keyword__pause_post","security":[{"APIKeyHeader":[]}],"parameters":[{"name":"keyword","in":"path","required":true,"schema":{"type":"string","title":"Keyword"}},{"name":"api_key","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Api Key"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Pause Keyword Endpoint Keywords  Keyword  Pause Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/keywords/{keyword}/resume":{"post":{"tags":["keywords"],"summary":"Resume Keyword Endpoint","description":"Resume a paused keyword — its pending search_queries re-enter the scrape queue.","operationId":"resume_keyword_endpoint_keywords__keyword__resume_post","security":[{"APIKeyHeader":[]}],"parameters":[{"name":"keyword","in":"path","required":true,"schema":{"type":"string","title":"Keyword"}},{"name":"api_key","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Api Key"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Resume Keyword Endpoint Keywords  Keyword  Resume Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/keywords/{keyword}/archive":{"post":{"tags":["keywords"],"summary":"Archive Keyword Endpoint","description":"Archive a keyword — soft-delete; rows are preserved for historical reporting.","operationId":"archive_keyword_endpoint_keywords__keyword__archive_post","security":[{"APIKeyHeader":[]}],"parameters":[{"name":"keyword","in":"path","required":true,"schema":{"type":"string","title":"Keyword"}},{"name":"api_key","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Api Key"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Archive Keyword Endpoint Keywords  Keyword  Archive Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/keywords/{keyword}/stats":{"get":{"tags":["keywords"],"summary":"Keyword Stats Endpoint","description":"Drill-down stats for a single keyword (summary, by-state, by-day).","operationId":"keyword_stats_endpoint_keywords__keyword__stats_get","security":[{"APIKeyHeader":[]}],"parameters":[{"name":"keyword","in":"path","required":true,"schema":{"type":"string","title":"Keyword"}},{"name":"api_key","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Api Key"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Keyword Stats Endpoint Keywords  Keyword  Stats Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/keywords/{keyword}/queries":{"get":{"tags":["keywords"],"summary":"Keyword Queries Page Endpoint","description":"Paginated list of search_queries for a keyword with net-new-lead counts.","operationId":"keyword_queries_page_endpoint_keywords__keyword__queries_get","security":[{"APIKeyHeader":[]}],"parameters":[{"name":"keyword","in":"path","required":true,"schema":{"type":"string","title":"Keyword"}},{"name":"sort","in":"query","required":false,"schema":{"type":"string","default":"net_new_leads","title":"Sort"}},{"name":"order","in":"query","required":false,"schema":{"type":"string","default":"desc","title":"Order"}},{"name":"status","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Status"}},{"name":"state","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"State"}},{"name":"search","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Search"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":200,"minimum":1,"default":50,"title":"Limit"}},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","minimum":0,"default":0,"title":"Offset"}},{"name":"api_key","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Api Key"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Keyword Queries Page Endpoint Keywords  Keyword  Queries Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/ghl/contacts/lookup":{"get":{"tags":["ghl:contacts"],"summary":"Lookup Ghl Contact","description":"Look up an existing GHL contact by email or phone.\n\nReturns ``{\"contact\": {...}}`` when found, ``{\"contact\": null}`` when not.\nAt least one of email or phone is required.","operationId":"lookup_ghl_contact_ghl_contacts_lookup_get","security":[{"APIKeyHeader":[]}],"parameters":[{"name":"location_id","in":"query","required":true,"schema":{"type":"string","title":"Location Id"}},{"name":"email","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Email"}},{"name":"phone","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Phone"}},{"name":"api_key","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Api Key"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Lookup Ghl Contact Ghl Contacts Lookup Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/ghl/contacts/deletions":{"get":{"tags":["ghl:contacts"],"summary":"List Ghl Contact Deletions","description":"List deferred contact deletion rows.\n\nOptional ``status`` filter: ``pending``, ``cancelled``, ``executed``, ``failed``.\nReturns ``{\"deletions\": [...]}`` ordered by scheduled_for.","operationId":"list_ghl_contact_deletions_ghl_contacts_deletions_get","security":[{"APIKeyHeader":[]}],"parameters":[{"name":"status","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Status"}},{"name":"api_key","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Api Key"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response List Ghl Contact Deletions Ghl Contacts Deletions Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/ghl/contacts/{contact_id}":{"get":{"tags":["ghl:contacts"],"summary":"Get Ghl Contact","description":"Fetch a single GHL contact by ID.\n\nReturns the contact dict from GHL.","operationId":"get_ghl_contact_ghl_contacts__contact_id__get","security":[{"APIKeyHeader":[]}],"parameters":[{"name":"contact_id","in":"path","required":true,"schema":{"type":"string","title":"Contact Id"}},{"name":"location_id","in":"query","required":true,"schema":{"type":"string","title":"Location Id"}},{"name":"api_key","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Api Key"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Get Ghl Contact Ghl Contacts  Contact Id  Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"put":{"tags":["ghl:contacts"],"summary":"Update Ghl Contact","description":"Update an existing GHL contact by ID.\n\nBody: ``{\"location_id\": str, \"data\": {fieldsToUpdate}}``.\nReturns the updated contact dict.","operationId":"update_ghl_contact_ghl_contacts__contact_id__put","security":[{"APIKeyHeader":[]}],"parameters":[{"name":"contact_id","in":"path","required":true,"schema":{"type":"string","title":"Contact Id"}},{"name":"api_key","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Api Key"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateContactRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Update Ghl Contact Ghl Contacts  Contact Id  Put"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/ghl/contacts":{"get":{"tags":["ghl:contacts"],"summary":"Search Ghl Contacts","description":"Search / list contacts for a GHL location.\n\nReturns ``{\"contacts\": [...]}`` — up to 100 per page.","operationId":"search_ghl_contacts_ghl_contacts_get","security":[{"APIKeyHeader":[]}],"parameters":[{"name":"location_id","in":"query","required":true,"schema":{"type":"string","title":"Location Id"}},{"name":"query","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Query"}},{"name":"page","in":"query","required":false,"schema":{"type":"integer","default":1,"title":"Page"}},{"name":"api_key","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Api Key"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Search Ghl Contacts Ghl Contacts Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["ghl:contacts"],"summary":"Create Ghl Contact","description":"Create a new GHL contact on a location.\n\nBody: ``{\"location_id\": str, \"data\": {contactFields}}``.\nReturns the created contact dict.","operationId":"create_ghl_contact_ghl_contacts_post","security":[{"APIKeyHeader":[]}],"parameters":[{"name":"api_key","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Api Key"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateContactRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Create Ghl Contact Ghl Contacts Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/ghl/locations/{location_id}/custom-fields":{"get":{"tags":["ghl:custom-fields"],"summary":"List Ghl Location Custom Fields","description":"List all custom fields for a GHL location / model.\n\nReturns ``{\"customFields\": [...]}`` — each item has ``id``, ``name``,\n``fieldKey``, ``dataType``.","operationId":"list_ghl_location_custom_fields_ghl_locations__location_id__custom_fields_get","security":[{"APIKeyHeader":[]}],"parameters":[{"name":"location_id","in":"path","required":true,"schema":{"type":"string","title":"Location Id"}},{"name":"model","in":"query","required":false,"schema":{"type":"string","default":"contact","title":"Model"}},{"name":"api_key","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Api Key"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response List Ghl Location Custom Fields Ghl Locations  Location Id  Custom Fields Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/ghl/contacts/upsert":{"post":{"tags":["ghl:contacts"],"summary":"Upsert Ghl Contact","description":"Create or update a GHL contact (server-side dedup by email/phone).\n\nBody: ``{\"location_id\": str, \"data\": {contactFields}}``.\nReturns ``{\"contact_id\", \"was_new\", \"contact\"}``.","operationId":"upsert_ghl_contact_ghl_contacts_upsert_post","security":[{"APIKeyHeader":[]}],"parameters":[{"name":"api_key","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Api Key"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpsertContactRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Upsert Ghl Contact Ghl Contacts Upsert Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/ghl/contacts/{contact_id}/tags":{"post":{"tags":["ghl:contacts"],"summary":"Add Ghl Contact Tags","description":"Add tags to a GHL contact.\n\nBody: ``{\"location_id\": str, \"tags\": [str, ...]}``.\nReturns the raw GHL response.","operationId":"add_ghl_contact_tags_ghl_contacts__contact_id__tags_post","security":[{"APIKeyHeader":[]}],"parameters":[{"name":"contact_id","in":"path","required":true,"schema":{"type":"string","title":"Contact Id"}},{"name":"api_key","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Api Key"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ContactTagsRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Add Ghl Contact Tags Ghl Contacts  Contact Id  Tags Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["ghl:contacts"],"summary":"Remove Ghl Contact Tags","description":"Remove tags from a GHL contact.\n\nBody: ``{\"location_id\": str, \"tags\": [str, ...]}``.\nReturns the raw GHL response.","operationId":"remove_ghl_contact_tags_ghl_contacts__contact_id__tags_delete","security":[{"APIKeyHeader":[]}],"parameters":[{"name":"contact_id","in":"path","required":true,"schema":{"type":"string","title":"Contact Id"}},{"name":"api_key","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Api Key"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ContactTagsRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Remove Ghl Contact Tags Ghl Contacts  Contact Id  Tags Delete"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/ghl/custom-fields":{"post":{"tags":["ghl:custom-fields"],"summary":"Create Ghl Custom Field","description":"Create a new GHL contact custom field on a location.\n\nBody: ``{\"location_id\": str, \"name\": str, \"data_type\": str, \"model\": str}``.\nReturns the created custom field dict.","operationId":"create_ghl_custom_field_ghl_custom_fields_post","security":[{"APIKeyHeader":[]}],"parameters":[{"name":"api_key","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Api Key"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateCustomFieldRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Create Ghl Custom Field Ghl Custom Fields Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/ghl/contacts/{contact_id}/schedule-delete":{"post":{"tags":["ghl:contacts"],"summary":"Schedule Ghl Contact Delete","description":"Schedule a GHL contact for deferred deletion (24 h from now).\n\nSnapshots the contact first so it is auditable/recoverable within the window.\nThe cron sweep ``ghl_contact_deletion_sweep`` executes the actual delete.\nUse ``POST /ghl/contacts/deletions/{deletion_id}/cancel`` to cancel within the window.\n\nReturns ``{\"deletion_id\": str, \"scheduled_for\": str}``.","operationId":"schedule_ghl_contact_delete_ghl_contacts__contact_id__schedule_delete_post","security":[{"APIKeyHeader":[]}],"parameters":[{"name":"contact_id","in":"path","required":true,"schema":{"type":"string","title":"Contact Id"}},{"name":"api_key","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Api Key"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ScheduleDeleteRequest"}}}},"responses":{"202":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Schedule Ghl Contact Delete Ghl Contacts  Contact Id  Schedule Delete Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/ghl/contacts/deletions/{deletion_id}/cancel":{"post":{"tags":["ghl:contacts"],"summary":"Cancel Ghl Contact Deletion","description":"Cancel a pending deferred contact deletion (only while status is 'pending').\n\nReturns ``{\"cancelled\": bool}`` — False when the row was already executed,\nfailed, cancelled, or not found.","operationId":"cancel_ghl_contact_deletion_ghl_contacts_deletions__deletion_id__cancel_post","security":[{"APIKeyHeader":[]}],"parameters":[{"name":"deletion_id","in":"path","required":true,"schema":{"type":"string","title":"Deletion Id"}},{"name":"api_key","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Api Key"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Cancel Ghl Contact Deletion Ghl Contacts Deletions  Deletion Id  Cancel Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/leads/import/facets":{"get":{"tags":["leads"],"summary":"Leads Import Facets","description":"Return distinct filter values (keywords, states, cities) for the import UI.\n\nValues are derived from the live ``backend.leads`` dataset.  Cities are\ncapped at the top 500 by lead count to keep the payload manageable.","operationId":"leads_import_facets_leads_import_facets_get","security":[{"APIKeyHeader":[]}],"parameters":[{"name":"api_key","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Api Key"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Leads Import Facets Leads Import Facets Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/ghl/contacts/import/preview":{"get":{"tags":["ghl:contacts"],"summary":"Ghl Contacts Import Preview","description":"Preview how many leads are eligible for import to a GHL location.\n\nQuery params:\n    location_id: GHL location id (required).\n    keyword:     Repeatable — restrict to leads with one of these scrape\n                 keywords (omit for all keywords).\n    state:       Repeatable — restrict to leads in these US state codes.\n    city:        Repeatable — restrict to leads in these cities.\n    has_phone:   Only count leads that have a normalised E.164 phone number\n                 (default ``true``).\n\nReturns ``{\"eligible\": int, \"already_pushed\": int}``.","operationId":"ghl_contacts_import_preview_ghl_contacts_import_preview_get","security":[{"APIKeyHeader":[]}],"parameters":[{"name":"location_id","in":"query","required":true,"schema":{"type":"string","title":"Location Id"}},{"name":"keyword","in":"query","required":false,"schema":{"type":"array","items":{"type":"string"},"default":[],"title":"Keyword"}},{"name":"state","in":"query","required":false,"schema":{"type":"array","items":{"type":"string"},"default":[],"title":"State"}},{"name":"city","in":"query","required":false,"schema":{"type":"array","items":{"type":"string"},"default":[],"title":"City"}},{"name":"has_phone","in":"query","required":false,"schema":{"type":"boolean","default":true,"title":"Has Phone"}},{"name":"api_key","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Api Key"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Ghl Contacts Import Preview Ghl Contacts Import Preview Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/ghl/contacts/import":{"post":{"tags":["ghl:contacts"],"summary":"Ghl Contacts Import","description":"Push scraped leads to a GHL location as tagged contacts (async).\n\nReturns 202 immediately.  The import job runs in the background and is\ntracked in ``/executions`` as job ``ghl_contacts_import``.\n\nBody fields:\n    location_id: GHL location id to push contacts into.\n    keywords:    Restrict to leads with one of these scrape keywords.\n    states:      Restrict to leads in these US state codes.\n    cities:      Restrict to leads in these cities.\n    has_phone:   Only import leads with a normalised E.164 phone number\n                 (default ``true``).\n    tag:         GHL tag applied to every contact (default ``\"scrape\"``).\n    limit:       Cap the number of leads imported in this run\n                 (``null`` = no cap).","operationId":"ghl_contacts_import_ghl_contacts_import_post","security":[{"APIKeyHeader":[]}],"parameters":[{"name":"api_key","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Api Key"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/GhlContactsImportRequest"}}}},"responses":{"202":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Ghl Contacts Import Ghl Contacts Import Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}}},"components":{"schemas":{"AddKeywordRequest":{"properties":{"keyword":{"type":"string","minLength":1,"title":"Keyword"}},"type":"object","required":["keyword"],"title":"AddKeywordRequest"},"AddNumberRequest":{"properties":{"subaccount_sid":{"type":"string","title":"Subaccount Sid"},"subaccount_auth_token":{"type":"string","title":"Subaccount Auth Token"},"messaging_service_sid":{"type":"string","title":"Messaging Service Sid"},"phone_number_sid":{"type":"string","title":"Phone Number Sid"},"ghl_location_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Ghl Location Id"}},"type":"object","required":["subaccount_sid","subaccount_auth_token","messaging_service_sid","phone_number_sid"],"title":"AddNumberRequest"},"AddressCreateRequest":{"properties":{"subaccount_sid":{"type":"string","title":"Subaccount Sid"},"customer_name":{"type":"string","title":"Customer Name"},"street":{"type":"string","title":"Street"},"city":{"type":"string","title":"City"},"region":{"type":"string","title":"Region"},"postal_code":{"type":"string","title":"Postal Code"},"iso_country":{"type":"string","title":"Iso Country","default":"US"},"ghl_location_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Ghl Location Id"}},"type":"object","required":["subaccount_sid","customer_name","street","city","region","postal_code"],"title":"AddressCreateRequest"},"AddressLinkRequest":{"properties":{"subaccount_sid":{"type":"string","title":"Subaccount Sid"},"phone_number_sid":{"type":"string","title":"Phone Number Sid"},"address_sid":{"type":"string","title":"Address Sid"},"ghl_location_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Ghl Location Id"}},"type":"object","required":["subaccount_sid","phone_number_sid","address_sid"],"title":"AddressLinkRequest"},"BrandRegistrationRequest":{"properties":{"subaccount_sid":{"type":"string","title":"Subaccount Sid"},"subaccount_auth_token":{"type":"string","title":"Subaccount Auth Token"},"address_sid":{"type":"string","title":"Address Sid"},"friendly_name":{"type":"string","title":"Friendly Name"},"email":{"type":"string","title":"Email"},"business_name":{"type":"string","title":"Business Name"},"business_type":{"type":"string","title":"Business Type","default":"llc"},"business_industry":{"type":"string","title":"Business Industry","default":"REAL_ESTATE"},"business_ein":{"type":"string","title":"Business Ein"},"business_website":{"type":"string","title":"Business Website"},"rep_first_name":{"type":"string","title":"Rep First Name"},"rep_last_name":{"type":"string","title":"Rep Last Name"},"rep_email":{"type":"string","title":"Rep Email"},"rep_phone":{"type":"string","title":"Rep Phone"},"rep_job_position":{"type":"string","title":"Rep Job Position","default":"CEO"},"rep_title":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Rep Title"},"company_type":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Company Type"},"brand_type":{"type":"string","title":"Brand Type","default":"LOW_VOLUME_STANDARD"},"notification_email":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Notification Email"},"ghl_location_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Ghl Location Id"}},"type":"object","required":["subaccount_sid","subaccount_auth_token","address_sid","friendly_name","email","business_name","business_ein","business_website","rep_first_name","rep_last_name","rep_email","rep_phone"],"title":"BrandRegistrationRequest"},"BulkDeleteAsyncRequest":{"properties":{"location_id":{"type":"string","title":"Location Id"},"custom_value_ids":{"items":{"type":"string"},"type":"array","title":"Custom Value Ids"}},"type":"object","required":["location_id","custom_value_ids"],"title":"BulkDeleteAsyncRequest"},"BulkUpsertAsyncRequest":{"properties":{"location_id":{"type":"string","title":"Location Id"},"items":{"items":{"additionalProperties":true,"type":"object"},"type":"array","title":"Items"}},"type":"object","required":["location_id","items"],"title":"BulkUpsertAsyncRequest"},"CampaignCreateRequest":{"properties":{"subaccount_sid":{"type":"string","title":"Subaccount Sid"},"subaccount_auth_token":{"type":"string","title":"Subaccount Auth Token"},"messaging_service_sid":{"type":"string","title":"Messaging Service Sid"},"brand_registration_sid":{"type":"string","title":"Brand Registration Sid"},"description":{"type":"string","title":"Description"},"message_flow":{"type":"string","title":"Message Flow"},"message_samples":{"items":{"type":"string"},"type":"array","title":"Message Samples"},"use_case":{"type":"string","title":"Use Case","default":"CUSTOMER_CARE"},"opt_in_keywords":{"items":{"type":"string"},"type":"array","title":"Opt In Keywords","default":["START"]},"opt_out_keywords":{"items":{"type":"string"},"type":"array","title":"Opt Out Keywords","default":["STOP"]},"help_keywords":{"items":{"type":"string"},"type":"array","title":"Help Keywords","default":["HELP"]},"privacy_policy_url":{"type":"string","title":"Privacy Policy Url"},"terms_and_conditions_url":{"type":"string","title":"Terms And Conditions Url"},"opt_in_message":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Opt In Message"},"opt_out_message":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Opt Out Message"},"help_message":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Help Message"},"opt_in_type":{"type":"string","title":"Opt In Type","default":"WEB_FORM"},"has_embedded_links":{"type":"boolean","title":"Has Embedded Links","default":true},"has_embedded_phone":{"type":"boolean","title":"Has Embedded Phone","default":false},"ghl_location_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Ghl Location Id"}},"type":"object","required":["subaccount_sid","subaccount_auth_token","messaging_service_sid","brand_registration_sid","description","message_flow","message_samples","privacy_policy_url","terms_and_conditions_url"],"title":"CampaignCreateRequest"},"CancellationWebhookPayload":{"properties":{"location_id":{"type":"string","title":"Location Id"},"company_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Company Id"}},"type":"object","required":["location_id"],"title":"CancellationWebhookPayload"},"ContactTagsRequest":{"properties":{"location_id":{"type":"string","title":"Location Id"},"tags":{"items":{"type":"string"},"type":"array","title":"Tags"}},"type":"object","required":["location_id","tags"],"title":"ContactTagsRequest"},"CreateContactRequest":{"properties":{"location_id":{"type":"string","title":"Location Id"},"data":{"additionalProperties":true,"type":"object","title":"Data"}},"type":"object","required":["location_id","data"],"title":"CreateContactRequest"},"CreateCustomFieldRequest":{"properties":{"location_id":{"type":"string","title":"Location Id"},"name":{"type":"string","title":"Name"},"data_type":{"type":"string","title":"Data Type","default":"TEXT"},"model":{"type":"string","title":"Model","default":"contact"}},"type":"object","required":["location_id","name"],"title":"CreateCustomFieldRequest"},"CreateCustomValueRequest":{"properties":{"location_id":{"type":"string","title":"Location Id"},"name":{"type":"string","title":"Name"},"value":{"type":"string","title":"Value"}},"type":"object","required":["location_id","name","value"],"title":"CreateCustomValueRequest"},"CronJobCreateRequest":{"properties":{"key":{"type":"string","title":"Key"},"name":{"type":"string","title":"Name"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description"},"cron_expr":{"type":"string","title":"Cron Expr"},"action_key":{"type":"string","title":"Action Key"},"args":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Args"},"enabled":{"type":"boolean","title":"Enabled","default":true}},"type":"object","required":["key","name","cron_expr","action_key"],"title":"CronJobCreateRequest"},"CronJobUpdateRequest":{"properties":{"name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Name"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description"},"cron_expr":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Cron Expr"},"action_key":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Action Key"},"args":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Args"},"enabled":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Enabled"}},"type":"object","title":"CronJobUpdateRequest"},"CustomItemModel":{"properties":{"ai_model":{"type":"string","title":"Ai Model"},"cv_name":{"type":"string","title":"Cv Name"},"prompt_template":{"type":"string","title":"Prompt Template"},"width":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Width"},"height":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Height"},"generate_order":{"type":"integer","title":"Generate Order","default":1},"image_name_template":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Image Name Template"},"loop_axis":{"type":"string","title":"Loop Axis","default":"none"},"loop_index":{"type":"integer","title":"Loop Index","default":0},"writing_style_index":{"type":"integer","title":"Writing Style Index","default":0},"sort_order":{"type":"integer","title":"Sort Order","default":0},"sheet":{"type":"string","title":"Sheet","default":"custom"},"result_slot":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Result Slot"},"generated_value":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Generated Value"}},"type":"object","required":["ai_model","cv_name","prompt_template"],"title":"CustomItemModel"},"CvCustomJobRequest":{"properties":{"ghl_location_id":{"type":"string","title":"Ghl Location Id"},"company_name":{"type":"string","title":"Company Name"},"services":{"items":{"type":"string"},"type":"array","title":"Services"},"locations":{"items":{"type":"string"},"type":"array","title":"Locations"},"writing_styles":{"items":{"type":"string"},"type":"array","title":"Writing Styles"},"writing_style_fixed":{"type":"string","title":"Writing Style Fixed","default":""},"years_exp":{"type":"integer","title":"Years Exp","default":0},"context":{"type":"string","title":"Context","default":""},"client_type":{"type":"string","title":"Client Type","default":""},"main_service":{"type":"string","title":"Main Service","default":""},"service_url_slug":{"type":"string","title":"Service Url Slug","default":""},"spare_fix":{"additionalProperties":{"type":"string"},"type":"object","title":"Spare Fix","default":{}},"provided":{"additionalProperties":{"items":{"type":"string"},"type":"array"},"type":"object","title":"Provided","default":{}},"items":{"items":{"$ref":"#/components/schemas/CustomItemModel"},"type":"array","title":"Items"},"run":{"type":"boolean","title":"Run","default":false}},"type":"object","required":["ghl_location_id","company_name","services","locations","writing_styles","items"],"title":"CvCustomJobRequest"},"CvJobDeleteRequest":{"properties":{"targets":{"items":{"type":"string"},"type":"array","title":"Targets","default":[]},"delete_record":{"type":"boolean","title":"Delete Record","default":true}},"type":"object","title":"CvJobDeleteRequest"},"CvJobRequest":{"properties":{"ghl_location_id":{"type":"string","title":"Ghl Location Id"},"company_name":{"type":"string","title":"Company Name"},"services":{"items":{"type":"string"},"type":"array","title":"Services"},"locations":{"items":{"type":"string"},"type":"array","title":"Locations"},"writing_styles":{"items":{"type":"string"},"type":"array","title":"Writing Styles"},"writing_style_fixed":{"type":"string","title":"Writing Style Fixed","default":""},"years_exp":{"type":"integer","title":"Years Exp","default":0},"context":{"type":"string","title":"Context","default":""},"client_type":{"type":"string","title":"Client Type","default":""},"main_service":{"type":"string","title":"Main Service","default":""},"service_url_slug":{"type":"string","title":"Service Url Slug","default":""},"spare_fix":{"additionalProperties":{"type":"string"},"type":"object","title":"Spare Fix","default":{}},"provided":{"additionalProperties":{"items":{"type":"string"},"type":"array"},"type":"object","title":"Provided","default":{}},"item_limit":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Item Limit"},"allow_blanks":{"type":"boolean","title":"Allow Blanks","default":false}},"type":"object","required":["ghl_location_id","company_name","services","locations","writing_styles"],"title":"CvJobRequest"},"CvPurgeRequest":{"properties":{"statuses":{"items":{"type":"string"},"type":"array","title":"Statuses"}},"type":"object","required":["statuses"],"title":"CvPurgeRequest"},"CvSampleJobRequest":{"properties":{"ghl_location_id":{"type":"string","title":"Ghl Location Id"},"company_name":{"type":"string","title":"Company Name"},"services":{"items":{"type":"string"},"type":"array","title":"Services"},"locations":{"items":{"type":"string"},"type":"array","title":"Locations"},"writing_styles":{"items":{"type":"string"},"type":"array","title":"Writing Styles"},"writing_style_fixed":{"type":"string","title":"Writing Style Fixed","default":""},"years_exp":{"type":"integer","title":"Years Exp","default":0},"context":{"type":"string","title":"Context","default":""},"client_type":{"type":"string","title":"Client Type","default":""},"main_service":{"type":"string","title":"Main Service","default":""},"service_url_slug":{"type":"string","title":"Service Url Slug","default":""},"spare_fix":{"additionalProperties":{"type":"string"},"type":"object","title":"Spare Fix","default":{}},"provided":{"additionalProperties":{"items":{"type":"string"},"type":"array"},"type":"object","title":"Provided","default":{}},"model_counts":{"additionalProperties":{"type":"integer"},"type":"object","title":"Model Counts"},"run":{"type":"boolean","title":"Run","default":false}},"type":"object","required":["ghl_location_id","company_name","services","locations","writing_styles","model_counts"],"title":"CvSampleJobRequest"},"GhlConnectRequest":{"properties":{"location_id":{"type":"string","title":"Location Id"},"phone_number":{"type":"string","title":"Phone Number"},"messaging_service_sid":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Messaging Service Sid"},"provisioning_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Provisioning Id"},"ghl_location_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Ghl Location Id"}},"type":"object","required":["location_id","phone_number"],"title":"GhlConnectRequest"},"GhlContactsImportRequest":{"properties":{"location_id":{"type":"string","title":"Location Id"},"keywords":{"items":{"type":"string"},"type":"array","title":"Keywords","default":[]},"states":{"items":{"type":"string"},"type":"array","title":"States","default":[]},"cities":{"items":{"type":"string"},"type":"array","title":"Cities","default":[]},"has_phone":{"type":"boolean","title":"Has Phone","default":true},"tag":{"type":"string","title":"Tag","default":"scrape"},"limit":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Limit"}},"type":"object","required":["location_id"],"title":"GhlContactsImportRequest"},"HTTPValidationError":{"properties":{"detail":{"items":{"$ref":"#/components/schemas/ValidationError"},"type":"array","title":"Detail"}},"type":"object","title":"HTTPValidationError"},"MessagingServiceCreateRequest":{"properties":{"subaccount_sid":{"type":"string","title":"Subaccount Sid"},"subaccount_auth_token":{"type":"string","title":"Subaccount Auth Token"},"friendly_name":{"type":"string","title":"Friendly Name"}},"type":"object","required":["subaccount_sid","subaccount_auth_token","friendly_name"],"title":"MessagingServiceCreateRequest"},"NumberAcquireRequest":{"properties":{"subaccount_sid":{"type":"string","title":"Subaccount Sid"},"area_code":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Area Code"},"city":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"City"},"state":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"State"},"poll_timeout_seconds":{"type":"integer","maximum":540.0,"minimum":0.0,"title":"Poll Timeout Seconds","default":300},"poll_interval_seconds":{"type":"integer","maximum":60.0,"minimum":5.0,"title":"Poll Interval Seconds","default":15},"ghl_location_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Ghl Location Id"}},"type":"object","required":["subaccount_sid"],"title":"NumberAcquireRequest"},"NumberPurchaseRequest":{"properties":{"subaccount_sid":{"type":"string","title":"Subaccount Sid"},"phone_number":{"type":"string","title":"Phone Number"},"ghl_location_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Ghl Location Id"}},"type":"object","required":["subaccount_sid","phone_number"],"title":"NumberPurchaseRequest"},"PreviewSheetRequest":{"properties":{"sheet_url":{"type":"string","title":"Sheet Url"},"location_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Location Id"}},"type":"object","required":["sheet_url"],"title":"PreviewSheetRequest"},"ProvisionRequest":{"properties":{"client_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Client Name"},"ghl_location_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Ghl Location Id"},"area_code":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Area Code"},"business_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Business Name"},"business_type":{"type":"string","title":"Business Type","default":"llc"},"business_ein":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Business Ein"},"business_website":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Business Website"},"business_industry":{"type":"string","title":"Business Industry","default":"REAL_ESTATE"},"rep_first_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Rep First Name"},"rep_last_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Rep Last Name"},"rep_email":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Rep Email"},"rep_phone":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Rep Phone"},"rep_job_position":{"type":"string","title":"Rep Job Position","default":"CEO"},"rep_title":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Rep Title"},"company_type":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Company Type"},"campaign_data":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Campaign Data"},"subaccount_sid":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Subaccount Sid"},"subaccount_friendly_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Subaccount Friendly Name"},"override_website":{"type":"boolean","title":"Override Website","default":false}},"type":"object","title":"ProvisionRequest"},"ResumeRequest":{"properties":{"from_milestone":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"From Milestone"},"website_override":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Website Override"}},"type":"object","title":"ResumeRequest"},"ScheduleDeleteRequest":{"properties":{"location_id":{"type":"string","title":"Location Id"},"reason":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Reason"}},"type":"object","required":["location_id"],"title":"ScheduleDeleteRequest"},"SearchQueriesRequest":{"properties":{"items":{"anyOf":[{"items":{"$ref":"#/components/schemas/SearchQueryItem"},"type":"array"},{"type":"null"}],"title":"Items"},"niches":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Niches"},"metros":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Metros"}},"type":"object","title":"SearchQueriesRequest","description":"Body for POST /search-queries.\n\nEither supply ``items`` directly (list of individual query dicts), or\nsupply ``niches`` + ``metros`` for a cartesian expansion:\n\n    niches: [\"roofing\", \"hvac\"]\n    metros: [\"Phoenix, AZ\", \"Scottsdale, AZ\"]\n\nBoth modes are idempotent (ON CONFLICT DO NOTHING on the DB side)."},"SearchQueryItem":{"properties":{"query":{"type":"string","title":"Query"},"city":{"type":"string","title":"City","default":""},"state":{"type":"string","title":"State","default":""},"zip":{"type":"string","title":"Zip","default":""},"priority":{"type":"integer","title":"Priority","default":0}},"type":"object","required":["query"],"title":"SearchQueryItem"},"UpdateByNameRequest":{"properties":{"name":{"type":"string","title":"Name"},"value":{"type":"string","title":"Value"},"location_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Location Id"}},"type":"object","required":["name","value"],"title":"UpdateByNameRequest"},"UpdateContactRequest":{"properties":{"location_id":{"type":"string","title":"Location Id"},"data":{"additionalProperties":true,"type":"object","title":"Data"}},"type":"object","required":["location_id","data"],"title":"UpdateContactRequest"},"UpdateCustomValueRequest":{"properties":{"location_id":{"type":"string","title":"Location Id"},"custom_value_id":{"type":"string","title":"Custom Value Id"},"value":{"type":"string","title":"Value"},"name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Name"}},"type":"object","required":["location_id","custom_value_id","value"],"title":"UpdateCustomValueRequest"},"UpsertContactRequest":{"properties":{"location_id":{"type":"string","title":"Location Id"},"data":{"additionalProperties":true,"type":"object","title":"Data"}},"type":"object","required":["location_id","data"],"title":"UpsertContactRequest"},"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"},"ZzzRenamePayload":{"properties":{"location_id":{"type":"string","title":"Location Id"},"company_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Company Id"}},"type":"object","required":["location_id"],"title":"ZzzRenamePayload"}},"securitySchemes":{"APIKeyHeader":{"type":"apiKey","in":"header","name":"X-Api-Key"}}},"tags":[{"name":"health","description":"Service liveness."},{"name":"ghl:tokens","description":"Read tokens from DB or trigger OAuth refresh / mint."},{"name":"ghl:locations","description":"Query GHL location metadata."},{"name":"ghl:webhooks","description":"Signed webhook receiver for GHL Marketplace events (Ed25519)."},{"name":"ghl:media","description":"GHL media library — list, upload, rename, delete."},{"name":"ghl:custom-values","description":"GHL custom values — list, create, update, bulk upsert."},{"name":"runware","description":"AI image generation via Runware, with optional GHL media upload."},{"name":"openai","description":"Text and image generation via OpenAI (gpt-4o, gpt-image-1, dall-e-3…), with optional GHL media upload."},{"name":"executions","description":"Background job execution history."},{"name":"cv","description":"Content pipeline — CV generation jobs."},{"name":"ghl:cancellation","description":"Client cancellation workflow — Twilio cleanup, DND, SaaS disable, ZZZ rename."},{"name":"twilio:numbers","description":"Search and purchase Twilio phone numbers."},{"name":"twilio:addresses","description":"Create and link E911 address records."},{"name":"twilio:messaging","description":"Create messaging services and assign phone numbers."},{"name":"twilio:brands","description":"A2P brand registration via TrustHub."},{"name":"twilio:campaigns","description":"10DLC campaign creation and status."},{"name":"twilio:provisioning","description":"Orchestrated provisioning pipeline and status polling."},{"name":"cron","description":"DB-backed cron job registry — list, create, update, delete, trigger."},{"name":"instantly","description":"Instantly cold-email lead pipeline — accounts, campaigns, leads, feeder."},{"name":"leads","description":"Lead sourcing via gosom/gmaps-runner — search queries, scrape trigger, health."},{"name":"keywords","description":"Keyword control panel — add, pause, resume, archive scrape niches."},{"name":"ghl:contacts","description":"GHL contacts — lookup, get, search, create, upsert, update, tags, deferred delete."},{"name":"ghl:custom-fields","description":"GHL contact custom fields — list and create."}]}