{"openapi":"3.0.3","info":{"title":"444host.com API","version":"1.4.0","description":"REST API for 444host.com — read your VPS fleet (incl. live stats and reverse DNS), web hosting, domains, billing and support tickets. Every endpoint is scope-gated via API-key permissions (`account:read`, `vps:read`, `vps:write`, `vps:destroy`, `hosting:read`, `hosting:write`, `hosting:destroy`, `domains:read`, `domains:write`, `billing:read`, `tickets:read`, `tickets:write`, `webhooks:read`, `webhooks:write`, `orders:write`).","contact":{"name":"444host Support","url":"https://444host.com/account/tickets"},"license":{"name":"Proprietary"}},"servers":[{"url":"https://api.444host.com/v1","description":"Production"}],"security":[{"bearerAuth":[]}],"tags":[{"name":"Account"},{"name":"Catalogue & ordering"},{"name":"VPS"},{"name":"Hosting"},{"name":"Domains"},{"name":"Billing"},{"name":"Support tickets"},{"name":"Webhooks"}],"components":{"securitySchemes":{"bearerAuth":{"type":"http","scheme":"bearer","bearerFormat":"API Key (h444_...)","description":"Mint an API key from your dashboard at https://444host.com/account/api-keys"}},"schemas":{"Error":{"type":"object","properties":{"statusCode":{"type":"integer"},"message":{"type":"string"},"error":{"type":"string"}}}},"responses":{"Unauthorized":{"description":"Missing or invalid API key","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"Forbidden":{"description":"API key lacks the required scope","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"NotFound":{"description":"Resource not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}},"paths":{"/account":{"get":{"operationId":"getAccount","summary":"Get account","description":"Returns the authenticated account profile and wallet balance.","tags":["Account"],"security":[{"bearerAuth":["account:read"]}],"responses":{"200":{"description":"Success","content":{"application/json":{"example":{"id":"9032ffac-…","email":"you@example.com","first_name":"Jane","last_name":"Doe","account_type":"individual","language":"en","email_verified":true,"balance_usd_cents":1250,"created_at":"2026-01-01T00:00:00.000Z"}}}},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"}}}},"/products":{"get":{"operationId":"getProducts","summary":"List plans & your prices","description":"Orderable VPS and hosting plans with retail price and YOUR effective price (reseller discount applied when your account has one).","tags":["Catalogue & ordering"],"security":[{"bearerAuth":["account:read"]}],"responses":{"200":{"description":"Success","content":{"application/json":{"example":[{"slug":"vps-2","category":"vps","name_en":"VPS 2","retail_monthly_usd_cents":1200,"your_monthly_usd_cents":960,"specs":{"vcpu":2,"ram_mb":4096,"disk_gb":60}}]}}},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"}}}},"/os-templates":{"get":{"operationId":"getOsTemplates","summary":"List OS templates","description":"Installable OS templates for VPS orders and reinstalls (Linux only).","tags":["Catalogue & ordering"],"security":[{"bearerAuth":["vps:read"]}],"responses":{"200":{"description":"Success","content":{"application/json":{}}},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"}}}},"/vps":{"post":{"operationId":"postVps","summary":"Order a VPS","description":"Atomic: debits your wallet at your effective price, issues a paid receipt, and provisions. Provisioning failure auto-refunds. Send an Idempotency-Key so a retried request can't order twice. Returns the server AND its initial root password (shown once).","tags":["Catalogue & ordering"],"security":[{"bearerAuth":["orders:write"]}],"responses":{"200":{"description":"Success","content":{"application/json":{}}},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"}},"requestBody":{"required":true,"content":{"application/json":{"example":{"plan_slug":"vps-2","label":"web-1","hostname":"web-1","os_family":"ubuntu","os_template":"ubuntu-22.04"}}}}},"get":{"operationId":"getVps","summary":"List servers","description":"Every VPS on the account, with live status and plan specs.","tags":["VPS"],"security":[{"bearerAuth":["vps:read"]}],"responses":{"200":{"description":"Success","content":{"application/json":{}}},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"}}}},"/hosting":{"post":{"operationId":"postHosting","summary":"Order web hosting","description":"Same atomic debit/refund contract. Returns the account AND its SFTP/DB passwords (shown once). `php_version` defaults to 8.3.","tags":["Catalogue & ordering"],"security":[{"bearerAuth":["orders:write"]}],"responses":{"200":{"description":"Success","content":{"application/json":{}}},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"}},"requestBody":{"required":true,"content":{"application/json":{"example":{"plan_slug":"hosting-starter","domain":"example.com","username":"examplecom"}}}}},"get":{"operationId":"getHosting","summary":"List hosting","description":"Web-hosting accounts with status, quota, usage and connection hosts. Passwords are never returned on the API.","tags":["Hosting"],"security":[{"bearerAuth":["hosting:read"]}],"responses":{"200":{"description":"Success","content":{"application/json":{}}},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"}}}},"/vps/{id}":{"get":{"operationId":"getVpsId","summary":"Get server","description":"Server detail (no credentials, no internal provisioning data).","tags":["VPS"],"security":[{"bearerAuth":["vps:read"]}],"responses":{"200":{"description":"Success","content":{"application/json":{}}},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"}},"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}]},"delete":{"operationId":"deleteVpsId","summary":"Terminate server","description":"DESTRUCTIVE — permanently terminate the server.","tags":["VPS"],"security":[{"bearerAuth":["vps:destroy"]}],"responses":{"200":{"description":"Success","content":{"application/json":{}}},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"}},"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}]}},"/vps/{id}/stats":{"get":{"operationId":"getVpsIdStats","summary":"Live stats","description":"Live CPU / memory / network / disk usage.","tags":["VPS"],"security":[{"bearerAuth":["vps:read"]}],"responses":{"200":{"description":"Success","content":{"application/json":{}}},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"}},"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}]}},"/vps/{id}/ips":{"get":{"operationId":"getVpsIdIps","summary":"List IPs & reverse DNS","description":"Every IP on the server with its current PTR record. `zoneHosted: false` means the reverse zone is not on our DNS.","tags":["VPS"],"security":[{"bearerAuth":["vps:read"]}],"responses":{"200":{"description":"Success","content":{"application/json":{"example":[{"ip":"46.31.78.56","primary":true,"gateway":"46.31.78.1","netmask":"255.255.255.0","ptr":"mail.example.com","zoneHosted":true}]}}},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"}},"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}]}},"/vps/all-ips":{"get":{"operationId":"getVpsAllIps","summary":"All IPs (aggregate)","description":"Every IP across all your servers, grouped per server, with PTR records — the API form of the dashboard Reverse DNS page.","tags":["VPS"],"security":[{"bearerAuth":["vps:read"]}],"responses":{"200":{"description":"Success","content":{"application/json":{}}},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"}}}},"/vps/{id}/power/{action}":{"post":{"operationId":"postVpsIdPowerAction","summary":"Power action","description":"Power the server start, stop, or reboot. `:action` ∈ {start,stop,reboot}.","tags":["VPS"],"security":[{"bearerAuth":["vps:write"]}],"responses":{"200":{"description":"Success","content":{"application/json":{}}},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"}},"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}},{"name":"action","in":"path","required":true,"schema":{"type":"string"}}]}},"/vps/{id}/label":{"patch":{"operationId":"patchVpsIdLabel","summary":"Rename server","description":"Change the display label.","tags":["VPS"],"security":[{"bearerAuth":["vps:write"]}],"responses":{"200":{"description":"Success","content":{"application/json":{}}},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"}},"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"example":{"label":"web-prod-1"}}}}}},"/vps/{id}/ips/{ip}/ptr":{"put":{"operationId":"putVpsIdIpsIpPtr","summary":"Set reverse DNS (PTR)","description":"Point the IP's PTR record at a hostname (e.g. `mail.example.com`). Idempotent upsert.","tags":["VPS"],"security":[{"bearerAuth":["vps:write"]}],"responses":{"200":{"description":"Success","content":{"application/json":{}}},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"}},"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}},{"name":"ip","in":"path","required":true,"schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"example":{"hostname":"mail.example.com"}}}}},"delete":{"operationId":"deleteVpsIdIpsIpPtr","summary":"Clear reverse DNS (PTR)","description":"Remove the PTR record for the IP.","tags":["VPS"],"security":[{"bearerAuth":["vps:write"]}],"responses":{"200":{"description":"Success","content":{"application/json":{}}},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"}},"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}},{"name":"ip","in":"path","required":true,"schema":{"type":"string"}}]}},"/vps/{id}/reinstall":{"post":{"operationId":"postVpsIdReinstall","summary":"Reinstall OS","description":"DESTRUCTIVE — wipe the disk and rebuild from an OS template. Honours an optional Idempotency-Key header.","tags":["VPS"],"security":[{"bearerAuth":["vps:destroy"]}],"responses":{"200":{"description":"Success","content":{"application/json":{}}},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"}},"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"example":{"os":"ubuntu","osTemplate":"ubuntu-22.04"}}}}}},"/hosting/{id}":{"get":{"operationId":"getHostingId","summary":"Get hosting","description":"Hosting account detail.","tags":["Hosting"],"security":[{"bearerAuth":["hosting:read"]}],"responses":{"200":{"description":"Success","content":{"application/json":{}}},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"}},"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}]},"delete":{"operationId":"deleteHostingId","summary":"Terminate hosting","description":"DESTRUCTIVE — permanently removes the site, databases, and mail; the username becomes reusable.","tags":["Hosting"],"security":[{"bearerAuth":["hosting:destroy"]}],"responses":{"200":{"description":"Success","content":{"application/json":{}}},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"}},"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}]}},"/hosting/{id}/suspend":{"post":{"operationId":"postHostingIdSuspend","summary":"Suspend hosting","description":"Suspend the account (site + databases stop serving). Reversible with unsuspend.","tags":["Hosting"],"security":[{"bearerAuth":["hosting:write"]}],"responses":{"200":{"description":"Success","content":{"application/json":{}}},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"}},"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}]}},"/hosting/{id}/unsuspend":{"post":{"operationId":"postHostingIdUnsuspend","summary":"Unsuspend hosting","description":"Lift a suspension and restore service.","tags":["Hosting"],"security":[{"bearerAuth":["hosting:write"]}],"responses":{"200":{"description":"Success","content":{"application/json":{}}},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"}},"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}]}},"/hosting/{id}/php":{"put":{"operationId":"putHostingIdPhp","summary":"Set PHP version","description":"Switch the account's PHP-FPM version. `php_version` ∈ {7.4, 8.1, 8.3}.","tags":["Hosting"],"security":[{"bearerAuth":["hosting:write"]}],"responses":{"200":{"description":"Success","content":{"application/json":{}}},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"}},"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"example":{"php_version":"8.3"}}}}}},"/hosting/{id}/ssl/retry":{"post":{"operationId":"postHostingIdSslRetry","summary":"Re-issue SSL","description":"Retry the Let's Encrypt certificate issue for the account's domain now.","tags":["Hosting"],"security":[{"bearerAuth":["hosting:write"]}],"responses":{"200":{"description":"Success","content":{"application/json":{}}},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"}},"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}]}},"/domains":{"get":{"operationId":"getDomains","summary":"List domains","description":"Registered domains with status, nameservers and expiry.","tags":["Domains"],"security":[{"bearerAuth":["domains:read"]}],"responses":{"200":{"description":"Success","content":{"application/json":{}}},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"}}}},"/domains/{id}":{"get":{"operationId":"getDomainsId","summary":"Get domain","description":"Domain detail.","tags":["Domains"],"security":[{"bearerAuth":["domains:read"]}],"responses":{"200":{"description":"Success","content":{"application/json":{}}},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"}},"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}]},"patch":{"operationId":"patchDomainsId","summary":"Update domain","description":"Update auto-renew, transfer lock, WHOIS privacy, or nameservers. Changes are pushed to the registry and rolled back if the push fails.","tags":["Domains"],"security":[{"bearerAuth":["domains:write"]}],"responses":{"200":{"description":"Success","content":{"application/json":{}}},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"}},"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"example":{"auto_renew":true,"nameservers":["ns1.example.com","ns2.example.com"]}}}}}},"/billing/invoices":{"get":{"operationId":"getBillingInvoices","summary":"List invoices","description":"Your invoices, newest first.","tags":["Billing"],"security":[{"bearerAuth":["billing:read"]}],"responses":{"200":{"description":"Success","content":{"application/json":{}}},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"}}}},"/billing/invoices/{id}":{"get":{"operationId":"getBillingInvoicesId","summary":"Get invoice","description":"Single invoice with line items and payment transactions.","tags":["Billing"],"security":[{"bearerAuth":["billing:read"]}],"responses":{"200":{"description":"Success","content":{"application/json":{}}},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"}},"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}]}},"/billing/wallet":{"get":{"operationId":"getBillingWallet","summary":"Get wallet","description":"Prepaid wallet balance (USD cents).","tags":["Billing"],"security":[{"bearerAuth":["billing:read"]}],"responses":{"200":{"description":"Success","content":{"application/json":{}}},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"}}}},"/billing/wallet/transactions":{"get":{"operationId":"getBillingWalletTransactions","summary":"Wallet transactions","description":"Recent wallet activity. Query: limit (max 200).","tags":["Billing"],"security":[{"bearerAuth":["billing:read"]}],"responses":{"200":{"description":"Success","content":{"application/json":{}}},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"}}}},"/tickets":{"get":{"operationId":"getTickets","summary":"List tickets","description":"Your support tickets, newest first.","tags":["Support tickets"],"security":[{"bearerAuth":["tickets:read"]}],"responses":{"200":{"description":"Success","content":{"application/json":{}}},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"}}},"post":{"operationId":"postTickets","summary":"Open ticket","description":"Open a support ticket. Honours an optional Idempotency-Key header so a retried request doesn't open a duplicate.","tags":["Support tickets"],"security":[{"bearerAuth":["tickets:write"]}],"responses":{"200":{"description":"Success","content":{"application/json":{}}},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"}},"requestBody":{"required":true,"content":{"application/json":{"example":{"subject":"Mail deliverability","message":"Our PTR record is set but…","priority":"medium","department":"technical"}}}}}},"/tickets/{id}":{"get":{"operationId":"getTicketsId","summary":"Get ticket","description":"Ticket detail with the message thread.","tags":["Support tickets"],"security":[{"bearerAuth":["tickets:read"]}],"responses":{"200":{"description":"Success","content":{"application/json":{}}},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"}},"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}]}},"/tickets/{id}/reply":{"post":{"operationId":"postTicketsIdReply","summary":"Reply to ticket","description":"Post a customer reply. Re-opens a resolved/closed ticket.","tags":["Support tickets"],"security":[{"bearerAuth":["tickets:write"]}],"responses":{"200":{"description":"Success","content":{"application/json":{}}},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"}},"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"example":{"body":"Thanks — that fixed it."}}}}}},"/tickets/{id}/close":{"post":{"operationId":"postTicketsIdClose","summary":"Close ticket","description":"Close the ticket. Idempotent.","tags":["Support tickets"],"security":[{"bearerAuth":["tickets:write"]}],"responses":{"200":{"description":"Success","content":{"application/json":{}}},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"}},"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}]}},"/webhooks":{"get":{"operationId":"getWebhooks","summary":"List webhooks","description":"Your webhook subscriptions (secrets masked).","tags":["Webhooks"],"security":[{"bearerAuth":["webhooks:read"]}],"responses":{"200":{"description":"Success","content":{"application/json":{}}},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"}}},"post":{"operationId":"postWebhooks","summary":"Create webhook","description":"Subscribe an HTTPS URL to events. The signing secret is returned ONCE in this response.","tags":["Webhooks"],"security":[{"bearerAuth":["webhooks:write"]}],"responses":{"200":{"description":"Success","content":{"application/json":{}}},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"}},"requestBody":{"required":true,"content":{"application/json":{"example":{"url":"https://example.com/hooks/444host","events":["vps.power.changed","ticket.replied"]}}}}}},"/webhooks/{id}":{"get":{"operationId":"getWebhooksId","summary":"Get webhook","description":"Subscription detail (secret masked).","tags":["Webhooks"],"security":[{"bearerAuth":["webhooks:read"]}],"responses":{"200":{"description":"Success","content":{"application/json":{}}},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"}},"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}]},"patch":{"operationId":"patchWebhooksId","summary":"Update webhook","description":"Change url, events, description, or pause/resume via `is_active`.","tags":["Webhooks"],"security":[{"bearerAuth":["webhooks:write"]}],"responses":{"200":{"description":"Success","content":{"application/json":{}}},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"}},"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"example":{"is_active":false}}}}},"delete":{"operationId":"deleteWebhooksId","summary":"Delete webhook","description":"Remove the subscription and stop deliveries.","tags":["Webhooks"],"security":[{"bearerAuth":["webhooks:write"]}],"responses":{"200":{"description":"Success","content":{"application/json":{}}},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"}},"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}]}},"/webhooks/{id}/rotate-secret":{"post":{"operationId":"postWebhooksIdRotateSecret","summary":"Rotate secret","description":"Issue a new signing secret (returned ONCE). The old secret stops signing immediately.","tags":["Webhooks"],"security":[{"bearerAuth":["webhooks:write"]}],"responses":{"200":{"description":"Success","content":{"application/json":{}}},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"}},"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}]}},"/webhooks/{id}/deliveries":{"get":{"operationId":"getWebhooksIdDeliveries","summary":"Delivery log","description":"Recent delivery attempts with status, duration, and errors. Query: limit (max 200).","tags":["Webhooks"],"security":[{"bearerAuth":["webhooks:read"]}],"responses":{"200":{"description":"Success","content":{"application/json":{}}},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"}},"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}]}},"/webhooks/{id}/deliveries/{deliveryId}/redeliver":{"post":{"operationId":"postWebhooksIdDeliveriesDeliveryIdRedeliver","summary":"Redeliver","description":"Clone a past delivery into a fresh attempt.","tags":["Webhooks"],"security":[{"bearerAuth":["webhooks:write"]}],"responses":{"200":{"description":"Success","content":{"application/json":{}}},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"}},"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}},{"name":"deliveryId","in":"path","required":true,"schema":{"type":"string"}}]}}}}