{"openapi":"3.1.0","info":{"title":"Swell Partner API","version":"1.0.0","description":"\nThe Swell Partner API provides programmatic access to Swell's ISP platform for partner integrations.\n\n## Authentication\n\nAll API requests (except health check) require authentication via API key:\n\n```\nX-API-Key: pk_live_your_api_key_here\n```\n\nOr using Bearer token:\n\n```\nAuthorization: Bearer pk_live_your_api_key_here\n```\n\n## Rate Limits\n\n- **Per minute**: 100-500 requests (depending on plan)\n- **Per day**: 10,000-50,000 requests (depending on plan)\n\nRate limit headers are included in all responses:\n- `X-RateLimit-Remaining-Minute`\n- `X-RateLimit-Remaining-Day`\n- `X-RateLimit-Reset`\n\n## Errors\n\nAll errors follow a consistent format:\n\n```json\n{\n  \"success\": false,\n  \"error\": \"ERROR_CODE\",\n  \"message\": \"Human-readable description\",\n  \"details\": { \"field\": \"additional context\" }\n}\n```\n\n## Webhooks\n\nRegister webhook endpoints to receive real-time notifications about events like:\n- Customer lifecycle (created, updated, deleted)\n- Subscription changes (created, upgraded, cancelled)\n- Provisioning status updates\n- Network outages\n\nUse the webhook test endpoint to verify your integration.\n      ","contact":{"name":"Swell Developer Support","email":"developers@swellinternet.com","url":"https://docs.swellinternet.com"}},"servers":[{"url":"https://api.swellinternet.com","description":"Production"},{"url":"https://api-staging.swellinternet.com","description":"Staging"},{"url":"http://localhost:3010","description":"Local development"}],"tags":[{"name":"Health","description":"API health and status"},{"name":"Customers","description":"Customer management"},{"name":"Subscriptions","description":"Subscription management"},{"name":"Provisioning","description":"Service provisioning"},{"name":"Tickets","description":"Support tickets"},{"name":"Webhooks","description":"Webhook management"},{"name":"Events","description":"Event publishing"},{"name":"Serviceability","description":"Address serviceability checks"},{"name":"Network","description":"Network status and outages"},{"name":"Billing","description":"Usage, invoices, and account balance"},{"name":"IP Management","description":"IP pools and allocations"},{"name":"Bulk Operations","description":"Bulk data operations"}],"components":{"securitySchemes":{"ApiKeyAuth":{"type":"apiKey","in":"header","name":"X-API-Key","description":"Partner API key for authentication"}},"schemas":{"PaginationParams":{"type":"object","properties":{"page":{"type":"integer","minimum":1,"default":1,"description":"Page number (1-indexed)","example":1},"limit":{"type":"integer","minimum":1,"maximum":100,"default":20,"description":"Number of items per page (max 100)","example":20}}},"PaginationResponse":{"type":"object","properties":{"page":{"type":"number","example":1},"limit":{"type":"number","example":20},"total":{"type":"number","example":150},"totalPages":{"type":"number","example":8},"hasNext":{"type":"boolean","example":true},"hasPrev":{"type":"boolean","example":false}},"required":["page","limit","total","totalPages","hasNext","hasPrev"]},"ErrorResponse":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string","example":"VALIDATION_ERROR"},"message":{"type":"string","example":"Invalid request data"},"details":{}},"required":["success","error","message"]},"Address":{"type":"object","properties":{"street1":{"type":"string","minLength":1,"example":"123 Main Street"},"street2":{"type":"string","example":"Apt 4B"},"city":{"type":"string","minLength":1,"example":"Escondido"},"state":{"type":"string","minLength":2,"maxLength":2,"example":"CA"},"zip":{"type":"string","pattern":"^\\d{5}(-\\d{4})?$","example":"92025"},"country":{"type":"string","default":"US","example":"US"}},"required":["street1","city","state","zip"]},"Customer":{"type":"object","properties":{"id":{"type":"string","example":"cust_abc123xyz"},"email":{"type":"string","format":"email","example":"john@example.com"},"firstName":{"type":"string","example":"John"},"lastName":{"type":"string","example":"Doe"},"phone":{"type":["string","null"],"example":"+1-555-123-4567"},"type":{"type":"string","enum":["INDIVIDUAL","BUSINESS"],"description":"Type of customer account","example":"INDIVIDUAL"},"companyName":{"type":["string","null"],"example":"Acme Inc."},"status":{"type":"string","enum":["ACTIVE","INACTIVE","SUSPENDED","PENDING"],"description":"Current status of the customer","example":"ACTIVE"},"serviceAddress":{"$ref":"#/components/schemas/Address"},"billingAddress":{"allOf":[{"$ref":"#/components/schemas/Address"},{"type":["object","null"]}]},"metadata":{"type":["object","null"],"additionalProperties":{"type":"string"}},"createdAt":{"type":"string","format":"date-time","example":"2024-01-15T10:30:00Z"},"updatedAt":{"type":"string","format":"date-time","example":"2024-01-20T14:45:00Z"}},"required":["id","email","firstName","lastName","phone","type","companyName","status","serviceAddress","billingAddress","metadata","createdAt","updatedAt"]},"CreateCustomer":{"type":"object","properties":{"email":{"type":"string","format":"email","example":"john@example.com"},"firstName":{"type":"string","minLength":1,"example":"John"},"lastName":{"type":"string","minLength":1,"example":"Doe"},"phone":{"type":"string","example":"+1-555-123-4567"},"type":{"type":"string","enum":["INDIVIDUAL","BUSINESS"],"default":"INDIVIDUAL","description":"Type of customer account","example":"INDIVIDUAL"},"companyName":{"type":"string","example":"Acme Inc."},"serviceAddress":{"$ref":"#/components/schemas/Address"},"billingAddress":{"$ref":"#/components/schemas/Address"},"metadata":{"type":"object","additionalProperties":{"type":"string"},"description":"Custom key-value metadata","example":{"source":"partner_signup","campaign":"q1_promo"}}},"required":["email","firstName","lastName","serviceAddress"]},"UpdateCustomer":{"type":"object","properties":{"firstName":{"type":"string","minLength":1,"example":"John"},"lastName":{"type":"string","minLength":1,"example":"Doe"},"phone":{"type":"string","example":"+1-555-123-4567"},"type":{"type":"string","enum":["INDIVIDUAL","BUSINESS"],"default":"INDIVIDUAL","description":"Type of customer account","example":"INDIVIDUAL"},"companyName":{"type":"string","example":"Acme Inc."},"serviceAddress":{"$ref":"#/components/schemas/Address"},"billingAddress":{"$ref":"#/components/schemas/Address"},"metadata":{"type":"object","additionalProperties":{"type":"string"},"description":"Custom key-value metadata","example":{"source":"partner_signup","campaign":"q1_promo"}}}},"Subscription":{"type":"object","properties":{"id":{"type":"string","example":"sub_xyz789abc"},"customerId":{"type":"string","example":"cust_abc123xyz"},"serviceTier":{"type":"string","enum":["RESIDENTIAL_100","RESIDENTIAL_500","RESIDENTIAL_1G","BUSINESS_1G","BUSINESS_10G"],"description":"Service tier/plan","example":"RESIDENTIAL_500"},"status":{"type":"string","enum":["ACTIVE","PENDING","SUSPENDED","CANCELLED","PAST_DUE"],"description":"Current subscription status","example":"ACTIVE"},"monthlyPrice":{"type":"number","example":79.99},"startDate":{"type":"string","format":"date-time","example":"2024-02-01T00:00:00Z"},"endDate":{"type":["string","null"],"format":"date-time","example":null},"currentPeriodStart":{"type":"string","format":"date-time","example":"2024-02-01T00:00:00Z"},"currentPeriodEnd":{"type":"string","format":"date-time","example":"2024-03-01T00:00:00Z"},"metadata":{"type":["object","null"],"additionalProperties":{"type":"string"}},"createdAt":{"type":"string","format":"date-time"},"updatedAt":{"type":"string","format":"date-time"}},"required":["id","customerId","serviceTier","status","monthlyPrice","startDate","endDate","currentPeriodStart","currentPeriodEnd","metadata","createdAt","updatedAt"]},"CreateSubscription":{"type":"object","properties":{"customerId":{"type":"string","minLength":1,"example":"cust_abc123xyz"},"serviceTier":{"type":"string","enum":["RESIDENTIAL_100","RESIDENTIAL_500","RESIDENTIAL_1G","BUSINESS_1G","BUSINESS_10G"],"description":"Service tier/plan","example":"RESIDENTIAL_500"},"startDate":{"type":"string","format":"date-time","example":"2024-02-01T00:00:00Z"},"promotionCode":{"type":"string","example":"WINTER2024"},"metadata":{"type":"object","additionalProperties":{"type":"string"}}},"required":["customerId","serviceTier"]},"ProvisioningRequest":{"type":"object","properties":{"id":{"type":"string","example":"prov_def456uvw"},"customerId":{"type":"string","example":"cust_abc123xyz"},"subscriptionId":{"type":"string","example":"sub_xyz789abc"},"requestType":{"type":"string","enum":["NEW_INSTALL","UPGRADE","DOWNGRADE","DISCONNECT"]},"status":{"type":"string","enum":["PENDING","IN_PROGRESS","COMPLETED","FAILED","CANCELLED"],"description":"Status of the provisioning request","example":"IN_PROGRESS"},"scheduledDate":{"type":["string","null"],"format":"date-time"},"completedDate":{"type":["string","null"],"format":"date-time"},"ontId":{"type":["string","null"],"example":"ont_esc_001"},"ipAllocation":{"type":["object","null"],"properties":{"ipv4":{"type":["string","null"],"example":"192.168.1.100"},"ipv6":{"type":["string","null"],"example":"2001:db8::1"}},"required":["ipv4","ipv6"]},"notes":{"type":["string","null"]},"metadata":{"type":["object","null"],"additionalProperties":{"type":"string"}},"createdAt":{"type":"string","format":"date-time"},"updatedAt":{"type":"string","format":"date-time"}},"required":["id","customerId","subscriptionId","requestType","status","scheduledDate","completedDate","ontId","ipAllocation","notes","metadata","createdAt","updatedAt"]},"CreateProvisioningRequest":{"type":"object","properties":{"customerId":{"type":"string","minLength":1,"example":"cust_abc123xyz"},"subscriptionId":{"type":"string","minLength":1,"example":"sub_xyz789abc"},"requestType":{"type":"string","enum":["NEW_INSTALL","UPGRADE","DOWNGRADE","DISCONNECT"],"example":"NEW_INSTALL"},"scheduledDate":{"type":"string","format":"date-time","description":"Preferred installation date/time","example":"2024-02-15T09:00:00Z"},"notes":{"type":"string","example":"Customer prefers morning installation"},"metadata":{"type":"object","additionalProperties":{"type":"string"}}},"required":["customerId","subscriptionId","requestType"]},"Ticket":{"type":"object","properties":{"id":{"type":"string","example":"tkt_ghi789rst"},"customerId":{"type":"string","example":"cust_abc123xyz"},"subject":{"type":"string"},"description":{"type":"string"},"category":{"type":"string","enum":["BILLING","TECHNICAL","INSTALLATION","GENERAL","OUTAGE"],"example":"TECHNICAL"},"priority":{"type":"string","enum":["LOW","MEDIUM","HIGH","URGENT"],"example":"MEDIUM"},"status":{"type":"string","enum":["OPEN","IN_PROGRESS","WAITING_CUSTOMER","RESOLVED","CLOSED"],"example":"OPEN"},"assignedTo":{"type":["string","null"],"example":"agent_001"},"resolvedAt":{"type":["string","null"],"format":"date-time"},"metadata":{"type":["object","null"],"additionalProperties":{"type":"string"}},"createdAt":{"type":"string","format":"date-time"},"updatedAt":{"type":"string","format":"date-time"}},"required":["id","customerId","subject","description","category","priority","status","assignedTo","resolvedAt","metadata","createdAt","updatedAt"]},"CreateTicket":{"type":"object","properties":{"customerId":{"type":"string","minLength":1,"example":"cust_abc123xyz"},"subject":{"type":"string","minLength":1,"maxLength":200,"example":"Internet connection issues"},"description":{"type":"string","minLength":1,"example":"Customer reports intermittent connectivity since yesterday morning."},"category":{"type":"string","enum":["BILLING","TECHNICAL","INSTALLATION","GENERAL","OUTAGE"],"example":"TECHNICAL"},"priority":{"type":"string","enum":["LOW","MEDIUM","HIGH","URGENT"],"default":"MEDIUM","example":"MEDIUM"},"metadata":{"type":"object","additionalProperties":{"type":"string"}}},"required":["customerId","subject","description","category"]},"WebhookRegistration":{"type":"object","properties":{"id":{"type":"string","example":"wh_jkl012mno"},"url":{"type":"string","format":"uri"},"events":{"type":"array","items":{"type":"string","enum":["customer.created","customer.updated","customer.deleted","subscription.created","subscription.updated","subscription.cancelled","provisioning.started","provisioning.completed","provisioning.failed","ticket.created","ticket.updated","ticket.resolved","outage.detected","outage.resolved"],"description":"Type of webhook event","example":"customer.created"}},"secret":{"type":"string","description":"Shared secret for signature verification (shown only once on creation)"},"description":{"type":["string","null"]},"isActive":{"type":"boolean","example":true},"lastDeliveryAt":{"type":["string","null"],"format":"date-time"},"lastDeliveryStatus":{"type":["string","null"],"enum":["success","failed"]},"createdAt":{"type":"string","format":"date-time"}},"required":["id","url","events","secret","description","isActive","lastDeliveryAt","lastDeliveryStatus","createdAt"]},"RegisterWebhook":{"type":"object","properties":{"url":{"type":"string","format":"uri","example":"https://partner.com/webhooks/swell"},"events":{"type":"array","items":{"type":"string","enum":["customer.created","customer.updated","customer.deleted","subscription.created","subscription.updated","subscription.cancelled","provisioning.started","provisioning.completed","provisioning.failed","ticket.created","ticket.updated","ticket.resolved","outage.detected","outage.resolved"],"description":"Type of webhook event","example":"customer.created"},"minItems":1,"example":["customer.created","subscription.created"]},"secret":{"type":"string","minLength":16,"description":"Shared secret for HMAC signature verification (auto-generated if not provided)"},"description":{"type":"string","example":"Production webhook endpoint"}},"required":["url","events"]},"TestWebhook":{"type":"object","properties":{"webhookId":{"type":"string","description":"Specific webhook ID to test (tests all if not provided)"},"eventType":{"type":"string","enum":["customer.created","customer.updated","customer.deleted","subscription.created","subscription.updated","subscription.cancelled","provisioning.started","provisioning.completed","provisioning.failed","ticket.created","ticket.updated","ticket.resolved","outage.detected","outage.resolved"],"description":"Event type to simulate","example":"customer.created"},"payload":{"type":"object","additionalProperties":{},"description":"Custom payload to send (uses sample data if not provided)"}},"required":["eventType"]},"PublishEvent":{"type":"object","properties":{"eventType":{"type":"string","minLength":1,"description":"Custom event type identifier","example":"partner.custom_event"},"payload":{"type":"object","additionalProperties":{},"description":"Event payload data","example":{"customerId":"cust_abc123","action":"profile_updated"}},"priority":{"type":"string","enum":["critical","high","medium","low"],"default":"medium"}},"required":["eventType","payload"]},"TicketComment":{"type":"object","properties":{"id":{"type":"string","example":"comment_abc123"},"ticketId":{"type":"string","example":"tkt_ghi789rst"},"author":{"type":"object","properties":{"id":{"type":"string"},"name":{"type":"string"},"type":{"type":"string","enum":["CUSTOMER","AGENT","SYSTEM"]}},"required":["id","name","type"]},"content":{"type":"string","example":"I have restarted my router but the issue persists."},"isInternal":{"type":"boolean","description":"Internal notes not visible to customer","example":false},"attachments":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"filename":{"type":"string"},"url":{"type":"string"},"size":{"type":"number"}},"required":["id","filename","url","size"]}},"createdAt":{"type":"string","format":"date-time"}},"required":["id","ticketId","author","content","isInternal","createdAt"]},"CreateTicketComment":{"type":"object","properties":{"content":{"type":"string","minLength":1,"example":"Thank you for the update. We are looking into this."},"isInternal":{"type":"boolean","default":false,"description":"Mark as internal note (not visible to customer)"}},"required":["content"]},"TicketAttachment":{"type":"object","properties":{"id":{"type":"string","example":"attach_abc123"},"ticketId":{"type":"string","example":"tkt_xyz789"},"filename":{"type":"string","example":"screenshot.png"},"url":{"type":"string","format":"uri","example":"https://storage.swell.example/attachments/attach_abc123/screenshot.png"},"size":{"type":"number","exclusiveMinimum":0,"description":"File size in bytes","example":245780},"mimeType":{"type":"string","example":"image/png"},"uploadedBy":{"type":"object","properties":{"id":{"type":"string"},"name":{"type":"string"},"type":{"type":"string","enum":["CUSTOMER","AGENT","SYSTEM"]}},"required":["id","name","type"]},"createdAt":{"type":"string","format":"date-time"}},"required":["id","ticketId","filename","url","size","mimeType","uploadedBy","createdAt"]},"CreateTicketAttachment":{"type":"object","properties":{"filename":{"type":"string","minLength":1,"example":"error_log.txt"},"url":{"type":"string","format":"uri","description":"URL where the file is hosted (after upload to storage)","example":"https://storage.swell.example/uploads/error_log.txt"},"size":{"type":"number","exclusiveMinimum":0,"description":"File size in bytes","example":1024},"mimeType":{"type":"string","default":"application/octet-stream","example":"text/plain"}},"required":["filename","url","size"]},"SubscriptionUpgrade":{"type":"object","properties":{"newTier":{"type":"string","enum":["RESIDENTIAL_100","RESIDENTIAL_500","RESIDENTIAL_1G","BUSINESS_1G","BUSINESS_10G"],"description":"The new service tier to upgrade/downgrade to","example":"RESIDENTIAL_500"},"effectiveDate":{"type":"string","format":"date-time","description":"When the change takes effect (defaults to immediately)","example":"2026-02-01T00:00:00Z"},"prorateCharges":{"type":"boolean","default":true,"description":"Whether to prorate charges for the current period"}},"required":["newTier"]},"SubscriptionAction":{"type":"object","properties":{"reason":{"type":"string","example":"Customer requested temporary suspension during vacation"},"scheduledResumeDate":{"type":"string","format":"date-time","description":"For suspend action: when to automatically resume","example":"2026-03-01T00:00:00Z"}}},"Outage":{"type":"object","properties":{"id":{"type":"string","example":"outage_001"},"type":{"type":"string","enum":["PLANNED","UNPLANNED"],"example":"UNPLANNED"},"severity":{"type":"string","enum":["LOW","MEDIUM","HIGH","CRITICAL"],"example":"MEDIUM"},"status":{"type":"string","enum":["INVESTIGATING","IDENTIFIED","MONITORING","RESOLVED"],"example":"IDENTIFIED"},"title":{"type":"string","example":"Fiber cut on Main St"},"description":{"type":"string","example":"Construction crew damaged fiber line"},"affectedArea":{"type":"string","example":"Escondido - Downtown"},"affectedCustomers":{"type":"number","example":150},"affectedZips":{"type":"array","items":{"type":"string"},"example":["92025","92026"]},"startedAt":{"type":"string","format":"date-time","example":"2026-01-21T14:30:00Z"},"estimatedResolution":{"type":["string","null"],"format":"date-time","example":"2026-01-21T18:00:00Z"},"resolvedAt":{"type":["string","null"],"format":"date-time"},"updates":{"type":"array","items":{"type":"object","properties":{"timestamp":{"type":"string","format":"date-time"},"message":{"type":"string"}},"required":["timestamp","message"]}}},"required":["id","type","severity","status","title","description","affectedArea","affectedCustomers","affectedZips","startedAt","estimatedResolution","resolvedAt"]},"Invoice":{"type":"object","properties":{"id":{"type":"string","example":"inv_xyz789"},"customerId":{"type":"string","example":"cust_abc123"},"number":{"type":"string","example":"INV-2026-0001"},"status":{"type":"string","enum":["DRAFT","PENDING","PAID","OVERDUE","VOID"],"example":"PAID"},"amount":{"type":"number","example":79.99},"tax":{"type":"number","example":6.4},"total":{"type":"number","example":86.39},"currency":{"type":"string","example":"USD"},"periodStart":{"type":"string","format":"date-time"},"periodEnd":{"type":"string","format":"date-time"},"dueDate":{"type":"string","format":"date-time"},"paidAt":{"type":["string","null"],"format":"date-time"},"lineItems":{"type":"array","items":{"type":"object","properties":{"description":{"type":"string"},"quantity":{"type":"number"},"unitPrice":{"type":"number"},"amount":{"type":"number"}},"required":["description","quantity","unitPrice","amount"]}},"createdAt":{"type":"string","format":"date-time"}},"required":["id","customerId","number","status","amount","tax","total","currency","periodStart","periodEnd","dueDate","paidAt","lineItems","createdAt"]},"BulkJobStatus":{"type":"string","enum":["PENDING","PROCESSING","COMPLETED","FAILED","PARTIAL"]},"BulkJob":{"type":"object","properties":{"id":{"type":"string","example":"bulk_job_abc123"},"type":{"type":"string","enum":["CUSTOMER_CREATE","PROVISIONING_CREATE"],"example":"CUSTOMER_CREATE"},"status":{"$ref":"#/components/schemas/BulkJobStatus"},"progress":{"type":"object","properties":{"total":{"type":"number","example":50},"processed":{"type":"number","example":35},"succeeded":{"type":"number","example":33},"failed":{"type":"number","example":2}},"required":["total","processed","succeeded","failed"]},"errors":{"type":"array","items":{"type":"object","properties":{"index":{"type":"number"},"message":{"type":"string"},"details":{}},"required":["index","message"]}},"createdAt":{"type":"string","format":"date-time"},"completedAt":{"type":["string","null"],"format":"date-time"},"expiresAt":{"type":"string","format":"date-time","description":"Job data expires after 24 hours"}},"required":["id","type","status","progress","createdAt","completedAt","expiresAt"]},"BulkCustomerCreate":{"type":"object","properties":{"customers":{"type":"array","items":{"$ref":"#/components/schemas/CreateCustomer"},"minItems":1,"maxItems":100,"description":"Array of customers to create (max 100)"},"options":{"type":"object","properties":{"stopOnError":{"type":"boolean","default":false,"description":"Stop processing on first error"},"dryRun":{"type":"boolean","default":false,"description":"Validate without creating"}}}},"required":["customers"]},"HealthResponse":{"type":"object","properties":{"success":{"type":"boolean","enum":[true]},"data":{"type":"object","properties":{"status":{"type":"string","enum":["healthy","degraded","unhealthy"]},"version":{"type":"string","example":"1.0.0"},"timestamp":{"type":"string","format":"date-time"},"services":{"type":"object","properties":{"database":{"type":"string","enum":["up","down"]},"messageBus":{"type":"string","enum":["up","down"]},"gaiia":{"type":"string","enum":["up","down","unavailable"]},"sifi":{"type":"string","enum":["up","down","unavailable"]},"aex":{"type":"string","enum":["up","down","unavailable"]}},"required":["database","messageBus","gaiia","sifi","aex"]}},"required":["status","version","timestamp","services"]}},"required":["success","data"]},"CustomerListResponse":{"type":"object","properties":{"success":{"type":"boolean","enum":[true]},"data":{"type":"array","items":{"$ref":"#/components/schemas/Customer"}},"pagination":{"$ref":"#/components/schemas/PaginationResponse"}},"required":["success","data","pagination"]},"CustomerResponse":{"type":"object","properties":{"success":{"type":"boolean","enum":[true]},"data":{"$ref":"#/components/schemas/Customer"}},"required":["success","data"]},"SubscriptionListResponse":{"type":"object","properties":{"success":{"type":"boolean","enum":[true]},"data":{"type":"array","items":{"$ref":"#/components/schemas/Subscription"}},"pagination":{"$ref":"#/components/schemas/PaginationResponse"}},"required":["success","data","pagination"]},"SubscriptionResponse":{"type":"object","properties":{"success":{"type":"boolean","enum":[true]},"data":{"$ref":"#/components/schemas/Subscription"}},"required":["success","data"]},"ProvisioningResponse":{"type":"object","properties":{"success":{"type":"boolean","enum":[true]},"data":{"$ref":"#/components/schemas/ProvisioningRequest"}},"required":["success","data"]},"TicketResponse":{"type":"object","properties":{"success":{"type":"boolean","enum":[true]},"data":{"$ref":"#/components/schemas/Ticket"}},"required":["success","data"]},"WebhookRegistrationResponse":{"type":"object","properties":{"success":{"type":"boolean","enum":[true]},"data":{"$ref":"#/components/schemas/WebhookRegistration"}},"required":["success","data"]},"TestWebhookResponse":{"type":"object","properties":{"success":{"type":"boolean","enum":[true]},"data":{"type":"object","properties":{"webhookId":{"type":"string"},"url":{"type":"string"},"eventType":{"type":"string"},"delivered":{"type":"boolean"},"statusCode":{"type":["number","null"]},"responseTime":{"type":"number","description":"Response time in ms"},"error":{"type":["string","null"]}},"required":["webhookId","url","eventType","delivered","statusCode","responseTime","error"]}},"required":["success","data"]},"PublishEventResponse":{"type":"object","properties":{"success":{"type":"boolean","enum":[true]},"data":{"type":"object","properties":{"eventId":{"type":"string","example":"evt_pqr345stu"},"eventType":{"type":"string"},"publishedAt":{"type":"string","format":"date-time"}},"required":["eventId","eventType","publishedAt"]}},"required":["success","data"]},"ServiceabilityResult":{"type":"object","properties":{"serviceable":{"type":"boolean","example":true},"address":{"type":"object","properties":{"street":{"type":"string"},"city":{"type":"string"},"state":{"type":"string"},"zip":{"type":"string"}},"required":["street","city","state","zip"]},"availablePlans":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string","example":"plan_res_500"},"name":{"type":"string","example":"Residential 500 Mbps"},"tier":{"type":"string","example":"RESIDENTIAL_500"},"downloadSpeed":{"type":"number","description":"Mbps","example":500},"uploadSpeed":{"type":"number","description":"Mbps","example":500},"monthlyPrice":{"type":"number","example":79.99}},"required":["id","name","tier","downloadSpeed","uploadSpeed","monthlyPrice"]},"description":"Available service plans at this address"},"estimatedInstallDate":{"type":["string","null"],"format":"date-time","description":"Earliest available installation date","example":"2026-02-15T00:00:00Z"},"nearestOLT":{"type":["object","null"],"properties":{"id":{"type":"string","example":"olt_esc_001"},"distance":{"type":"number","description":"Distance in miles","example":0.5}},"required":["id","distance"],"description":"Nearest optical line terminal"},"reason":{"type":["string","null"],"description":"If not serviceable, explains why","example":"Address is outside current service area"}},"required":["serviceable","availablePlans","estimatedInstallDate","nearestOLT","reason"]},"ServiceabilityResponse":{"type":"object","properties":{"success":{"type":"boolean","enum":[true]},"data":{"$ref":"#/components/schemas/ServiceabilityResult"}},"required":["success","data"]},"NetworkStatus":{"type":"object","properties":{"overall":{"type":"string","enum":["healthy","degraded","outage"],"example":"healthy"},"regions":{"type":"array","items":{"type":"object","properties":{"name":{"type":"string","example":"Escondido, CA"},"status":{"type":"string","enum":["healthy","degraded","outage"]},"activeOutages":{"type":"number","example":0},"customersAffected":{"type":"number","example":0}},"required":["name","status","activeOutages","customersAffected"]}},"metrics":{"type":"object","properties":{"totalOLTs":{"type":"number","example":12},"totalONTs":{"type":"number","example":5430},"activeCustomers":{"type":"number","example":5215},"averageLatency":{"type":"number","description":"ms","example":2.3}},"required":["totalOLTs","totalONTs","activeCustomers","averageLatency"]},"lastUpdated":{"type":"string","format":"date-time"}},"required":["overall","regions","metrics","lastUpdated"]},"NetworkStatusResponse":{"type":"object","properties":{"success":{"type":"boolean","enum":[true]},"data":{"$ref":"#/components/schemas/NetworkStatus"}},"required":["success","data"]},"OutageListResponse":{"type":"object","properties":{"success":{"type":"boolean","enum":[true]},"data":{"type":"array","items":{"$ref":"#/components/schemas/Outage"}},"pagination":{"$ref":"#/components/schemas/PaginationResponse"}},"required":["success","data"]},"Usage":{"type":"object","properties":{"customerId":{"type":"string","example":"cust_abc123"},"period":{"type":"object","properties":{"start":{"type":"string","format":"date-time"},"end":{"type":"string","format":"date-time"}},"required":["start","end"]},"usage":{"type":"object","properties":{"downloadGB":{"type":"number","example":245.7},"uploadGB":{"type":"number","example":32.4},"peakDownloadMbps":{"type":"number","example":485},"peakUploadMbps":{"type":"number","example":478},"averageDownloadMbps":{"type":"number","example":125.3},"averageUploadMbps":{"type":"number","example":45.2}},"required":["downloadGB","uploadGB","peakDownloadMbps","peakUploadMbps","averageDownloadMbps","averageUploadMbps"]},"sessions":{"type":"object","properties":{"total":{"type":"number","example":1250},"averageDurationMinutes":{"type":"number","example":42}},"required":["total","averageDurationMinutes"]}},"required":["customerId","period","usage","sessions"]},"UsageResponse":{"type":"object","properties":{"success":{"type":"boolean","enum":[true]},"data":{"$ref":"#/components/schemas/Usage"}},"required":["success","data"]},"InvoiceListResponse":{"type":"object","properties":{"success":{"type":"boolean","enum":[true]},"data":{"type":"array","items":{"$ref":"#/components/schemas/Invoice"}},"pagination":{"$ref":"#/components/schemas/PaginationResponse"}},"required":["success","data"]},"Balance":{"type":"object","properties":{"customerId":{"type":"string","example":"cust_abc123"},"currentBalance":{"type":"number","description":"Amount owed (negative means credit)","example":0},"pendingCharges":{"type":"number","example":79.99},"lastPayment":{"type":["object","null"],"properties":{"amount":{"type":"number"},"date":{"type":"string","format":"date-time"},"method":{"type":"string","example":"card"}},"required":["amount","date","method"]},"autoPayEnabled":{"type":"boolean","example":true},"paymentMethodOnFile":{"type":"boolean","example":true}},"required":["customerId","currentBalance","pendingCharges","lastPayment","autoPayEnabled","paymentMethodOnFile"]},"BalanceResponse":{"type":"object","properties":{"success":{"type":"boolean","enum":[true]},"data":{"$ref":"#/components/schemas/Balance"}},"required":["success","data"]},"IPAllocation":{"type":"object","properties":{"id":{"type":"string","example":"ip_alloc_001"},"customerId":{"type":"string","example":"cust_abc123"},"type":{"type":"string","enum":["IPv4","IPv6"],"example":"IPv4"},"address":{"type":"string","example":"192.168.1.100"},"subnet":{"type":"string","example":"/32"},"gateway":{"type":["string","null"],"example":"192.168.1.1"},"status":{"type":"string","enum":["ACTIVE","PENDING","RELEASED"],"example":"ACTIVE"},"allocatedAt":{"type":"string","format":"date-time"},"releasedAt":{"type":["string","null"],"format":"date-time"}},"required":["id","customerId","type","address","subnet","gateway","status","allocatedAt","releasedAt"]},"CustomerIPs":{"type":"object","properties":{"customerId":{"type":"string","example":"cust_abc123"},"allocations":{"type":"array","items":{"$ref":"#/components/schemas/IPAllocation"}},"summary":{"type":"object","properties":{"totalIPv4":{"type":"number","example":1},"totalIPv6":{"type":"number","example":1},"activeAllocations":{"type":"number","example":2}},"required":["totalIPv4","totalIPv6","activeAllocations"]}},"required":["customerId","allocations","summary"]},"CustomerIPsResponse":{"type":"object","properties":{"success":{"type":"boolean","enum":[true]},"data":{"$ref":"#/components/schemas/CustomerIPs"}},"required":["success","data"]},"IPPool":{"type":"object","properties":{"id":{"type":"string","example":"pool_residential_v4"},"name":{"type":"string","example":"Residential IPv4 Pool"},"type":{"type":"string","enum":["IPv4","IPv6"],"example":"IPv4"},"cidr":{"type":"string","example":"10.0.0.0/16"},"region":{"type":"string","example":"Escondido"},"totalAddresses":{"type":"number","example":65536},"allocatedAddresses":{"type":"number","example":5215},"availableAddresses":{"type":"number","example":60321},"utilizationPercent":{"type":"number","example":7.96},"status":{"type":"string","enum":["ACTIVE","EXHAUSTED","RESERVED"],"example":"ACTIVE"}},"required":["id","name","type","cidr","region","totalAddresses","allocatedAddresses","availableAddresses","utilizationPercent","status"]},"IPPoolListResponse":{"type":"object","properties":{"success":{"type":"boolean","enum":[true]},"data":{"type":"array","items":{"$ref":"#/components/schemas/IPPool"}}},"required":["success","data"]},"IPPoolUtilization":{"type":"object","properties":{"poolId":{"type":"string","example":"pool_residential_v4"},"totalAddresses":{"type":"number","example":65536},"allocatedAddresses":{"type":"number","example":5215},"availableAddresses":{"type":"number","example":60321},"utilizationPercent":{"type":"number","example":7.96},"history":{"type":"array","items":{"type":"object","properties":{"date":{"type":"string","format":"date-time"},"utilizationPercent":{"type":"number"}},"required":["date","utilizationPercent"]}}},"required":["poolId","totalAddresses","allocatedAddresses","availableAddresses","utilizationPercent"]},"IPPoolUtilizationResponse":{"type":"object","properties":{"success":{"type":"boolean","enum":[true]},"data":{"$ref":"#/components/schemas/IPPoolUtilization"}},"required":["success","data"]},"TicketCommentListResponse":{"type":"object","properties":{"success":{"type":"boolean","enum":[true]},"data":{"type":"array","items":{"$ref":"#/components/schemas/TicketComment"}},"pagination":{"$ref":"#/components/schemas/PaginationResponse"}},"required":["success","data"]},"TicketCommentResponse":{"type":"object","properties":{"success":{"type":"boolean","enum":[true]},"data":{"$ref":"#/components/schemas/TicketComment"}},"required":["success","data"]},"TicketAttachmentListResponse":{"type":"object","properties":{"success":{"type":"boolean","enum":[true]},"data":{"type":"array","items":{"$ref":"#/components/schemas/TicketAttachment"}}},"required":["success","data"]},"TicketAttachmentResponse":{"type":"object","properties":{"success":{"type":"boolean","enum":[true]},"data":{"$ref":"#/components/schemas/TicketAttachment"},"message":{"type":"string"}},"required":["success","data"]},"SubscriptionChangeResponse":{"type":"object","properties":{"success":{"type":"boolean","enum":[true]},"data":{"type":"object","properties":{"subscriptionId":{"type":"string"},"previousTier":{"type":"string","enum":["RESIDENTIAL_100","RESIDENTIAL_500","RESIDENTIAL_1G","BUSINESS_1G","BUSINESS_10G"],"description":"Service tier/plan","example":"RESIDENTIAL_500"},"newTier":{"type":"string","enum":["RESIDENTIAL_100","RESIDENTIAL_500","RESIDENTIAL_1G","BUSINESS_1G","BUSINESS_10G"],"description":"Service tier/plan","example":"RESIDENTIAL_500"},"previousStatus":{"type":"string","enum":["ACTIVE","PENDING","SUSPENDED","CANCELLED","PAST_DUE"],"description":"Current subscription status","example":"ACTIVE"},"newStatus":{"type":"string","enum":["ACTIVE","PENDING","SUSPENDED","CANCELLED","PAST_DUE"],"description":"Current subscription status","example":"ACTIVE"},"effectiveDate":{"type":"string","format":"date-time"},"proratedAmount":{"type":"number","description":"Prorated charge or credit amount"}},"required":["subscriptionId","newStatus","effectiveDate"]}},"required":["success","data"]},"BulkJobResponse":{"type":"object","properties":{"success":{"type":"boolean","enum":[true]},"data":{"$ref":"#/components/schemas/BulkJob"}},"required":["success","data"]}},"parameters":{}},"paths":{"/api/v1/health":{"get":{"tags":["Health"],"summary":"Health check","description":"Returns the health status of the API and connected services","responses":{"200":{"description":"API is healthy","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HealthResponse"}}}},"503":{"description":"API is unhealthy","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HealthResponse"}}}}}}},"/api/v1/customers":{"get":{"tags":["Customers"],"summary":"List customers","description":"Retrieve a paginated list of customers","security":[{"ApiKeyAuth":[]}],"parameters":[{"schema":{"type":"integer","minimum":1,"default":1,"description":"Page number (1-indexed)","example":1},"required":false,"name":"page","in":"query"},{"schema":{"type":"integer","minimum":1,"maximum":100,"default":20,"description":"Number of items per page (max 100)","example":20},"required":false,"name":"limit","in":"query"}],"responses":{"200":{"description":"List of customers","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CustomerListResponse"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}},"post":{"tags":["Customers"],"summary":"Create customer","description":"Create a new customer account","security":[{"ApiKeyAuth":[]}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateCustomer"}}}},"responses":{"201":{"description":"Customer created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CustomerResponse"}}}},"400":{"description":"Validation error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/api/v1/customers/{id}":{"get":{"tags":["Customers"],"summary":"Get customer","description":"Retrieve a specific customer by ID","security":[{"ApiKeyAuth":[]}],"parameters":[{"schema":{"type":"string","description":"Customer ID"},"required":true,"name":"id","in":"path"}],"responses":{"200":{"description":"Customer details","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CustomerResponse"}}}},"404":{"description":"Customer not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}},"patch":{"tags":["Customers"],"summary":"Update customer","description":"Update an existing customer","security":[{"ApiKeyAuth":[]}],"parameters":[{"schema":{"type":"string","description":"Customer ID"},"required":true,"name":"id","in":"path"}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateCustomer"}}}},"responses":{"200":{"description":"Customer updated","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CustomerResponse"}}}},"404":{"description":"Customer not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/api/v1/subscriptions":{"get":{"tags":["Subscriptions"],"summary":"List subscriptions","description":"Retrieve a paginated list of subscriptions","security":[{"ApiKeyAuth":[]}],"parameters":[{"schema":{"type":"integer","minimum":1,"default":1,"description":"Page number (1-indexed)","example":1},"required":false,"name":"page","in":"query"},{"schema":{"type":"integer","minimum":1,"maximum":100,"default":20,"description":"Number of items per page (max 100)","example":20},"required":false,"name":"limit","in":"query"},{"schema":{"type":"string","description":"Filter by customer ID"},"required":false,"name":"customerId","in":"query"}],"responses":{"200":{"description":"List of subscriptions","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SubscriptionListResponse"}}}}}},"post":{"tags":["Subscriptions"],"summary":"Create subscription","description":"Create a new subscription for a customer","security":[{"ApiKeyAuth":[]}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateSubscription"}}}},"responses":{"201":{"description":"Subscription created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SubscriptionResponse"}}}}}}},"/api/v1/provisioning":{"post":{"tags":["Provisioning"],"summary":"Request provisioning","description":"Create a service provisioning request","security":[{"ApiKeyAuth":[]}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateProvisioningRequest"}}}},"responses":{"201":{"description":"Provisioning request created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProvisioningResponse"}}}}}},"get":{"tags":["Provisioning"],"summary":"List provisioning requests","description":"Get a paginated list of provisioning requests","security":[{"ApiKeyAuth":[]}],"parameters":[{"schema":{"type":"integer","minimum":1,"default":1,"description":"Page number (1-indexed)","example":1},"required":false,"name":"page","in":"query"},{"schema":{"type":"integer","minimum":1,"maximum":100,"default":20,"description":"Number of items per page (max 100)","example":20},"required":false,"name":"limit","in":"query"},{"schema":{"type":"string","enum":["PENDING","IN_PROGRESS","COMPLETED","FAILED","CANCELLED"]},"required":false,"name":"status","in":"query"},{"schema":{"type":"string"},"required":false,"name":"customerId","in":"query"}],"responses":{"200":{"description":"List of provisioning requests","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[true]},"data":{"type":"array","items":{"$ref":"#/components/schemas/ProvisioningRequest"}},"pagination":{"$ref":"#/components/schemas/PaginationResponse"}},"required":["success","data","pagination"]}}}}}}},"/api/v1/tickets":{"post":{"tags":["Tickets"],"summary":"Create ticket","description":"Create a support ticket","security":[{"ApiKeyAuth":[]}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateTicket"}}}},"responses":{"201":{"description":"Ticket created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TicketResponse"}}}}}},"get":{"tags":["Tickets"],"summary":"List tickets","description":"Get a paginated list of support tickets","security":[{"ApiKeyAuth":[]}],"parameters":[{"schema":{"type":"integer","minimum":1,"default":1,"description":"Page number (1-indexed)","example":1},"required":false,"name":"page","in":"query"},{"schema":{"type":"integer","minimum":1,"maximum":100,"default":20,"description":"Number of items per page (max 100)","example":20},"required":false,"name":"limit","in":"query"},{"schema":{"type":"string","enum":["OPEN","IN_PROGRESS","WAITING_CUSTOMER","RESOLVED","CLOSED"]},"required":false,"name":"status","in":"query"},{"schema":{"type":"string"},"required":false,"name":"customerId","in":"query"},{"schema":{"type":"string","enum":["LOW","MEDIUM","HIGH","URGENT"]},"required":false,"name":"priority","in":"query"}],"responses":{"200":{"description":"List of tickets","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[true]},"data":{"type":"array","items":{"$ref":"#/components/schemas/Ticket"}},"pagination":{"$ref":"#/components/schemas/PaginationResponse"}},"required":["success","data","pagination"]}}}}}}},"/api/v1/webhooks":{"get":{"tags":["Webhooks"],"summary":"List webhooks","description":"List all webhook registrations for your partner account","security":[{"ApiKeyAuth":[]}],"responses":{"200":{"description":"List of webhooks","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[true]},"data":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string","example":"wh_jkl012mno"},"url":{"type":"string","format":"uri"},"events":{"type":"array","items":{"type":"string","enum":["customer.created","customer.updated","customer.deleted","subscription.created","subscription.updated","subscription.cancelled","provisioning.started","provisioning.completed","provisioning.failed","ticket.created","ticket.updated","ticket.resolved","outage.detected","outage.resolved"],"description":"Type of webhook event","example":"customer.created"}},"description":{"type":["string","null"]},"isActive":{"type":"boolean","example":true},"lastDeliveryAt":{"type":["string","null"],"format":"date-time"},"lastDeliveryStatus":{"type":["string","null"],"enum":["success","failed"]},"createdAt":{"type":"string","format":"date-time"}},"required":["id","url","events","description","isActive","lastDeliveryAt","lastDeliveryStatus","createdAt"]}}},"required":["success","data"]}}}}}},"post":{"tags":["Webhooks"],"summary":"Register webhook","description":"Register a new webhook endpoint. The secret is only returned once on creation.","security":[{"ApiKeyAuth":[]}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RegisterWebhook"}}}},"responses":{"201":{"description":"Webhook registered","content":{"application/json":{"schema":{"$ref":"#/components/schemas/WebhookRegistrationResponse"}}}}}}},"/api/v1/webhooks/test":{"post":{"tags":["Webhooks"],"summary":"Test webhook","description":"Send a test event to your webhook endpoint","security":[{"ApiKeyAuth":[]}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TestWebhook"}}}},"responses":{"200":{"description":"Test result","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TestWebhookResponse"}}}}}}},"/api/v1/events":{"post":{"tags":["Events"],"summary":"Publish event","description":"Publish a custom event to the Swell message bus","security":[{"ApiKeyAuth":[]}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublishEvent"}}}},"responses":{"202":{"description":"Event accepted","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublishEventResponse"}}}}}}},"/api/v1/serviceability":{"get":{"tags":["Serviceability"],"summary":"Check address serviceability","description":"Check if an address can be serviced and what plans are available","security":[{"ApiKeyAuth":[]}],"parameters":[{"schema":{"type":"string","description":"Full address to check (e.g., \"123 Main St, Escondido, CA 92025\")","example":"123 Main St, Escondido, CA 92025"},"required":false,"name":"address","in":"query"},{"schema":{"type":"string","example":"123 Main St"},"required":false,"name":"street","in":"query"},{"schema":{"type":"string","example":"Escondido"},"required":false,"name":"city","in":"query"},{"schema":{"type":"string","example":"CA"},"required":false,"name":"state","in":"query"},{"schema":{"type":"string","example":"92025"},"required":false,"name":"zip","in":"query"},{"schema":{"type":["number","null"],"example":33.1192},"required":false,"name":"lat","in":"query"},{"schema":{"type":["number","null"],"example":-117.0864},"required":false,"name":"lng","in":"query"}],"responses":{"200":{"description":"Serviceability check result","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServiceabilityResponse"}}}},"400":{"description":"Invalid address parameters","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/api/v1/network/status":{"get":{"tags":["Network"],"summary":"Get network status","description":"Get overall network health status and metrics","security":[{"ApiKeyAuth":[]}],"responses":{"200":{"description":"Network status","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NetworkStatusResponse"}}}}}}},"/api/v1/network/outages":{"get":{"tags":["Network"],"summary":"List outages","description":"Get a list of active and recent network outages","security":[{"ApiKeyAuth":[]}],"parameters":[{"schema":{"type":"string","enum":["INVESTIGATING","IDENTIFIED","MONITORING","RESOLVED"]},"required":false,"name":"status","in":"query"},{"schema":{"type":"string","enum":["PLANNED","UNPLANNED"]},"required":false,"name":"type","in":"query"},{"schema":{"type":["number","null"]},"required":false,"name":"limit","in":"query"}],"responses":{"200":{"description":"List of outages","content":{"application/json":{"schema":{"$ref":"#/components/schemas/OutageListResponse"}}}}}}},"/api/v1/network/outages/{id}":{"get":{"tags":["Network"],"summary":"Get outage details","description":"Get detailed information about a specific network outage","security":[{"ApiKeyAuth":[]}],"parameters":[{"schema":{"type":"string","description":"Outage ID"},"required":true,"name":"id","in":"path"}],"responses":{"200":{"description":"Outage details","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[true]},"data":{"type":"object","properties":{"id":{"type":"string"},"type":{"type":"string","enum":["PLANNED","UNPLANNED","EMERGENCY"]},"severity":{"type":"string","enum":["LOW","MEDIUM","HIGH","CRITICAL"]},"status":{"type":"string","enum":["SCHEDULED","IN_PROGRESS","RESOLVED","CANCELLED"]},"title":{"type":"string"},"description":{"type":"string"},"affectedAreas":{"type":"array","items":{"type":"string"}},"affectedServices":{"type":"array","items":{"type":"string"}},"affectedCustomerCount":{"type":"number"},"startedAt":{"type":"string"},"estimatedEndAt":{"type":["string","null"]},"resolvedAt":{"type":["string","null"]},"updates":{"type":"array","items":{"type":"object","properties":{"timestamp":{"type":"string"},"message":{"type":"string"},"author":{"type":"string"}},"required":["timestamp","message","author"]}},"createdAt":{"type":"string"},"updatedAt":{"type":"string"}},"required":["id","type","severity","status","title","description","affectedAreas","affectedServices","affectedCustomerCount","startedAt","estimatedEndAt","resolvedAt","updates","createdAt","updatedAt"]}},"required":["success","data"]}}}},"404":{"description":"Outage not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/api/v1/network/maintenance":{"get":{"tags":["Network"],"summary":"List scheduled maintenance","description":"Get a list of scheduled maintenance windows","security":[{"ApiKeyAuth":[]}],"parameters":[{"schema":{"type":"string","enum":["SCHEDULED","IN_PROGRESS","COMPLETED","CANCELLED"]},"required":false,"name":"status","in":"query"},{"schema":{"type":"integer","minimum":1,"maximum":90,"description":"Number of days to look ahead (default: 30)"},"required":false,"name":"days","in":"query"},{"schema":{"type":["boolean","null"],"description":"Include completed maintenance windows"},"required":false,"name":"includeCompleted","in":"query"}],"responses":{"200":{"description":"List of maintenance windows","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[true]},"data":{"type":"object","properties":{"maintenance":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"type":{"type":"string","enum":["FIRMWARE_UPGRADE","HARDWARE_REPLACEMENT","NETWORK_EXPANSION","ROUTINE_MAINTENANCE"]},"title":{"type":"string"},"description":{"type":"string"},"affectedAreas":{"type":"array","items":{"type":"string"}},"affectedServices":{"type":"array","items":{"type":"string"}},"estimatedImpact":{"type":"string","enum":["NONE","MINIMAL","MODERATE","SIGNIFICANT"]},"scheduledStart":{"type":"string"},"scheduledEnd":{"type":"string"},"status":{"type":"string","enum":["SCHEDULED","IN_PROGRESS","COMPLETED","CANCELLED"]},"notificationSent":{"type":"boolean"},"createdAt":{"type":"string"},"updatedAt":{"type":"string"}},"required":["id","type","title","description","affectedAreas","affectedServices","estimatedImpact","scheduledStart","scheduledEnd","status","notificationSent","createdAt","updatedAt"]}},"summary":{"type":"object","properties":{"total":{"type":"number"},"scheduled":{"type":"number"},"inProgress":{"type":"number"},"completed":{"type":"number"}},"required":["total","scheduled","inProgress","completed"]},"timeRange":{"type":"object","properties":{"start":{"type":"string"},"end":{"type":"string"},"days":{"type":"number"}},"required":["start","end","days"]}},"required":["maintenance","summary","timeRange"]}},"required":["success","data"]}}}}}}},"/api/v1/customers/{id}/usage":{"get":{"tags":["Billing"],"summary":"Get customer usage","description":"Get current billing period usage data for a customer","security":[{"ApiKeyAuth":[]}],"parameters":[{"schema":{"type":"string","description":"Customer ID"},"required":true,"name":"id","in":"path"}],"responses":{"200":{"description":"Customer usage data","content":{"application/json":{"schema":{"$ref":"#/components/schemas/UsageResponse"}}}},"404":{"description":"Customer not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/api/v1/customers/{id}/usage/history":{"get":{"tags":["Billing"],"summary":"Get customer usage history","description":"Get historical usage data for a customer over multiple billing periods","security":[{"ApiKeyAuth":[]}],"parameters":[{"schema":{"type":"string","description":"Customer ID"},"required":true,"name":"id","in":"path"},{"schema":{"type":"integer","minimum":1,"maximum":24,"description":"Number of months of history (default: 6)"},"required":false,"name":"months","in":"query"},{"schema":{"type":"string","description":"End date for history range (default: today)"},"required":false,"name":"endDate","in":"query"}],"responses":{"200":{"description":"Customer usage history","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[true]},"data":{"type":"object","properties":{"customerId":{"type":"string"},"periodMonths":{"type":"number"},"endDate":{"type":"string"},"history":{"type":"array","items":{"type":"object","properties":{"period":{"type":"string"},"downloadGB":{"type":"number"},"uploadGB":{"type":"number"},"peakDownloadMbps":{"type":"number"},"peakUploadMbps":{"type":"number"},"averageDownloadMbps":{"type":"number"},"averageUploadMbps":{"type":"number"},"uptime":{"type":"number"},"outageMinutes":{"type":"number"}},"required":["period","downloadGB","uploadGB","peakDownloadMbps","peakUploadMbps","averageDownloadMbps","averageUploadMbps","uptime","outageMinutes"]}},"summary":{"type":"object","properties":{"totalDownloadGB":{"type":"number"},"totalUploadGB":{"type":"number"},"averageUptime":{"type":"number"},"totalOutageMinutes":{"type":"number"}},"required":["totalDownloadGB","totalUploadGB","averageUptime","totalOutageMinutes"]}},"required":["customerId","periodMonths","endDate","history","summary"]}},"required":["success","data"]}}}},"404":{"description":"Customer not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/api/v1/customers/{id}/invoices":{"get":{"tags":["Billing"],"summary":"List customer invoices","description":"Get a list of invoices for a customer","security":[{"ApiKeyAuth":[]}],"parameters":[{"schema":{"type":"string","description":"Customer ID"},"required":true,"name":"id","in":"path"},{"schema":{"type":"integer","minimum":1,"default":1,"description":"Page number (1-indexed)","example":1},"required":false,"name":"page","in":"query"},{"schema":{"type":"integer","minimum":1,"maximum":100,"default":20,"description":"Number of items per page (max 100)","example":20},"required":false,"name":"limit","in":"query"}],"responses":{"200":{"description":"List of invoices","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InvoiceListResponse"}}}},"404":{"description":"Customer not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/api/v1/invoices/{id}":{"get":{"tags":["Billing"],"summary":"Get invoice details","description":"Get detailed information about a specific invoice","security":[{"ApiKeyAuth":[]}],"parameters":[{"schema":{"type":"string","description":"Invoice ID"},"required":true,"name":"id","in":"path"}],"responses":{"200":{"description":"Invoice details","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[true]},"data":{"type":"object","properties":{"id":{"type":"string"},"customerId":{"type":"string"},"number":{"type":"string"},"status":{"type":"string","enum":["DRAFT","PENDING","PAID","OVERDUE","CANCELLED"]},"periodStart":{"type":"string"},"periodEnd":{"type":"string"},"dueDate":{"type":"string"},"paidDate":{"type":["string","null"]},"lineItems":{"type":"array","items":{"type":"object","properties":{"description":{"type":"string"},"quantity":{"type":"number"},"unitPrice":{"type":"number"},"amount":{"type":"number"}},"required":["description","quantity","unitPrice","amount"]}},"subtotal":{"type":"number"},"tax":{"type":"number"},"total":{"type":"number"},"currency":{"type":"string"},"paymentMethod":{"type":["string","null"]},"createdAt":{"type":"string"},"updatedAt":{"type":"string"}},"required":["id","customerId","number","status","periodStart","periodEnd","dueDate","paidDate","lineItems","subtotal","tax","total","currency","paymentMethod","createdAt","updatedAt"]}},"required":["success","data"]}}}},"404":{"description":"Invoice not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/api/v1/customers/{id}/balance":{"get":{"tags":["Billing"],"summary":"Get customer balance","description":"Get account balance and payment information for a customer","security":[{"ApiKeyAuth":[]}],"parameters":[{"schema":{"type":"string","description":"Customer ID"},"required":true,"name":"id","in":"path"}],"responses":{"200":{"description":"Customer balance","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BalanceResponse"}}}},"404":{"description":"Customer not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/api/v1/customers/{id}/ips":{"get":{"tags":["IP Management"],"summary":"Get customer IP allocations","description":"Get all IP addresses allocated to a customer","security":[{"ApiKeyAuth":[]}],"parameters":[{"schema":{"type":"string","description":"Customer ID"},"required":true,"name":"id","in":"path"}],"responses":{"200":{"description":"Customer IP allocations","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CustomerIPsResponse"}}}},"404":{"description":"Customer not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/api/v1/ip-pools":{"get":{"tags":["IP Management"],"summary":"List IP pools","description":"Get all available IP address pools","security":[{"ApiKeyAuth":[]}],"responses":{"200":{"description":"List of IP pools","content":{"application/json":{"schema":{"$ref":"#/components/schemas/IPPoolListResponse"}}}}}}},"/api/v1/ip-pools/{id}/utilization":{"get":{"tags":["IP Management"],"summary":"Get IP pool utilization","description":"Get utilization statistics and history for an IP pool","security":[{"ApiKeyAuth":[]}],"parameters":[{"schema":{"type":"string","description":"IP Pool ID"},"required":true,"name":"id","in":"path"}],"responses":{"200":{"description":"Pool utilization data","content":{"application/json":{"schema":{"$ref":"#/components/schemas/IPPoolUtilizationResponse"}}}},"404":{"description":"Pool not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/api/v1/provisioning/{id}":{"get":{"tags":["Provisioning"],"summary":"Get provisioning request","description":"Get details of a specific provisioning request","security":[{"ApiKeyAuth":[]}],"parameters":[{"schema":{"type":"string","description":"Provisioning request ID"},"required":true,"name":"id","in":"path"}],"responses":{"200":{"description":"Provisioning request details","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProvisioningResponse"}}}},"404":{"description":"Request not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/api/v1/tickets/{id}":{"get":{"tags":["Tickets"],"summary":"Get ticket","description":"Get details of a specific support ticket","security":[{"ApiKeyAuth":[]}],"parameters":[{"schema":{"type":"string","description":"Ticket ID"},"required":true,"name":"id","in":"path"}],"responses":{"200":{"description":"Ticket details","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TicketResponse"}}}},"404":{"description":"Ticket not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}},"patch":{"tags":["Tickets"],"summary":"Update ticket","description":"Update ticket status, priority, assignee, or tags","security":[{"ApiKeyAuth":[]}],"parameters":[{"schema":{"type":"string","description":"Ticket ID"},"required":true,"name":"id","in":"path"}],"requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"status":{"type":"string","enum":["OPEN","IN_PROGRESS","WAITING","RESOLVED","CLOSED"]},"priority":{"type":"string","enum":["LOW","MEDIUM","HIGH","CRITICAL"]},"assignee":{"type":"string","maxLength":100},"tags":{"type":"array","items":{"type":"string","maxLength":50},"maxItems":10}}}}}},"responses":{"200":{"description":"Ticket updated","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TicketResponse"}}}},"400":{"description":"Validation error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Ticket not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/api/v1/tickets/{id}/comments":{"get":{"tags":["Tickets"],"summary":"List ticket comments","description":"Get all comments on a support ticket","security":[{"ApiKeyAuth":[]}],"parameters":[{"schema":{"type":"string","description":"Ticket ID"},"required":true,"name":"id","in":"path"},{"schema":{"type":["boolean","null"],"description":"Include internal notes (requires appropriate permissions)"},"required":false,"name":"includeInternal","in":"query"}],"responses":{"200":{"description":"List of comments","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TicketCommentListResponse"}}}},"404":{"description":"Ticket not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}},"post":{"tags":["Tickets"],"summary":"Add ticket comment","description":"Add a comment to a support ticket","security":[{"ApiKeyAuth":[]}],"parameters":[{"schema":{"type":"string","description":"Ticket ID"},"required":true,"name":"id","in":"path"}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateTicketComment"}}}},"responses":{"201":{"description":"Comment created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TicketCommentResponse"}}}},"404":{"description":"Ticket not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/api/v1/tickets/{id}/attachments":{"get":{"tags":["Tickets"],"summary":"List ticket attachments","description":"Get all attachments on a support ticket","security":[{"ApiKeyAuth":[]}],"parameters":[{"schema":{"type":"string","description":"Ticket ID"},"required":true,"name":"id","in":"path"}],"responses":{"200":{"description":"List of attachments","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TicketAttachmentListResponse"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}},"post":{"tags":["Tickets"],"summary":"Add ticket attachment","description":"Add an attachment to a support ticket. The file must be pre-uploaded to storage, and this endpoint registers the metadata.","security":[{"ApiKeyAuth":[]}],"parameters":[{"schema":{"type":"string","description":"Ticket ID"},"required":true,"name":"id","in":"path"}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateTicketAttachment"}}}},"responses":{"200":{"description":"Attachment added","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TicketAttachmentResponse"}}}},"404":{"description":"Ticket not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/api/v1/subscriptions/{id}":{"get":{"tags":["Subscriptions"],"summary":"Get subscription","description":"Get details of a specific subscription","security":[{"ApiKeyAuth":[]}],"parameters":[{"schema":{"type":"string","description":"Subscription ID"},"required":true,"name":"id","in":"path"}],"responses":{"200":{"description":"Subscription details","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SubscriptionResponse"}}}},"404":{"description":"Subscription not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/api/v1/subscriptions/{id}/upgrade":{"post":{"tags":["Subscriptions"],"summary":"Upgrade subscription","description":"Upgrade a subscription to a higher service tier","security":[{"ApiKeyAuth":[]}],"parameters":[{"schema":{"type":"string","description":"Subscription ID"},"required":true,"name":"id","in":"path"}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SubscriptionUpgrade"}}}},"responses":{"200":{"description":"Subscription upgraded","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SubscriptionChangeResponse"}}}},"400":{"description":"Invalid upgrade request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/api/v1/subscriptions/{id}/downgrade":{"post":{"tags":["Subscriptions"],"summary":"Downgrade subscription","description":"Downgrade a subscription to a lower service tier","security":[{"ApiKeyAuth":[]}],"parameters":[{"schema":{"type":"string","description":"Subscription ID"},"required":true,"name":"id","in":"path"}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SubscriptionUpgrade"}}}},"responses":{"200":{"description":"Subscription downgraded","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SubscriptionChangeResponse"}}}},"400":{"description":"Invalid downgrade request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/api/v1/subscriptions/{id}/suspend":{"post":{"tags":["Subscriptions"],"summary":"Suspend subscription","description":"Temporarily suspend a subscription","security":[{"ApiKeyAuth":[]}],"parameters":[{"schema":{"type":"string","description":"Subscription ID"},"required":true,"name":"id","in":"path"}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SubscriptionAction"}}}},"responses":{"200":{"description":"Subscription suspended","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SubscriptionChangeResponse"}}}},"400":{"description":"Cannot suspend subscription","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/api/v1/subscriptions/{id}/resume":{"post":{"tags":["Subscriptions"],"summary":"Resume subscription","description":"Resume a suspended subscription","security":[{"ApiKeyAuth":[]}],"parameters":[{"schema":{"type":"string","description":"Subscription ID"},"required":true,"name":"id","in":"path"}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SubscriptionAction"}}}},"responses":{"200":{"description":"Subscription resumed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SubscriptionChangeResponse"}}}},"400":{"description":"Cannot resume subscription","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/api/v1/bulk/customers":{"post":{"tags":["Bulk Operations"],"summary":"Bulk create customers","description":"Create multiple customers in a single request (max 100)","security":[{"ApiKeyAuth":[]}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BulkCustomerCreate"}}}},"responses":{"202":{"description":"Bulk job created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BulkJobResponse"}}}},"400":{"description":"Validation error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/api/v1/bulk/jobs/{id}":{"get":{"tags":["Bulk Operations"],"summary":"Get bulk job status","description":"Get the status and results of a bulk operation","security":[{"ApiKeyAuth":[]}],"parameters":[{"schema":{"type":"string","description":"Bulk job ID"},"required":true,"name":"id","in":"path"}],"responses":{"200":{"description":"Bulk job status","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BulkJobResponse"}}}},"404":{"description":"Job not found or expired","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/api/v1/webhooks/{id}/deliveries":{"get":{"tags":["Webhooks"],"summary":"List webhook delivery attempts","description":"List all delivery attempts for a specific webhook, with optional status filtering and pagination. Only returns deliveries for webhooks owned by the authenticated partner.","security":[{"ApiKeyAuth":[]}],"parameters":[{"schema":{"type":"string","description":"Webhook ID"},"required":true,"name":"id","in":"path"},{"schema":{"type":"string","enum":["pending","success","failed","retrying"],"description":"Filter by delivery status"},"required":false,"name":"status","in":"query"},{"schema":{"type":"string","description":"Page number (1-based)","example":"1"},"required":false,"name":"page","in":"query"},{"schema":{"type":"string","description":"Results per page (max 100, default 20)","example":"20"},"required":false,"name":"limit","in":"query"}],"responses":{"200":{"description":"List of delivery attempts","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[true]},"data":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"webhookId":{"type":"string"},"eventId":{"type":"string"},"eventType":{"type":"string"},"url":{"type":"string"},"requestPayload":{"type":"object","additionalProperties":{}},"responseStatus":{"type":["number","null"]},"responseBody":{"type":["string","null"]},"deliveryTime":{"type":"number","description":"Delivery time in milliseconds"},"attempt":{"type":"number"},"status":{"type":"string"},"error":{"type":["string","null"]},"createdAt":{"type":"string"}},"required":["id","webhookId","eventId","eventType","url","requestPayload","responseStatus","responseBody","deliveryTime","attempt","status","error","createdAt"]}},"pagination":{"type":"object","properties":{"page":{"type":"number"},"limit":{"type":"number"},"total":{"type":"number"},"totalPages":{"type":"number"},"hasNext":{"type":"boolean"},"hasPrev":{"type":"boolean"}},"required":["page","limit","total","totalPages","hasNext","hasPrev"]}},"required":["success","data","pagination"]}}}},"404":{"description":"Webhook not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/api/v1/webhooks/{id}/deliveries/{deliveryId}/retry":{"post":{"tags":["Webhooks"],"summary":"Retry a webhook delivery","description":"Replay a previous delivery attempt. Creates a new delivery log entry with an incremented attempt number. Only allowed for webhooks owned by the authenticated partner.","security":[{"ApiKeyAuth":[]}],"parameters":[{"schema":{"type":"string","description":"Webhook ID"},"required":true,"name":"id","in":"path"},{"schema":{"type":"string","description":"Delivery log ID to retry"},"required":true,"name":"deliveryId","in":"path"}],"responses":{"202":{"description":"Delivery retry accepted","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[true]},"data":{"type":"object","properties":{"deliveryId":{"type":"string","description":"ID of the new delivery log entry"}},"required":["deliveryId"]},"message":{"type":"string"}},"required":["success","data","message"]}}}},"404":{"description":"Webhook or delivery not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/api/v1/webhooks/{id}":{"delete":{"tags":["Webhooks"],"summary":"Delete webhook","description":"Remove a registered webhook endpoint","security":[{"ApiKeyAuth":[]}],"parameters":[{"schema":{"type":"string","description":"Webhook ID"},"required":true,"name":"id","in":"path"}],"responses":{"200":{"description":"Webhook deleted","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[true]},"data":{"type":"object","properties":{"message":{"type":"string"}},"required":["message"]}},"required":["success","data"]}}}},"404":{"description":"Webhook not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}}},"webhooks":{}}