{"openapi":"3.1.0","info":{"title":"eSMS Africa SMS API","description":"SMS platform API - send messages, manage contacts, track delivery. Authenticate with `Authorization: Bearer <api_key>` (esms_live_ / esms_test_).","version":"1.0.0"},"paths":{"/health":{"get":{"summary":"Health","operationId":"health_health_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/auth/me":{"get":{"tags":["Auth"],"summary":"Get Me","description":"Current user info from JWT + balance from local DB.","operationId":"get_me_api_auth_me_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/v1/auth/me":{"get":{"tags":["Auth"],"summary":"Get Me","description":"Current user info from JWT + balance from local DB.","operationId":"get_me_v1_auth_me_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/balance":{"get":{"tags":["Balance"],"summary":"Get Balance","operationId":"get_balance_api_balance_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/balance/transactions":{"get":{"tags":["Balance"],"summary":"List Transactions","operationId":"list_transactions_api_balance_transactions_get","parameters":[{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":0,"default":0,"title":"Page"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":20,"title":"Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/balance/topup":{"post":{"tags":["Balance"],"summary":"Initiate Topup","description":"Redirect user to auth's Flutterwave checkout.","operationId":"initiate_topup_api_balance_topup_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/admin/balances/stats":{"get":{"tags":["Balance"],"summary":"Admin Balance Stats","description":"Aggregated balance analytics.","operationId":"admin_balance_stats_api_admin_balances_stats_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/admin/balances":{"get":{"tags":["Balance"],"summary":"Admin List Balances","operationId":"admin_list_balances_api_admin_balances_get","parameters":[{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":0,"default":0,"title":"Page"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":25,"title":"Limit"}},{"name":"search","in":"query","required":false,"schema":{"type":"string","default":"","title":"Search"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/balances/{user_id}/credit":{"post":{"tags":["Balance"],"summary":"Admin Credit","operationId":"admin_credit_api_admin_balances__user_id__credit_post","parameters":[{"name":"user_id","in":"path","required":true,"schema":{"type":"string","title":"User Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ManualAdjustment"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/balances/{user_id}/debit":{"post":{"tags":["Balance"],"summary":"Admin Debit","operationId":"admin_debit_api_admin_balances__user_id__debit_post","parameters":[{"name":"user_id","in":"path","required":true,"schema":{"type":"string","title":"User Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ManualAdjustment"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/balance":{"get":{"tags":["Balance"],"summary":"Get Balance","operationId":"get_balance_v1_balance_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/v1/balance/transactions":{"get":{"tags":["Balance"],"summary":"List Transactions","operationId":"list_transactions_v1_balance_transactions_get","parameters":[{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":0,"default":0,"title":"Page"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":20,"title":"Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/balance/topup":{"post":{"tags":["Balance"],"summary":"Initiate Topup","description":"Redirect user to auth's Flutterwave checkout.","operationId":"initiate_topup_v1_balance_topup_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/v1/admin/balances/stats":{"get":{"tags":["Balance"],"summary":"Admin Balance Stats","description":"Aggregated balance analytics.","operationId":"admin_balance_stats_v1_admin_balances_stats_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/v1/admin/balances":{"get":{"tags":["Balance"],"summary":"Admin List Balances","operationId":"admin_list_balances_v1_admin_balances_get","parameters":[{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":0,"default":0,"title":"Page"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":25,"title":"Limit"}},{"name":"search","in":"query","required":false,"schema":{"type":"string","default":"","title":"Search"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/admin/balances/{user_id}/credit":{"post":{"tags":["Balance"],"summary":"Admin Credit","operationId":"admin_credit_v1_admin_balances__user_id__credit_post","parameters":[{"name":"user_id","in":"path","required":true,"schema":{"type":"string","title":"User Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ManualAdjustment"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/admin/balances/{user_id}/debit":{"post":{"tags":["Balance"],"summary":"Admin Debit","operationId":"admin_debit_v1_admin_balances__user_id__debit_post","parameters":[{"name":"user_id","in":"path","required":true,"schema":{"type":"string","title":"User Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ManualAdjustment"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/messages/stats":{"get":{"tags":["Stats"],"summary":"Message Stats","operationId":"message_stats_api_messages_stats_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/messages/volume":{"get":{"tags":["Admin Stats"],"summary":"Message Volume","description":"Daily message volume (delivered/failed/pending) for bar chart.","operationId":"message_volume_api_messages_volume_get","parameters":[{"name":"days","in":"query","required":false,"schema":{"type":"integer","maximum":90,"minimum":1,"default":14,"title":"Days"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/routes/health":{"get":{"tags":["Admin Stats"],"summary":"Route Health","description":"Delivery rate per route in the last 60 minutes.","operationId":"route_health_api_routes_health_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/reports":{"get":{"tags":["Stats"],"summary":"Reports","description":"Aggregated delivery + cost analytics for the reports dashboard:\ntotals, per-status, per-country, and a daily timeseries over a date range.","operationId":"reports_api_reports_get","parameters":[{"name":"date_from","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"ISO date lower bound (default 30d ago)","title":"Date From"},"description":"ISO date lower bound (default 30d ago)"},{"name":"date_to","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"ISO date upper bound (default now)","title":"Date To"},"description":"ISO date upper bound (default now)"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/reports/breakdown":{"get":{"tags":["Stats"],"summary":"Reports Breakdown","description":"Spend broken down by campaign and by API key over a date range.","operationId":"reports_breakdown_api_reports_breakdown_get","parameters":[{"name":"date_from","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Date From"}},{"name":"date_to","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Date To"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/messages/stats":{"get":{"tags":["Stats"],"summary":"Message Stats","operationId":"message_stats_v1_messages_stats_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/v1/messages/volume":{"get":{"tags":["Admin Stats"],"summary":"Message Volume","description":"Daily message volume (delivered/failed/pending) for bar chart.","operationId":"message_volume_v1_messages_volume_get","parameters":[{"name":"days","in":"query","required":false,"schema":{"type":"integer","maximum":90,"minimum":1,"default":14,"title":"Days"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/routes/health":{"get":{"tags":["Admin Stats"],"summary":"Route Health","description":"Delivery rate per route in the last 60 minutes.","operationId":"route_health_v1_routes_health_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/v1/reports":{"get":{"tags":["Stats"],"summary":"Reports","description":"Aggregated delivery + cost analytics for the reports dashboard:\ntotals, per-status, per-country, and a daily timeseries over a date range.","operationId":"reports_v1_reports_get","parameters":[{"name":"date_from","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"ISO date lower bound (default 30d ago)","title":"Date From"},"description":"ISO date lower bound (default 30d ago)"},{"name":"date_to","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"ISO date upper bound (default now)","title":"Date To"},"description":"ISO date upper bound (default now)"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/reports/breakdown":{"get":{"tags":["Stats"],"summary":"Reports Breakdown","description":"Spend broken down by campaign and by API key over a date range.","operationId":"reports_breakdown_v1_reports_breakdown_get","parameters":[{"name":"date_from","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Date From"}},{"name":"date_to","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Date To"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/routes":{"get":{"tags":["Routes"],"summary":"List Routes","description":"All active routes with pricing.","operationId":"list_routes_api_routes_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/routes/{code}":{"get":{"tags":["Routes"],"summary":"Get Route","operationId":"get_route_api_routes__code__get","parameters":[{"name":"code","in":"path","required":true,"schema":{"type":"string","title":"Code"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/pricing":{"get":{"tags":["Routes"],"summary":"Public Pricing","description":"Public pricing - no auth required.","operationId":"public_pricing_api_pricing_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/pricing/marketing":{"get":{"tags":["Routes"],"summary":"Marketing Pricing","description":"Public, no-auth. Live per-country tiered pricing for the marketing site.\n\nKeyed by country name, matching the marketing page's `pricingData` shape:\n{ \"Kenya\": { basic|business|enterprise: { local:{price,range,symbol}, international:{...} } } }","operationId":"marketing_pricing_api_pricing_marketing_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/admin/routes":{"get":{"tags":["Routes"],"summary":"Admin List All Routes","description":"All routes including inactive, with cost data.","operationId":"admin_list_all_routes_api_admin_routes_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}},"post":{"tags":["Routes"],"summary":"Admin Create Route","operationId":"admin_create_route_api_admin_routes_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateRoute"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/routes/{code}":{"delete":{"tags":["Routes"],"summary":"Admin Delete Route","operationId":"admin_delete_route_api_admin_routes__code__delete","parameters":[{"name":"code","in":"path","required":true,"schema":{"type":"string","title":"Code"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"put":{"tags":["Routes"],"summary":"Admin Update Route","operationId":"admin_update_route_api_admin_routes__code__put","parameters":[{"name":"code","in":"path","required":true,"schema":{"type":"string","title":"Code"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateRoute"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/routes":{"get":{"tags":["Routes"],"summary":"List Routes","description":"All active routes with pricing.","operationId":"list_routes_v1_routes_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/v1/routes/{code}":{"get":{"tags":["Routes"],"summary":"Get Route","operationId":"get_route_v1_routes__code__get","parameters":[{"name":"code","in":"path","required":true,"schema":{"type":"string","title":"Code"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/pricing":{"get":{"tags":["Routes"],"summary":"Public Pricing","description":"Public pricing - no auth required.","operationId":"public_pricing_v1_pricing_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/v1/pricing/marketing":{"get":{"tags":["Routes"],"summary":"Marketing Pricing","description":"Public, no-auth. Live per-country tiered pricing for the marketing site.\n\nKeyed by country name, matching the marketing page's `pricingData` shape:\n{ \"Kenya\": { basic|business|enterprise: { local:{price,range,symbol}, international:{...} } } }","operationId":"marketing_pricing_v1_pricing_marketing_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/v1/admin/routes":{"get":{"tags":["Routes"],"summary":"Admin List All Routes","description":"All routes including inactive, with cost data.","operationId":"admin_list_all_routes_v1_admin_routes_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}},"post":{"tags":["Routes"],"summary":"Admin Create Route","operationId":"admin_create_route_v1_admin_routes_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateRoute"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/admin/routes/{code}":{"delete":{"tags":["Routes"],"summary":"Admin Delete Route","operationId":"admin_delete_route_v1_admin_routes__code__delete","parameters":[{"name":"code","in":"path","required":true,"schema":{"type":"string","title":"Code"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"put":{"tags":["Routes"],"summary":"Admin Update Route","operationId":"admin_update_route_v1_admin_routes__code__put","parameters":[{"name":"code","in":"path","required":true,"schema":{"type":"string","title":"Code"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateRoute"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/rate":{"post":{"tags":["Messages"],"summary":"Rate Check","description":"Price a message BEFORE sending - no charge, no delivery.\n\nReturns the encoding, segment count and the cost per recipient (in both the\nroute currency and the caller's wallet currency), using the exact same\nengine that billing uses (analyze_message + price_per_segment + fx). Handy\nfor showing a live cost estimate in a UI or reconciling spend.","operationId":"rate_check_api_rate_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RateRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/messages/rate":{"post":{"tags":["Messages"],"summary":"Rate Check","description":"Price a message BEFORE sending - no charge, no delivery.\n\nReturns the encoding, segment count and the cost per recipient (in both the\nroute currency and the caller's wallet currency), using the exact same\nengine that billing uses (analyze_message + price_per_segment + fx). Handy\nfor showing a live cost estimate in a UI or reconciling spend.","operationId":"rate_check_api_messages_rate_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RateRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/validate":{"post":{"tags":["Messages"],"summary":"Validate Numbers","description":"Validate recipient numbers before sending - format, validity, line type\nand assigned carrier (offline libphonenumber; no HLR network call, no\ncharge). Reject non-mobile or invalid numbers early to save spend.","operationId":"validate_numbers_api_validate_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ValidateRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/messages/validate":{"post":{"tags":["Messages"],"summary":"Validate Numbers","description":"Validate recipient numbers before sending - format, validity, line type\nand assigned carrier (offline libphonenumber; no HLR network call, no\ncharge). Reject non-mobile or invalid numbers early to save spend.","operationId":"validate_numbers_api_messages_validate_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ValidateRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/messages/send":{"post":{"tags":["Messages"],"summary":"Send Single","operationId":"send_single_api_messages_send_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SendRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/messages":{"get":{"tags":["Messages"],"summary":"List Messages","operationId":"list_messages_api_messages_get","parameters":[{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":0,"default":0,"title":"Page"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":20,"title":"Limit"}},{"name":"status","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Status"}},{"name":"environment","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"live | test | all","title":"Environment"},"description":"live | test | all"},{"name":"to","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Filter by recipient phone (E.164)","title":"To"},"description":"Filter by recipient phone (E.164)"},{"name":"batch_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Filter by bulk batch id","title":"Batch Id"},"description":"Filter by bulk batch id"},{"name":"date_from","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"ISO date/datetime lower bound (created_at)","title":"Date From"},"description":"ISO date/datetime lower bound (created_at)"},{"name":"date_to","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"ISO date/datetime upper bound (created_at)","title":"Date To"},"description":"ISO date/datetime upper bound (created_at)"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/messages/status":{"get":{"tags":["Messages"],"summary":"Batch Status","description":"Look up delivery status for many messages in one call.","operationId":"batch_status_api_messages_status_get","parameters":[{"name":"ids","in":"query","required":true,"schema":{"type":"string","description":"Comma-separated message ids (max 100)","title":"Ids"},"description":"Comma-separated message ids (max 100)"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/messages/batch/{batch_id}":{"get":{"tags":["Messages"],"summary":"Batch Summary","description":"Aggregate status of a bulk batch (returned as batch_id by /messages/send-bulk),\nplus a paginated list of its member messages - so a developer can track a blast\nthey launched via the API.","operationId":"batch_summary_api_messages_batch__batch_id__get","parameters":[{"name":"batch_id","in":"path","required":true,"schema":{"type":"string","title":"Batch Id"}},{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":0,"default":0,"title":"Page"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":200,"minimum":1,"default":50,"title":"Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/messages/export":{"get":{"tags":["Messages"],"summary":"Export Messages Csv","description":"Export messages as CSV download (live traffic; test keys get test traffic,\nmatching the /messages list isolation).","operationId":"export_messages_csv_api_messages_export_get","parameters":[{"name":"status","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Status"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/messages/{message_id}":{"get":{"tags":["Messages"],"summary":"Get Message","operationId":"get_message_api_messages__message_id__get","parameters":[{"name":"message_id","in":"path","required":true,"schema":{"type":"string","title":"Message Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/messages/{message_id}/retry":{"post":{"tags":["Messages"],"summary":"Retry Message","operationId":"retry_message_api_messages__message_id__retry_post","parameters":[{"name":"message_id","in":"path","required":true,"schema":{"type":"string","title":"Message Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/messages":{"get":{"tags":["Messages"],"summary":"Admin List Messages","operationId":"admin_list_messages_api_admin_messages_get","parameters":[{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":0,"default":0,"title":"Page"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":20,"title":"Limit"}},{"name":"status","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Status"}},{"name":"user_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"User Id"}},{"name":"search","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Search"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/rate":{"post":{"tags":["Messages"],"summary":"Rate Check","description":"Price a message BEFORE sending - no charge, no delivery.\n\nReturns the encoding, segment count and the cost per recipient (in both the\nroute currency and the caller's wallet currency), using the exact same\nengine that billing uses (analyze_message + price_per_segment + fx). Handy\nfor showing a live cost estimate in a UI or reconciling spend.","operationId":"rate_check_v1_rate_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RateRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/messages/rate":{"post":{"tags":["Messages"],"summary":"Rate Check","description":"Price a message BEFORE sending - no charge, no delivery.\n\nReturns the encoding, segment count and the cost per recipient (in both the\nroute currency and the caller's wallet currency), using the exact same\nengine that billing uses (analyze_message + price_per_segment + fx). Handy\nfor showing a live cost estimate in a UI or reconciling spend.","operationId":"rate_check_v1_messages_rate_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RateRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/validate":{"post":{"tags":["Messages"],"summary":"Validate Numbers","description":"Validate recipient numbers before sending - format, validity, line type\nand assigned carrier (offline libphonenumber; no HLR network call, no\ncharge). Reject non-mobile or invalid numbers early to save spend.","operationId":"validate_numbers_v1_validate_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ValidateRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/messages/validate":{"post":{"tags":["Messages"],"summary":"Validate Numbers","description":"Validate recipient numbers before sending - format, validity, line type\nand assigned carrier (offline libphonenumber; no HLR network call, no\ncharge). Reject non-mobile or invalid numbers early to save spend.","operationId":"validate_numbers_v1_messages_validate_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ValidateRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/messages/send":{"post":{"tags":["Messages"],"summary":"Send Single","operationId":"send_single_v1_messages_send_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SendRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/messages":{"get":{"tags":["Messages"],"summary":"List Messages","operationId":"list_messages_v1_messages_get","parameters":[{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":0,"default":0,"title":"Page"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":20,"title":"Limit"}},{"name":"status","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Status"}},{"name":"environment","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"live | test | all","title":"Environment"},"description":"live | test | all"},{"name":"to","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Filter by recipient phone (E.164)","title":"To"},"description":"Filter by recipient phone (E.164)"},{"name":"batch_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Filter by bulk batch id","title":"Batch Id"},"description":"Filter by bulk batch id"},{"name":"date_from","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"ISO date/datetime lower bound (created_at)","title":"Date From"},"description":"ISO date/datetime lower bound (created_at)"},{"name":"date_to","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"ISO date/datetime upper bound (created_at)","title":"Date To"},"description":"ISO date/datetime upper bound (created_at)"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/messages/status":{"get":{"tags":["Messages"],"summary":"Batch Status","description":"Look up delivery status for many messages in one call.","operationId":"batch_status_v1_messages_status_get","parameters":[{"name":"ids","in":"query","required":true,"schema":{"type":"string","description":"Comma-separated message ids (max 100)","title":"Ids"},"description":"Comma-separated message ids (max 100)"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/messages/batch/{batch_id}":{"get":{"tags":["Messages"],"summary":"Batch Summary","description":"Aggregate status of a bulk batch (returned as batch_id by /messages/send-bulk),\nplus a paginated list of its member messages - so a developer can track a blast\nthey launched via the API.","operationId":"batch_summary_v1_messages_batch__batch_id__get","parameters":[{"name":"batch_id","in":"path","required":true,"schema":{"type":"string","title":"Batch Id"}},{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":0,"default":0,"title":"Page"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":200,"minimum":1,"default":50,"title":"Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/messages/export":{"get":{"tags":["Messages"],"summary":"Export Messages Csv","description":"Export messages as CSV download (live traffic; test keys get test traffic,\nmatching the /messages list isolation).","operationId":"export_messages_csv_v1_messages_export_get","parameters":[{"name":"status","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Status"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/messages/{message_id}":{"get":{"tags":["Messages"],"summary":"Get Message","operationId":"get_message_v1_messages__message_id__get","parameters":[{"name":"message_id","in":"path","required":true,"schema":{"type":"string","title":"Message Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/messages/{message_id}/retry":{"post":{"tags":["Messages"],"summary":"Retry Message","operationId":"retry_message_v1_messages__message_id__retry_post","parameters":[{"name":"message_id","in":"path","required":true,"schema":{"type":"string","title":"Message Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/admin/messages":{"get":{"tags":["Messages"],"summary":"Admin List Messages","operationId":"admin_list_messages_v1_admin_messages_get","parameters":[{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":0,"default":0,"title":"Page"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":20,"title":"Limit"}},{"name":"status","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Status"}},{"name":"user_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"User Id"}},{"name":"search","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Search"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/api-keys":{"get":{"tags":["API Keys"],"summary":"List Keys","operationId":"list_keys_api_api_keys_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}},"post":{"tags":["API Keys"],"summary":"Create Key","description":"Create a new API key. The full key is returned ONCE - store it securely.","operationId":"create_key_api_api_keys_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateKeyRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/api-keys/{key_id}":{"delete":{"tags":["API Keys"],"summary":"Revoke Key","operationId":"revoke_key_api_api_keys__key_id__delete","parameters":[{"name":"key_id","in":"path","required":true,"schema":{"type":"integer","title":"Key Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/api-keys":{"get":{"tags":["API Keys"],"summary":"List Keys","operationId":"list_keys_v1_api_keys_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}},"post":{"tags":["API Keys"],"summary":"Create Key","description":"Create a new API key. The full key is returned ONCE - store it securely.","operationId":"create_key_v1_api_keys_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateKeyRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/api-keys/{key_id}":{"delete":{"tags":["API Keys"],"summary":"Revoke Key","operationId":"revoke_key_v1_api_keys__key_id__delete","parameters":[{"name":"key_id","in":"path","required":true,"schema":{"type":"integer","title":"Key Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/contact-lists":{"get":{"tags":["Contacts"],"summary":"List Contact Lists","operationId":"list_contact_lists_api_contact_lists_get","parameters":[{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":0,"default":0,"title":"Page"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":20,"title":"Limit"}},{"name":"tag","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Tag"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["Contacts"],"summary":"Create Contact List","description":"Upload a CSV to create a contact list. First row = headers.","operationId":"create_contact_list_api_contact_lists_post","requestBody":{"required":true,"content":{"multipart/form-data":{"schema":{"$ref":"#/components/schemas/Body_create_contact_list_api_contact_lists_post"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/contact-lists/{list_id}":{"get":{"tags":["Contacts"],"summary":"Get Contact List","operationId":"get_contact_list_api_contact_lists__list_id__get","parameters":[{"name":"list_id","in":"path","required":true,"schema":{"type":"integer","title":"List Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["Contacts"],"summary":"Delete Contact List","operationId":"delete_contact_list_api_contact_lists__list_id__delete","parameters":[{"name":"list_id","in":"path","required":true,"schema":{"type":"integer","title":"List Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/contact-lists/{list_id}/contacts":{"get":{"tags":["Contacts"],"summary":"List Contacts","operationId":"list_contacts_api_contact_lists__list_id__contacts_get","parameters":[{"name":"list_id","in":"path","required":true,"schema":{"type":"integer","title":"List Id"}},{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":0,"default":0,"title":"Page"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":20,"title":"Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["Contacts"],"summary":"Add Contact","operationId":"add_contact_api_contact_lists__list_id__contacts_post","parameters":[{"name":"list_id","in":"path","required":true,"schema":{"type":"integer","title":"List Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ContactIn"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/contacts/{contact_id}":{"patch":{"tags":["Contacts"],"summary":"Update Contact","operationId":"update_contact_api_contacts__contact_id__patch","parameters":[{"name":"contact_id","in":"path","required":true,"schema":{"type":"integer","title":"Contact Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ContactIn"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["Contacts"],"summary":"Delete Contact","operationId":"delete_contact_api_contacts__contact_id__delete","parameters":[{"name":"contact_id","in":"path","required":true,"schema":{"type":"integer","title":"Contact Id"}}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/contact-lists/{list_id}/export":{"get":{"tags":["Contacts"],"summary":"Export Contacts","description":"Download every contact in a list as CSV (phone, name, + any custom fields).","operationId":"export_contacts_api_contact_lists__list_id__export_get","parameters":[{"name":"list_id","in":"path","required":true,"schema":{"type":"integer","title":"List Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/contact-lists":{"get":{"tags":["Contacts"],"summary":"List Contact Lists","operationId":"list_contact_lists_v1_contact_lists_get","parameters":[{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":0,"default":0,"title":"Page"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":20,"title":"Limit"}},{"name":"tag","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Tag"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["Contacts"],"summary":"Create Contact List","description":"Upload a CSV to create a contact list. First row = headers.","operationId":"create_contact_list_v1_contact_lists_post","requestBody":{"required":true,"content":{"multipart/form-data":{"schema":{"$ref":"#/components/schemas/Body_create_contact_list_v1_contact_lists_post"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/contact-lists/{list_id}":{"get":{"tags":["Contacts"],"summary":"Get Contact List","operationId":"get_contact_list_v1_contact_lists__list_id__get","parameters":[{"name":"list_id","in":"path","required":true,"schema":{"type":"integer","title":"List Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["Contacts"],"summary":"Delete Contact List","operationId":"delete_contact_list_v1_contact_lists__list_id__delete","parameters":[{"name":"list_id","in":"path","required":true,"schema":{"type":"integer","title":"List Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/contact-lists/{list_id}/contacts":{"get":{"tags":["Contacts"],"summary":"List Contacts","operationId":"list_contacts_v1_contact_lists__list_id__contacts_get","parameters":[{"name":"list_id","in":"path","required":true,"schema":{"type":"integer","title":"List Id"}},{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":0,"default":0,"title":"Page"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":20,"title":"Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["Contacts"],"summary":"Add Contact","operationId":"add_contact_v1_contact_lists__list_id__contacts_post","parameters":[{"name":"list_id","in":"path","required":true,"schema":{"type":"integer","title":"List Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ContactIn"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/contacts/{contact_id}":{"patch":{"tags":["Contacts"],"summary":"Update Contact","operationId":"update_contact_v1_contacts__contact_id__patch","parameters":[{"name":"contact_id","in":"path","required":true,"schema":{"type":"integer","title":"Contact Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ContactIn"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["Contacts"],"summary":"Delete Contact","operationId":"delete_contact_v1_contacts__contact_id__delete","parameters":[{"name":"contact_id","in":"path","required":true,"schema":{"type":"integer","title":"Contact Id"}}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/contact-lists/{list_id}/export":{"get":{"tags":["Contacts"],"summary":"Export Contacts","description":"Download every contact in a list as CSV (phone, name, + any custom fields).","operationId":"export_contacts_v1_contact_lists__list_id__export_get","parameters":[{"name":"list_id","in":"path","required":true,"schema":{"type":"integer","title":"List Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/sender-ids":{"get":{"tags":["Sender IDs"],"summary":"List Sender Ids","operationId":"list_sender_ids_api_sender_ids_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}},"post":{"tags":["Sender IDs"],"summary":"Request Sender Id","operationId":"request_sender_id_api_sender_ids_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RequestSenderID"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/sender-ids/fees":{"get":{"tags":["Sender IDs"],"summary":"Sender ID registration fees by country (public)","description":"Sender ID registration pricing for all 54 African countries. **No\nauthentication**; cacheable for 5 minutes.\n\nEach row in `countries` is one of:\n- `fee_type: \"one_time\"` - a flat `fee_usd` charged once per country,\n  covering registration on all networks (`covers: \"all_networks\"`).\n- `fee_type: \"per_network\"` - `fee_usd` null; `fee_table` lists\n  `[network, setup, recurring]` in local currency.\n- `fee_type: \"on_request\"` - fees are confirmed during onboarding.\n\nFlat fees are charged from the wallet only when a request is approved -\nnothing on rejection. `fees` (country -> flat USD fee) and `note` are kept\nfor older clients.","operationId":"sender_id_fees_api_sender_ids_fees_get","responses":{"200":{"description":"One row per African country (54)","content":{"application/json":{"schema":{}}}}}}},"/api/sender-ids/default":{"get":{"tags":["Sender IDs"],"summary":"Get Default Sender","description":"The built-in default sender ID assigned to this account's country.\n\nUsed without approval when sending without a custom sender. Users can still\nrequest their own brand sender IDs below.","operationId":"get_default_sender_api_sender_ids_default_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/admin/sender-requests":{"get":{"tags":["Sender IDs"],"summary":"Admin List Requests","operationId":"admin_list_requests_api_admin_sender_requests_get","parameters":[{"name":"status_filter","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Status Filter"}},{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":0,"default":0,"title":"Page"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":50,"title":"Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/sender-ids":{"post":{"tags":["Sender IDs"],"summary":"Admin Create Sender Id","description":"Admin directly creates an approved sender ID and assigns it to a user.","operationId":"admin_create_sender_id_api_admin_sender_ids_post","requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AdminCreateSenderID"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"get":{"tags":["Sender IDs"],"summary":"Admin List All Senders","description":"List ALL sender IDs across all users.","operationId":"admin_list_all_senders_api_admin_sender_ids_get","parameters":[{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":0,"default":0,"title":"Page"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":200,"minimum":1,"default":50,"title":"Limit"}},{"name":"status_filter","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Status Filter"}},{"name":"user_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"User Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/sender-ids/{sender_id}":{"delete":{"tags":["Sender IDs"],"summary":"Admin Delete Sender","operationId":"admin_delete_sender_api_admin_sender_ids__sender_id__delete","parameters":[{"name":"sender_id","in":"path","required":true,"schema":{"type":"integer","title":"Sender Id"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/DeleteSenderID","default":{}}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"patch":{"tags":["Sender IDs"],"summary":"Admin Edit Sender","description":"Edit an allocated sender ID and notify the user.","operationId":"admin_edit_sender_api_admin_sender_ids__sender_id__patch","parameters":[{"name":"sender_id","in":"path","required":true,"schema":{"type":"integer","title":"Sender Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/EditSenderID"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"put":{"tags":["Sender IDs"],"summary":"Admin Review Sender","operationId":"admin_review_sender_api_admin_sender_ids__sender_id__put","parameters":[{"name":"sender_id","in":"path","required":true,"schema":{"type":"integer","title":"Sender Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ReviewSenderID"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/restrictions":{"get":{"tags":["Sender IDs"],"summary":"List Restrictions","operationId":"list_restrictions_api_admin_restrictions_get","parameters":[{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":0,"default":0,"title":"Page"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":200,"minimum":1,"default":50,"title":"Limit"}},{"name":"is_active","in":"query","required":false,"schema":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Is Active"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["Sender IDs"],"summary":"Create Restriction","operationId":"create_restriction_api_admin_restrictions_post","requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateRestriction"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/restrictions/{restriction_id}":{"patch":{"tags":["Sender IDs"],"summary":"Update Restriction","operationId":"update_restriction_api_admin_restrictions__restriction_id__patch","parameters":[{"name":"restriction_id","in":"path","required":true,"schema":{"type":"integer","title":"Restriction Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateRestriction"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["Sender IDs"],"summary":"Delete Restriction","operationId":"delete_restriction_api_admin_restrictions__restriction_id__delete","parameters":[{"name":"restriction_id","in":"path","required":true,"schema":{"type":"integer","title":"Restriction Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/sender-ids":{"get":{"tags":["Sender IDs"],"summary":"List Sender Ids","operationId":"list_sender_ids_v1_sender_ids_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}},"post":{"tags":["Sender IDs"],"summary":"Request Sender Id","operationId":"request_sender_id_v1_sender_ids_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RequestSenderID"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/sender-ids/fees":{"get":{"tags":["Sender IDs"],"summary":"Sender ID registration fees by country (public)","description":"Sender ID registration pricing for all 54 African countries. **No\nauthentication**; cacheable for 5 minutes.\n\nEach row in `countries` is one of:\n- `fee_type: \"one_time\"` - a flat `fee_usd` charged once per country,\n  covering registration on all networks (`covers: \"all_networks\"`).\n- `fee_type: \"per_network\"` - `fee_usd` null; `fee_table` lists\n  `[network, setup, recurring]` in local currency.\n- `fee_type: \"on_request\"` - fees are confirmed during onboarding.\n\nFlat fees are charged from the wallet only when a request is approved -\nnothing on rejection. `fees` (country -> flat USD fee) and `note` are kept\nfor older clients.","operationId":"sender_id_fees_v1_sender_ids_fees_get","responses":{"200":{"description":"One row per African country (54)","content":{"application/json":{"schema":{}}}}}}},"/v1/sender-ids/default":{"get":{"tags":["Sender IDs"],"summary":"Get Default Sender","description":"The built-in default sender ID assigned to this account's country.\n\nUsed without approval when sending without a custom sender. Users can still\nrequest their own brand sender IDs below.","operationId":"get_default_sender_v1_sender_ids_default_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/v1/admin/sender-requests":{"get":{"tags":["Sender IDs"],"summary":"Admin List Requests","operationId":"admin_list_requests_v1_admin_sender_requests_get","parameters":[{"name":"status_filter","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Status Filter"}},{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":0,"default":0,"title":"Page"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":50,"title":"Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/admin/sender-ids":{"post":{"tags":["Sender IDs"],"summary":"Admin Create Sender Id","description":"Admin directly creates an approved sender ID and assigns it to a user.","operationId":"admin_create_sender_id_v1_admin_sender_ids_post","requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AdminCreateSenderID"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"get":{"tags":["Sender IDs"],"summary":"Admin List All Senders","description":"List ALL sender IDs across all users.","operationId":"admin_list_all_senders_v1_admin_sender_ids_get","parameters":[{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":0,"default":0,"title":"Page"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":200,"minimum":1,"default":50,"title":"Limit"}},{"name":"status_filter","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Status Filter"}},{"name":"user_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"User Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/admin/sender-ids/{sender_id}":{"delete":{"tags":["Sender IDs"],"summary":"Admin Delete Sender","operationId":"admin_delete_sender_v1_admin_sender_ids__sender_id__delete","parameters":[{"name":"sender_id","in":"path","required":true,"schema":{"type":"integer","title":"Sender Id"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/DeleteSenderID","default":{}}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"patch":{"tags":["Sender IDs"],"summary":"Admin Edit Sender","description":"Edit an allocated sender ID and notify the user.","operationId":"admin_edit_sender_v1_admin_sender_ids__sender_id__patch","parameters":[{"name":"sender_id","in":"path","required":true,"schema":{"type":"integer","title":"Sender Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/EditSenderID"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"put":{"tags":["Sender IDs"],"summary":"Admin Review Sender","operationId":"admin_review_sender_v1_admin_sender_ids__sender_id__put","parameters":[{"name":"sender_id","in":"path","required":true,"schema":{"type":"integer","title":"Sender Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ReviewSenderID"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/admin/restrictions":{"get":{"tags":["Sender IDs"],"summary":"List Restrictions","operationId":"list_restrictions_v1_admin_restrictions_get","parameters":[{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":0,"default":0,"title":"Page"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":200,"minimum":1,"default":50,"title":"Limit"}},{"name":"is_active","in":"query","required":false,"schema":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Is Active"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["Sender IDs"],"summary":"Create Restriction","operationId":"create_restriction_v1_admin_restrictions_post","requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateRestriction"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/admin/restrictions/{restriction_id}":{"patch":{"tags":["Sender IDs"],"summary":"Update Restriction","operationId":"update_restriction_v1_admin_restrictions__restriction_id__patch","parameters":[{"name":"restriction_id","in":"path","required":true,"schema":{"type":"integer","title":"Restriction Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateRestriction"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["Sender IDs"],"summary":"Delete Restriction","operationId":"delete_restriction_v1_admin_restrictions__restriction_id__delete","parameters":[{"name":"restriction_id","in":"path","required":true,"schema":{"type":"integer","title":"Restriction Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/notifications":{"get":{"tags":["Notifications"],"summary":"List Notifications","operationId":"list_notifications_api_notifications_get","parameters":[{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":0,"default":0,"title":"Page"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":20,"title":"Limit"}},{"name":"type_filter","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Type Filter"}},{"name":"unread_only","in":"query","required":false,"schema":{"type":"boolean","default":false,"title":"Unread Only"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/notifications/unread-count":{"get":{"tags":["Notifications"],"summary":"Unread Count","operationId":"unread_count_api_notifications_unread_count_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/notifications/{notif_id}/read":{"post":{"tags":["Notifications"],"summary":"Mark Read","operationId":"mark_read_api_notifications__notif_id__read_post","parameters":[{"name":"notif_id","in":"path","required":true,"schema":{"type":"integer","title":"Notif Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/notifications/read-all":{"post":{"tags":["Notifications"],"summary":"Mark All Read","operationId":"mark_all_read_api_notifications_read_all_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/v1/notifications":{"get":{"tags":["Notifications"],"summary":"List Notifications","operationId":"list_notifications_v1_notifications_get","parameters":[{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":0,"default":0,"title":"Page"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":20,"title":"Limit"}},{"name":"type_filter","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Type Filter"}},{"name":"unread_only","in":"query","required":false,"schema":{"type":"boolean","default":false,"title":"Unread Only"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/notifications/unread-count":{"get":{"tags":["Notifications"],"summary":"Unread Count","operationId":"unread_count_v1_notifications_unread_count_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/v1/notifications/{notif_id}/read":{"post":{"tags":["Notifications"],"summary":"Mark Read","operationId":"mark_read_v1_notifications__notif_id__read_post","parameters":[{"name":"notif_id","in":"path","required":true,"schema":{"type":"integer","title":"Notif Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/notifications/read-all":{"post":{"tags":["Notifications"],"summary":"Mark All Read","operationId":"mark_all_read_v1_notifications_read_all_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/workspace":{"get":{"tags":["Settings"],"summary":"Get Workspace","operationId":"get_workspace_api_workspace_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}},"put":{"tags":["Settings"],"summary":"Update Workspace","operationId":"update_workspace_api_workspace_put","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateWorkspace"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/webhooks":{"get":{"tags":["Settings"],"summary":"Get Webhooks","operationId":"get_webhooks_api_webhooks_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}},"put":{"tags":["Settings"],"summary":"Update Webhooks","operationId":"update_webhooks_api_webhooks_put","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateWebhooks"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/webhooks/test":{"post":{"tags":["Settings"],"summary":"Send Test Event","description":"Send sample HMAC-signed DLR + MO events to the configured endpoints so\nusers can verify their integration.","operationId":"send_test_event_api_webhooks_test_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/webhooks/rotate-secret":{"post":{"tags":["Settings"],"summary":"Rotate Secret","operationId":"rotate_secret_api_webhooks_rotate_secret_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/v1/workspace":{"get":{"tags":["Settings"],"summary":"Get Workspace","operationId":"get_workspace_v1_workspace_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}},"put":{"tags":["Settings"],"summary":"Update Workspace","operationId":"update_workspace_v1_workspace_put","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateWorkspace"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/webhooks":{"get":{"tags":["Settings"],"summary":"Get Webhooks","operationId":"get_webhooks_v1_webhooks_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}},"put":{"tags":["Settings"],"summary":"Update Webhooks","operationId":"update_webhooks_v1_webhooks_put","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateWebhooks"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/webhooks/test":{"post":{"tags":["Settings"],"summary":"Send Test Event","description":"Send sample HMAC-signed DLR + MO events to the configured endpoints so\nusers can verify their integration.","operationId":"send_test_event_v1_webhooks_test_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/v1/webhooks/rotate-secret":{"post":{"tags":["Settings"],"summary":"Rotate Secret","operationId":"rotate_secret_v1_webhooks_rotate_secret_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/admin/stats":{"get":{"tags":["Admin Stats"],"summary":"Admin Stats","operationId":"admin_stats_api_admin_stats_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/admin/revenue":{"get":{"tags":["Admin Stats"],"summary":"Admin Revenue","description":"Revenue breakdown by route over the specified period. All figures in USD.","operationId":"admin_revenue_api_admin_revenue_get","parameters":[{"name":"days","in":"query","required":false,"schema":{"type":"integer","maximum":365,"minimum":1,"default":30,"title":"Days"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/fx-rates":{"get":{"tags":["Admin Stats"],"summary":"Admin Get Fx Rates","description":"Get current exchange rates (units per 1 USD).","operationId":"admin_get_fx_rates_api_admin_fx_rates_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}},"put":{"tags":["Admin Stats"],"summary":"Admin Update Fx Rates","description":"Update exchange rates. Keys are currency codes, values are units per 1 USD.","operationId":"admin_update_fx_rates_api_admin_fx_rates_put","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateRatesBody"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/users":{"get":{"tags":["Admin Stats"],"summary":"Admin List Users","description":"Proxy user search to auth service - returns id, email, name, company.","operationId":"admin_list_users_api_admin_users_get","parameters":[{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":0,"default":0,"title":"Page"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":200,"minimum":1,"default":50,"title":"Limit"}},{"name":"search","in":"query","required":false,"schema":{"type":"string","default":"","title":"Search"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/admin/stats":{"get":{"tags":["Admin Stats"],"summary":"Admin Stats","operationId":"admin_stats_v1_admin_stats_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/v1/admin/revenue":{"get":{"tags":["Admin Stats"],"summary":"Admin Revenue","description":"Revenue breakdown by route over the specified period. All figures in USD.","operationId":"admin_revenue_v1_admin_revenue_get","parameters":[{"name":"days","in":"query","required":false,"schema":{"type":"integer","maximum":365,"minimum":1,"default":30,"title":"Days"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/admin/fx-rates":{"get":{"tags":["Admin Stats"],"summary":"Admin Get Fx Rates","description":"Get current exchange rates (units per 1 USD).","operationId":"admin_get_fx_rates_v1_admin_fx_rates_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}},"put":{"tags":["Admin Stats"],"summary":"Admin Update Fx Rates","description":"Update exchange rates. Keys are currency codes, values are units per 1 USD.","operationId":"admin_update_fx_rates_v1_admin_fx_rates_put","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateRatesBody"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/admin/users":{"get":{"tags":["Admin Stats"],"summary":"Admin List Users","description":"Proxy user search to auth service - returns id, email, name, company.","operationId":"admin_list_users_v1_admin_users_get","parameters":[{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":0,"default":0,"title":"Page"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":200,"minimum":1,"default":50,"title":"Limit"}},{"name":"search","in":"query","required":false,"schema":{"type":"string","default":"","title":"Search"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/messages/bulk-precheck":{"post":{"tags":["Bulk Send"],"summary":"Bulk Precheck","description":"Analyze a bulk send before executing - returns per-country breakdown,\ntotal cost in user's wallet currency, and balance after.","operationId":"bulk_precheck_api_messages_bulk_precheck_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PreCheckRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/messages/send-bulk":{"post":{"tags":["Bulk Send"],"summary":"Send Bulk","operationId":"send_bulk_api_messages_send_bulk_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BulkSendRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BulkSendResult"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/messages/bulk-precheck":{"post":{"tags":["Bulk Send"],"summary":"Bulk Precheck","description":"Analyze a bulk send before executing - returns per-country breakdown,\ntotal cost in user's wallet currency, and balance after.","operationId":"bulk_precheck_v1_messages_bulk_precheck_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PreCheckRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/messages/send-bulk":{"post":{"tags":["Bulk Send"],"summary":"Send Bulk","operationId":"send_bulk_v1_messages_send_bulk_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BulkSendRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BulkSendResult"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/product-requests/catalogue":{"get":{"tags":["Inquiries"],"summary":"Product Catalogue","operationId":"product_catalogue_api_product_requests_catalogue_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/product-requests":{"post":{"tags":["Inquiries"],"summary":"Create Product Request","description":"A logged-in customer applies for a carrier product (sender ID, shortcode,\npremium, USSD, SMPP). Stored as an Inquiry - reviewed under Admin -> Inquiries.","operationId":"create_product_request_api_product_requests_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProductRequestIn"}}},"required":true},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/inquiries":{"get":{"tags":["Inquiries"],"summary":"List Inquiries","operationId":"list_inquiries_api_admin_inquiries_get","parameters":[{"name":"status","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Status"}},{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":0,"default":0,"title":"Page"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":20,"title":"Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/inquiries/{inquiry_id}":{"patch":{"tags":["Inquiries"],"summary":"Update Inquiry","operationId":"update_inquiry_api_admin_inquiries__inquiry_id__patch","parameters":[{"name":"inquiry_id","in":"path","required":true,"schema":{"type":"integer","title":"Inquiry Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/InquiryUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/product-requests/catalogue":{"get":{"tags":["Inquiries"],"summary":"Product Catalogue","operationId":"product_catalogue_v1_product_requests_catalogue_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/v1/product-requests":{"post":{"tags":["Inquiries"],"summary":"Create Product Request","description":"A logged-in customer applies for a carrier product (sender ID, shortcode,\npremium, USSD, SMPP). Stored as an Inquiry - reviewed under Admin -> Inquiries.","operationId":"create_product_request_v1_product_requests_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProductRequestIn"}}},"required":true},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/admin/inquiries":{"get":{"tags":["Inquiries"],"summary":"List Inquiries","operationId":"list_inquiries_v1_admin_inquiries_get","parameters":[{"name":"status","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Status"}},{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":0,"default":0,"title":"Page"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":20,"title":"Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/admin/inquiries/{inquiry_id}":{"patch":{"tags":["Inquiries"],"summary":"Update Inquiry","operationId":"update_inquiry_v1_admin_inquiries__inquiry_id__patch","parameters":[{"name":"inquiry_id","in":"path","required":true,"schema":{"type":"integer","title":"Inquiry Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/InquiryUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/logs":{"get":{"tags":["Admin"],"summary":"List Admin Logs","operationId":"list_admin_logs_api_admin_logs_get","parameters":[{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":0,"default":0,"title":"Page"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":25,"title":"Limit"}},{"name":"action","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Action"}},{"name":"target_user_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Target User Id"}},{"name":"admin_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Admin Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/admin/logs":{"get":{"tags":["Admin"],"summary":"List Admin Logs","operationId":"list_admin_logs_v1_admin_logs_get","parameters":[{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":0,"default":0,"title":"Page"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":25,"title":"Limit"}},{"name":"action","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Action"}},{"name":"target_user_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Target User Id"}},{"name":"admin_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Admin Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/opt-outs":{"get":{"tags":["Opt-outs"],"summary":"List Optouts","operationId":"list_optouts_api_opt_outs_get","parameters":[{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":1000,"default":200,"title":"Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["Opt-outs"],"summary":"Add Optout","operationId":"add_optout_api_opt_outs_post","requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/OptOutIn"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/opt-outs/{phone}":{"delete":{"tags":["Opt-outs"],"summary":"Remove Optout","operationId":"remove_optout_api_opt_outs__phone__delete","parameters":[{"name":"phone","in":"path","required":true,"schema":{"type":"string","title":"Phone"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/conversations":{"get":{"tags":["Opt-outs"],"summary":"List Conversations","description":"People who have replied (have >=1 inbound message), newest activity first,\nwith the latest message in the thread as a preview. Single query (DISTINCT ON)\n- no per-phone N+1.","operationId":"list_conversations_api_conversations_get","parameters":[{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":500,"default":100,"title":"Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/conversations/{phone}":{"get":{"tags":["Opt-outs"],"summary":"Conversation Thread","description":"Full two-way thread with one number (inbound + outbound), oldest first.","operationId":"conversation_thread_api_conversations__phone__get","parameters":[{"name":"phone","in":"path","required":true,"schema":{"type":"string","title":"Phone"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":500,"default":200,"title":"Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/opt-outs":{"get":{"tags":["Opt-outs"],"summary":"List Optouts","operationId":"list_optouts_v1_opt_outs_get","parameters":[{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":1000,"default":200,"title":"Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["Opt-outs"],"summary":"Add Optout","operationId":"add_optout_v1_opt_outs_post","requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/OptOutIn"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/opt-outs/{phone}":{"delete":{"tags":["Opt-outs"],"summary":"Remove Optout","operationId":"remove_optout_v1_opt_outs__phone__delete","parameters":[{"name":"phone","in":"path","required":true,"schema":{"type":"string","title":"Phone"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/conversations":{"get":{"tags":["Opt-outs"],"summary":"List Conversations","description":"People who have replied (have >=1 inbound message), newest activity first,\nwith the latest message in the thread as a preview. Single query (DISTINCT ON)\n- no per-phone N+1.","operationId":"list_conversations_v1_conversations_get","parameters":[{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":500,"default":100,"title":"Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/conversations/{phone}":{"get":{"tags":["Opt-outs"],"summary":"Conversation Thread","description":"Full two-way thread with one number (inbound + outbound), oldest first.","operationId":"conversation_thread_v1_conversations__phone__get","parameters":[{"name":"phone","in":"path","required":true,"schema":{"type":"string","title":"Phone"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":500,"default":200,"title":"Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/verify/apps":{"get":{"tags":["Verify Apps"],"summary":"List Apps","operationId":"list_apps_api_verify_apps_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}},"post":{"tags":["Verify Apps"],"summary":"Create App","operationId":"create_app_api_verify_apps_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/VerifyAppIn"}}},"required":true},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/verify/apps/{app_id}":{"get":{"tags":["Verify Apps"],"summary":"Get App","operationId":"get_app_api_verify_apps__app_id__get","parameters":[{"name":"app_id","in":"path","required":true,"schema":{"type":"string","title":"App Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"patch":{"tags":["Verify Apps"],"summary":"Update App","operationId":"update_app_api_verify_apps__app_id__patch","parameters":[{"name":"app_id","in":"path","required":true,"schema":{"type":"string","title":"App Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/VerifyAppIn"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["Verify Apps"],"summary":"Delete App","operationId":"delete_app_api_verify_apps__app_id__delete","parameters":[{"name":"app_id","in":"path","required":true,"schema":{"type":"string","title":"App Id"}}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/verify/apps/{app_id}/stats":{"get":{"tags":["Verify Apps"],"summary":"App Stats","operationId":"app_stats_api_verify_apps__app_id__stats_get","parameters":[{"name":"app_id","in":"path","required":true,"schema":{"type":"string","title":"App Id"}},{"name":"days","in":"query","required":false,"schema":{"type":"integer","maximum":90,"minimum":1,"default":30,"title":"Days"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/verify/apps":{"get":{"tags":["Verify Apps"],"summary":"List Apps","operationId":"list_apps_v1_verify_apps_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}},"post":{"tags":["Verify Apps"],"summary":"Create App","operationId":"create_app_v1_verify_apps_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/VerifyAppIn"}}},"required":true},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/verify/apps/{app_id}":{"get":{"tags":["Verify Apps"],"summary":"Get App","operationId":"get_app_v1_verify_apps__app_id__get","parameters":[{"name":"app_id","in":"path","required":true,"schema":{"type":"string","title":"App Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"patch":{"tags":["Verify Apps"],"summary":"Update App","operationId":"update_app_v1_verify_apps__app_id__patch","parameters":[{"name":"app_id","in":"path","required":true,"schema":{"type":"string","title":"App Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/VerifyAppIn"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["Verify Apps"],"summary":"Delete App","operationId":"delete_app_v1_verify_apps__app_id__delete","parameters":[{"name":"app_id","in":"path","required":true,"schema":{"type":"string","title":"App Id"}}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/verify/apps/{app_id}/stats":{"get":{"tags":["Verify Apps"],"summary":"App Stats","operationId":"app_stats_v1_verify_apps__app_id__stats_get","parameters":[{"name":"app_id","in":"path","required":true,"schema":{"type":"string","title":"App Id"}},{"name":"days","in":"query","required":false,"schema":{"type":"integer","maximum":90,"minimum":1,"default":30,"title":"Days"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/verify/start":{"post":{"tags":["Verify"],"summary":"Verify Start","operationId":"verify_start_api_verify_start_post","parameters":[{"name":"Idempotency-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Idempotency-Key"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/VerifyStart"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/verify/check":{"post":{"tags":["Verify"],"summary":"Verify Check","operationId":"verify_check_api_verify_check_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/VerifyCheck"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/verify/{verification_id}":{"get":{"tags":["Verify"],"summary":"Verify Get","description":"Read a verification's status WITHOUT consuming an attempt.","operationId":"verify_get_api_verify__verification_id__get","parameters":[{"name":"verification_id","in":"path","required":true,"schema":{"type":"string","title":"Verification Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/verify/{verification_id}/resend":{"post":{"tags":["Verify"],"summary":"Verify Resend","description":"Send a fresh code for the SAME verification (new code, reset expiry).","operationId":"verify_resend_api_verify__verification_id__resend_post","parameters":[{"name":"verification_id","in":"path","required":true,"schema":{"type":"string","title":"Verification Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/verify/{verification_id}/cancel":{"post":{"tags":["Verify"],"summary":"Verify Cancel","description":"Void an in-flight verification (abandoned flow).","operationId":"verify_cancel_api_verify__verification_id__cancel_post","parameters":[{"name":"verification_id","in":"path","required":true,"schema":{"type":"string","title":"Verification Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/verify":{"get":{"tags":["Verify"],"summary":"Verify List","description":"List the caller's verifications (most recent first), scoped to the key's environment.","operationId":"verify_list_api_verify_get","parameters":[{"name":"status","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Status"}},{"name":"app_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"App Id"}},{"name":"to","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"To"}},{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":0,"default":0,"title":"Page"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":20,"title":"Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/verify/start":{"post":{"tags":["Verify"],"summary":"Verify Start","operationId":"verify_start_v1_verify_start_post","parameters":[{"name":"Idempotency-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Idempotency-Key"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/VerifyStart"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/verify/check":{"post":{"tags":["Verify"],"summary":"Verify Check","operationId":"verify_check_v1_verify_check_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/VerifyCheck"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/verify/{verification_id}":{"get":{"tags":["Verify"],"summary":"Verify Get","description":"Read a verification's status WITHOUT consuming an attempt.","operationId":"verify_get_v1_verify__verification_id__get","parameters":[{"name":"verification_id","in":"path","required":true,"schema":{"type":"string","title":"Verification Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/verify/{verification_id}/resend":{"post":{"tags":["Verify"],"summary":"Verify Resend","description":"Send a fresh code for the SAME verification (new code, reset expiry).","operationId":"verify_resend_v1_verify__verification_id__resend_post","parameters":[{"name":"verification_id","in":"path","required":true,"schema":{"type":"string","title":"Verification Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/verify/{verification_id}/cancel":{"post":{"tags":["Verify"],"summary":"Verify Cancel","description":"Void an in-flight verification (abandoned flow).","operationId":"verify_cancel_v1_verify__verification_id__cancel_post","parameters":[{"name":"verification_id","in":"path","required":true,"schema":{"type":"string","title":"Verification Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/verify":{"get":{"tags":["Verify"],"summary":"Verify List","description":"List the caller's verifications (most recent first), scoped to the key's environment.","operationId":"verify_list_v1_verify_get","parameters":[{"name":"status","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Status"}},{"name":"app_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"App Id"}},{"name":"to","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"To"}},{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":0,"default":0,"title":"Page"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":20,"title":"Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/segments":{"get":{"tags":["Campaigns"],"summary":"List Segments","operationId":"list_segments_api_segments_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}},"post":{"tags":["Campaigns"],"summary":"Create Segment","operationId":"create_segment_api_segments_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SegmentBody"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/segments/{segment_id}":{"get":{"tags":["Campaigns"],"summary":"Get Segment","operationId":"get_segment_api_segments__segment_id__get","parameters":[{"name":"segment_id","in":"path","required":true,"schema":{"type":"integer","title":"Segment Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"patch":{"tags":["Campaigns"],"summary":"Update Segment","operationId":"update_segment_api_segments__segment_id__patch","parameters":[{"name":"segment_id","in":"path","required":true,"schema":{"type":"integer","title":"Segment Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SegmentBody"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["Campaigns"],"summary":"Delete Segment","operationId":"delete_segment_api_segments__segment_id__delete","parameters":[{"name":"segment_id","in":"path","required":true,"schema":{"type":"integer","title":"Segment Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/segments/{segment_id}/preview":{"get":{"tags":["Campaigns"],"summary":"Preview Segment","operationId":"preview_segment_api_segments__segment_id__preview_get","parameters":[{"name":"segment_id","in":"path","required":true,"schema":{"type":"integer","title":"Segment Id"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","default":25,"title":"Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/campaigns":{"get":{"tags":["Campaigns"],"summary":"List Campaigns","operationId":"list_campaigns_api_campaigns_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}},"post":{"tags":["Campaigns"],"summary":"Create Campaign","operationId":"create_campaign_api_campaigns_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CampaignBody"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/campaigns/{campaign_id}":{"get":{"tags":["Campaigns"],"summary":"Get Campaign","operationId":"get_campaign_api_campaigns__campaign_id__get","parameters":[{"name":"campaign_id","in":"path","required":true,"schema":{"type":"integer","title":"Campaign Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"patch":{"tags":["Campaigns"],"summary":"Update Campaign","operationId":"update_campaign_api_campaigns__campaign_id__patch","parameters":[{"name":"campaign_id","in":"path","required":true,"schema":{"type":"integer","title":"Campaign Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CampaignBody"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["Campaigns"],"summary":"Delete Campaign","operationId":"delete_campaign_api_campaigns__campaign_id__delete","parameters":[{"name":"campaign_id","in":"path","required":true,"schema":{"type":"integer","title":"Campaign Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/campaigns/{campaign_id}/send":{"post":{"tags":["Campaigns"],"summary":"Send Campaign","operationId":"send_campaign_api_campaigns__campaign_id__send_post","parameters":[{"name":"campaign_id","in":"path","required":true,"schema":{"type":"integer","title":"Campaign Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/campaigns/{campaign_id}/cancel":{"post":{"tags":["Campaigns"],"summary":"Cancel Campaign","operationId":"cancel_campaign_api_campaigns__campaign_id__cancel_post","parameters":[{"name":"campaign_id","in":"path","required":true,"schema":{"type":"integer","title":"Campaign Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/campaigns/{campaign_id}/stats":{"get":{"tags":["Campaigns"],"summary":"Campaign Stats","operationId":"campaign_stats_api_campaigns__campaign_id__stats_get","parameters":[{"name":"campaign_id","in":"path","required":true,"schema":{"type":"integer","title":"Campaign Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/segments":{"get":{"tags":["Campaigns"],"summary":"List Segments","operationId":"list_segments_v1_segments_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}},"post":{"tags":["Campaigns"],"summary":"Create Segment","operationId":"create_segment_v1_segments_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SegmentBody"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/segments/{segment_id}":{"get":{"tags":["Campaigns"],"summary":"Get Segment","operationId":"get_segment_v1_segments__segment_id__get","parameters":[{"name":"segment_id","in":"path","required":true,"schema":{"type":"integer","title":"Segment Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"patch":{"tags":["Campaigns"],"summary":"Update Segment","operationId":"update_segment_v1_segments__segment_id__patch","parameters":[{"name":"segment_id","in":"path","required":true,"schema":{"type":"integer","title":"Segment Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SegmentBody"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["Campaigns"],"summary":"Delete Segment","operationId":"delete_segment_v1_segments__segment_id__delete","parameters":[{"name":"segment_id","in":"path","required":true,"schema":{"type":"integer","title":"Segment Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/segments/{segment_id}/preview":{"get":{"tags":["Campaigns"],"summary":"Preview Segment","operationId":"preview_segment_v1_segments__segment_id__preview_get","parameters":[{"name":"segment_id","in":"path","required":true,"schema":{"type":"integer","title":"Segment Id"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","default":25,"title":"Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/campaigns":{"get":{"tags":["Campaigns"],"summary":"List Campaigns","operationId":"list_campaigns_v1_campaigns_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}},"post":{"tags":["Campaigns"],"summary":"Create Campaign","operationId":"create_campaign_v1_campaigns_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CampaignBody"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/campaigns/{campaign_id}":{"get":{"tags":["Campaigns"],"summary":"Get Campaign","operationId":"get_campaign_v1_campaigns__campaign_id__get","parameters":[{"name":"campaign_id","in":"path","required":true,"schema":{"type":"integer","title":"Campaign Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"patch":{"tags":["Campaigns"],"summary":"Update Campaign","operationId":"update_campaign_v1_campaigns__campaign_id__patch","parameters":[{"name":"campaign_id","in":"path","required":true,"schema":{"type":"integer","title":"Campaign Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CampaignBody"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["Campaigns"],"summary":"Delete Campaign","operationId":"delete_campaign_v1_campaigns__campaign_id__delete","parameters":[{"name":"campaign_id","in":"path","required":true,"schema":{"type":"integer","title":"Campaign Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/campaigns/{campaign_id}/send":{"post":{"tags":["Campaigns"],"summary":"Send Campaign","operationId":"send_campaign_v1_campaigns__campaign_id__send_post","parameters":[{"name":"campaign_id","in":"path","required":true,"schema":{"type":"integer","title":"Campaign Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/campaigns/{campaign_id}/cancel":{"post":{"tags":["Campaigns"],"summary":"Cancel Campaign","operationId":"cancel_campaign_v1_campaigns__campaign_id__cancel_post","parameters":[{"name":"campaign_id","in":"path","required":true,"schema":{"type":"integer","title":"Campaign Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/campaigns/{campaign_id}/stats":{"get":{"tags":["Campaigns"],"summary":"Campaign Stats","operationId":"campaign_stats_v1_campaigns__campaign_id__stats_get","parameters":[{"name":"campaign_id","in":"path","required":true,"schema":{"type":"integer","title":"Campaign Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/team":{"get":{"tags":["Team"],"summary":"List Team","operationId":"list_team_api_team_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/team/invite":{"post":{"tags":["Team"],"summary":"Invite Member","operationId":"invite_member_api_team_invite_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/InviteBody"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/team/{member_id}":{"patch":{"tags":["Team"],"summary":"Update Member","operationId":"update_member_api_team__member_id__patch","parameters":[{"name":"member_id","in":"path","required":true,"schema":{"type":"integer","title":"Member Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RoleBody"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["Team"],"summary":"Remove Member","operationId":"remove_member_api_team__member_id__delete","parameters":[{"name":"member_id","in":"path","required":true,"schema":{"type":"integer","title":"Member Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/team":{"get":{"tags":["Team"],"summary":"List Team","operationId":"list_team_v1_team_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/v1/team/invite":{"post":{"tags":["Team"],"summary":"Invite Member","operationId":"invite_member_v1_team_invite_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/InviteBody"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/team/{member_id}":{"patch":{"tags":["Team"],"summary":"Update Member","operationId":"update_member_v1_team__member_id__patch","parameters":[{"name":"member_id","in":"path","required":true,"schema":{"type":"integer","title":"Member Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RoleBody"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["Team"],"summary":"Remove Member","operationId":"remove_member_v1_team__member_id__delete","parameters":[{"name":"member_id","in":"path","required":true,"schema":{"type":"integer","title":"Member Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/public/sales-materials":{"get":{"tags":["sales"],"summary":"Public List","operationId":"public_list_api_public_sales_materials_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/public/price-tiers":{"get":{"tags":["sales"],"summary":"Public Tiers","operationId":"public_tiers_api_public_price_tiers_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/sales":{"get":{"tags":["sales"],"summary":"Sales Index","operationId":"sales_index_api_sales_get","responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}}}}},"/api/sales/{country}/{doc_type}.pdf":{"get":{"tags":["sales"],"summary":"Sales Pdf","operationId":"sales_pdf_api_sales__country___doc_type__pdf_get","parameters":[{"name":"country","in":"path","required":true,"schema":{"type":"string","title":"Country"}},{"name":"doc_type","in":"path","required":true,"schema":{"type":"string","title":"Doc Type"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/sales/{country}/{doc_type}":{"get":{"tags":["sales"],"summary":"Sales Page","operationId":"sales_page_api_sales__country___doc_type__get","parameters":[{"name":"country","in":"path","required":true,"schema":{"type":"string","title":"Country"}},{"name":"doc_type","in":"path","required":true,"schema":{"type":"string","title":"Doc Type"}}],"responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/sales-materials/meta":{"get":{"tags":["sales"],"summary":"Admin Meta","operationId":"admin_meta_api_admin_sales_materials_meta_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/admin/sales-materials":{"get":{"tags":["sales"],"summary":"Admin List","operationId":"admin_list_api_admin_sales_materials_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}},"post":{"tags":["sales"],"summary":"Admin Create","operationId":"admin_create_api_admin_sales_materials_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/MaterialIn"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/sales-materials/{material_id}":{"get":{"tags":["sales"],"summary":"Admin Get","operationId":"admin_get_api_admin_sales_materials__material_id__get","parameters":[{"name":"material_id","in":"path","required":true,"schema":{"type":"integer","title":"Material Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"put":{"tags":["sales"],"summary":"Admin Update","operationId":"admin_update_api_admin_sales_materials__material_id__put","parameters":[{"name":"material_id","in":"path","required":true,"schema":{"type":"integer","title":"Material Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/MaterialUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["sales"],"summary":"Admin Delete","operationId":"admin_delete_api_admin_sales_materials__material_id__delete","parameters":[{"name":"material_id","in":"path","required":true,"schema":{"type":"integer","title":"Material Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/sales-materials/{material_id}/preview":{"get":{"tags":["sales"],"summary":"Admin Preview","operationId":"admin_preview_api_admin_sales_materials__material_id__preview_get","parameters":[{"name":"material_id","in":"path","required":true,"schema":{"type":"integer","title":"Material Id"}}],"responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/sales-materials/{material_id}/pdf":{"get":{"tags":["sales"],"summary":"Admin Pdf","operationId":"admin_pdf_api_admin_sales_materials__material_id__pdf_get","parameters":[{"name":"material_id","in":"path","required":true,"schema":{"type":"integer","title":"Material Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/price-tiers":{"get":{"tags":["sales"],"summary":"Admin Tiers","operationId":"admin_tiers_api_admin_price_tiers_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/admin/price-tiers/{slug}":{"put":{"tags":["sales"],"summary":"Admin Update Tier","operationId":"admin_update_tier_api_admin_price_tiers__slug__put","parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string","title":"Slug"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TierUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/public/sales-materials":{"get":{"tags":["sales"],"summary":"Public List","operationId":"public_list_v1_public_sales_materials_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/v1/public/price-tiers":{"get":{"tags":["sales"],"summary":"Public Tiers","operationId":"public_tiers_v1_public_price_tiers_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/v1/sales":{"get":{"tags":["sales"],"summary":"Sales Index","operationId":"sales_index_v1_sales_get","responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}}}}},"/v1/sales/{country}/{doc_type}.pdf":{"get":{"tags":["sales"],"summary":"Sales Pdf","operationId":"sales_pdf_v1_sales__country___doc_type__pdf_get","parameters":[{"name":"country","in":"path","required":true,"schema":{"type":"string","title":"Country"}},{"name":"doc_type","in":"path","required":true,"schema":{"type":"string","title":"Doc Type"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/sales/{country}/{doc_type}":{"get":{"tags":["sales"],"summary":"Sales Page","operationId":"sales_page_v1_sales__country___doc_type__get","parameters":[{"name":"country","in":"path","required":true,"schema":{"type":"string","title":"Country"}},{"name":"doc_type","in":"path","required":true,"schema":{"type":"string","title":"Doc Type"}}],"responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/admin/sales-materials/meta":{"get":{"tags":["sales"],"summary":"Admin Meta","operationId":"admin_meta_v1_admin_sales_materials_meta_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/v1/admin/sales-materials":{"get":{"tags":["sales"],"summary":"Admin List","operationId":"admin_list_v1_admin_sales_materials_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}},"post":{"tags":["sales"],"summary":"Admin Create","operationId":"admin_create_v1_admin_sales_materials_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/MaterialIn"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/admin/sales-materials/{material_id}":{"get":{"tags":["sales"],"summary":"Admin Get","operationId":"admin_get_v1_admin_sales_materials__material_id__get","parameters":[{"name":"material_id","in":"path","required":true,"schema":{"type":"integer","title":"Material Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"put":{"tags":["sales"],"summary":"Admin Update","operationId":"admin_update_v1_admin_sales_materials__material_id__put","parameters":[{"name":"material_id","in":"path","required":true,"schema":{"type":"integer","title":"Material Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/MaterialUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["sales"],"summary":"Admin Delete","operationId":"admin_delete_v1_admin_sales_materials__material_id__delete","parameters":[{"name":"material_id","in":"path","required":true,"schema":{"type":"integer","title":"Material Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/admin/sales-materials/{material_id}/preview":{"get":{"tags":["sales"],"summary":"Admin Preview","operationId":"admin_preview_v1_admin_sales_materials__material_id__preview_get","parameters":[{"name":"material_id","in":"path","required":true,"schema":{"type":"integer","title":"Material Id"}}],"responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/admin/sales-materials/{material_id}/pdf":{"get":{"tags":["sales"],"summary":"Admin Pdf","operationId":"admin_pdf_v1_admin_sales_materials__material_id__pdf_get","parameters":[{"name":"material_id","in":"path","required":true,"schema":{"type":"integer","title":"Material Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/admin/price-tiers":{"get":{"tags":["sales"],"summary":"Admin Tiers","operationId":"admin_tiers_v1_admin_price_tiers_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/v1/admin/price-tiers/{slug}":{"put":{"tags":["sales"],"summary":"Admin Update Tier","operationId":"admin_update_tier_v1_admin_price_tiers__slug__put","parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string","title":"Slug"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TierUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/templates":{"get":{"tags":["Templates"],"summary":"List Templates","operationId":"list_templates_api_templates_get","parameters":[{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":500,"default":200,"title":"Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["Templates"],"summary":"Create Template","operationId":"create_template_api_templates_post","requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TemplateIn"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/templates/{template_id}":{"patch":{"tags":["Templates"],"summary":"Update Template","operationId":"update_template_api_templates__template_id__patch","parameters":[{"name":"template_id","in":"path","required":true,"schema":{"type":"integer","title":"Template Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TemplateIn"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["Templates"],"summary":"Delete Template","operationId":"delete_template_api_templates__template_id__delete","parameters":[{"name":"template_id","in":"path","required":true,"schema":{"type":"integer","title":"Template Id"}}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/templates":{"get":{"tags":["Templates"],"summary":"List Templates","operationId":"list_templates_v1_templates_get","parameters":[{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":500,"default":200,"title":"Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["Templates"],"summary":"Create Template","operationId":"create_template_v1_templates_post","requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TemplateIn"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/templates/{template_id}":{"patch":{"tags":["Templates"],"summary":"Update Template","operationId":"update_template_v1_templates__template_id__patch","parameters":[{"name":"template_id","in":"path","required":true,"schema":{"type":"integer","title":"Template Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TemplateIn"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["Templates"],"summary":"Delete Template","operationId":"delete_template_v1_templates__template_id__delete","parameters":[{"name":"template_id","in":"path","required":true,"schema":{"type":"integer","title":"Template Id"}}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/countries":{"get":{"tags":["Countries"],"summary":"List Countries","description":"All 54 African markets: networks, sender-ID policy, compliance rules, and\nlive price per segment where we route. `supported=true` = we have an active\nroute for that country today.","operationId":"list_countries_api_countries_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/v1/countries":{"get":{"tags":["Countries"],"summary":"List Countries","description":"All 54 African markets: networks, sender-ID policy, compliance rules, and\nlive price per segment where we route. `supported=true` = we have an active\nroute for that country today.","operationId":"list_countries_v1_countries_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/request-logs":{"get":{"tags":["Request Logs"],"summary":"List Request Logs","operationId":"list_request_logs_api_request_logs_get","parameters":[{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":0,"default":0,"title":"Page"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":200,"minimum":1,"default":50,"title":"Limit"}},{"name":"status_code","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Status Code"}},{"name":"errors_only","in":"query","required":false,"schema":{"type":"boolean","default":false,"title":"Errors Only"}},{"name":"environment","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"live | test","title":"Environment"},"description":"live | test"},{"name":"request_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Request Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/request-logs":{"get":{"tags":["Request Logs"],"summary":"Admin Request Logs","description":"All customers' API calls (admin) - for support and abuse review.","operationId":"admin_request_logs_api_admin_request_logs_get","parameters":[{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":0,"default":0,"title":"Page"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":500,"minimum":1,"default":100,"title":"Limit"}},{"name":"auth_user_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Auth User Id"}},{"name":"status_code","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Status Code"}},{"name":"errors_only","in":"query","required":false,"schema":{"type":"boolean","default":false,"title":"Errors Only"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/request-logs":{"get":{"tags":["Request Logs"],"summary":"List Request Logs","operationId":"list_request_logs_v1_request_logs_get","parameters":[{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":0,"default":0,"title":"Page"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":200,"minimum":1,"default":50,"title":"Limit"}},{"name":"status_code","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Status Code"}},{"name":"errors_only","in":"query","required":false,"schema":{"type":"boolean","default":false,"title":"Errors Only"}},{"name":"environment","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"live | test","title":"Environment"},"description":"live | test"},{"name":"request_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Request Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/admin/request-logs":{"get":{"tags":["Request Logs"],"summary":"Admin Request Logs","description":"All customers' API calls (admin) - for support and abuse review.","operationId":"admin_request_logs_v1_admin_request_logs_get","parameters":[{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":0,"default":0,"title":"Page"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":500,"minimum":1,"default":100,"title":"Limit"}},{"name":"auth_user_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Auth User Id"}},{"name":"status_code","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Status Code"}},{"name":"errors_only","in":"query","required":false,"schema":{"type":"boolean","default":false,"title":"Errors Only"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/alerts":{"get":{"tags":["Alerts"],"summary":"List Alerts","operationId":"list_alerts_api_alerts_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/alerts/{alert_type}":{"put":{"tags":["Alerts"],"summary":"Upsert Alert","operationId":"upsert_alert_api_alerts__alert_type__put","parameters":[{"name":"alert_type","in":"path","required":true,"schema":{"type":"string","title":"Alert Type"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AlertIn"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/alerts":{"get":{"tags":["Alerts"],"summary":"List Alerts","operationId":"list_alerts_v1_alerts_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/v1/alerts/{alert_type}":{"put":{"tags":["Alerts"],"summary":"Upsert Alert","operationId":"upsert_alert_v1_alerts__alert_type__put","parameters":[{"name":"alert_type","in":"path","required":true,"schema":{"type":"string","title":"Alert Type"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AlertIn"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/webhook-deliveries":{"get":{"tags":["Webhook Logs"],"summary":"List Webhook Deliveries","operationId":"list_webhook_deliveries_api_webhook_deliveries_get","parameters":[{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":0,"default":0,"title":"Page"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":200,"minimum":1,"default":50,"title":"Limit"}},{"name":"success","in":"query","required":false,"schema":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Success"}},{"name":"event_type","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Event Type"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/webhook-deliveries/{delivery_id}/replay":{"post":{"tags":["Webhook Logs"],"summary":"Replay Webhook","description":"Re-POST a past webhook payload to your current endpoint, freshly signed.","operationId":"replay_webhook_api_webhook_deliveries__delivery_id__replay_post","parameters":[{"name":"delivery_id","in":"path","required":true,"schema":{"type":"integer","title":"Delivery Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/webhook-deliveries":{"get":{"tags":["Webhook Logs"],"summary":"Admin Webhook Deliveries","operationId":"admin_webhook_deliveries_api_admin_webhook_deliveries_get","parameters":[{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":0,"default":0,"title":"Page"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":500,"minimum":1,"default":100,"title":"Limit"}},{"name":"success","in":"query","required":false,"schema":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Success"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/webhook-deliveries":{"get":{"tags":["Webhook Logs"],"summary":"List Webhook Deliveries","operationId":"list_webhook_deliveries_v1_webhook_deliveries_get","parameters":[{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":0,"default":0,"title":"Page"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":200,"minimum":1,"default":50,"title":"Limit"}},{"name":"success","in":"query","required":false,"schema":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Success"}},{"name":"event_type","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Event Type"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/webhook-deliveries/{delivery_id}/replay":{"post":{"tags":["Webhook Logs"],"summary":"Replay Webhook","description":"Re-POST a past webhook payload to your current endpoint, freshly signed.","operationId":"replay_webhook_v1_webhook_deliveries__delivery_id__replay_post","parameters":[{"name":"delivery_id","in":"path","required":true,"schema":{"type":"integer","title":"Delivery Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/admin/webhook-deliveries":{"get":{"tags":["Webhook Logs"],"summary":"Admin Webhook Deliveries","operationId":"admin_webhook_deliveries_v1_admin_webhook_deliveries_get","parameters":[{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":0,"default":0,"title":"Page"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":500,"minimum":1,"default":100,"title":"Limit"}},{"name":"success","in":"query","required":false,"schema":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Success"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/status/summary":{"get":{"tags":["Status"],"summary":"Status Summary","operationId":"status_summary_api_status_summary_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/status/subscribe":{"post":{"tags":["Status"],"summary":"Subscribe","operationId":"subscribe_api_status_subscribe_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SubscribeBody"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/status/subscribe/confirm":{"get":{"tags":["Status"],"summary":"Confirm","operationId":"confirm_api_status_subscribe_confirm_get","parameters":[{"name":"token","in":"query","required":true,"schema":{"type":"string","title":"Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/status/unsubscribe":{"get":{"tags":["Status"],"summary":"Unsubscribe","operationId":"unsubscribe_api_status_unsubscribe_get","parameters":[{"name":"token","in":"query","required":true,"schema":{"type":"string","title":"Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/status/admin/components":{"get":{"tags":["Status"],"summary":"Admin Components","operationId":"admin_components_api_status_admin_components_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}},"post":{"tags":["Status"],"summary":"Admin Create Component","operationId":"admin_create_component_api_status_admin_components_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ComponentBody"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/status/admin/components/{cid}":{"patch":{"tags":["Status"],"summary":"Admin Update Component","operationId":"admin_update_component_api_status_admin_components__cid__patch","parameters":[{"name":"cid","in":"path","required":true,"schema":{"type":"integer","title":"Cid"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ComponentBody"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["Status"],"summary":"Admin Delete Component","operationId":"admin_delete_component_api_status_admin_components__cid__delete","parameters":[{"name":"cid","in":"path","required":true,"schema":{"type":"integer","title":"Cid"}}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/status/admin/incidents":{"get":{"tags":["Status"],"summary":"Admin Incidents","operationId":"admin_incidents_api_status_admin_incidents_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}},"post":{"tags":["Status"],"summary":"Admin Create Incident","operationId":"admin_create_incident_api_status_admin_incidents_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/IncidentBody"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/status/admin/incidents/{iid}/updates":{"post":{"tags":["Status"],"summary":"Admin Add Update","operationId":"admin_add_update_api_status_admin_incidents__iid__updates_post","parameters":[{"name":"iid","in":"path","required":true,"schema":{"type":"integer","title":"Iid"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateBody"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/status/admin/incidents/{iid}":{"delete":{"tags":["Status"],"summary":"Admin Delete Incident","operationId":"admin_delete_incident_api_status_admin_incidents__iid__delete","parameters":[{"name":"iid","in":"path","required":true,"schema":{"type":"integer","title":"Iid"}}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/status/admin/subscribers":{"get":{"tags":["Status"],"summary":"Admin Subscribers","operationId":"admin_subscribers_api_status_admin_subscribers_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/v1/status/summary":{"get":{"tags":["Status"],"summary":"Status Summary","operationId":"status_summary_v1_status_summary_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/v1/status/subscribe":{"post":{"tags":["Status"],"summary":"Subscribe","operationId":"subscribe_v1_status_subscribe_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SubscribeBody"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/status/subscribe/confirm":{"get":{"tags":["Status"],"summary":"Confirm","operationId":"confirm_v1_status_subscribe_confirm_get","parameters":[{"name":"token","in":"query","required":true,"schema":{"type":"string","title":"Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/status/unsubscribe":{"get":{"tags":["Status"],"summary":"Unsubscribe","operationId":"unsubscribe_v1_status_unsubscribe_get","parameters":[{"name":"token","in":"query","required":true,"schema":{"type":"string","title":"Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/status/admin/components":{"get":{"tags":["Status"],"summary":"Admin Components","operationId":"admin_components_v1_status_admin_components_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}},"post":{"tags":["Status"],"summary":"Admin Create Component","operationId":"admin_create_component_v1_status_admin_components_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ComponentBody"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/status/admin/components/{cid}":{"patch":{"tags":["Status"],"summary":"Admin Update Component","operationId":"admin_update_component_v1_status_admin_components__cid__patch","parameters":[{"name":"cid","in":"path","required":true,"schema":{"type":"integer","title":"Cid"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ComponentBody"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["Status"],"summary":"Admin Delete Component","operationId":"admin_delete_component_v1_status_admin_components__cid__delete","parameters":[{"name":"cid","in":"path","required":true,"schema":{"type":"integer","title":"Cid"}}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/status/admin/incidents":{"get":{"tags":["Status"],"summary":"Admin Incidents","operationId":"admin_incidents_v1_status_admin_incidents_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}},"post":{"tags":["Status"],"summary":"Admin Create Incident","operationId":"admin_create_incident_v1_status_admin_incidents_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/IncidentBody"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/status/admin/incidents/{iid}/updates":{"post":{"tags":["Status"],"summary":"Admin Add Update","operationId":"admin_add_update_v1_status_admin_incidents__iid__updates_post","parameters":[{"name":"iid","in":"path","required":true,"schema":{"type":"integer","title":"Iid"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateBody"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/status/admin/incidents/{iid}":{"delete":{"tags":["Status"],"summary":"Admin Delete Incident","operationId":"admin_delete_incident_v1_status_admin_incidents__iid__delete","parameters":[{"name":"iid","in":"path","required":true,"schema":{"type":"integer","title":"Iid"}}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/status/admin/subscribers":{"get":{"tags":["Status"],"summary":"Admin Subscribers","operationId":"admin_subscribers_v1_status_admin_subscribers_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/sandbox/info":{"get":{"tags":["Sandbox"],"summary":"Sandbox Info","operationId":"sandbox_info_api_sandbox_info_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/sandbox/simulate":{"post":{"tags":["Sandbox"],"summary":"Simulate","operationId":"simulate_api_sandbox_simulate_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SimBody"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/sandbox/info":{"get":{"tags":["Sandbox"],"summary":"Sandbox Info","operationId":"sandbox_info_v1_sandbox_info_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/v1/sandbox/simulate":{"post":{"tags":["Sandbox"],"summary":"Simulate","operationId":"simulate_v1_sandbox_simulate_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SimBody"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/support/customer-snapshot":{"get":{"tags":["Support"],"summary":"Customer Snapshot","description":"Balance + traffic summary + recent messages for one customer.","operationId":"customer_snapshot_api_support_customer_snapshot_get","parameters":[{"name":"user_id","in":"query","required":true,"schema":{"type":"string","description":"auth user UUID","title":"User Id"},"description":"auth user UUID"},{"name":"days","in":"query","required":false,"schema":{"type":"integer","maximum":90,"minimum":1,"default":30,"title":"Days"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/support/message":{"get":{"tags":["Support"],"summary":"Message Lookup","description":"Full detail for one message - route, MNO, status, timings, latency, error.","operationId":"message_lookup_api_support_message_get","parameters":[{"name":"id","in":"query","required":true,"schema":{"type":"string","description":"message_id (MSG-... / gateway id)","title":"Id"},"description":"message_id (MSG-... / gateway id)"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/internal/customer-snapshot":{"get":{"tags":["Support"],"summary":"Internal Customer Snapshot","description":"Same snapshot as /support/customer-snapshot, authed by the internal key.","operationId":"internal_customer_snapshot_api_internal_customer_snapshot_get","parameters":[{"name":"user_id","in":"query","required":true,"schema":{"type":"string","description":"auth user UUID (caller's own authenticated customer)","title":"User Id"},"description":"auth user UUID (caller's own authenticated customer)"},{"name":"days","in":"query","required":false,"schema":{"type":"integer","maximum":90,"minimum":1,"default":30,"title":"Days"}},{"name":"X-Internal-Key","in":"header","required":true,"schema":{"type":"string","title":"X-Internal-Key"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/internal/message":{"get":{"tags":["Support"],"summary":"Internal Message Lookup","description":"Same message detail as /support/message, authed by the internal key.","operationId":"internal_message_lookup_api_internal_message_get","parameters":[{"name":"id","in":"query","required":true,"schema":{"type":"string","description":"message_id (MSG-... / gateway id)","title":"Id"},"description":"message_id (MSG-... / gateway id)"},{"name":"X-Internal-Key","in":"header","required":true,"schema":{"type":"string","title":"X-Internal-Key"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/support/customer-snapshot":{"get":{"tags":["Support"],"summary":"Customer Snapshot","description":"Balance + traffic summary + recent messages for one customer.","operationId":"customer_snapshot_v1_support_customer_snapshot_get","parameters":[{"name":"user_id","in":"query","required":true,"schema":{"type":"string","description":"auth user UUID","title":"User Id"},"description":"auth user UUID"},{"name":"days","in":"query","required":false,"schema":{"type":"integer","maximum":90,"minimum":1,"default":30,"title":"Days"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/support/message":{"get":{"tags":["Support"],"summary":"Message Lookup","description":"Full detail for one message - route, MNO, status, timings, latency, error.","operationId":"message_lookup_v1_support_message_get","parameters":[{"name":"id","in":"query","required":true,"schema":{"type":"string","description":"message_id (MSG-... / gateway id)","title":"Id"},"description":"message_id (MSG-... / gateway id)"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/internal/customer-snapshot":{"get":{"tags":["Support"],"summary":"Internal Customer Snapshot","description":"Same snapshot as /support/customer-snapshot, authed by the internal key.","operationId":"internal_customer_snapshot_v1_internal_customer_snapshot_get","parameters":[{"name":"user_id","in":"query","required":true,"schema":{"type":"string","description":"auth user UUID (caller's own authenticated customer)","title":"User Id"},"description":"auth user UUID (caller's own authenticated customer)"},{"name":"days","in":"query","required":false,"schema":{"type":"integer","maximum":90,"minimum":1,"default":30,"title":"Days"}},{"name":"X-Internal-Key","in":"header","required":true,"schema":{"type":"string","title":"X-Internal-Key"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/internal/message":{"get":{"tags":["Support"],"summary":"Internal Message Lookup","description":"Same message detail as /support/message, authed by the internal key.","operationId":"internal_message_lookup_v1_internal_message_get","parameters":[{"name":"id","in":"query","required":true,"schema":{"type":"string","description":"message_id (MSG-... / gateway id)","title":"Id"},"description":"message_id (MSG-... / gateway id)"},{"name":"X-Internal-Key","in":"header","required":true,"schema":{"type":"string","title":"X-Internal-Key"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/currency-rates":{"get":{"tags":["Pricing admin"],"summary":"List Currency Rates","description":"Every currency used by a route, with its current rate (units per 1 USD),\nwhether it is admin-locked, and how many routes use it.","operationId":"list_currency_rates_api_admin_currency_rates_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/admin/currency-rates/{currency}":{"put":{"tags":["Pricing admin"],"summary":"Set Currency Rate","description":"Set (and by default lock) the local->USD rate for a currency. A locked\nrate is what billing + the marketing USD view use, and the live 6h refresh\nwill not overwrite it, so the USD we bill stays stable.","operationId":"set_currency_rate_api_admin_currency_rates__currency__put","parameters":[{"name":"currency","in":"path","required":true,"schema":{"type":"string","title":"Currency"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SetRate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["Pricing admin"],"summary":"Unlock Currency Rate","description":"Remove the admin lock so the live feed manages this currency again.","operationId":"unlock_currency_rate_api_admin_currency_rates__currency__delete","parameters":[{"name":"currency","in":"path","required":true,"schema":{"type":"string","title":"Currency"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/user-prices":{"get":{"tags":["Pricing admin"],"summary":"List User Prices","description":"All per-country price overrides for one customer, with USD equivalents.","operationId":"list_user_prices_api_admin_user_prices_get","parameters":[{"name":"user_id","in":"query","required":true,"schema":{"type":"string","description":"auth user id (UUID)","title":"User Id"},"description":"auth user id (UUID)"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"put":{"tags":["Pricing admin"],"summary":"Upsert User Price","description":"Create or update a customer's custom price for one country.","operationId":"upsert_user_price_api_admin_user_prices_put","requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SetUserPrice"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/user-prices/{price_id}":{"delete":{"tags":["Pricing admin"],"summary":"Delete User Price","operationId":"delete_user_price_api_admin_user_prices__price_id__delete","parameters":[{"name":"price_id","in":"path","required":true,"schema":{"type":"integer","title":"Price Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/admin/currency-rates":{"get":{"tags":["Pricing admin"],"summary":"List Currency Rates","description":"Every currency used by a route, with its current rate (units per 1 USD),\nwhether it is admin-locked, and how many routes use it.","operationId":"list_currency_rates_v1_admin_currency_rates_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/v1/admin/currency-rates/{currency}":{"put":{"tags":["Pricing admin"],"summary":"Set Currency Rate","description":"Set (and by default lock) the local->USD rate for a currency. A locked\nrate is what billing + the marketing USD view use, and the live 6h refresh\nwill not overwrite it, so the USD we bill stays stable.","operationId":"set_currency_rate_v1_admin_currency_rates__currency__put","parameters":[{"name":"currency","in":"path","required":true,"schema":{"type":"string","title":"Currency"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SetRate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["Pricing admin"],"summary":"Unlock Currency Rate","description":"Remove the admin lock so the live feed manages this currency again.","operationId":"unlock_currency_rate_v1_admin_currency_rates__currency__delete","parameters":[{"name":"currency","in":"path","required":true,"schema":{"type":"string","title":"Currency"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/admin/user-prices":{"get":{"tags":["Pricing admin"],"summary":"List User Prices","description":"All per-country price overrides for one customer, with USD equivalents.","operationId":"list_user_prices_v1_admin_user_prices_get","parameters":[{"name":"user_id","in":"query","required":true,"schema":{"type":"string","description":"auth user id (UUID)","title":"User Id"},"description":"auth user id (UUID)"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"put":{"tags":["Pricing admin"],"summary":"Upsert User Price","description":"Create or update a customer's custom price for one country.","operationId":"upsert_user_price_v1_admin_user_prices_put","requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SetUserPrice"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/admin/user-prices/{price_id}":{"delete":{"tags":["Pricing admin"],"summary":"Delete User Price","operationId":"delete_user_price_v1_admin_user_prices__price_id__delete","parameters":[{"name":"price_id","in":"path","required":true,"schema":{"type":"integer","title":"Price Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/two-way/pricing":{"get":{"tags":["Two-Way SMS"],"summary":"Two-Way SMS pricing by country (public)","description":"Per-country Two-Way SMS pricing in USD. **No authentication**; responses\nare cacheable for 5 minutes.\n\n- `setup_fee_usd` is one-time and `monthly_fee_usd` recurring (VAT inclusive),\n  both charged only once a request is approved.\n- `inbound_price_usd` / `outbound_price_usd` are the **effective** per-SMS\n  prices: the country's Basic SMS price (`sms_basic_price_usd`, the same USD\n  figure shown as Basic on esmsafrica.io/pricing) unless an admin set a\n  custom price (`price_source` = `custom`). `outbound_price_usd` null means\n  the standard SMS rate.\n- `toll_free_inbound_price_usd` null means the same as `inbound_price_usd`.\n- A country without a Basic price or explicit prices has null prices and\n  `is_available: false`.","operationId":"public_pricing_api_two_way_pricing_get","responses":{"200":{"description":"Per-country USD commercials for short codes","content":{"application/json":{"schema":{}}}}}}},"/api/two-way/countries":{"get":{"tags":["Two-Way SMS"],"summary":"Countries you can request a short code in","description":"The public pricing rows plus KYC requirements, notes and whether a\nshared / dedicated short code is currently free in each country.","operationId":"list_countries_api_two_way_countries_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/two-way/keywords/check":{"get":{"tags":["Two-Way SMS"],"summary":"Check if a keyword is free on a shared short code","description":"Pass `number` (a shared short code) or `country_code`. Keywords are 2-20 letters or digits; STOP, START, HELP and INFO are reserved.","operationId":"check_keyword_api_two_way_keywords_check_get","parameters":[{"name":"keyword","in":"query","required":true,"schema":{"type":"string","maxLength":40,"title":"Keyword"}},{"name":"number","in":"query","required":false,"schema":{"anyOf":[{"type":"string","maxLength":20},{"type":"null"}],"title":"Number"}},{"name":"country_code","in":"query","required":false,"schema":{"anyOf":[{"type":"string","maxLength":2},{"type":"null"}],"title":"Country Code"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/two-way/kyc-documents":{"post":{"tags":["Two-Way SMS"],"summary":"Upload a KYC document","description":"PDF, PNG, JPG or WEBP up to 5 MB. Pass the returned `id` in `kyc_document_ids` when requesting a service.","operationId":"upload_kyc_api_two_way_kyc_documents_post","requestBody":{"content":{"multipart/form-data":{"schema":{"$ref":"#/components/schemas/Body_upload_kyc_api_two_way_kyc_documents_post"}}},"required":true},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/two-way/kyc-documents/{doc_id}":{"get":{"tags":["Two-Way SMS"],"summary":"Download one of your KYC documents","operationId":"get_kyc_api_two_way_kyc_documents__doc_id__get","parameters":[{"name":"doc_id","in":"path","required":true,"schema":{"type":"integer","title":"Doc Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/two-way/services":{"get":{"tags":["Two-Way SMS"],"summary":"List your two-way services","operationId":"list_services_api_two_way_services_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}},"post":{"tags":["Two-Way SMS"],"summary":"Request a short code (dedicated or shared keyword)","description":"Creates a pending request for admin review (KYC + network setup). Nothing is charged until it is approved; the setup fee and first month are charged from your wallet on approval.","operationId":"create_service_api_two_way_services_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServiceIn"}}},"required":true},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/two-way/services/{service_id}":{"get":{"tags":["Two-Way SMS"],"summary":"Get one two-way service","operationId":"get_service_api_two_way_services__service_id__get","parameters":[{"name":"service_id","in":"path","required":true,"schema":{"type":"integer","title":"Service Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"patch":{"tags":["Two-Way SMS"],"summary":"Update webhook, auto-reply or email forwarding","operationId":"patch_service_api_two_way_services__service_id__patch","parameters":[{"name":"service_id","in":"path","required":true,"schema":{"type":"integer","title":"Service Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServicePatch"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/two-way/services/{service_id}/cancel":{"post":{"tags":["Two-Way SMS"],"summary":"Cancel a two-way service","operationId":"cancel_api_two_way_services__service_id__cancel_post","parameters":[{"name":"service_id","in":"path","required":true,"schema":{"type":"integer","title":"Service Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/two-way/services/{service_id}/messages":{"get":{"tags":["Two-Way SMS"],"summary":"Conversation history (inbound + replies)","operationId":"service_messages_api_two_way_services__service_id__messages_get","parameters":[{"name":"service_id","in":"path","required":true,"schema":{"type":"integer","title":"Service Id"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":1000,"minimum":1,"default":200,"title":"Limit"}},{"name":"phone","in":"query","required":false,"schema":{"anyOf":[{"type":"string","maxLength":20},{"type":"null"}],"title":"Phone"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/two-way/services/{service_id}/reply":{"post":{"tags":["Two-Way SMS"],"summary":"Reply FROM your short code","description":"Charged per segment at your per-customer country price when you have one, otherwise the two-way outbound price (the country's Basic SMS price unless a custom price is set).","operationId":"reply_api_two_way_services__service_id__reply_post","parameters":[{"name":"service_id","in":"path","required":true,"schema":{"type":"integer","title":"Service Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ReplyIn"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/two-way/services/{service_id}/test-webhook":{"post":{"tags":["Two-Way SMS"],"summary":"Send a signed test `message.inbound` webhook","operationId":"test_webhook_api_two_way_services__service_id__test_webhook_post","parameters":[{"name":"service_id","in":"path","required":true,"schema":{"type":"integer","title":"Service Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/two-way/pricing":{"get":{"tags":["Two-Way SMS - admin"],"summary":"All 54 countries' two-way commercials (admin)","operationId":"admin_pricing_api_admin_two_way_pricing_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/admin/two-way/pricing/{cc}":{"put":{"tags":["Two-Way SMS - admin"],"summary":"Update a country's two-way commercials (admin)","description":"Send `inbound_price_usd` / `outbound_price_usd` as null to clear the override and follow the country's Basic SMS price.","operationId":"admin_update_pricing_api_admin_two_way_pricing__cc__put","parameters":[{"name":"cc","in":"path","required":true,"schema":{"type":"string","title":"Cc"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PricingPatch"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/two-way/numbers":{"get":{"tags":["Two-Way SMS - admin"],"summary":"List short-code inventory (admin)","operationId":"admin_numbers_api_admin_two_way_numbers_get","parameters":[{"name":"country_code","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Country Code"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["Two-Way SMS - admin"],"summary":"Add a short code (admin)","operationId":"admin_create_number_api_admin_two_way_numbers_post","requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/NumberIn"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/two-way/numbers/{number_id}":{"patch":{"tags":["Two-Way SMS - admin"],"summary":"Update a short code (admin)","operationId":"admin_update_number_api_admin_two_way_numbers__number_id__patch","parameters":[{"name":"number_id","in":"path","required":true,"schema":{"type":"integer","title":"Number Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/NumberIn"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["Two-Way SMS - admin"],"summary":"Delete an unused short code (admin)","operationId":"admin_delete_number_api_admin_two_way_numbers__number_id__delete","parameters":[{"name":"number_id","in":"path","required":true,"schema":{"type":"integer","title":"Number Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/two-way/numbers/{number_id}/unmatched":{"get":{"tags":["Two-Way SMS - admin"],"summary":"Unmatched inbound on a number (admin)","operationId":"admin_unmatched_api_admin_two_way_numbers__number_id__unmatched_get","parameters":[{"name":"number_id","in":"path","required":true,"schema":{"type":"integer","title":"Number Id"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":500,"minimum":1,"default":100,"title":"Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/two-way/services":{"get":{"tags":["Two-Way SMS - admin"],"summary":"All two-way services and requests (admin)","operationId":"admin_services_api_admin_two_way_services_get","parameters":[{"name":"status","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Status"}},{"name":"search","in":"query","required":false,"schema":{"anyOf":[{"type":"string","maxLength":100},{"type":"null"}],"title":"Search"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":500,"minimum":1,"default":200,"title":"Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/two-way/services/{service_id}/approve":{"post":{"tags":["Two-Way SMS - admin"],"summary":"Approve a request - charges setup + first month (admin)","operationId":"admin_approve_api_admin_two_way_services__service_id__approve_post","parameters":[{"name":"service_id","in":"path","required":true,"schema":{"type":"integer","title":"Service Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApproveIn"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/two-way/services/{service_id}/reject":{"post":{"tags":["Two-Way SMS - admin"],"summary":"Reject a request - nothing charged (admin)","operationId":"admin_reject_api_admin_two_way_services__service_id__reject_post","parameters":[{"name":"service_id","in":"path","required":true,"schema":{"type":"integer","title":"Service Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ReasonIn"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/two-way/services/{service_id}/suspend":{"post":{"tags":["Two-Way SMS - admin"],"summary":"Suspend a service (admin)","operationId":"admin_suspend_api_admin_two_way_services__service_id__suspend_post","parameters":[{"name":"service_id","in":"path","required":true,"schema":{"type":"integer","title":"Service Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ReasonIn"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/two-way/services/{service_id}/resume":{"post":{"tags":["Two-Way SMS - admin"],"summary":"Resume a service (admin)","operationId":"admin_resume_api_admin_two_way_services__service_id__resume_post","parameters":[{"name":"service_id","in":"path","required":true,"schema":{"type":"integer","title":"Service Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/sender-id-fees":{"get":{"tags":["Sender IDs - admin"],"summary":"Sender ID fees for all 54 countries (admin)","description":"Every country's configured flat fee plus what customers see publicly\n(`public`: the GET /sender-ids/fees row - flat fee, per-network fee table\nfrom the Sender ID sales doc, or on request).","operationId":"admin_sender_fees_api_admin_sender_id_fees_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/admin/sender-id-fees/{cc}":{"put":{"tags":["Sender IDs - admin"],"summary":"Set a country's one-time Sender ID fee (admin)","operationId":"admin_set_sender_fee_api_admin_sender_id_fees__cc__put","parameters":[{"name":"cc","in":"path","required":true,"schema":{"type":"string","title":"Cc"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SenderFeeIn"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/two-way/pricing":{"get":{"tags":["Two-Way SMS"],"summary":"Two-Way SMS pricing by country (public)","description":"Per-country Two-Way SMS pricing in USD. **No authentication**; responses\nare cacheable for 5 minutes.\n\n- `setup_fee_usd` is one-time and `monthly_fee_usd` recurring (VAT inclusive),\n  both charged only once a request is approved.\n- `inbound_price_usd` / `outbound_price_usd` are the **effective** per-SMS\n  prices: the country's Basic SMS price (`sms_basic_price_usd`, the same USD\n  figure shown as Basic on esmsafrica.io/pricing) unless an admin set a\n  custom price (`price_source` = `custom`). `outbound_price_usd` null means\n  the standard SMS rate.\n- `toll_free_inbound_price_usd` null means the same as `inbound_price_usd`.\n- A country without a Basic price or explicit prices has null prices and\n  `is_available: false`.","operationId":"public_pricing_v1_two_way_pricing_get","responses":{"200":{"description":"Per-country USD commercials for short codes","content":{"application/json":{"schema":{}}}}}}},"/v1/two-way/countries":{"get":{"tags":["Two-Way SMS"],"summary":"Countries you can request a short code in","description":"The public pricing rows plus KYC requirements, notes and whether a\nshared / dedicated short code is currently free in each country.","operationId":"list_countries_v1_two_way_countries_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/v1/two-way/keywords/check":{"get":{"tags":["Two-Way SMS"],"summary":"Check if a keyword is free on a shared short code","description":"Pass `number` (a shared short code) or `country_code`. Keywords are 2-20 letters or digits; STOP, START, HELP and INFO are reserved.","operationId":"check_keyword_v1_two_way_keywords_check_get","parameters":[{"name":"keyword","in":"query","required":true,"schema":{"type":"string","maxLength":40,"title":"Keyword"}},{"name":"number","in":"query","required":false,"schema":{"anyOf":[{"type":"string","maxLength":20},{"type":"null"}],"title":"Number"}},{"name":"country_code","in":"query","required":false,"schema":{"anyOf":[{"type":"string","maxLength":2},{"type":"null"}],"title":"Country Code"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/two-way/kyc-documents":{"post":{"tags":["Two-Way SMS"],"summary":"Upload a KYC document","description":"PDF, PNG, JPG or WEBP up to 5 MB. Pass the returned `id` in `kyc_document_ids` when requesting a service.","operationId":"upload_kyc_v1_two_way_kyc_documents_post","requestBody":{"content":{"multipart/form-data":{"schema":{"$ref":"#/components/schemas/Body_upload_kyc_v1_two_way_kyc_documents_post"}}},"required":true},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/two-way/kyc-documents/{doc_id}":{"get":{"tags":["Two-Way SMS"],"summary":"Download one of your KYC documents","operationId":"get_kyc_v1_two_way_kyc_documents__doc_id__get","parameters":[{"name":"doc_id","in":"path","required":true,"schema":{"type":"integer","title":"Doc Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/two-way/services":{"get":{"tags":["Two-Way SMS"],"summary":"List your two-way services","operationId":"list_services_v1_two_way_services_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}},"post":{"tags":["Two-Way SMS"],"summary":"Request a short code (dedicated or shared keyword)","description":"Creates a pending request for admin review (KYC + network setup). Nothing is charged until it is approved; the setup fee and first month are charged from your wallet on approval.","operationId":"create_service_v1_two_way_services_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServiceIn"}}},"required":true},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/two-way/services/{service_id}":{"get":{"tags":["Two-Way SMS"],"summary":"Get one two-way service","operationId":"get_service_v1_two_way_services__service_id__get","parameters":[{"name":"service_id","in":"path","required":true,"schema":{"type":"integer","title":"Service Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"patch":{"tags":["Two-Way SMS"],"summary":"Update webhook, auto-reply or email forwarding","operationId":"patch_service_v1_two_way_services__service_id__patch","parameters":[{"name":"service_id","in":"path","required":true,"schema":{"type":"integer","title":"Service Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServicePatch"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/two-way/services/{service_id}/cancel":{"post":{"tags":["Two-Way SMS"],"summary":"Cancel a two-way service","operationId":"cancel_v1_two_way_services__service_id__cancel_post","parameters":[{"name":"service_id","in":"path","required":true,"schema":{"type":"integer","title":"Service Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/two-way/services/{service_id}/messages":{"get":{"tags":["Two-Way SMS"],"summary":"Conversation history (inbound + replies)","operationId":"service_messages_v1_two_way_services__service_id__messages_get","parameters":[{"name":"service_id","in":"path","required":true,"schema":{"type":"integer","title":"Service Id"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":1000,"minimum":1,"default":200,"title":"Limit"}},{"name":"phone","in":"query","required":false,"schema":{"anyOf":[{"type":"string","maxLength":20},{"type":"null"}],"title":"Phone"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/two-way/services/{service_id}/reply":{"post":{"tags":["Two-Way SMS"],"summary":"Reply FROM your short code","description":"Charged per segment at your per-customer country price when you have one, otherwise the two-way outbound price (the country's Basic SMS price unless a custom price is set).","operationId":"reply_v1_two_way_services__service_id__reply_post","parameters":[{"name":"service_id","in":"path","required":true,"schema":{"type":"integer","title":"Service Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ReplyIn"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/two-way/services/{service_id}/test-webhook":{"post":{"tags":["Two-Way SMS"],"summary":"Send a signed test `message.inbound` webhook","operationId":"test_webhook_v1_two_way_services__service_id__test_webhook_post","parameters":[{"name":"service_id","in":"path","required":true,"schema":{"type":"integer","title":"Service Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/admin/two-way/pricing":{"get":{"tags":["Two-Way SMS - admin"],"summary":"All 54 countries' two-way commercials (admin)","operationId":"admin_pricing_v1_admin_two_way_pricing_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/v1/admin/two-way/pricing/{cc}":{"put":{"tags":["Two-Way SMS - admin"],"summary":"Update a country's two-way commercials (admin)","description":"Send `inbound_price_usd` / `outbound_price_usd` as null to clear the override and follow the country's Basic SMS price.","operationId":"admin_update_pricing_v1_admin_two_way_pricing__cc__put","parameters":[{"name":"cc","in":"path","required":true,"schema":{"type":"string","title":"Cc"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PricingPatch"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/admin/two-way/numbers":{"get":{"tags":["Two-Way SMS - admin"],"summary":"List short-code inventory (admin)","operationId":"admin_numbers_v1_admin_two_way_numbers_get","parameters":[{"name":"country_code","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Country Code"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["Two-Way SMS - admin"],"summary":"Add a short code (admin)","operationId":"admin_create_number_v1_admin_two_way_numbers_post","requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/NumberIn"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/admin/two-way/numbers/{number_id}":{"patch":{"tags":["Two-Way SMS - admin"],"summary":"Update a short code (admin)","operationId":"admin_update_number_v1_admin_two_way_numbers__number_id__patch","parameters":[{"name":"number_id","in":"path","required":true,"schema":{"type":"integer","title":"Number Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/NumberIn"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["Two-Way SMS - admin"],"summary":"Delete an unused short code (admin)","operationId":"admin_delete_number_v1_admin_two_way_numbers__number_id__delete","parameters":[{"name":"number_id","in":"path","required":true,"schema":{"type":"integer","title":"Number Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/admin/two-way/numbers/{number_id}/unmatched":{"get":{"tags":["Two-Way SMS - admin"],"summary":"Unmatched inbound on a number (admin)","operationId":"admin_unmatched_v1_admin_two_way_numbers__number_id__unmatched_get","parameters":[{"name":"number_id","in":"path","required":true,"schema":{"type":"integer","title":"Number Id"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":500,"minimum":1,"default":100,"title":"Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/admin/two-way/services":{"get":{"tags":["Two-Way SMS - admin"],"summary":"All two-way services and requests (admin)","operationId":"admin_services_v1_admin_two_way_services_get","parameters":[{"name":"status","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Status"}},{"name":"search","in":"query","required":false,"schema":{"anyOf":[{"type":"string","maxLength":100},{"type":"null"}],"title":"Search"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":500,"minimum":1,"default":200,"title":"Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/admin/two-way/services/{service_id}/approve":{"post":{"tags":["Two-Way SMS - admin"],"summary":"Approve a request - charges setup + first month (admin)","operationId":"admin_approve_v1_admin_two_way_services__service_id__approve_post","parameters":[{"name":"service_id","in":"path","required":true,"schema":{"type":"integer","title":"Service Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApproveIn"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/admin/two-way/services/{service_id}/reject":{"post":{"tags":["Two-Way SMS - admin"],"summary":"Reject a request - nothing charged (admin)","operationId":"admin_reject_v1_admin_two_way_services__service_id__reject_post","parameters":[{"name":"service_id","in":"path","required":true,"schema":{"type":"integer","title":"Service Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ReasonIn"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/admin/two-way/services/{service_id}/suspend":{"post":{"tags":["Two-Way SMS - admin"],"summary":"Suspend a service (admin)","operationId":"admin_suspend_v1_admin_two_way_services__service_id__suspend_post","parameters":[{"name":"service_id","in":"path","required":true,"schema":{"type":"integer","title":"Service Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ReasonIn"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/admin/two-way/services/{service_id}/resume":{"post":{"tags":["Two-Way SMS - admin"],"summary":"Resume a service (admin)","operationId":"admin_resume_v1_admin_two_way_services__service_id__resume_post","parameters":[{"name":"service_id","in":"path","required":true,"schema":{"type":"integer","title":"Service Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/admin/sender-id-fees":{"get":{"tags":["Sender IDs - admin"],"summary":"Sender ID fees for all 54 countries (admin)","description":"Every country's configured flat fee plus what customers see publicly\n(`public`: the GET /sender-ids/fees row - flat fee, per-network fee table\nfrom the Sender ID sales doc, or on request).","operationId":"admin_sender_fees_v1_admin_sender_id_fees_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/v1/admin/sender-id-fees/{cc}":{"put":{"tags":["Sender IDs - admin"],"summary":"Set a country's one-time Sender ID fee (admin)","operationId":"admin_set_sender_fee_v1_admin_sender_id_fees__cc__put","parameters":[{"name":"cc","in":"path","required":true,"schema":{"type":"string","title":"Cc"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SenderFeeIn"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/internal/mo":{"post":{"tags":["Internal"],"summary":"Receive Mo","operationId":"receive_mo_internal_mo_post","parameters":[{"name":"X-Internal-Key","in":"header","required":true,"schema":{"type":"string","title":"X-Internal-Key"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/MOIn"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/internal/credit":{"post":{"tags":["Internal"],"summary":"Receive Credit","description":"Auth fans out payment confirmation here after a successful charge.\n\nIdempotent: if a transaction with the same auth_transaction_id has already been\napplied, return the current balance without crediting again. Auth retries the\nfanout on partial failures, so duplicate calls are expected.","operationId":"receive_credit_internal_credit_post","parameters":[{"name":"X-Internal-Key","in":"header","required":true,"schema":{"type":"string","title":"X-Internal-Key"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreditRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/internal/account-state":{"post":{"tags":["Internal"],"summary":"Set Account State","description":"Auth fans out account suspend/restore here. Idempotent upsert; the send\npath checks this so a suspended account is blocked instantly.","operationId":"set_account_state_internal_account_state_post","parameters":[{"name":"X-Internal-Key","in":"header","required":true,"schema":{"type":"string","title":"X-Internal-Key"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AccountStateIn"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/internal/pricing-sync":{"post":{"tags":["internal"],"summary":"Pricing Sync","description":"Single source of truth is the SMPP portal's per-country price. On save it\ncalls here; we write the price into every route for that country (converted\nto the route's local currency) so the marketing page (reads routes live) and\nsms-app billing (bills off routes) both reflect immediately, then reseed the\nseed-owned sales pricing docs. Does NOT touch SMPP bind client prices.","operationId":"pricing_sync_internal_pricing_sync_post","parameters":[{"name":"X-Internal-Key","in":"header","required":true,"schema":{"type":"string","title":"X-Internal-Key"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PricingSyncBody"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/internal/render-pdf":{"post":{"tags":["Internal"],"summary":"Internal Render Pdf","description":"Render arbitrary HTML to a PDF via headless Chromium (shared platform\ncapability - used by the admin proposal sender). Internal only.","operationId":"internal_render_pdf_internal_render_pdf_post","parameters":[{"name":"X-Internal-Key","in":"header","required":true,"schema":{"type":"string","title":"X-Internal-Key"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RenderPdfIn"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/internal/inquiries":{"post":{"tags":["Internal"],"summary":"Receive Inquiry","operationId":"receive_inquiry_internal_inquiries_post","parameters":[{"name":"X-Internal-Key","in":"header","required":true,"schema":{"type":"string","title":"X-Internal-Key"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/InquiryPayload"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/internal/grant-default-senders":{"post":{"tags":["internal"],"summary":"Grant Default Senders","description":"Grant the account the two default, pre-approved sender IDs (eSMS,\neSMSAfrica) for every country we route to, so a freshly-verified user can top\nup and start sending right away. Idempotent - safe to call more than once.","operationId":"grant_default_senders_internal_grant_default_senders_post","parameters":[{"name":"X-Internal-Key","in":"header","required":true,"schema":{"type":"string","title":"X-Internal-Key"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/GrantDefaultsBody"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/webhooks/dlr":{"post":{"tags":["Webhooks"],"summary":"Handle Dlr","description":"DLR callback - update message status, trigger auto-retry or webhook delivery.\n\nMust return the literal body 'ACK/Jasmin' so Jasmin's HTTP DLR thrower\ntreats the delivery as acknowledged. Anything else (including JSON) makes\nJasmin raise MessageAcknowledgementError, retry 4 times, then purge the\nmessage from the dlr_thrower queue.","operationId":"handle_dlr_webhooks_dlr_post","responses":{"200":{"description":"Successful Response","content":{"text/plain":{"schema":{"type":"string"}}}}}}},"/api/textsms/dlr":{"get":{"tags":["Webhooks"],"summary":"Textsms Dlr","operationId":"textsms_dlr_api_textsms_dlr_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}},"post":{"tags":["Webhooks"],"summary":"Textsms Dlr","operationId":"textsms_dlr_api_textsms_dlr_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}}},"components":{"schemas":{"AccountStateIn":{"properties":{"auth_user_id":{"type":"string","title":"Auth User Id"},"suspended":{"type":"boolean","title":"Suspended"},"reason":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Reason"}},"type":"object","required":["auth_user_id","suspended"],"title":"AccountStateIn"},"AdminCreateSenderID":{"properties":{"auth_user_id":{"type":"string","title":"Auth User Id"},"name":{"type":"string","title":"Name"},"countries":{"items":{"type":"string"},"type":"array","title":"Countries"},"use_case":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Use Case"}},"type":"object","required":["auth_user_id","name","countries"],"title":"AdminCreateSenderID","description":"Admin directly creates an approved sender ID for a user."},"AlertIn":{"properties":{"enabled":{"type":"boolean","title":"Enabled","default":true},"threshold":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Threshold"},"channel":{"type":"string","title":"Channel","default":"both"}},"type":"object","title":"AlertIn"},"ApproveIn":{"properties":{"number_id":{"type":"integer","title":"Number Id"},"keyword":{"anyOf":[{"type":"string","maxLength":40},{"type":"null"}],"title":"Keyword"},"admin_note":{"anyOf":[{"type":"string","maxLength":1000},{"type":"null"}],"title":"Admin Note"}},"type":"object","required":["number_id"],"title":"ApproveIn"},"Body_create_contact_list_api_contact_lists_post":{"properties":{"file":{"type":"string","contentMediaType":"application/octet-stream","title":"File"},"name":{"type":"string","title":"Name","default":""},"tags":{"type":"string","title":"Tags","default":""}},"type":"object","required":["file"],"title":"Body_create_contact_list_api_contact_lists_post"},"Body_create_contact_list_v1_contact_lists_post":{"properties":{"file":{"type":"string","contentMediaType":"application/octet-stream","title":"File"},"name":{"type":"string","title":"Name","default":""},"tags":{"type":"string","title":"Tags","default":""}},"type":"object","required":["file"],"title":"Body_create_contact_list_v1_contact_lists_post"},"Body_upload_kyc_api_two_way_kyc_documents_post":{"properties":{"file":{"type":"string","contentMediaType":"application/octet-stream","title":"File"}},"type":"object","required":["file"],"title":"Body_upload_kyc_api_two_way_kyc_documents_post"},"Body_upload_kyc_v1_two_way_kyc_documents_post":{"properties":{"file":{"type":"string","contentMediaType":"application/octet-stream","title":"File"}},"type":"object","required":["file"],"title":"Body_upload_kyc_v1_two_way_kyc_documents_post"},"BulkSendRequest":{"properties":{"contact_list_ids":{"items":{"type":"integer"},"type":"array","title":"Contact List Ids","default":[]},"recipients":{"items":{"$ref":"#/components/schemas/Recipient"},"type":"array","title":"Recipients","default":[]},"text":{"type":"string","title":"Text"},"sender_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Sender Id"},"route":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Route"},"schedule_mode":{"type":"string","title":"Schedule Mode","default":"now"},"scheduled_at":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Scheduled At"},"drip_rate":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Drip Rate"},"international":{"type":"boolean","title":"International","default":false}},"type":"object","required":["text"],"title":"BulkSendRequest"},"BulkSendResult":{"properties":{"batch_id":{"type":"string","title":"Batch Id"},"total_recipients":{"type":"integer","title":"Total Recipients"},"estimated_cost":{"type":"number","title":"Estimated Cost"},"status":{"type":"string","title":"Status"}},"type":"object","required":["batch_id","total_recipients","estimated_cost","status"],"title":"BulkSendResult"},"CampaignBody":{"properties":{"name":{"type":"string","title":"Name"},"text_template":{"type":"string","title":"Text Template"},"segment_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Segment Id"},"contact_list_ids":{"items":{"type":"integer"},"type":"array","title":"Contact List Ids","default":[]},"sender_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Sender Id"},"route_code":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Route Code"},"schedule_mode":{"type":"string","title":"Schedule Mode","default":"now"},"scheduled_at":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Scheduled At"},"drip_rate":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Drip Rate"}},"type":"object","required":["name","text_template"],"title":"CampaignBody"},"ComponentBody":{"properties":{"key":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Key"},"name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Name"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description"},"status":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Status"},"position":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Position"},"enabled":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Enabled"}},"type":"object","title":"ComponentBody"},"ContactIn":{"properties":{"phone":{"type":"string","title":"Phone"},"name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Name"},"data":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Data"}},"type":"object","required":["phone"],"title":"ContactIn"},"CreateKeyRequest":{"properties":{"name":{"type":"string","title":"Name"},"environment":{"type":"string","title":"Environment","default":"live"},"scopes":{"type":"string","title":"Scopes","default":"send,query,webhooks"}},"type":"object","required":["name"],"title":"CreateKeyRequest"},"CreateRestriction":{"properties":{"sender_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Sender Name"},"country_code":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Country Code"},"reason":{"type":"string","title":"Reason"},"admin_note":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Admin Note"}},"type":"object","required":["reason"],"title":"CreateRestriction"},"CreateRoute":{"properties":{"code":{"type":"string","title":"Code"},"name":{"type":"string","title":"Name"},"country_code":{"type":"string","title":"Country Code"},"country_name":{"type":"string","title":"Country Name"},"currency":{"type":"string","title":"Currency","default":"USD"},"price_per_segment":{"type":"number","title":"Price Per Segment"},"cost_per_segment":{"type":"number","title":"Cost Per Segment"},"provider":{"type":"string","title":"Provider","default":"jasmin"},"jasmin_username":{"type":"string","title":"Jasmin Username","default":""},"jasmin_password":{"type":"string","title":"Jasmin Password","default":""},"provider_config":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Provider Config"},"sender_id_default":{"type":"string","title":"Sender Id Default","default":"eSMSAfrica"},"tier_prices":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Tier Prices"},"intl_prices":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Intl Prices"}},"type":"object","required":["code","name","country_code","country_name","price_per_segment","cost_per_segment"],"title":"CreateRoute"},"CreditRequest":{"properties":{"transactionId":{"type":"string","title":"Transactionid"},"userId":{"type":"string","title":"Userid"},"walletId":{"type":"integer","title":"Walletid","default":0},"amount":{"type":"number","title":"Amount"},"currency":{"type":"string","title":"Currency"},"reference":{"type":"string","title":"Reference"},"provider":{"type":"string","title":"Provider"}},"type":"object","required":["transactionId","userId","amount","currency","reference","provider"],"title":"CreditRequest"},"DeleteSenderID":{"properties":{"notification_message":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Notification Message"}},"type":"object","title":"DeleteSenderID"},"EditSenderID":{"properties":{"name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Name"},"countries":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Countries"},"admin_note":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Admin Note"},"notification_message":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Notification Message"}},"type":"object","title":"EditSenderID"},"GrantDefaultsBody":{"properties":{"userId":{"type":"string","title":"Userid"}},"type":"object","required":["userId"],"title":"GrantDefaultsBody"},"HTTPValidationError":{"properties":{"detail":{"items":{"$ref":"#/components/schemas/ValidationError"},"type":"array","title":"Detail"}},"type":"object","title":"HTTPValidationError"},"IncidentBody":{"properties":{"title":{"type":"string","title":"Title"},"status":{"type":"string","title":"Status","default":"investigating"},"impact":{"type":"string","title":"Impact","default":"minor"},"body":{"type":"string","title":"Body"},"component_keys":{"items":{"type":"string"},"type":"array","title":"Component Keys","default":[]},"component_status":{"type":"string","title":"Component Status","default":"degraded"},"is_maintenance":{"type":"boolean","title":"Is Maintenance","default":false}},"type":"object","required":["title","body"],"title":"IncidentBody"},"InquiryPayload":{"properties":{"id":{"type":"integer","title":"Id"},"requester_type":{"type":"string","title":"Requester Type"},"full_name":{"type":"string","title":"Full Name"},"company_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Company Name"},"email":{"type":"string","title":"Email"},"phone":{"type":"string","title":"Phone"},"your_country":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Your Country"},"countries_inquiry":{"type":"string","title":"Countries Inquiry"},"message":{"type":"string","title":"Message"},"created_at":{"type":"string","title":"Created At"}},"type":"object","required":["id","requester_type","full_name","email","phone","countries_inquiry","message","created_at"],"title":"InquiryPayload"},"InquiryUpdate":{"properties":{"status":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Status"},"notes":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Notes"}},"type":"object","title":"InquiryUpdate"},"InviteBody":{"properties":{"email":{"type":"string","title":"Email"},"role":{"type":"string","title":"Role","default":"member"}},"type":"object","required":["email"],"title":"InviteBody"},"MOIn":{"properties":{"source":{"type":"string","title":"Source"},"destination":{"type":"string","title":"Destination","default":""},"text":{"type":"string","title":"Text","default":""},"connector":{"type":"string","title":"Connector","default":""},"message_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Message Id"},"received_at":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Received At"},"segments":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Segments"}},"type":"object","required":["source"],"title":"MOIn"},"ManualAdjustment":{"properties":{"amount":{"type":"number","exclusiveMinimum":0.0,"title":"Amount"},"description":{"type":"string","title":"Description"}},"type":"object","required":["amount","description"],"title":"ManualAdjustment"},"MaterialIn":{"properties":{"scope":{"type":"string","title":"Scope","default":"country"},"country_code":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Country Code"},"country_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Country Name"},"doc_type":{"type":"string","title":"Doc Type"},"title":{"type":"string","title":"Title"},"summary":{"type":"string","title":"Summary","default":""},"body":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Body"},"is_published":{"type":"boolean","title":"Is Published","default":false},"sort_order":{"type":"integer","title":"Sort Order","default":0}},"type":"object","required":["doc_type","title"],"title":"MaterialIn"},"MaterialUpdate":{"properties":{"title":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Title"},"summary":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Summary"},"body":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Body"},"is_published":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Is Published"},"sort_order":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Sort Order"}},"type":"object","title":"MaterialUpdate"},"NumberIn":{"properties":{"number":{"anyOf":[{"type":"string","maxLength":20},{"type":"null"}],"title":"Number"},"country_code":{"anyOf":[{"type":"string","maxLength":2,"minLength":2},{"type":"null"}],"title":"Country Code"},"mode":{"anyOf":[{"type":"string","pattern":"^(dedicated|shared)$"},{"type":"null"}],"title":"Mode"},"toll_free":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Toll Free"},"connector_id":{"anyOf":[{"type":"string","maxLength":50},{"type":"null"}],"title":"Connector Id"},"status":{"anyOf":[{"type":"string","pattern":"^(active|disabled)$"},{"type":"null"}],"title":"Status"},"default_reply":{"anyOf":[{"type":"string","maxLength":480},{"type":"null"}],"title":"Default Reply"},"notes":{"anyOf":[{"type":"string","maxLength":2000},{"type":"null"}],"title":"Notes"}},"type":"object","title":"NumberIn"},"OptOutIn":{"properties":{"phone":{"type":"string","title":"Phone"}},"type":"object","required":["phone"],"title":"OptOutIn"},"PreCheckRequest":{"properties":{"contact_list_ids":{"items":{"type":"integer"},"type":"array","title":"Contact List Ids","default":[]},"recipients":{"items":{"$ref":"#/components/schemas/Recipient"},"type":"array","title":"Recipients","default":[]},"text":{"type":"string","title":"Text"},"sender_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Sender Id"},"international":{"type":"boolean","title":"International","default":false}},"type":"object","required":["text"],"title":"PreCheckRequest"},"PricingPatch":{"properties":{"setup_fee_usd":{"anyOf":[{"type":"number","minimum":0.0},{"type":"null"}],"title":"Setup Fee Usd"},"monthly_fee_usd":{"anyOf":[{"type":"number","minimum":0.0},{"type":"null"}],"title":"Monthly Fee Usd"},"shared_keyword_monthly_fee_usd":{"anyOf":[{"type":"number","minimum":0.0},{"type":"null"}],"title":"Shared Keyword Monthly Fee Usd"},"inbound_price_usd":{"anyOf":[{"type":"number","minimum":0.0},{"type":"null"}],"title":"Inbound Price Usd"},"outbound_price_usd":{"anyOf":[{"type":"number","minimum":0.0},{"type":"null"}],"title":"Outbound Price Usd"},"toll_free_available":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Toll Free Available"},"toll_free_inbound_price_usd":{"anyOf":[{"type":"number","minimum":0.0},{"type":"null"}],"title":"Toll Free Inbound Price Usd"},"networks":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Networks"},"kyc_requirements":{"anyOf":[{"type":"string","maxLength":4000},{"type":"null"}],"title":"Kyc Requirements"},"notes":{"anyOf":[{"type":"string","maxLength":4000},{"type":"null"}],"title":"Notes"},"is_available":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Is Available"}},"type":"object","title":"PricingPatch"},"PricingSyncBody":{"properties":{"country_code":{"type":"string","title":"Country Code"},"country_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Country Name"},"cost_usd":{"type":"number","title":"Cost Usd","default":0},"basic_usd":{"type":"number","title":"Basic Usd"},"business_usd":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Business Usd"},"enterprise_usd":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Enterprise Usd"},"intl_basic_usd":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Intl Basic Usd"},"intl_business_usd":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Intl Business Usd"},"intl_enterprise_usd":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Intl Enterprise Usd"}},"type":"object","required":["country_code","basic_usd"],"title":"PricingSyncBody","description":"Country selling price pushed from the SMPP portal (jcli-api). All USD."},"ProductRequestIn":{"properties":{"product":{"type":"string","title":"Product"},"company_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Company Name"},"countries":{"type":"string","title":"Countries"},"details":{"type":"string","title":"Details"},"phone":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Phone"}},"type":"object","required":["product","countries","details"],"title":"ProductRequestIn"},"RateRequest":{"properties":{"to":{"anyOf":[{"type":"string"},{"items":{"type":"string"},"type":"array"}],"title":"To"},"text":{"type":"string","title":"Text"},"route":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Route"},"international":{"type":"boolean","title":"International","default":false}},"type":"object","required":["to","text"],"title":"RateRequest"},"ReasonIn":{"properties":{"reason":{"anyOf":[{"type":"string","maxLength":500},{"type":"null"}],"title":"Reason"}},"type":"object","title":"ReasonIn"},"Recipient":{"properties":{"to":{"type":"string","title":"To"},"name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Name"},"vars":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Vars"}},"type":"object","required":["to"],"title":"Recipient"},"RenderPdfIn":{"properties":{"html":{"type":"string","title":"Html"}},"type":"object","required":["html"],"title":"RenderPdfIn"},"ReplyIn":{"properties":{"to":{"type":"string","maxLength":20,"minLength":5,"title":"To"},"text":{"type":"string","maxLength":1600,"minLength":1,"title":"Text"}},"type":"object","required":["to","text"],"title":"ReplyIn"},"RequestSenderID":{"properties":{"name":{"type":"string","title":"Name"},"countries":{"items":{"type":"string"},"type":"array","title":"Countries"},"use_case":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Use Case"}},"type":"object","required":["name","countries"],"title":"RequestSenderID"},"ReviewSenderID":{"properties":{"status":{"type":"string","title":"Status"},"rejection_reason":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Rejection Reason"},"waiting_message":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Waiting Message"},"admin_note":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Admin Note"},"countries":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Countries"},"waive_fee":{"type":"boolean","title":"Waive Fee","default":false}},"type":"object","required":["status"],"title":"ReviewSenderID"},"RoleBody":{"properties":{"role":{"type":"string","title":"Role"}},"type":"object","required":["role"],"title":"RoleBody"},"SegmentBody":{"properties":{"name":{"type":"string","title":"Name"},"contact_list_ids":{"items":{"type":"integer"},"type":"array","title":"Contact List Ids","default":[]},"filters":{"items":{"additionalProperties":true,"type":"object"},"type":"array","title":"Filters","default":[]},"match_all":{"type":"boolean","title":"Match All","default":true}},"type":"object","required":["name"],"title":"SegmentBody"},"SendRequest":{"properties":{"to":{"type":"string","title":"To"},"text":{"type":"string","title":"Text"},"sender_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Sender Id"},"route":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Route"},"schedule_mode":{"type":"string","title":"Schedule Mode","default":"now"},"scheduled_at":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Scheduled At"},"international":{"type":"boolean","title":"International","default":false}},"type":"object","required":["to","text"],"title":"SendRequest"},"SenderFeeIn":{"properties":{"fee_usd":{"anyOf":[{"type":"number","maximum":100000.0,"minimum":0.0},{"type":"null"}],"title":"Fee Usd"},"is_active":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Is Active"},"note":{"anyOf":[{"type":"string","maxLength":300},{"type":"null"}],"title":"Note"}},"type":"object","title":"SenderFeeIn"},"ServiceIn":{"properties":{"country_code":{"type":"string","maxLength":2,"minLength":2,"title":"Country Code"},"type":{"type":"string","pattern":"^(dedicated|shared)$","title":"Type"},"keyword":{"anyOf":[{"type":"string","maxLength":40},{"type":"null"}],"title":"Keyword"},"toll_free":{"type":"boolean","title":"Toll Free","default":false},"use_case":{"type":"string","maxLength":4000,"minLength":10,"title":"Use Case"},"company_name":{"type":"string","maxLength":200,"minLength":2,"title":"Company Name"},"kyc_document_urls":{"items":{"type":"string"},"type":"array","maxItems":10,"title":"Kyc Document Urls"},"kyc_document_ids":{"items":{"type":"integer"},"type":"array","maxItems":10,"title":"Kyc Document Ids"},"webhook_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Webhook Url"}},"type":"object","required":["country_code","type","use_case","company_name"],"title":"ServiceIn"},"ServicePatch":{"properties":{"webhook_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Webhook Url"},"auto_reply_text":{"anyOf":[{"type":"string","maxLength":480},{"type":"null"}],"title":"Auto Reply Text"},"auto_reply_enabled":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Auto Reply Enabled"},"forward_email":{"anyOf":[{"type":"string","maxLength":255},{"type":"null"}],"title":"Forward Email"}},"type":"object","title":"ServicePatch"},"SetRate":{"properties":{"units_per_usd":{"type":"number","title":"Units Per Usd"},"locked":{"type":"boolean","title":"Locked","default":true}},"type":"object","required":["units_per_usd"],"title":"SetRate"},"SetUserPrice":{"properties":{"auth_user_id":{"type":"string","title":"Auth User Id"},"country_code":{"type":"string","title":"Country Code"},"currency":{"type":"string","title":"Currency"},"price_per_segment":{"type":"number","title":"Price Per Segment"},"intl_price_per_segment":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Intl Price Per Segment"},"note":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Note"}},"type":"object","required":["auth_user_id","country_code","currency","price_per_segment"],"title":"SetUserPrice"},"SimBody":{"properties":{"to":{"type":"string","title":"To"},"sender":{"type":"string","title":"Sender","default":"eSMS"},"text":{"type":"string","title":"Text"}},"type":"object","required":["to","text"],"title":"SimBody"},"SubscribeBody":{"properties":{"email":{"type":"string","title":"Email"}},"type":"object","required":["email"],"title":"SubscribeBody"},"TemplateIn":{"properties":{"name":{"type":"string","maxLength":80,"minLength":1,"title":"Name"},"text":{"type":"string","minLength":1,"title":"Text"}},"type":"object","required":["name","text"],"title":"TemplateIn"},"TierUpdate":{"properties":{"name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Name"},"min_usd":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Min Usd"},"max_usd":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Max Usd"},"blurb":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Blurb"},"sort_order":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Sort Order"},"is_active":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Is Active"}},"type":"object","title":"TierUpdate"},"UpdateBody":{"properties":{"status":{"type":"string","title":"Status"},"body":{"type":"string","title":"Body"}},"type":"object","required":["status","body"],"title":"UpdateBody"},"UpdateRatesBody":{"properties":{"rates":{"additionalProperties":{"type":"number"},"type":"object","title":"Rates"}},"type":"object","required":["rates"],"title":"UpdateRatesBody"},"UpdateRestriction":{"properties":{"reason":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Reason"},"admin_note":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Admin Note"},"is_active":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Is Active"}},"type":"object","title":"UpdateRestriction"},"UpdateRoute":{"properties":{"name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Name"},"currency":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Currency"},"price_per_segment":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Price Per Segment"},"cost_per_segment":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Cost Per Segment"},"sender_id_default":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Sender Id Default"},"is_active":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Is Active"},"provider":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Provider"},"jasmin_username":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Jasmin Username"},"jasmin_password":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Jasmin Password"},"provider_config":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Provider Config"},"tier_prices":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Tier Prices"},"intl_prices":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Intl Prices"}},"type":"object","title":"UpdateRoute"},"UpdateWebhooks":{"properties":{"dlr_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Dlr Url"},"mo_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Mo Url"},"is_active":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Is Active"}},"type":"object","title":"UpdateWebhooks"},"UpdateWorkspace":{"properties":{"name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Name"},"timezone":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Timezone"},"default_sender_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Default Sender Id"},"encoding_default":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Encoding Default"},"dlr_tracking":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Dlr Tracking"},"dup_protection":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Dup Protection"}},"type":"object","title":"UpdateWorkspace"},"ValidateRequest":{"properties":{"phone":{"anyOf":[{"type":"string"},{"items":{"type":"string"},"type":"array"}],"title":"Phone"}},"type":"object","required":["phone"],"title":"ValidateRequest"},"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"},"VerifyAppIn":{"properties":{"name":{"type":"string","maxLength":80,"minLength":1,"title":"Name"},"sender_id":{"anyOf":[{"type":"string","maxLength":11},{"type":"null"}],"title":"Sender Id"},"template":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Template"},"code_length":{"type":"integer","maximum":8.0,"minimum":4.0,"title":"Code Length","default":6},"expiry_seconds":{"type":"integer","maximum":900.0,"minimum":60.0,"title":"Expiry Seconds","default":300},"max_attempts":{"type":"integer","maximum":10.0,"minimum":1.0,"title":"Max Attempts","default":5},"allowed_countries":{"items":{"type":"string"},"type":"array","title":"Allowed Countries","default":[]},"locale":{"type":"string","title":"Locale","default":"en"},"enabled":{"type":"boolean","title":"Enabled","default":true}},"type":"object","required":["name"],"title":"VerifyAppIn"},"VerifyCheck":{"properties":{"code":{"type":"string","title":"Code"},"verification_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Verification Id"},"to":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"To"}},"type":"object","required":["code"],"title":"VerifyCheck"},"VerifyStart":{"properties":{"to":{"type":"string","title":"To"},"channel":{"type":"string","title":"Channel","default":"sms"},"app_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"App Id"},"sender_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Sender Id"},"code_length":{"type":"integer","maximum":8.0,"minimum":4.0,"title":"Code Length","default":6},"expiry_seconds":{"type":"integer","maximum":900.0,"minimum":60.0,"title":"Expiry Seconds","default":300},"template":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Template"}},"type":"object","required":["to"],"title":"VerifyStart"}}},"tags":[{"name":"Messages","description":"Send SMS and track delivery."},{"name":"Two-Way SMS","description":"Short codes that both send and receive. A dedicated short code is yours alone; a shared one is split between customers by keyword. Inbound messages reach your backend as signed `message.inbound` webhooks and you reply FROM the short code. Per-SMS prices follow each country's Basic SMS price unless a custom price is set. API keys need the `two_way` scope (`query` is enough for reads; replies accept `send`)."},{"name":"Sender IDs","description":"Request branded alphanumeric Sender IDs per country and see registration fees for all 54 African countries."},{"name":"Two-Way SMS - admin","description":"Admin console endpoints (admin role required)."},{"name":"Sender IDs - admin","description":"Admin console endpoints (admin role required)."}]}