{"openapi":"3.1.0","info":{"title":"Proxy Charm — Developer API","description":"Programmatic access to your Proxy Charm resources.\n\nAuthenticate with `Authorization: Bearer <your px_live_… key>`.\n\nKeys are created and revoked on the **Developer** page of the dashboard.","version":"0.1.0"},"paths":{"/api/v1/public/organization":{"get":{"tags":["Public API","Public API"],"summary":"Get organisation","description":"Return the caller's organisation.\n\nIncludes the organisation name, accounts (workspaces), and members.\nEquivalent to the dashboard's *My Organisation* view, scoped to the\norganisation that owns this API key.","operationId":"get_organization_api_v1_public_organization_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ActionResponse_OrganizationView_"}}}}},"security":[{"HTTPBearer":[]},{"BearerAuth":[]}]}},"/api/v1/public/workspaces":{"get":{"tags":["Public API","Public API"],"summary":"List workspaces","description":"List all active workspaces for the caller's organisation.","operationId":"list_workspaces_api_v1_public_workspaces_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ActionResponse_list_OrganizationAccount__"}}}}},"security":[{"HTTPBearer":[]},{"BearerAuth":[]}]},"post":{"tags":["Public API","Public API"],"summary":"Add workspace","description":"Add a new workspace to the organisation.\n\nRequires an active subscription.  The workspace appears as\n``pending_provision`` until IPs are assigned.","operationId":"add_workspace_api_v1_public_workspaces_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AddWorkspaceBody"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ActionResponse_AddOrganizationAccountResult_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]},{"BearerAuth":[]}]}},"/api/v1/public/workspaces/{account_id}":{"get":{"tags":["Public API","Public API"],"summary":"Get workspace","description":"Return details for a single workspace.\n\nReturns 403 if the workspace does not belong to the caller's organisation.","operationId":"get_workspace_api_v1_public_workspaces__account_id__get","security":[{"HTTPBearer":[]},{"BearerAuth":[]}],"parameters":[{"name":"account_id","in":"path","required":true,"schema":{"type":"string","title":"Account Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ActionResponse_OrganizationAccount_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["Public API","Public API"],"summary":"Remove workspace","description":"Permanently remove a workspace from the organisation.\n\nReturns 403 if the workspace does not belong to the caller's organisation.\nThe last active workspace cannot be removed while a subscription is live.","operationId":"remove_workspace_api_v1_public_workspaces__account_id__delete","security":[{"HTTPBearer":[]},{"BearerAuth":[]}],"parameters":[{"name":"account_id","in":"path","required":true,"schema":{"type":"string","title":"Account Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ActionResponse_MySubscriptionView_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/public/proxies":{"get":{"tags":["Public API","Public API"],"summary":"List proxies","description":"List all assigned proxies for the caller's organisation.\n\nPass ``?account_id=`` to filter results to a single workspace.\nReturns Proxy Charm gateway credentials (host, port, username, password)\nand the residential exit IP for each assignment.\nUpstream vendor credentials are never included.","operationId":"list_proxies_api_v1_public_proxies_get","security":[{"HTTPBearer":[]},{"BearerAuth":[]}],"parameters":[{"name":"account_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Optional workspace id to filter proxies to a single workspace","title":"Account Id"},"description":"Optional workspace id to filter proxies to a single workspace"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ActionResponse_AssignedProxyList_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/public/proxies/{assignment_id}":{"get":{"tags":["Public API","Public API"],"summary":"Get proxy","description":"Return details for a single proxy assignment.\n\nReturns 404 if the assignment does not exist in the caller's organisation.\nCross-org access is prevented by scoping the lookup to the org's accounts.","operationId":"get_proxy_api_v1_public_proxies__assignment_id__get","security":[{"HTTPBearer":[]},{"BearerAuth":[]}],"parameters":[{"name":"assignment_id","in":"path","required":true,"schema":{"type":"string","title":"Assignment Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ActionResponse_AssignedProxy_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/public/workspaces/{account_id}/proxies":{"get":{"tags":["Public API","Public API"],"summary":"List workspace proxies","description":"List all proxies assigned to a specific workspace.\n\nReturns 403 if the workspace does not belong to the caller's organisation.\nEquivalent to ``GET /proxies?account_id={account_id}``.","operationId":"get_workspace_proxies_api_v1_public_workspaces__account_id__proxies_get","security":[{"HTTPBearer":[]},{"BearerAuth":[]}],"parameters":[{"name":"account_id","in":"path","required":true,"schema":{"type":"string","title":"Account Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ActionResponse_AssignedProxyList_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/public/subscription":{"get":{"tags":["Public API","Public API"],"summary":"Get subscription","description":"Return the caller's live subscription.\n\nReturns ``{\"subscription\": null}`` (not an error) when the organisation\nhas no active subscription.  Use ``POST /checkout`` from the dashboard to\nstart one.","operationId":"get_subscription_api_v1_public_subscription_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ActionResponse_MySubscriptionView_"}}}}},"security":[{"HTTPBearer":[]},{"BearerAuth":[]}]}},"/api/v1/public/invoices":{"get":{"tags":["Public API","Public API"],"summary":"List invoices","description":"Return a paginated list of invoices for the caller's organisation.\n\nInvoice data includes the ``hosted_url`` for viewing the Stripe-hosted\ninvoice page.  Card numbers and sensitive payment details are never\nincluded.  Newest invoices appear first.","operationId":"list_invoices_api_v1_public_invoices_get","security":[{"HTTPBearer":[]},{"BearerAuth":[]}],"parameters":[{"name":"limit","in":"query","required":false,"schema":{"anyOf":[{"type":"integer","maximum":100,"minimum":1},{"type":"null"}],"description":"Max invoices to return (1–100, default 10)","title":"Limit"},"description":"Max invoices to return (1–100, default 10)"},{"name":"starting_after","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Stripe invoice id to paginate from (cursor-based, newest-first)","title":"Starting After"},"description":"Stripe invoice id to paginate from (cursor-based, newest-first)"},{"name":"status","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Filter by status: open | paid | uncollectible | void","title":"Status"},"description":"Filter by status: open | paid | uncollectible | void"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ActionResponse_CustomerInvoiceList_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}}},"components":{"schemas":{"AccountPlanChangeBody":{"properties":{"account_id":{"type":"string","title":"Account Id","description":"Live account that receives added or dropped slots"},"add_slots":{"items":{"$ref":"#/components/schemas/SlotCountryChoice"},"type":"array","title":"Add Slots","description":"New countries for IPs added on this account"},"drop_slot_indexes":{"items":{"type":"integer"},"type":"array","title":"Drop Slot Indexes","description":"Existing slot indexes on this account to release"}},"type":"object","required":["account_id"],"title":"AccountPlanChangeBody"},"ActionResponse_AddAccountPreview_":{"properties":{"success":{"type":"boolean","title":"Success","description":"Whether the action completed successfully"},"data":{"anyOf":[{"$ref":"#/components/schemas/AddAccountPreview"},{"type":"null"}],"description":"Action result data"},"error":{"anyOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"type":"null"}],"description":"Error details if success is False"},"context":{"anyOf":[{"$ref":"#/components/schemas/ResponseContext"},{"type":"null"}],"description":"Additional context and suggestions"},"request_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Request Id","description":"Unique request identifier for tracing"},"timestamp":{"type":"string","format":"date-time","title":"Timestamp","description":"Response timestamp"}},"type":"object","required":["success"],"title":"ActionResponse[AddAccountPreview]"},"ActionResponse_AddOrganizationAccountResult_":{"properties":{"success":{"type":"boolean","title":"Success","description":"Whether the action completed successfully"},"data":{"anyOf":[{"$ref":"#/components/schemas/AddOrganizationAccountResult"},{"type":"null"}],"description":"Action result data"},"error":{"anyOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"type":"null"}],"description":"Error details if success is False"},"context":{"anyOf":[{"$ref":"#/components/schemas/ResponseContext"},{"type":"null"}],"description":"Additional context and suggestions"},"request_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Request Id","description":"Unique request identifier for tracing"},"timestamp":{"type":"string","format":"date-time","title":"Timestamp","description":"Response timestamp"}},"type":"object","required":["success"],"title":"ActionResponse[AddOrganizationAccountResult]"},"ActionResponse_AdminSubscriptionList_":{"properties":{"success":{"type":"boolean","title":"Success","description":"Whether the action completed successfully"},"data":{"anyOf":[{"$ref":"#/components/schemas/AdminSubscriptionList"},{"type":"null"}],"description":"Action result data"},"error":{"anyOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"type":"null"}],"description":"Error details if success is False"},"context":{"anyOf":[{"$ref":"#/components/schemas/ResponseContext"},{"type":"null"}],"description":"Additional context and suggestions"},"request_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Request Id","description":"Unique request identifier for tracing"},"timestamp":{"type":"string","format":"date-time","title":"Timestamp","description":"Response timestamp"}},"type":"object","required":["success"],"title":"ActionResponse[AdminSubscriptionList]"},"ActionResponse_ApiKeyCreated_":{"properties":{"success":{"type":"boolean","title":"Success","description":"Whether the action completed successfully"},"data":{"anyOf":[{"$ref":"#/components/schemas/ApiKeyCreated"},{"type":"null"}],"description":"Action result data"},"error":{"anyOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"type":"null"}],"description":"Error details if success is False"},"context":{"anyOf":[{"$ref":"#/components/schemas/ResponseContext"},{"type":"null"}],"description":"Additional context and suggestions"},"request_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Request Id","description":"Unique request identifier for tracing"},"timestamp":{"type":"string","format":"date-time","title":"Timestamp","description":"Response timestamp"}},"type":"object","required":["success"],"title":"ActionResponse[ApiKeyCreated]"},"ActionResponse_ApiKeyList_":{"properties":{"success":{"type":"boolean","title":"Success","description":"Whether the action completed successfully"},"data":{"anyOf":[{"$ref":"#/components/schemas/ApiKeyList"},{"type":"null"}],"description":"Action result data"},"error":{"anyOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"type":"null"}],"description":"Error details if success is False"},"context":{"anyOf":[{"$ref":"#/components/schemas/ResponseContext"},{"type":"null"}],"description":"Additional context and suggestions"},"request_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Request Id","description":"Unique request identifier for tracing"},"timestamp":{"type":"string","format":"date-time","title":"Timestamp","description":"Response timestamp"}},"type":"object","required":["success"],"title":"ActionResponse[ApiKeyList]"},"ActionResponse_ApiKeyView_":{"properties":{"success":{"type":"boolean","title":"Success","description":"Whether the action completed successfully"},"data":{"anyOf":[{"$ref":"#/components/schemas/ApiKeyView"},{"type":"null"}],"description":"Action result data"},"error":{"anyOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"type":"null"}],"description":"Error details if success is False"},"context":{"anyOf":[{"$ref":"#/components/schemas/ResponseContext"},{"type":"null"}],"description":"Additional context and suggestions"},"request_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Request Id","description":"Unique request identifier for tracing"},"timestamp":{"type":"string","format":"date-time","title":"Timestamp","description":"Response timestamp"}},"type":"object","required":["success"],"title":"ActionResponse[ApiKeyView]"},"ActionResponse_AssignableCountryList_":{"properties":{"success":{"type":"boolean","title":"Success","description":"Whether the action completed successfully"},"data":{"anyOf":[{"$ref":"#/components/schemas/AssignableCountryList"},{"type":"null"}],"description":"Action result data"},"error":{"anyOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"type":"null"}],"description":"Error details if success is False"},"context":{"anyOf":[{"$ref":"#/components/schemas/ResponseContext"},{"type":"null"}],"description":"Additional context and suggestions"},"request_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Request Id","description":"Unique request identifier for tracing"},"timestamp":{"type":"string","format":"date-time","title":"Timestamp","description":"Response timestamp"}},"type":"object","required":["success"],"title":"ActionResponse[AssignableCountryList]"},"ActionResponse_AssignedProxyList_":{"properties":{"success":{"type":"boolean","title":"Success","description":"Whether the action completed successfully"},"data":{"anyOf":[{"$ref":"#/components/schemas/AssignedProxyList"},{"type":"null"}],"description":"Action result data"},"error":{"anyOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"type":"null"}],"description":"Error details if success is False"},"context":{"anyOf":[{"$ref":"#/components/schemas/ResponseContext"},{"type":"null"}],"description":"Additional context and suggestions"},"request_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Request Id","description":"Unique request identifier for tracing"},"timestamp":{"type":"string","format":"date-time","title":"Timestamp","description":"Response timestamp"}},"type":"object","required":["success"],"title":"ActionResponse[AssignedProxyList]"},"ActionResponse_AssignedProxy_":{"properties":{"success":{"type":"boolean","title":"Success","description":"Whether the action completed successfully"},"data":{"anyOf":[{"$ref":"#/components/schemas/AssignedProxy"},{"type":"null"}],"description":"Action result data"},"error":{"anyOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"type":"null"}],"description":"Error details if success is False"},"context":{"anyOf":[{"$ref":"#/components/schemas/ResponseContext"},{"type":"null"}],"description":"Additional context and suggestions"},"request_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Request Id","description":"Unique request identifier for tracing"},"timestamp":{"type":"string","format":"date-time","title":"Timestamp","description":"Response timestamp"}},"type":"object","required":["success"],"title":"ActionResponse[AssignedProxy]"},"ActionResponse_BillingPortalStartResult_":{"properties":{"success":{"type":"boolean","title":"Success","description":"Whether the action completed successfully"},"data":{"anyOf":[{"$ref":"#/components/schemas/BillingPortalStartResult"},{"type":"null"}],"description":"Action result data"},"error":{"anyOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"type":"null"}],"description":"Error details if success is False"},"context":{"anyOf":[{"$ref":"#/components/schemas/ResponseContext"},{"type":"null"}],"description":"Additional context and suggestions"},"request_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Request Id","description":"Unique request identifier for tracing"},"timestamp":{"type":"string","format":"date-time","title":"Timestamp","description":"Response timestamp"}},"type":"object","required":["success"],"title":"ActionResponse[BillingPortalStartResult]"},"ActionResponse_CheckoutStartResult_":{"properties":{"success":{"type":"boolean","title":"Success","description":"Whether the action completed successfully"},"data":{"anyOf":[{"$ref":"#/components/schemas/CheckoutStartResult"},{"type":"null"}],"description":"Action result data"},"error":{"anyOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"type":"null"}],"description":"Error details if success is False"},"context":{"anyOf":[{"$ref":"#/components/schemas/ResponseContext"},{"type":"null"}],"description":"Additional context and suggestions"},"request_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Request Id","description":"Unique request identifier for tracing"},"timestamp":{"type":"string","format":"date-time","title":"Timestamp","description":"Response timestamp"}},"type":"object","required":["success"],"title":"ActionResponse[CheckoutStartResult]"},"ActionResponse_CustomerInvoiceList_":{"properties":{"success":{"type":"boolean","title":"Success","description":"Whether the action completed successfully"},"data":{"anyOf":[{"$ref":"#/components/schemas/CustomerInvoiceList"},{"type":"null"}],"description":"Action result data"},"error":{"anyOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"type":"null"}],"description":"Error details if success is False"},"context":{"anyOf":[{"$ref":"#/components/schemas/ResponseContext"},{"type":"null"}],"description":"Additional context and suggestions"},"request_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Request Id","description":"Unique request identifier for tracing"},"timestamp":{"type":"string","format":"date-time","title":"Timestamp","description":"Response timestamp"}},"type":"object","required":["success"],"title":"ActionResponse[CustomerInvoiceList]"},"ActionResponse_CustomerList_":{"properties":{"success":{"type":"boolean","title":"Success","description":"Whether the action completed successfully"},"data":{"anyOf":[{"$ref":"#/components/schemas/CustomerList"},{"type":"null"}],"description":"Action result data"},"error":{"anyOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"type":"null"}],"description":"Error details if success is False"},"context":{"anyOf":[{"$ref":"#/components/schemas/ResponseContext"},{"type":"null"}],"description":"Additional context and suggestions"},"request_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Request Id","description":"Unique request identifier for tracing"},"timestamp":{"type":"string","format":"date-time","title":"Timestamp","description":"Response timestamp"}},"type":"object","required":["success"],"title":"ActionResponse[CustomerList]"},"ActionResponse_GatewayAccessResult_":{"properties":{"success":{"type":"boolean","title":"Success","description":"Whether the action completed successfully"},"data":{"anyOf":[{"$ref":"#/components/schemas/GatewayAccessResult"},{"type":"null"}],"description":"Action result data"},"error":{"anyOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"type":"null"}],"description":"Error details if success is False"},"context":{"anyOf":[{"$ref":"#/components/schemas/ResponseContext"},{"type":"null"}],"description":"Additional context and suggestions"},"request_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Request Id","description":"Unique request identifier for tracing"},"timestamp":{"type":"string","format":"date-time","title":"Timestamp","description":"Response timestamp"}},"type":"object","required":["success"],"title":"ActionResponse[GatewayAccessResult]"},"ActionResponse_InventoryItem_":{"properties":{"success":{"type":"boolean","title":"Success","description":"Whether the action completed successfully"},"data":{"anyOf":[{"$ref":"#/components/schemas/InventoryItem"},{"type":"null"}],"description":"Action result data"},"error":{"anyOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"type":"null"}],"description":"Error details if success is False"},"context":{"anyOf":[{"$ref":"#/components/schemas/ResponseContext"},{"type":"null"}],"description":"Additional context and suggestions"},"request_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Request Id","description":"Unique request identifier for tracing"},"timestamp":{"type":"string","format":"date-time","title":"Timestamp","description":"Response timestamp"}},"type":"object","required":["success"],"title":"ActionResponse[InventoryItem]"},"ActionResponse_InventoryList_":{"properties":{"success":{"type":"boolean","title":"Success","description":"Whether the action completed successfully"},"data":{"anyOf":[{"$ref":"#/components/schemas/InventoryList"},{"type":"null"}],"description":"Action result data"},"error":{"anyOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"type":"null"}],"description":"Error details if success is False"},"context":{"anyOf":[{"$ref":"#/components/schemas/ResponseContext"},{"type":"null"}],"description":"Additional context and suggestions"},"request_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Request Id","description":"Unique request identifier for tracing"},"timestamp":{"type":"string","format":"date-time","title":"Timestamp","description":"Response timestamp"}},"type":"object","required":["success"],"title":"ActionResponse[InventoryList]"},"ActionResponse_InventorySyncResult_":{"properties":{"success":{"type":"boolean","title":"Success","description":"Whether the action completed successfully"},"data":{"anyOf":[{"$ref":"#/components/schemas/InventorySyncResult"},{"type":"null"}],"description":"Action result data"},"error":{"anyOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"type":"null"}],"description":"Error details if success is False"},"context":{"anyOf":[{"$ref":"#/components/schemas/ResponseContext"},{"type":"null"}],"description":"Additional context and suggestions"},"request_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Request Id","description":"Unique request identifier for tracing"},"timestamp":{"type":"string","format":"date-time","title":"Timestamp","description":"Response timestamp"}},"type":"object","required":["success"],"title":"ActionResponse[InventorySyncResult]"},"ActionResponse_MySubscriptionView_":{"properties":{"success":{"type":"boolean","title":"Success","description":"Whether the action completed successfully"},"data":{"anyOf":[{"$ref":"#/components/schemas/MySubscriptionView"},{"type":"null"}],"description":"Action result data"},"error":{"anyOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"type":"null"}],"description":"Error details if success is False"},"context":{"anyOf":[{"$ref":"#/components/schemas/ResponseContext"},{"type":"null"}],"description":"Additional context and suggestions"},"request_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Request Id","description":"Unique request identifier for tracing"},"timestamp":{"type":"string","format":"date-time","title":"Timestamp","description":"Response timestamp"}},"type":"object","required":["success"],"title":"ActionResponse[MySubscriptionView]"},"ActionResponse_OrganizationAccount_":{"properties":{"success":{"type":"boolean","title":"Success","description":"Whether the action completed successfully"},"data":{"anyOf":[{"$ref":"#/components/schemas/OrganizationAccount"},{"type":"null"}],"description":"Action result data"},"error":{"anyOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"type":"null"}],"description":"Error details if success is False"},"context":{"anyOf":[{"$ref":"#/components/schemas/ResponseContext"},{"type":"null"}],"description":"Additional context and suggestions"},"request_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Request Id","description":"Unique request identifier for tracing"},"timestamp":{"type":"string","format":"date-time","title":"Timestamp","description":"Response timestamp"}},"type":"object","required":["success"],"title":"ActionResponse[OrganizationAccount]"},"ActionResponse_OrganizationSignupOptions_":{"properties":{"success":{"type":"boolean","title":"Success","description":"Whether the action completed successfully"},"data":{"anyOf":[{"$ref":"#/components/schemas/OrganizationSignupOptions"},{"type":"null"}],"description":"Action result data"},"error":{"anyOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"type":"null"}],"description":"Error details if success is False"},"context":{"anyOf":[{"$ref":"#/components/schemas/ResponseContext"},{"type":"null"}],"description":"Additional context and suggestions"},"request_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Request Id","description":"Unique request identifier for tracing"},"timestamp":{"type":"string","format":"date-time","title":"Timestamp","description":"Response timestamp"}},"type":"object","required":["success"],"title":"ActionResponse[OrganizationSignupOptions]"},"ActionResponse_OrganizationView_":{"properties":{"success":{"type":"boolean","title":"Success","description":"Whether the action completed successfully"},"data":{"anyOf":[{"$ref":"#/components/schemas/OrganizationView"},{"type":"null"}],"description":"Action result data"},"error":{"anyOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"type":"null"}],"description":"Error details if success is False"},"context":{"anyOf":[{"$ref":"#/components/schemas/ResponseContext"},{"type":"null"}],"description":"Additional context and suggestions"},"request_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Request Id","description":"Unique request identifier for tracing"},"timestamp":{"type":"string","format":"date-time","title":"Timestamp","description":"Response timestamp"}},"type":"object","required":["success"],"title":"ActionResponse[OrganizationView]"},"ActionResponse_PlanChangePreview_":{"properties":{"success":{"type":"boolean","title":"Success","description":"Whether the action completed successfully"},"data":{"anyOf":[{"$ref":"#/components/schemas/PlanChangePreview"},{"type":"null"}],"description":"Action result data"},"error":{"anyOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"type":"null"}],"description":"Error details if success is False"},"context":{"anyOf":[{"$ref":"#/components/schemas/ResponseContext"},{"type":"null"}],"description":"Additional context and suggestions"},"request_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Request Id","description":"Unique request identifier for tracing"},"timestamp":{"type":"string","format":"date-time","title":"Timestamp","description":"Response timestamp"}},"type":"object","required":["success"],"title":"ActionResponse[PlanChangePreview]"},"ActionResponse_Profile_":{"properties":{"success":{"type":"boolean","title":"Success","description":"Whether the action completed successfully"},"data":{"anyOf":[{"$ref":"#/components/schemas/Profile"},{"type":"null"}],"description":"Action result data"},"error":{"anyOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"type":"null"}],"description":"Error details if success is False"},"context":{"anyOf":[{"$ref":"#/components/schemas/ResponseContext"},{"type":"null"}],"description":"Additional context and suggestions"},"request_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Request Id","description":"Unique request identifier for tracing"},"timestamp":{"type":"string","format":"date-time","title":"Timestamp","description":"Response timestamp"}},"type":"object","required":["success"],"title":"ActionResponse[Profile]"},"ActionResponse_ProjectionHealth_":{"properties":{"success":{"type":"boolean","title":"Success","description":"Whether the action completed successfully"},"data":{"anyOf":[{"$ref":"#/components/schemas/ProjectionHealth"},{"type":"null"}],"description":"Action result data"},"error":{"anyOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"type":"null"}],"description":"Error details if success is False"},"context":{"anyOf":[{"$ref":"#/components/schemas/ResponseContext"},{"type":"null"}],"description":"Additional context and suggestions"},"request_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Request Id","description":"Unique request identifier for tracing"},"timestamp":{"type":"string","format":"date-time","title":"Timestamp","description":"Response timestamp"}},"type":"object","required":["success"],"title":"ActionResponse[ProjectionHealth]"},"ActionResponse_ProjectionRebuildResult_":{"properties":{"success":{"type":"boolean","title":"Success","description":"Whether the action completed successfully"},"data":{"anyOf":[{"$ref":"#/components/schemas/ProjectionRebuildResult"},{"type":"null"}],"description":"Action result data"},"error":{"anyOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"type":"null"}],"description":"Error details if success is False"},"context":{"anyOf":[{"$ref":"#/components/schemas/ResponseContext"},{"type":"null"}],"description":"Additional context and suggestions"},"request_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Request Id","description":"Unique request identifier for tracing"},"timestamp":{"type":"string","format":"date-time","title":"Timestamp","description":"Response timestamp"}},"type":"object","required":["success"],"title":"ActionResponse[ProjectionRebuildResult]"},"ActionResponse_ProviderCapabilities_":{"properties":{"success":{"type":"boolean","title":"Success","description":"Whether the action completed successfully"},"data":{"anyOf":[{"$ref":"#/components/schemas/ProviderCapabilities"},{"type":"null"}],"description":"Action result data"},"error":{"anyOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"type":"null"}],"description":"Error details if success is False"},"context":{"anyOf":[{"$ref":"#/components/schemas/ResponseContext"},{"type":"null"}],"description":"Additional context and suggestions"},"request_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Request Id","description":"Unique request identifier for tracing"},"timestamp":{"type":"string","format":"date-time","title":"Timestamp","description":"Response timestamp"}},"type":"object","required":["success"],"title":"ActionResponse[ProviderCapabilities]"},"ActionResponse_ReleaseResult_":{"properties":{"success":{"type":"boolean","title":"Success","description":"Whether the action completed successfully"},"data":{"anyOf":[{"$ref":"#/components/schemas/ReleaseResult"},{"type":"null"}],"description":"Action result data"},"error":{"anyOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"type":"null"}],"description":"Error details if success is False"},"context":{"anyOf":[{"$ref":"#/components/schemas/ResponseContext"},{"type":"null"}],"description":"Additional context and suggestions"},"request_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Request Id","description":"Unique request identifier for tracing"},"timestamp":{"type":"string","format":"date-time","title":"Timestamp","description":"Response timestamp"}},"type":"object","required":["success"],"title":"ActionResponse[ReleaseResult]"},"ActionResponse_ResidioPlanAdminList_":{"properties":{"success":{"type":"boolean","title":"Success","description":"Whether the action completed successfully"},"data":{"anyOf":[{"$ref":"#/components/schemas/ResidioPlanAdminList"},{"type":"null"}],"description":"Action result data"},"error":{"anyOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"type":"null"}],"description":"Error details if success is False"},"context":{"anyOf":[{"$ref":"#/components/schemas/ResponseContext"},{"type":"null"}],"description":"Additional context and suggestions"},"request_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Request Id","description":"Unique request identifier for tracing"},"timestamp":{"type":"string","format":"date-time","title":"Timestamp","description":"Response timestamp"}},"type":"object","required":["success"],"title":"ActionResponse[ResidioPlanAdminList]"},"ActionResponse_ResidioPlanAdmin_":{"properties":{"success":{"type":"boolean","title":"Success","description":"Whether the action completed successfully"},"data":{"anyOf":[{"$ref":"#/components/schemas/ResidioPlanAdmin"},{"type":"null"}],"description":"Action result data"},"error":{"anyOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"type":"null"}],"description":"Error details if success is False"},"context":{"anyOf":[{"$ref":"#/components/schemas/ResponseContext"},{"type":"null"}],"description":"Additional context and suggestions"},"request_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Request Id","description":"Unique request identifier for tracing"},"timestamp":{"type":"string","format":"date-time","title":"Timestamp","description":"Response timestamp"}},"type":"object","required":["success"],"title":"ActionResponse[ResidioPlanAdmin]"},"ActionResponse_ResidioPlanList_":{"properties":{"success":{"type":"boolean","title":"Success","description":"Whether the action completed successfully"},"data":{"anyOf":[{"$ref":"#/components/schemas/ResidioPlanList"},{"type":"null"}],"description":"Action result data"},"error":{"anyOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"type":"null"}],"description":"Error details if success is False"},"context":{"anyOf":[{"$ref":"#/components/schemas/ResponseContext"},{"type":"null"}],"description":"Additional context and suggestions"},"request_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Request Id","description":"Unique request identifier for tracing"},"timestamp":{"type":"string","format":"date-time","title":"Timestamp","description":"Response timestamp"}},"type":"object","required":["success"],"title":"ActionResponse[ResidioPlanList]"},"ActionResponse_SlotReplaceResult_":{"properties":{"success":{"type":"boolean","title":"Success","description":"Whether the action completed successfully"},"data":{"anyOf":[{"$ref":"#/components/schemas/SlotReplaceResult"},{"type":"null"}],"description":"Action result data"},"error":{"anyOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"type":"null"}],"description":"Error details if success is False"},"context":{"anyOf":[{"$ref":"#/components/schemas/ResponseContext"},{"type":"null"}],"description":"Additional context and suggestions"},"request_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Request Id","description":"Unique request identifier for tracing"},"timestamp":{"type":"string","format":"date-time","title":"Timestamp","description":"Response timestamp"}},"type":"object","required":["success"],"title":"ActionResponse[SlotReplaceResult]"},"ActionResponse_SubscriptionProvisionResult_":{"properties":{"success":{"type":"boolean","title":"Success","description":"Whether the action completed successfully"},"data":{"anyOf":[{"$ref":"#/components/schemas/SubscriptionProvisionResult"},{"type":"null"}],"description":"Action result data"},"error":{"anyOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"type":"null"}],"description":"Error details if success is False"},"context":{"anyOf":[{"$ref":"#/components/schemas/ResponseContext"},{"type":"null"}],"description":"Additional context and suggestions"},"request_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Request Id","description":"Unique request identifier for tracing"},"timestamp":{"type":"string","format":"date-time","title":"Timestamp","description":"Response timestamp"}},"type":"object","required":["success"],"title":"ActionResponse[SubscriptionProvisionResult]"},"ActionResponse_UnfulfilledAssignResult_":{"properties":{"success":{"type":"boolean","title":"Success","description":"Whether the action completed successfully"},"data":{"anyOf":[{"$ref":"#/components/schemas/UnfulfilledAssignResult"},{"type":"null"}],"description":"Action result data"},"error":{"anyOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"type":"null"}],"description":"Error details if success is False"},"context":{"anyOf":[{"$ref":"#/components/schemas/ResponseContext"},{"type":"null"}],"description":"Additional context and suggestions"},"request_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Request Id","description":"Unique request identifier for tracing"},"timestamp":{"type":"string","format":"date-time","title":"Timestamp","description":"Response timestamp"}},"type":"object","required":["success"],"title":"ActionResponse[UnfulfilledAssignResult]"},"ActionResponse_UnfulfilledQueue_":{"properties":{"success":{"type":"boolean","title":"Success","description":"Whether the action completed successfully"},"data":{"anyOf":[{"$ref":"#/components/schemas/UnfulfilledQueue"},{"type":"null"}],"description":"Action result data"},"error":{"anyOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"type":"null"}],"description":"Error details if success is False"},"context":{"anyOf":[{"$ref":"#/components/schemas/ResponseContext"},{"type":"null"}],"description":"Additional context and suggestions"},"request_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Request Id","description":"Unique request identifier for tracing"},"timestamp":{"type":"string","format":"date-time","title":"Timestamp","description":"Response timestamp"}},"type":"object","required":["success"],"title":"ActionResponse[UnfulfilledQueue]"},"ActionResponse_dict_str__Any__":{"properties":{"success":{"type":"boolean","title":"Success","description":"Whether the action completed successfully"},"data":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Data","description":"Action result data"},"error":{"anyOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"type":"null"}],"description":"Error details if success is False"},"context":{"anyOf":[{"$ref":"#/components/schemas/ResponseContext"},{"type":"null"}],"description":"Additional context and suggestions"},"request_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Request Id","description":"Unique request identifier for tracing"},"timestamp":{"type":"string","format":"date-time","title":"Timestamp","description":"Response timestamp"}},"type":"object","required":["success"],"title":"ActionResponse[dict[str, Any]]"},"ActionResponse_list_OrganizationAccount__":{"properties":{"success":{"type":"boolean","title":"Success","description":"Whether the action completed successfully"},"data":{"anyOf":[{"items":{"$ref":"#/components/schemas/OrganizationAccount"},"type":"array"},{"type":"null"}],"title":"Data","description":"Action result data"},"error":{"anyOf":[{"$ref":"#/components/schemas/ErrorDetail"},{"type":"null"}],"description":"Error details if success is False"},"context":{"anyOf":[{"$ref":"#/components/schemas/ResponseContext"},{"type":"null"}],"description":"Additional context and suggestions"},"request_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Request Id","description":"Unique request identifier for tracing"},"timestamp":{"type":"string","format":"date-time","title":"Timestamp","description":"Response timestamp"}},"type":"object","required":["success"],"title":"ActionResponse[list[OrganizationAccount]]"},"AddAccountBody":{"properties":{"account_name":{"type":"string","title":"Account Name","description":"Display name for the new account"},"account_address":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Account Address","description":"Optional mailing or operating address for the new account"},"account_country":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Account Country","description":"Optional ISO-2 country the new account is based in"},"slots":{"items":{"$ref":"#/components/schemas/SlotCountryChoice"},"type":"array","title":"Slots","description":"One country (or Any) per IP in the plan"},"idempotency_key":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Idempotency Key","description":"Retry key"}},"type":"object","required":["account_name","slots"],"title":"AddAccountBody"},"AddAccountPreview":{"properties":{"open_seat":{"type":"boolean","title":"Open Seat","description":"True when a paid seat is unused this period (no charge today)"},"current_paid_seats":{"type":"integer","title":"Current Paid Seats","description":"Stripe quantity before this add"},"next_paid_seats":{"type":"integer","title":"Next Paid Seats","description":"Paid seats after this add (same as current on an open seat)"},"charge_cents":{"type":"integer","title":"Charge Cents","description":"Estimated charge now in minor units; 0 on an open seat"},"currency":{"type":"string","title":"Currency","description":"ISO-4217 currency, lowercase"},"next_invoice_cents":{"type":"integer","title":"Next Invoice Cents","description":"Local next-renewal estimate: next_paid_seats × plan amount"},"interval":{"type":"string","title":"Interval","description":"Billing interval: month or year"},"period_end":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Period End","description":"ISO timestamp of the current period end when known"},"account_name":{"type":"string","title":"Account Name","description":"Normalized account name that would be created"}},"type":"object","required":["open_seat","current_paid_seats","next_paid_seats","charge_cents","currency","next_invoice_cents","interval","account_name"],"title":"AddAccountPreview","description":"Owner quote for adding an organization account. No Stripe ids. No writes."},"AddOrganizationAccountResult":{"properties":{"account_id":{"type":"string","title":"Account Id","description":"accounts.id created or reused"},"subscription":{"$ref":"#/components/schemas/ResidioSubscription","description":"Live subscription after the confirm (new account may still be pending_payment)"}},"type":"object","required":["account_id","subscription"],"title":"AddOrganizationAccountResult","description":"Result of confirming an add. IPs come from webhooks except open-seat provision."},"AddWorkspaceBody":{"properties":{"name":{"type":"string","title":"Name","description":"Display name for the new workspace"},"slots":{"items":{"additionalProperties":true,"type":"object"},"type":"array","title":"Slots","description":"IP slot country choices, e.g. [{'country': 'US'}, {'country': null}]"},"address":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Address","description":"Optional mailing or operating address for this workspace"},"country":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Country","description":"Optional ISO-2 country this workspace is based in"},"idempotency_key":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Idempotency Key","description":"Optional idempotency key for safe retries"}},"type":"object","required":["name"],"title":"AddWorkspaceBody"},"AdminSubscriptionList":{"properties":{"items":{"items":{"$ref":"#/components/schemas/AdminSubscriptionRow"},"type":"array","title":"Items","description":"Admin subscription rows"},"total":{"type":"integer","title":"Total","description":"Number of rows returned"}},"type":"object","required":["items","total"],"title":"AdminSubscriptionList"},"AdminSubscriptionRow":{"properties":{"id":{"type":"string","title":"Id","description":"Proxy Charm subscriptions.id"},"profile_id":{"type":"string","title":"Profile Id","description":"Owner profiles.id for ops contact"},"email":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Email","description":"Owner profiles.email"},"organization_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Organization Id","description":"Paying organization id"},"organization_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Organization Name","description":"Organization display name"},"paid_seat_count":{"type":"integer","title":"Paid Seat Count","description":"Stripe quantity (paid accounts)","default":1},"plan_name":{"type":"string","title":"Plan Name","description":"Proxy Charm plan name"},"ip_count":{"type":"integer","title":"Ip Count","description":"How many IPs the plan includes per account"},"status":{"type":"string","title":"Status","description":"Proxy Charm subscription status"},"current_period_end":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Current Period End","description":"ISO timestamp of period end when known"},"stripe_subscription_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Stripe Subscription Id","description":"Stripe Subscription id for ops matching"},"slots":{"items":{"$ref":"#/components/schemas/ResidioSubscriptionSlot"},"type":"array","title":"Slots","description":"Per-IP country and assign state (pending | assigned | dropped)"},"accounts":{"items":{"$ref":"#/components/schemas/SubscriptionAccountView"},"type":"array","title":"Accounts","description":"Workspaces on this subscription, each with its slots"},"has_pending_slots":{"type":"boolean","title":"Has Pending Slots","description":"True when at least one slot is still pending"}},"type":"object","required":["id","profile_id","plan_name","ip_count","status","slots","has_pending_slots"],"title":"AdminSubscriptionRow","description":"Admin Proxy Charm subscription row. Omits customer Price ids and upstream secrets."},"ApiKeyCreated":{"properties":{"id":{"type":"string","title":"Id","description":"UUID of the key row"},"key_prefix":{"type":"string","title":"Key Prefix","description":"First 16 characters of the key for display — safe to show in UI"},"label":{"type":"string","title":"Label","description":"Human-readable name given to this key"},"permissions":{"items":{"type":"string"},"type":"array","title":"Permissions","description":"Permission scopes granted to this key, e.g. ['read', 'write']"},"last_used_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Last Used At","description":"UTC timestamp of the most recent authenticated request, if any"},"expires_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Expires At","description":"UTC expiry timestamp; None means the key never expires"},"revoked_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Revoked At","description":"UTC timestamp when the key was revoked; None means it is active"},"created_at":{"type":"string","format":"date-time","title":"Created At","description":"UTC creation timestamp"},"full_key":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Full Key","description":"The raw API key, shown exactly once at creation time. Store it securely — it cannot be retrieved again."}},"type":"object","required":["id","key_prefix","label","permissions","created_at"],"title":"ApiKeyCreated","description":"Returned once, immediately after a key is created.\n\n``full_key`` is the raw secret the caller must store.  It is NEVER\nreturned again.  On an idempotent retry (same idempotency_key, same\nparams) ``full_key`` is None — the server cannot reconstruct it."},"ApiKeyList":{"properties":{"items":{"items":{"$ref":"#/components/schemas/ApiKeyView"},"type":"array","title":"Items","description":"Active API keys ordered by creation date desc"},"total":{"type":"integer","title":"Total","description":"Total number of active keys for this organisation"}},"type":"object","required":["items","total"],"title":"ApiKeyList","description":"Paginated list of API keys for an organisation."},"ApiKeyView":{"properties":{"id":{"type":"string","title":"Id","description":"UUID of the key row"},"key_prefix":{"type":"string","title":"Key Prefix","description":"First 16 characters of the key for display — safe to show in UI"},"label":{"type":"string","title":"Label","description":"Human-readable name given to this key"},"permissions":{"items":{"type":"string"},"type":"array","title":"Permissions","description":"Permission scopes granted to this key, e.g. ['read', 'write']"},"last_used_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Last Used At","description":"UTC timestamp of the most recent authenticated request, if any"},"expires_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Expires At","description":"UTC expiry timestamp; None means the key never expires"},"revoked_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Revoked At","description":"UTC timestamp when the key was revoked; None means it is active"},"created_at":{"type":"string","format":"date-time","title":"Created At","description":"UTC creation timestamp"}},"type":"object","required":["id","key_prefix","label","permissions","created_at"],"title":"ApiKeyView","description":"Safe representation of an API key (no raw key, no hash)."},"AssignBody":{"properties":{"proxy_ip_id":{"type":"string","title":"Proxy Ip Id","description":"Inventory row to assign"},"profile_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Profile Id","description":"Customer profile id"},"customer_email":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Customer Email","description":"Customer email"},"idempotency_key":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Idempotency Key","description":"Retry key"}},"type":"object","required":["proxy_ip_id"],"title":"AssignBody"},"AssignUnfulfilledBody":{"properties":{"subscription_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Subscription Id","description":"Limit assignment to one Proxy Charm subscriptions.id"},"idempotency_key":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Idempotency Key","description":"Retry key"}},"type":"object","title":"AssignUnfulfilledBody"},"AssignableCountry":{"properties":{"country":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Country","description":"ISO-2 code, or null for Random"}},"type":"object","title":"AssignableCountry"},"AssignableCountryList":{"properties":{"items":{"items":{"$ref":"#/components/schemas/AssignableCountry"},"type":"array","title":"Items","description":"Random (null) plus Webshare residential countries. No stock counts."},"total":{"type":"integer","title":"Total","description":"Number of choices including Random"}},"type":"object","required":["items","total"],"title":"AssignableCountryList"},"AssignedProxy":{"properties":{"assignment_id":{"type":"string","title":"Assignment Id","description":"assignments.id"},"proxy_ip_id":{"type":"string","title":"Proxy Ip Id","description":"proxy_ips.id"},"ip_address":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Ip Address","description":"Residential IP"},"country":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Country","description":"ISO country code"},"city":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"City","description":"City name"},"status":{"type":"string","enum":["reserved","assigned","active","replacing","released"],"title":"Status","description":"Assignment lifecycle status"},"host":{"type":"string","title":"Host","description":"Shared Proxy Charm gateway host"},"port":{"type":"integer","title":"Port","description":"Shared Proxy Charm gateway port"},"username":{"type":"string","title":"Username","description":"Proxy Charm gateway username"},"password":{"type":"string","title":"Password","description":"Proxy Charm gateway password"},"replaced_at":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Replaced At","description":"ISO timestamp when Proxy Charm last flipped the residential IP"}},"type":"object","required":["assignment_id","proxy_ip_id","status","host","port","username","password"],"title":"AssignedProxy","description":"Customer-visible assignment. Proxy Charm credentials plus residential IP."},"AssignedProxyList":{"properties":{"items":{"items":{"$ref":"#/components/schemas/AssignedProxy"},"type":"array","title":"Items","description":"Assigned endpoints"},"total":{"type":"integer","title":"Total","description":"Number of assignments returned"}},"type":"object","required":["items","total"],"title":"AssignedProxyList"},"BillingPortalStartResult":{"properties":{"portal_url":{"type":"string","title":"Portal Url","description":"Hosted Stripe Customer Portal URL"}},"type":"object","required":["portal_url"],"title":"BillingPortalStartResult"},"ChangeMemberRoleBody":{"properties":{"role":{"type":"string","title":"Role","description":"New role: owner or admin"}},"type":"object","required":["role"],"title":"ChangeMemberRoleBody"},"ChangePlanBody":{"properties":{"plan_id":{"type":"string","title":"Plan Id","description":"Target Proxy Charm plans.id"},"add_slots":{"items":{"$ref":"#/components/schemas/SlotCountryChoice"},"type":"array","title":"Add Slots","description":"New countries for IPs added on upgrade (org-of-one)"},"drop_slot_indexes":{"items":{"type":"integer"},"type":"array","title":"Drop Slot Indexes","description":"Existing slot indexes to release on downgrade (org-of-one)"},"account_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Account Id","description":"Account that receives added or dropped slots when account_changes is omitted"},"account_changes":{"anyOf":[{"items":{"$ref":"#/components/schemas/AccountPlanChangeBody"},"type":"array"},{"type":"null"}],"title":"Account Changes","description":"Per-live-account adds/drops. Omit for org-of-one (account_id + top-level add/drop)"},"idempotency_key":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Idempotency Key","description":"Retry key"}},"type":"object","required":["plan_id"],"title":"ChangePlanBody"},"CheckoutStartResult":{"properties":{"checkout_url":{"type":"string","title":"Checkout Url","description":"Hosted Stripe Checkout URL"}},"type":"object","required":["checkout_url"],"title":"CheckoutStartResult"},"CountryOption":{"properties":{"code":{"type":"string","title":"Code","description":"Two-letter country code"}},"type":"object","required":["code"],"title":"CountryOption","description":"ISO-3166-1 alpha-2 country offered on organization signup."},"CreateApiKeyBody":{"properties":{"label":{"type":"string","title":"Label","description":"Human-readable name for this key (e.g. 'Production server')"},"expires_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Expires At","description":"Optional ISO-8601 UTC expiry. Omit for a key that never expires."},"idempotency_key":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Idempotency Key","description":"Optional idempotency key for safe retries. Same key + same params returns the same row."}},"type":"object","required":["label"],"title":"CreateApiKeyBody"},"CreateCustomerBody":{"properties":{"email":{"type":"string","title":"Email","description":"Customer sign-in email"},"password":{"type":"string","title":"Password","description":"Temporary password; never returned"},"idempotency_key":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Idempotency Key","description":"Retry key"}},"type":"object","required":["email","password"],"title":"CreateCustomerBody"},"CreateOrganizationBody":{"properties":{"name":{"type":"string","title":"Name","description":"Organization display name shown in the dashboard shell"},"website":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Website","description":"Optional public website (http or https)"},"country":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Country","description":"Optional ISO-3166-1 alpha-2 country they operate from"},"use_case":{"type":"string","title":"Use Case","description":"How they will use Proxy Charm; must match signup options"},"use_case_note":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Use Case Note","description":"Optional note when use_case is other"},"team_size":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Team Size","description":"Optional team-size chip; not billed seats"},"full_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Full Name","description":"Person display name stored on the profile"},"idempotency_key":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Idempotency Key","description":"Retry key"}},"type":"object","required":["name","use_case"],"title":"CreateOrganizationBody"},"CreatePlanBody":{"properties":{"name":{"type":"string","title":"Name","description":"SKU name shown to customers"},"ip_count":{"type":"integer","title":"Ip Count","description":"How many IPs this SKU includes"},"interval":{"type":"string","title":"Interval","description":"Billing interval: month or year"},"amount_cents":{"type":"integer","title":"Amount Cents","description":"Customer price in minor units"},"currency":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Currency","description":"ISO-4217 currency, lowercase"},"idempotency_key":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Idempotency Key","description":"Retry key"}},"type":"object","required":["name","ip_count","interval","amount_cents"],"title":"CreatePlanBody"},"CustomerInvoice":{"properties":{"id":{"type":"string","title":"Id","description":"Stripe invoice id (in_…) used as a list cursor"},"number":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Number","description":"Customer-facing invoice number"},"status":{"type":"string","title":"Status","description":"open | paid | uncollectible | void"},"amount_cents":{"type":"integer","title":"Amount Cents","description":"Invoice total in minor units"},"currency":{"type":"string","title":"Currency","description":"ISO-4217 currency, lowercase"},"amount_display":{"type":"string","title":"Amount Display","description":"Formatted total, e.g. 10.00 USD"},"created_at":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Created At","description":"ISO timestamp when Stripe created the invoice"},"billing_reason":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Billing Reason","description":"subscription_create | subscription_cycle | subscription_update | …"},"hosted_invoice_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Hosted Invoice Url","description":"Stripe-hosted page to view or pay the invoice"},"invoice_pdf":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Invoice Pdf","description":"Stripe-hosted PDF URL"}},"type":"object","required":["id","status","amount_cents","currency","amount_display"],"title":"CustomerInvoice","description":"Customer-visible invoice. Omits Stripe customer and subscription ids."},"CustomerInvoiceList":{"properties":{"items":{"items":{"$ref":"#/components/schemas/CustomerInvoice"},"type":"array","title":"Items","description":"Invoices on this page, newest first"},"has_more":{"type":"boolean","title":"Has More","description":"True when Stripe has a later page"}},"type":"object","required":["items","has_more"],"title":"CustomerInvoiceList"},"CustomerList":{"properties":{"items":{"items":{"$ref":"#/components/schemas/Profile"},"type":"array","title":"Items","description":"Customer profiles (role=customer)"},"total":{"type":"integer","title":"Total","description":"Number of rows returned"},"truncated":{"type":"boolean","title":"Truncated","description":"True when the list stopped at the configured limit"}},"type":"object","required":["items","total","truncated"],"title":"CustomerList","description":"Admin directory of Proxy Charm customers. Never includes passwords or Stripe ids."},"CustomerStatusBody":{"properties":{"idempotency_key":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Idempotency Key","description":"Retry key"}},"type":"object","title":"CustomerStatusBody"},"EnsureOrganizationBody":{"properties":{"idempotency_key":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Idempotency Key","description":"Retry key"}},"type":"object","title":"EnsureOrganizationBody"},"ErrorDetail":{"properties":{"code":{"type":"string","title":"Code","description":"Machine-readable error code (e.g., PROFILE_NOT_FOUND)"},"message":{"type":"string","title":"Message","description":"Human-readable error message"},"field":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Field","description":"Field that caused the error (for validation errors)"},"details":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Details","description":"Additional error context"},"suggestion":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Suggestion","description":"Suggested action to resolve the error"}},"type":"object","required":["code","message"],"title":"ErrorDetail","description":"Detailed error information, actionable for humans and AI agents."},"GatewayAccessBody":{"properties":{"profile_id":{"type":"string","title":"Profile Id","description":"Customer profiles.id"},"idempotency_key":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Idempotency Key","description":"Retry key"}},"type":"object","required":["profile_id"],"title":"GatewayAccessBody"},"GatewayAccessResult":{"properties":{"profile_id":{"type":"string","title":"Profile Id","description":"Customer profiles.id"},"affected":{"type":"integer","title":"Affected","description":"Live assignments whose Redis key was updated"}},"type":"object","required":["profile_id","affected"],"title":"GatewayAccessResult","description":"Result of suspending or resuming CONNECT for a customer's live assignments."},"HTTPValidationError":{"properties":{"detail":{"items":{"$ref":"#/components/schemas/ValidationError"},"type":"array","title":"Detail"}},"type":"object","title":"HTTPValidationError"},"HealthCheck":{"properties":{"status":{"type":"string","title":"Status","description":"Service status"},"version":{"type":"string","title":"Version","description":"API version"},"timestamp":{"type":"string","format":"date-time","title":"Timestamp"}},"type":"object","required":["status","version"],"title":"HealthCheck","description":"Health check response."},"InventoryItem":{"properties":{"id":{"type":"string","title":"Id","description":"Proxy Charm proxy_ips.id"},"provider_code":{"type":"string","title":"Provider Code","description":"Adapter code, e.g. webshare"},"external_id":{"type":"string","title":"External Id","description":"Vendor id or manual:{uuid}"},"ip_address":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Ip Address","description":"Residential IP"},"country":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Country","description":"ISO country code"},"city":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"City","description":"City name"},"valid":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Valid","description":"Vendor validity flag"},"status":{"type":"string","enum":["available","assigned","quarantined"],"title":"Status","description":"available, assigned, or quarantined"},"source":{"type":"string","enum":["webshare","manual"],"title":"Source","description":"webshare sync or manual add"},"assignment_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Assignment Id","description":"Live assignments.id when this IP is assigned"},"created_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Created At","description":"When the row was created"}},"type":"object","required":["id","provider_code","external_id","status","source"],"title":"InventoryItem","description":"Admin-visible inventory row. Upstream credentials are omitted."},"InventoryList":{"properties":{"items":{"items":{"$ref":"#/components/schemas/InventoryItem"},"type":"array","title":"Items","description":"Inventory rows"},"total":{"type":"integer","title":"Total","description":"Number of rows returned"}},"type":"object","required":["items","total"],"title":"InventoryList"},"InventorySyncResult":{"properties":{"provider":{"type":"string","title":"Provider","description":"Provider code that was synced"},"upserted":{"type":"integer","title":"Upserted","description":"Rows inserted or updated from the vendor list"},"credentials_stored":{"type":"integer","title":"Credentials Stored","description":"Upstream credential rows stored"},"invalidated":{"type":"integer","title":"Invalidated","description":"Webshare-source rows marked valid=false (missing or vendor-invalid)"},"disconnected":{"type":"integer","title":"Disconnected","description":"Live assignments whose Redis CONNECT key was removed"}},"type":"object","required":["provider","upserted","credentials_stored","invalidated","disconnected"],"title":"InventorySyncResult"},"InviteMemberBody":{"properties":{"email":{"type":"string","title":"Email","description":"Invitee email; they sign in with this address to join"},"role":{"type":"string","title":"Role","description":"Role they receive: owner or admin"},"idempotency_key":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Idempotency Key","description":"Retry key"}},"type":"object","required":["email","role"],"title":"InviteMemberBody"},"ManualProxyBody":{"properties":{"ip_address":{"type":"string","title":"Ip Address","description":"Residential IP shown to the customer"},"upstream_host":{"type":"string","title":"Upstream Host","description":"Upstream proxy host"},"upstream_port":{"type":"integer","title":"Upstream Port","description":"Upstream proxy port"},"upstream_username":{"type":"string","title":"Upstream Username","description":"Upstream username"},"upstream_password":{"type":"string","title":"Upstream Password","description":"Upstream password"},"country":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Country","description":"ISO country code"},"city":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"City","description":"City name"},"provider":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Provider","description":"Provider code"},"idempotency_key":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Idempotency Key","description":"Retry key"}},"type":"object","required":["ip_address","upstream_host","upstream_port","upstream_username","upstream_password"],"title":"ManualProxyBody"},"MySubscriptionView":{"properties":{"subscription":{"anyOf":[{"$ref":"#/components/schemas/ResidioSubscription"},{"type":"null"}],"description":"Live subscription, or null if the customer has none"}},"type":"object","title":"MySubscriptionView"},"OpenPortalBody":{"properties":{"idempotency_key":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Idempotency Key","description":"Retry key"}},"type":"object","title":"OpenPortalBody"},"OrganizationAccount":{"properties":{"id":{"type":"string","title":"Id","description":"Account id"},"name":{"type":"string","title":"Name","description":"Workspace display name"},"address":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Address","description":"Optional mailing or operating address for this workspace"},"country":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Country","description":"Optional ISO-2 country this workspace is based in"},"status":{"type":"string","enum":["pending_payment","active","pending_provision","removed"],"title":"Status","description":"pending_payment | active | pending_provision | removed"}},"type":"object","required":["id","name","status"],"title":"OrganizationAccount","description":"Billed proxy workspace. Empty until first Checkout creates the row."},"OrganizationInvite":{"properties":{"id":{"type":"string","title":"Id","description":"organization_invites.id"},"email":{"type":"string","title":"Email","description":"Invited email, lowercase"},"role":{"type":"string","enum":["owner","admin"],"title":"Role","description":"Role they receive when they join"}},"type":"object","required":["id","email","role"],"title":"OrganizationInvite","description":"Pending email invite. They join when they sign in with this email."},"OrganizationMember":{"properties":{"profile_id":{"type":"string","title":"Profile Id","description":"profiles.id"},"email":{"type":"string","title":"Email","description":"Member email"},"role":{"type":"string","enum":["owner","admin"],"title":"Role","description":"owner or admin"}},"type":"object","required":["profile_id","email","role"],"title":"OrganizationMember","description":"Active person in the organization. People are not billed seats."},"OrganizationSignupOptions":{"properties":{"use_cases":{"items":{"$ref":"#/components/schemas/SignupOption"},"type":"array","title":"Use Cases","description":"Required use-case chips"},"team_sizes":{"items":{"$ref":"#/components/schemas/SignupOption"},"type":"array","title":"Team Sizes","description":"Optional team-size chips"},"countries":{"items":{"$ref":"#/components/schemas/CountryOption"},"type":"array","title":"Countries","description":"Optional operating-country picker; ISO-2 codes"}},"type":"object","required":["use_cases","team_sizes","countries"],"title":"OrganizationSignupOptions","description":"Enums for the organization create wizard. Dashboard must not hardcode chips."},"OrganizationView":{"properties":{"id":{"type":"string","title":"Id","description":"Organization id"},"name":{"type":"string","title":"Name","description":"Organization display name"},"website":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Website","description":"Optional public website collected at create"},"country":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Country","description":"Optional ISO-2 country the organization operates from"},"use_case":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Use Case","description":"How they will use Proxy Charm"},"use_case_note":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Use Case Note","description":"Optional note when use_case is other"},"team_size":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Team Size","description":"Optional team-size chip; not billed seats"},"role":{"type":"string","enum":["owner","admin"],"title":"Role","description":"Caller’s membership role"},"accounts":{"items":{"$ref":"#/components/schemas/OrganizationAccount"},"type":"array","title":"Accounts","description":"Workspaces in this organization; empty until first Checkout"},"members":{"items":{"$ref":"#/components/schemas/OrganizationMember"},"type":"array","title":"Members","description":"Active members (email + role)"},"pending_invites":{"items":{"$ref":"#/components/schemas/OrganizationInvite"},"type":"array","title":"Pending Invites","description":"Pending email invites; empty when none"}},"type":"object","required":["id","name","role","accounts"],"title":"OrganizationView","description":"Caller’s organization, membership role, and accounts. No Stripe ids."},"PendingAccountChange":{"properties":{"account_id":{"type":"string","title":"Account Id","description":"accounts.id this add/drop applies to"},"add_slots":{"items":{"$ref":"#/components/schemas/SlotCountryChoice"},"type":"array","title":"Add Slots","description":"New IP countries for this account after the update pays"},"drop_slot_indexes":{"items":{"type":"integer"},"type":"array","title":"Drop Slot Indexes","description":"Slot indexes on this account to release after the update pays"}},"type":"object","required":["account_id"],"title":"PendingAccountChange","description":"Per-account slot intent on a pending plan change."},"PendingPlanChange":{"properties":{"plan_id":{"type":"string","title":"Plan Id","description":"Target Proxy Charm plans.id"},"add_slots":{"items":{"$ref":"#/components/schemas/SlotCountryChoice"},"type":"array","title":"Add Slots","description":"Flattened new IP countries (org-of-one / first account)"},"drop_slot_indexes":{"items":{"type":"integer"},"type":"array","title":"Drop Slot Indexes","description":"Flattened slot indexes to release (org-of-one / first account)"},"accounts":{"items":{"$ref":"#/components/schemas/PendingAccountChange"},"type":"array","title":"Accounts","description":"Per-live-account add/drop intent"}},"type":"object","required":["plan_id"],"title":"PendingPlanChange","description":"Intended plan change waiting for the Stripe update invoice to pay."},"PlanChangePreview":{"properties":{"plan_id":{"type":"string","title":"Plan Id","description":"Target Proxy Charm plans.id"},"charge_cents":{"type":"integer","title":"Charge Cents","description":"Estimated charge now in minor units"},"currency":{"type":"string","title":"Currency","description":"ISO-4217 currency, lowercase"},"current_paid_seats":{"type":"integer","title":"Current Paid Seats","description":"Stripe quantity (unchanged by a plan change)"}},"type":"object","required":["plan_id","charge_cents","currency","current_paid_seats"],"title":"PlanChangePreview","description":"Owner quote for changing plan. No Stripe ids. No writes."},"PreviewChangePlanBody":{"properties":{"plan_id":{"type":"string","title":"Plan Id","description":"Target Proxy Charm plans.id to quote"}},"type":"object","required":["plan_id"],"title":"PreviewChangePlanBody"},"Profile":{"properties":{"id":{"type":"string","title":"Id","description":"Profile id; matches auth.users.id"},"email":{"type":"string","title":"Email","description":"Account email"},"full_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Full Name","description":"Person display name from signup; not the organization name"},"role":{"type":"string","enum":["customer","admin"],"title":"Role","description":"customer or admin"},"status":{"type":"string","enum":["active","suspended"],"title":"Status","description":"active or suspended"},"created_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Created At","description":"When the profile was created"},"organization_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Organization Id","description":"Organization this profile belongs to (admin customer list only)"},"organization_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Organization Name","description":"Organization display name (admin customer list only)"},"member_role":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Member Role","description":"owner or admin on that organization (admin customer list only)"}},"type":"object","required":["id","email","role","status"],"title":"Profile","description":"Proxy Charm application profile (not the upstream vendor identity)."},"ProjectionHealth":{"properties":{"redis_ok":{"type":"boolean","title":"Redis Ok","description":"Whether Redis PING succeeded"},"key_count":{"type":"integer","title":"Key Count","description":"Number of gw:cred keys currently projected"}},"type":"object","required":["redis_ok","key_count"],"title":"ProjectionHealth"},"ProjectionRebuildResult":{"properties":{"projected":{"type":"integer","title":"Projected","description":"Live assignments written to Redis"},"deleted_stale":{"type":"integer","title":"Deleted Stale","description":"Redis keys removed because they are no longer live"}},"type":"object","required":["projected","deleted_stale"],"title":"ProjectionRebuildResult"},"ProviderCapabilities":{"properties":{"provider":{"type":"string","title":"Provider","description":"Stable provider code, e.g. webshare"},"purchase":{"type":"boolean","title":"Purchase","description":"Can buy/provision inventory via API"},"replace":{"type":"boolean","title":"Replace","description":"Can replace a dead IP via API"},"release":{"type":"boolean","title":"Release","description":"Can release an IP back to the vendor"},"list_inventory":{"type":"boolean","title":"List Inventory","description":"Can list owned inventory via API"},"health":{"type":"boolean","title":"Health","description":"Vendor health endpoint exists"},"usage":{"type":"boolean","title":"Usage","description":"Vendor usage endpoint exists"},"subusers":{"type":"boolean","title":"Subusers","description":"Vendor supports sub-users"},"notes":{"type":"string","title":"Notes","description":"Human notes on gaps vs the Protocol","default":""}},"type":"object","required":["provider","purchase","replace","release","list_inventory","health","usage","subusers"],"title":"ProviderCapabilities","description":"What this adapter can do. Unsupported ops must not be faked."},"ReleaseBody":{"properties":{"proxy_ip_id":{"type":"string","title":"Proxy Ip Id","description":"Inventory row to release"}},"type":"object","required":["proxy_ip_id"],"title":"ReleaseBody"},"ReleaseResult":{"properties":{"proxy_ip_id":{"type":"string","title":"Proxy Ip Id","description":"Released inventory id"},"status":{"type":"string","enum":["available","assigned","quarantined"],"title":"Status","description":"Inventory status after release"}},"type":"object","required":["proxy_ip_id","status"],"title":"ReleaseResult"},"RemoveAccountBody":{"properties":{"idempotency_key":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Idempotency Key","description":"Retry key; same key on an already-removed account is a no-op"}},"type":"object","title":"RemoveAccountBody"},"RemoveMemberBody":{"properties":{"profile_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Profile Id","description":"Member profiles.id to remove"},"invite_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Invite Id","description":"Pending invite id to cancel"}},"type":"object","title":"RemoveMemberBody"},"RenameOrganizationBody":{"properties":{"name":{"type":"string","title":"Name","description":"New organization display name"}},"type":"object","required":["name"],"title":"RenameOrganizationBody"},"ReplaceAssignedBody":{"properties":{"assignment_id":{"type":"string","title":"Assignment Id","description":"Live assignments.id to flip"},"replacement_proxy_ip_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Replacement Proxy Ip Id","description":"Available inventory row to use"},"country":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Country","description":"ISO-2 filter for the new IP, or null for Any"},"reason":{"type":"string","title":"Reason","description":"Why the IP is being replaced"},"idempotency_key":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Idempotency Key","description":"Retry key"}},"type":"object","required":["assignment_id","reason"],"title":"ReplaceAssignedBody"},"ReplaceSlotBody":{"properties":{"replacement_proxy_ip_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Replacement Proxy Ip Id","description":"Available inventory row; omit to auto-pick"},"reason":{"type":"string","title":"Reason","description":"Why the slot IP is being replaced"},"idempotency_key":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Idempotency Key","description":"Retry key"}},"type":"object","required":["reason"],"title":"ReplaceSlotBody"},"ResidioPlan":{"properties":{"id":{"type":"string","title":"Id","description":"Proxy Charm plans.id"},"name":{"type":"string","title":"Name","description":"SKU name shown to customers"},"ip_count":{"type":"integer","title":"Ip Count","description":"How many IPs this SKU includes per account"},"interval":{"type":"string","title":"Interval","description":"Billing interval: month or year"},"amount_cents":{"type":"integer","title":"Amount Cents","description":"Customer price in minor units"},"currency":{"type":"string","title":"Currency","description":"ISO-4217 currency, lowercase"},"amount_display":{"type":"string","title":"Amount Display","description":"Formatted price, e.g. 10.00 USD"},"active":{"type":"boolean","title":"Active","description":"False archives the SKU from new checkouts"},"popular":{"type":"boolean","title":"Popular","description":"True when this SKU is the featured plan for its interval"}},"type":"object","required":["id","name","ip_count","interval","amount_cents","currency","amount_display","active","popular"],"title":"ResidioPlan","description":"Customer-visible Proxy Charm SKU. Price comes from our table, not Stripe."},"ResidioPlanAdmin":{"properties":{"id":{"type":"string","title":"Id","description":"Proxy Charm plans.id"},"name":{"type":"string","title":"Name","description":"SKU name shown to customers"},"ip_count":{"type":"integer","title":"Ip Count","description":"How many IPs this SKU includes per account"},"interval":{"type":"string","title":"Interval","description":"Billing interval: month or year"},"amount_cents":{"type":"integer","title":"Amount Cents","description":"Customer price in minor units"},"currency":{"type":"string","title":"Currency","description":"ISO-4217 currency, lowercase"},"amount_display":{"type":"string","title":"Amount Display","description":"Formatted price, e.g. 10.00 USD"},"active":{"type":"boolean","title":"Active","description":"False archives the SKU from new checkouts"},"popular":{"type":"boolean","title":"Popular","description":"True when this SKU is the featured plan for its interval"},"stripe_product_id":{"type":"string","title":"Stripe Product Id","description":"Stripe Product id (prod_…)"},"stripe_price_id":{"type":"string","title":"Stripe Price Id","description":"Stripe Price id (price_…)"}},"type":"object","required":["id","name","ip_count","interval","amount_cents","currency","amount_display","active","popular","stripe_product_id","stripe_price_id"],"title":"ResidioPlanAdmin","description":"Admin catalog row. Includes Stripe Product and Price ids for ops."},"ResidioPlanAdminList":{"properties":{"items":{"items":{"$ref":"#/components/schemas/ResidioPlanAdmin"},"type":"array","title":"Items","description":"All Proxy Charm plans including archived"},"total":{"type":"integer","title":"Total","description":"Number of plans returned"}},"type":"object","required":["items","total"],"title":"ResidioPlanAdminList"},"ResidioPlanList":{"properties":{"items":{"items":{"$ref":"#/components/schemas/ResidioPlan"},"type":"array","title":"Items","description":"Active Proxy Charm plans"},"total":{"type":"integer","title":"Total","description":"Number of plans returned"}},"type":"object","required":["items","total"],"title":"ResidioPlanList"},"ResidioSubscription":{"properties":{"id":{"type":"string","title":"Id","description":"Proxy Charm subscriptions.id"},"status":{"type":"string","title":"Status","description":"incomplete | active | past_due | canceling | canceled | unpaid"},"plan":{"$ref":"#/components/schemas/ResidioPlan","description":"SKU this subscription is on"},"slots":{"items":{"$ref":"#/components/schemas/ResidioSubscriptionSlot"},"type":"array","title":"Slots","description":"Per-IP country and assign state"},"current_period_end":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Current Period End","description":"ISO timestamp of period end when known"},"cancel_at_period_end":{"type":"boolean","title":"Cancel At Period End","description":"True when cancel is scheduled at period end (Portal)","default":false},"payment_action_required":{"type":"boolean","title":"Payment Action Required","description":"True when the customer must authenticate a payment (SCA)","default":false},"pending_change":{"anyOf":[{"$ref":"#/components/schemas/PendingPlanChange"},{"type":"null"}],"description":"Plan change waiting for the Stripe update invoice to pay"},"paid_seat_count":{"type":"integer","title":"Paid Seat Count","description":"Stripe subscription quantity (paid accounts)","default":1},"open_seats":{"type":"integer","title":"Open Seats","description":"Paid seats with no active or pending_provision account","default":0},"accounts":{"items":{"$ref":"#/components/schemas/SubscriptionAccountView"},"type":"array","title":"Accounts","description":"Billed workspaces on this subscription"}},"type":"object","required":["id","status","plan","slots"],"title":"ResidioSubscription","description":"Customer-visible subscription. Omits Stripe ids."},"ResidioSubscriptionSlot":{"properties":{"slot_index":{"type":"integer","title":"Slot Index","description":"0-based slot index"},"country":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Country","description":"ISO-2 or null for Any"},"status":{"type":"string","title":"Status","description":"pending | assigned | dropped"},"assignment_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Assignment Id","description":"Proxy Charm assignment id when this slot has an IP"},"account_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Account Id","description":"Organization account that owns this slot"}},"type":"object","required":["slot_index","status"],"title":"ResidioSubscriptionSlot"},"ResponseContext":{"properties":{"affected_entities":{"items":{"type":"string"},"type":"array","title":"Affected Entities","description":"Entities affected by the action (format: entity_type:id)"},"suggested_next_actions":{"items":{"type":"string"},"type":"array","title":"Suggested Next Actions","description":"Suggested follow-up actions for AI agents"},"warnings":{"items":{"type":"string"},"type":"array","title":"Warnings","description":"Non-fatal warnings"}},"type":"object","title":"ResponseContext","description":"Hints for AI agents and affected entity tracking."},"RetryProvisionBody":{"properties":{"idempotency_key":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Idempotency Key","description":"Retry key"}},"type":"object","title":"RetryProvisionBody"},"SetPlanPopularBody":{"properties":{"popular":{"type":"boolean","title":"Popular","description":"True features this plan and clears the other popular plan on the same interval"}},"type":"object","required":["popular"],"title":"SetPlanPopularBody"},"SignupOption":{"properties":{"id":{"type":"string","title":"Id","description":"Stable value stored on the organization"},"label":{"type":"string","title":"Label","description":"Label shown in the dashboard"},"allows_note":{"type":"boolean","title":"Allows Note","description":"True when this option may include use_case_note","default":false}},"type":"object","required":["id","label"],"title":"SignupOption","description":"Selectable chip on organization signup."},"SlotCountryChoice":{"properties":{"country":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Country","description":"ISO-2 country filter, or null for Any"}},"type":"object","title":"SlotCountryChoice","description":"One IP slot at checkout. Null country means Any."},"SlotReplaceResult":{"properties":{"slot":{"$ref":"#/components/schemas/ResidioSubscriptionSlot","description":"Slot that still owns the assignment"},"assignment":{"$ref":"#/components/schemas/AssignedProxy","description":"Flipped assignment. Same Proxy Charm username and password"}},"type":"object","required":["slot","assignment"],"title":"SlotReplaceResult","description":"Paid slot after a Proxy Charm stock swap. Assignment id is unchanged."},"StartCheckoutBody":{"properties":{"plan_id":{"type":"string","title":"Plan Id","description":"Proxy Charm plans.id to subscribe to"},"account_name":{"type":"string","title":"Account Name","description":"Display name for the first account"},"account_address":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Account Address","description":"Optional mailing or operating address for the first account"},"account_country":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Account Country","description":"Optional ISO-2 country the first account is based in"},"slots":{"items":{"$ref":"#/components/schemas/SlotCountryChoice"},"type":"array","title":"Slots","description":"One country (or Any) per IP in the plan"},"idempotency_key":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Idempotency Key","description":"Retry key"}},"type":"object","required":["plan_id","account_name","slots"],"title":"StartCheckoutBody"},"SubscriptionAccountView":{"properties":{"account_id":{"type":"string","title":"Account Id","description":"accounts.id"},"name":{"type":"string","title":"Name","description":"Account display name"},"status":{"type":"string","title":"Status","description":"pending_payment | active | pending_provision | removed"},"slots":{"items":{"$ref":"#/components/schemas/ResidioSubscriptionSlot"},"type":"array","title":"Slots","description":"Slots belonging to this account"}},"type":"object","required":["account_id","name","status","slots"],"title":"SubscriptionAccountView","description":"One billed workspace on the live subscription."},"SubscriptionProvisionResult":{"properties":{"subscription_id":{"type":"string","title":"Subscription Id","description":"Proxy Charm subscriptions.id"},"status":{"type":"string","title":"Status","description":"Proxy Charm subscription status after retry"},"provision_status":{"type":"string","title":"Provision Status","description":"complete when no pending slots remain; pending when stock is still empty"},"pending_slots":{"items":{"$ref":"#/components/schemas/ResidioSubscriptionSlot"},"type":"array","title":"Pending Slots","description":"Slots still waiting for a matching IP"},"codes":{"items":{"type":"string"},"type":"array","title":"Codes","description":"PROVISION_PENDING and/or COUNTRY_NO_STOCK when slots remain pending"}},"type":"object","required":["subscription_id","status","provision_status","pending_slots"],"title":"SubscriptionProvisionResult","description":"Result of retrying pending slot assignment after inventory is available."},"SyncBody":{"properties":{"provider":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Provider","description":"Provider code (default webshare)"}},"type":"object","title":"SyncBody"},"UnfulfilledAssignResult":{"properties":{"assigned_count":{"type":"integer","title":"Assigned Count","description":"Slots assigned in this call"},"still_pending":{"type":"integer","title":"Still Pending","description":"Paid slots still waiting after this call"},"subscription_ids":{"items":{"type":"string"},"type":"array","title":"Subscription Ids","description":"Subscriptions that still have pending slots, or were touched"},"queue":{"$ref":"#/components/schemas/UnfulfilledQueue","description":"Refreshed fulfillment queue after this call"}},"type":"object","required":["assigned_count","still_pending","subscription_ids","queue"],"title":"UnfulfilledAssignResult","description":"Result of assigning available stock to paid pending slots."},"UnfulfilledCountryNeed":{"properties":{"country":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Country","description":"ISO-2 or null for Any"},"waiting":{"type":"integer","title":"Waiting","description":"Pending paid slots for this country"},"available":{"type":"integer","title":"Available","description":"Valid available IPs that match this country"},"shortfall":{"type":"integer","title":"Shortfall","description":"How many more matching IPs are needed to clear this country"}},"type":"object","required":["waiting","available","shortfall"],"title":"UnfulfilledCountryNeed","description":"How many paid slots wait on a country versus matching stock."},"UnfulfilledQueue":{"properties":{"items":{"items":{"$ref":"#/components/schemas/UnfulfilledSlot"},"type":"array","title":"Items","description":"Pending paid slots, oldest first"},"total_slots":{"type":"integer","title":"Total Slots","description":"How many paid IPs are still waiting"},"ready_count":{"type":"integer","title":"Ready Count","description":"Slots that can be assigned from current stock"},"blocked_count":{"type":"integer","title":"Blocked Count","description":"Slots that still need matching inventory"},"countries":{"items":{"$ref":"#/components/schemas/UnfulfilledCountryNeed"},"type":"array","title":"Countries","description":"Per-country waiting versus stock, shortfall first"}},"type":"object","required":["items","total_slots","ready_count","blocked_count","countries"],"title":"UnfulfilledQueue","description":"Ops queue of paid customers waiting on inventory."},"UnfulfilledSlot":{"properties":{"subscription_id":{"type":"string","title":"Subscription Id","description":"Proxy Charm subscriptions.id"},"slot_index":{"type":"integer","title":"Slot Index","description":"0-based slot index"},"profile_id":{"type":"string","title":"Profile Id","description":"Owner profiles.id for ops contact"},"email":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Email","description":"Owner profiles.email"},"organization_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Organization Id","description":"Paying organization id"},"organization_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Organization Name","description":"Organization display name"},"account_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Account Id","description":"Account waiting for this slot"},"account_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Account Name","description":"Account display name"},"plan_name":{"type":"string","title":"Plan Name","description":"Proxy Charm plan name"},"subscription_status":{"type":"string","title":"Subscription Status","description":"Proxy Charm subscription status"},"country":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Country","description":"ISO-2 or null for Any"},"waiting_since":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Waiting Since","description":"ISO timestamp when the slot was created"},"matching_available":{"type":"integer","title":"Matching Available","description":"Valid available IPs that match this slot country right now"},"can_fulfill":{"type":"boolean","title":"Can Fulfill","description":"True when this slot would receive an IP if ops assign oldest first"}},"type":"object","required":["subscription_id","slot_index","profile_id","plan_name","subscription_status","matching_available","can_fulfill"],"title":"UnfulfilledSlot","description":"One paid slot still waiting for a matching IP."},"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"}},"securitySchemes":{"HTTPBearer":{"type":"http","scheme":"bearer"},"BearerAuth":{"type":"http","scheme":"bearer","bearerFormat":"API Key","description":"Pass your `px_live_…` API key as the Bearer token. Keys are created on the Developer page of the dashboard.","x-prefix":"px_live_"}}},"tags":[{"name":"Public API","description":"Customer-facing REST API authenticated via API keys. Pass your `px_live_…` key as a Bearer token."}]}