{"openapi":"3.1.0","info":{"title":"Orbit API","version":"1.0.0","description":"Public API for Orbit by YunZheng LAB (AS204921): authoritative DNS, Shield CDN, security rules, hosted RPKI and compute.\n\nAuthenticate with `Authorization: Bearer orb_…` (create tokens in the console under **API tokens**; API access must be enabled on your account).\nErrors are always `{ \"error\": { \"code\", \"message\" } }`. Tokens are limited to 300 requests per minute (`X-RateLimit-*` headers).\nEvery response carries `X-Orbit-Api-Version: 1`. The legacy `/api/*` RPC endpoints remain for the console and are deprecated for integrations.","contact":{"name":"YunZheng LAB","url":"https://helpdesk.yunzheng.space"}},"servers":[{"url":"https://dash.yunzheng.space/api/v1"}],"tags":[{"name":"Account","description":"Identity, API tokens and console sessions"},{"name":"Webhooks","description":"Outbound event notifications, signed with HMAC-SHA256"},{"name":"Services","description":"Your Orbit services and plan quotas"},{"name":"DNS","description":"Authoritative DNS: zones, records, DNSSEC, transfers, analytics"},{"name":"Shield CDN","description":"Proxied hostnames: cache, WAF, waiting room, certificates"},{"name":"Security","description":"Country / ASN / IP / ISP rules per site or zone"},{"name":"RPKI","description":"Hosted RPKI CAs and ROAs (Krill-backed)"},{"name":"Compute","description":"KVM virtual machines"},{"name":"RIPE","description":"Link a RIPE Database API key, discover your resources, onboard reverse DNS and RPKI, edit domain objects"},{"name":"Migration","description":"Move zones served elsewhere onto Orbit"}],"security":[{"bearerAuth":[]}],"components":{"securitySchemes":{"bearerAuth":{"type":"http","scheme":"bearer","bearerFormat":"orb_…"}},"schemas":{"Error":{"type":"object","required":["error"],"properties":{"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["unauthorized","forbidden","not_found","validation_error","limit_exceeded","conflict","upstream_error","rate_limited","method_not_allowed"]},"message":{"type":"string"}}}}},"Me":{"type":"object","properties":{"email":{"type":"string"},"name":{"type":"string"},"role":{"type":"string","enum":["user","admin"]},"auth":{"type":"string","enum":["token","session"]},"api_enabled":{"type":"boolean"}}},"Service":{"type":"object","properties":{"id":{"type":"integer"},"name":{"type":"string"},"type":{"type":"string","enum":["resolver","auth_dns","cdn","vm"]},"plan":{"type":"string","description":"Plan key (e.g. basic, pro)"},"plan_label":{"type":"string","nullable":true,"description":"Display name of the plan (e.g. Free)"},"enabled":{"type":"boolean"},"filter_level":{"type":"string","nullable":true},"note":{"type":"string","nullable":true},"limits":{"type":"object","additionalProperties":{"type":"integer"},"description":"Plan quotas (0 = unlimited)"},"created_at":{"type":"string"}}},"Quota":{"type":"object","description":"Limits belong to the account, not to a service. An account may hold several packs and their limits add up; a limit of 0 means unmetered and absorbs every other pack.","properties":{"label":{"type":"string","description":"Display name of the merged packs, e.g. \"Pro + Zone add-on ×2\""},"limits":{"type":"object","additionalProperties":{"type":"integer"},"description":"Merged quotas (0 = unmetered)"},"usage":{"type":"object","additionalProperties":{"type":"integer"},"description":"Counted across every service the account owns"},"packs":{"type":"array","items":{"type":"object","properties":{"plan":{"type":"string"},"label":{"type":"string"},"qty":{"type":"integer"},"note":{"type":"string","nullable":true}}}}}},"Webhook":{"type":"object","properties":{"id":{"type":"integer"},"url":{"type":"string"},"events":{"type":"array","items":{"type":"string"}},"enabled":{"type":"boolean"},"note":{"type":"string","nullable":true},"last_status":{"type":"integer","nullable":true},"last_at":{"type":"string","nullable":true},"failures":{"type":"integer"},"created_at":{"type":"string"},"secret":{"type":"string","nullable":true,"description":"Returned only when the endpoint is created - store it, it is never shown again"}}},"WebhookCreate":{"type":"object","required":["url"],"properties":{"url":{"type":"string","description":"Public https:// endpoint"},"events":{"type":"array","items":{"type":"string"},"description":"Event names, or [\"*\"] for all. Defaults to all."},"note":{"type":"string"}}},"WebhookPatch":{"type":"object","properties":{"url":{"type":"string"},"events":{"type":"array","items":{"type":"string"}},"enabled":{"type":"boolean"},"note":{"type":"string"}}},"Delivery":{"type":"object","properties":{"id":{"type":"integer"},"webhook_id":{"type":"integer"},"event":{"type":"string"},"status":{"type":"string","enum":["pending","delivered","failed"]},"attempts":{"type":"integer"},"http_status":{"type":"integer","nullable":true},"response":{"type":"string","nullable":true},"next_attempt":{"type":"string","nullable":true},"created_at":{"type":"string"},"delivered_at":{"type":"string","nullable":true},"payload":{"type":"object","description":"Exactly what was POSTed"}}},"Pagination":{"type":"object","properties":{"limit":{"type":"integer"},"offset":{"type":"integer"},"count":{"type":"integer","description":"Rows in this page"},"next_offset":{"type":"integer","nullable":true,"description":"Offset of the next page, or null when this is the last one"}}},"Filter":{"type":"object","properties":{"custom_block":{"type":"string","description":"One domain per line"},"custom_allow":{"type":"string"},"rewrites":{"type":"string","description":"One `name -> target` per line"}}},"Zone":{"type":"object","properties":{"id":{"type":"integer"},"service_id":{"type":"integer"},"name":{"type":"string"},"mode":{"type":"string","enum":["zone","host"]},"delegation":{"type":"object","description":"Daily re-check of the public NS delegation for active zones","properties":{"checked_at":{"type":"string","nullable":true},"lost_at":{"type":"string","nullable":true,"description":"Set while the public DNS tree reports name servers other than ns1/ns2.yunzheng.space; the zone keeps being served"}}},"status":{"type":"string","enum":["pending","active"]},"enabled":{"type":"boolean"},"serial":{"type":"integer"},"dnssec":{"type":"boolean"},"secondary_master":{"type":"string","nullable":true,"description":"Master IP when served as a secondary zone"},"transfer":{"type":"object","properties":{"allow":{"type":"array","items":{"type":"string"}},"notify":{"type":"array","items":{"type":"string"}},"tsig_name":{"type":"string","nullable":true},"tsig_configured":{"type":"boolean"}}},"verified_at":{"type":"string","nullable":true},"created_at":{"type":"string"}}},"ZoneCreate":{"type":"object","required":["service_id","name"],"properties":{"service_id":{"type":"integer"},"name":{"type":"string","example":"example.com"},"mode":{"type":"string","enum":["zone","host"],"default":"zone","description":"host: the apex is a single hostname, delegated with NS records inside the customer's existing zone"}}},"ZonePatch":{"type":"object","properties":{"enabled":{"type":"boolean"},"secondary_master":{"type":"string","nullable":true,"description":"Set an IP to serve as secondary; null/empty to go back to primary"}}},"ZoneVerify":{"type":"object","properties":{"active":{"type":"boolean"},"seen":{"type":"array","items":{"type":"string"}},"expected":{"type":"array","items":{"type":"string"}},"ns":{"type":"array","items":{"type":"object"}},"serving_pops":{"type":"integer"}}},"Dnssec":{"type":"object","properties":{"enabled":{"type":"boolean"},"ds":{"type":"string","nullable":true},"dnskey":{"type":"string","nullable":true},"warning":{"type":"string"}}},"DnssecPut":{"type":"object","required":["enabled"],"properties":{"enabled":{"type":"boolean"}}},"Transfer":{"type":"object","required":["to"],"properties":{"to":{"type":"string","description":"\"me\" or \"team:<id>\" — you must be owner/admin on both sides"}}},"TransferPut":{"type":"object","properties":{"allow":{"type":"array","items":{"type":"string"},"maxItems":16},"notify":{"type":"array","items":{"type":"string"},"maxItems":16},"tsig":{"type":"boolean","description":"true = generate a TSIG key (once); false = remove it"}}},"Analytics":{"type":"object","properties":{"dims":{"type":"object","additionalProperties":{"type":"integer"}},"per_pop":{"type":"object","additionalProperties":{"type":"integer"}}}},"ImportBody":{"type":"object","required":["text"],"properties":{"text":{"type":"string","description":"BIND-style zone file lines"}}},"ImportResult":{"type":"object","properties":{"added":{"type":"integer"},"skipped":{"type":"array","items":{"type":"string"}}}},"Record":{"type":"object","properties":{"id":{"type":"integer"},"zone_id":{"type":"integer"},"name":{"type":"string"},"type":{"type":"string"},"ttl":{"type":"integer"},"content":{"type":"string"},"enabled":{"type":"boolean"},"proxied":{"type":"boolean"},"weight":{"type":"integer","nullable":true},"health_check":{"type":"string","nullable":true,"example":"https:443/health"},"created_at":{"type":"string"}}},"RecordCreate":{"type":"object","required":["type","content"],"properties":{"name":{"type":"string","default":"@"},"type":{"type":"string","enum":["A","AAAA","PTR","CNAME","TXT","MX","NS","SRV","CAA","ALIAS","HTTPS","SVCB"]},"ttl":{"type":"integer","minimum":60,"maximum":86400,"default":3600},"content":{"type":"string"},"weight":{"type":"integer"},"health_check":{"type":"string"}}},"RecordPatch":{"type":"object","properties":{"content":{"type":"string"},"ttl":{"type":"integer"},"weight":{"type":"integer"},"health_check":{"type":"string"},"enabled":{"type":"boolean"},"proxied":{"type":"boolean","description":"Route through Orbit Shield (A/AAAA/CNAME only)"}}},"Site":{"type":"object","properties":{"id":{"type":"integer"},"hostname":{"type":"string"},"zone_id":{"type":"integer"},"waf":{"type":"boolean"},"cache_ttl":{"type":"integer"},"force_https":{"type":"boolean"},"rate_limit":{"type":"integer"},"origin_scheme":{"type":"string","enum":["http","https","strict"]},"has_certificate":{"type":"boolean"},"cert_pem":{"type":"string","nullable":true},"waiting_room":{"type":"object","properties":{"capacity":{"type":"integer"},"session_min":{"type":"integer"}}},"under_attack":{"type":"boolean"},"bot_fight":{"type":"boolean"},"created_at":{"type":"string"},"dns_mode":{"type":"string","enum":["zone","cname"],"description":"zone: a proxied record in a hosted zone; cname: the customer's DNS CNAMEs to Orbit's target zone"},"origin":{"type":"string","nullable":true,"description":"cname mode only"},"target":{"type":"string","nullable":true,"description":"cname mode: <slug>.edge.yunzheng.space"},"verified_at":{"type":"string","nullable":true},"instructions":{"$ref":"#/components/schemas/Instructions"}}},"SiteCreate":{"type":"object","required":["hostname","origin"],"properties":{"hostname":{"type":"string","example":"www.example.com"},"origin":{"type":"string","description":"Origin IP or hostname"},"origin_scheme":{"type":"string","enum":["http","https","strict"],"default":"http"},"service_id":{"type":"integer","description":"Owning DNS service; defaults to the account's first"}}},"Instructions":{"type":"object","nullable":true,"description":"What to add at the customer's DNS provider","properties":{"mode":{"type":"string"},"add_in":{"type":"string"},"records":{"type":"array","items":{"type":"object","properties":{"name":{"type":"string"},"type":{"type":"string"},"content":{"type":"string"}}}},"note":{"type":"string"}}},"SiteVerify":{"type":"object","properties":{"verified":{"type":"boolean"},"cname":{"type":"string","nullable":true,"description":"CNAME target seen in public DNS"},"acme_cname":{"type":"string","nullable":true},"expected":{"type":"string"},"certificate_requested":{"type":"boolean"}}},"Recommendation":{"type":"object","properties":{"hostname":{"type":"string"},"likely_apex":{"type":"boolean"},"current_ns":{"type":"array","items":{"type":"string"}},"modes":{"type":"array","items":{"type":"object","properties":{"mode":{"type":"string"},"why":{"type":"string"},"caveat":{"type":"string"}}}}}},"SitePatch":{"type":"object","properties":{"waf":{"type":"boolean"},"cache_ttl":{"type":"integer"},"force_https":{"type":"boolean"},"rate_limit":{"type":"integer"},"origin_scheme":{"type":"string","enum":["http","https","strict"]},"cert_pem":{"type":"string"},"key_pem":{"type":"string"},"waiting_room":{"type":"object","properties":{"capacity":{"type":"integer"},"session_min":{"type":"integer"}}},"under_attack":{"type":"boolean"},"bot_fight":{"type":"boolean"}}},"Purge":{"type":"object","properties":{"urls":{"type":"array","items":{"type":"string"},"maxItems":30,"description":"Paths to purge; omit to purge everything"}}},"PurgeResult":{"type":"object","properties":{"purged":{"type":"integer","description":"URLs purged, or 0 for a full purge"}}},"OriginCert":{"type":"object","properties":{"cert_pem":{"type":"string"},"key_pem":{"type":"string","description":"Returned once, never stored"},"ca_pem":{"type":"string"}}},"Rule":{"type":"object","properties":{"id":{"type":"integer"},"service_id":{"type":"integer"},"site_hostname":{"type":"string","nullable":true},"zone_id":{"type":"integer","nullable":true},"seq":{"type":"integer"},"field":{"type":"string","enum":["country","asn","ip","isp"]},"op":{"type":"string","enum":["in","not_in"]},"value":{"type":"string"},"action":{"type":"string","enum":["block","allow","challenge","ratelimit"]},"note":{"type":"string","nullable":true},"enabled":{"type":"boolean"},"created_at":{"type":"string"}}},"RuleCreate":{"type":"object","required":["field","op","value","action"],"properties":{"site_id":{"type":"integer"},"zone_id":{"type":"integer","description":"Use instead of site_id for a zone-wide rule"},"field":{"type":"string","enum":["country","asn","ip","isp"]},"op":{"type":"string","enum":["in","not_in"]},"value":{"type":"string","description":"Comma-separated list"},"action":{"type":"string","enum":["block","allow","challenge","ratelimit"]},"seq":{"type":"integer","default":100},"note":{"type":"string"}}},"RulePatch":{"type":"object","required":["enabled"],"properties":{"enabled":{"type":"boolean"}}},"CA":{"type":"object","properties":{"id":{"type":"integer"},"handle":{"type":"string"},"parent_rir":{"type":"string","nullable":true},"state":{"type":"string"},"asns":{"type":"array","items":{"type":"integer"}},"resources":{"type":"object","nullable":true},"note":{"type":"string","nullable":true},"created_at":{"type":"string"},"roas":{"type":"array","nullable":true,"items":{"$ref":"#/components/schemas/Roa"},"description":"Included when listing CAs, so a client need not fetch each CA's ROAs separately"}}},"CACreate":{"type":"object","required":["handle"],"properties":{"handle":{"type":"string","pattern":"^[a-z0-9][a-z0-9_-]{2,29}$"},"parent_rir":{"type":"string"},"asns":{"type":"array","items":{"type":"integer"},"maxItems":8}}},"CAPatch":{"type":"object","properties":{"asns":{"type":"array","items":{"type":"integer"},"maxItems":8},"note":{"type":"string"}}},"ParentResponse":{"type":"object","required":["xml"],"properties":{"xml":{"type":"string","description":"RFC 8183 parent response from your RIR portal"}}},"Sync":{"type":"object","properties":{"resources":{"type":"object","nullable":true}}},"Roa":{"type":"object","properties":{"id":{"type":"integer"},"ca_id":{"type":"integer"},"asn":{"type":"integer"},"prefix":{"type":"string"},"max_length":{"type":"integer","nullable":true},"comment":{"type":"string","nullable":true},"created_at":{"type":"string"}}},"RoaCreate":{"type":"object","required":["asn","prefix"],"properties":{"asn":{"type":"integer"},"prefix":{"type":"string","example":"192.0.2.0/24"},"max_length":{"type":"integer"},"comment":{"type":"string"}}},"Suggestion":{"type":"object","properties":{"asn":{"type":"integer"},"prefix":{"type":"string"},"covered":{"type":"boolean"}}},"VM":{"type":"object","properties":{"id":{"type":"integer"},"name":{"type":"string"},"desired":{"type":"string","enum":["running","stopped"]},"state":{"type":"string","nullable":true},"state_at":{"type":"string","nullable":true},"pop_id":{"type":"integer","nullable":true},"plan_id":{"type":"integer","nullable":true},"image_id":{"type":"integer","nullable":true},"ssh_key":{"type":"string","nullable":true},"note":{"type":"string","nullable":true},"created_at":{"type":"string"}}},"Power":{"type":"object","required":["state"],"properties":{"state":{"type":"string","enum":["on","off","restart"]}}},"Reinstall":{"type":"object","properties":{"root_password":{"type":"string","description":"Shown once"}}},"Token":{"type":"object","properties":{"id":{"type":"integer"},"note":{"type":"string"},"scope":{"type":"string","enum":["read","write"]},"expires_at":{"type":"string","nullable":true},"created_at":{"type":"string"},"last_used":{"type":"string","nullable":true}}},"TokenCreate":{"type":"object","properties":{"note":{"type":"string","maxLength":100},"scope":{"type":"string","enum":["read","write"],"default":"write"},"expires_in_days":{"type":"integer","minimum":1,"maximum":365}}},"TokenCreated":{"type":"object","properties":{"id":{"type":"integer"},"token":{"type":"string","description":"Shown once — store it now"},"scope":{"type":"string"},"expires_at":{"type":"string","nullable":true},"principal":{"type":"string","description":"Who the token acts as: your email, or team:<id> for a team token"},"team_role":{"type":"string","nullable":true,"enum":["admin","operator","viewer",null]}}},"Grant":{"type":"object","properties":{"zone_id":{"type":"integer"},"email":{"type":"string"},"role":{"type":"string","enum":["viewer","operator"]},"granted_by":{"type":"string"},"created_at":{"type":"string"}}},"GrantPut":{"type":"object","required":["role"],"properties":{"role":{"type":"string","enum":["viewer","operator"]}}},"Session":{"type":"object","properties":{"id":{"type":"integer"},"created_at":{"type":"string"},"expires_at":{"type":"string"},"current":{"type":"boolean"}}},"RipeLink":{"type":"object","properties":{"linked":{"type":"boolean"},"key_id":{"type":"string","nullable":true},"mntner":{"type":"string","nullable":true},"status":{"type":"string","nullable":true},"last_sync":{"type":"string","nullable":true},"created_at":{"type":"string","nullable":true},"platform_mntner":{"type":"string","nullable":true,"description":"Add this to your inet(6)num mnt-domains for the credential-free path"}}},"RipeLinkPut":{"type":"object","required":["key_id","key_secret","mntner"],"properties":{"key_id":{"type":"string"},"key_secret":{"type":"string","description":"Stored encrypted; never returned"},"mntner":{"type":"string","description":"Maintainer the key is authorised for"}}},"RipeResource":{"type":"object","properties":{"type":{"type":"string"},"key":{"type":"string"},"name":{"type":"string","nullable":true},"attrs":{"type":"array","items":{"type":"object"}},"cidrs":{"type":"array","nullable":true,"items":{"type":"string"},"description":"The block in CIDR form (RIPE keys IPv4 blocks as ranges)"},"covers":{"type":"array","nullable":true,"items":{"type":"string"},"description":"More-specific blocks of this allocation that RIPE also returns; they are folded into this row because they resolve to the same reverse zones"},"reverse":{"type":"array","nullable":true,"items":{"type":"object","properties":{"domain":{"type":"string"},"status":{"type":"string","enum":["none","orbit","elsewhere","unsupported"]},"current_ns":{"type":"array","items":{"type":"string"}},"zone_id":{"type":"integer","nullable":true}}}}}},"RdnsPlanBody":{"type":"object","required":["prefix"],"properties":{"prefix":{"type":"string","example":"192.0.2.0/24"},"dnssec":{"type":"boolean","default":true}}},"RdnsPlan":{"type":"object","properties":{"prefix":{"type":"string"},"domains":{"type":"array","items":{"type":"object","properties":{"domain":{"type":"string"},"action":{"type":"string","enum":["create","update","noop"]},"conflict":{"type":"boolean"},"current_ns":{"type":"array","items":{"type":"string"}},"zone":{"type":"object","nullable":true},"diff":{"type":"array","items":{"type":"object"}},"missing":{"type":"array","items":{"type":"string"}}}}},"modes":{"type":"array","items":{"type":"string","enum":["create","axfr","zonefile"]}}}},"RdnsApplyBody":{"type":"object","required":["prefix","mode"],"properties":{"prefix":{"type":"string"},"mode":{"type":"string","enum":["create","axfr","zonefile"]},"master_ip":{"type":"string"},"zonefile":{"type":"string"},"dnssec":{"type":"boolean","default":true},"dry_run":{"type":"boolean","default":false,"description":"Validate with RIPE without writing"}}},"RdnsApplyResult":{"type":"object","properties":{"results":{"type":"array","items":{"type":"object","properties":{"domain":{"type":"string"},"zone_id":{"type":"integer","nullable":true},"ripe":{"type":"string"},"ok":{"type":"boolean"},"error":{"type":"string","nullable":true}}}}}},"RipeDomain":{"type":"object","properties":{"name":{"type":"string"},"nserver":{"type":"array","items":{"type":"string"}},"ds_rdata":{"type":"array","items":{"type":"string"}},"at_orbit":{"type":"boolean"},"attrs":{"type":"array","items":{"type":"object"}}}},"RipeDomainPut":{"type":"object","properties":{"nserver":{"type":"array","items":{"type":"string"}},"ds_rdata":{"type":"array","items":{"type":"string"}},"dry_run":{"type":"boolean","default":false}}},"MigrationPlan":{"type":"object","properties":{"zone":{"type":"string"},"kind":{"type":"string","enum":["forward","rdns"]},"current_ns":{"type":"array","items":{"type":"string"}},"at_orbit":{"type":"boolean"},"modes":{"type":"array","items":{"type":"string"}},"steps":{"type":"array","items":{"type":"string"}}}},"MigrationApplyBody":{"type":"object","required":["mode"],"properties":{"mode":{"type":"string","enum":["axfr","zonefile","fresh"]},"master_ip":{"type":"string"},"zonefile":{"type":"string"}}},"MigrationApplyResult":{"type":"object","properties":{"migration_id":{"type":"integer"},"state":{"type":"string"},"imported":{"type":"integer","nullable":true},"next":{"type":"string"}}},"RpkiPlan":{"type":"object","properties":{"asns":{"type":"array","items":{"type":"integer"}},"prefixes":{"type":"array","items":{"type":"string"}},"suggested_roas":{"type":"array","items":{"type":"object"}},"cas":{"type":"array","items":{"type":"object"}},"steps":{"type":"array","items":{"type":"string"}}}},"LogEntry":{"type":"object","description":"One request handled by the Orbit edge, identified by its Ray ID. Records are a sample: every security event is kept; pass-through requests are capped at about 200 per minute per site per point of presence.","properties":{"ts":{"type":"string","description":"UTC, millisecond precision"},"ray":{"type":"string"},"ip":{"type":"string","description":"Client IP"},"cc":{"type":"string","nullable":true,"description":"Client country (ISO 3166-1 alpha-2)"},"method":{"type":"string"},"path":{"type":"string","description":"Path and query string"},"status":{"type":"integer"},"action":{"type":"string","enum":["pass","netrule_block","waf","challenge","ratelimit","waiting","origin_error","redirect"]},"error_code":{"type":"integer","description":"Orbit error code (1001–1020), 0 = none"},"cache":{"type":"string","enum":["HIT","MISS","-"]},"bytes":{"type":"integer","description":"Response bytes"},"duration_ms":{"type":"integer"},"ua":{"type":"string"}}},"LogDetail":{"type":"object","description":"LogEntry plus every request header and connection detail","properties":{"ts":{"type":"string"},"ray":{"type":"string"},"ip":{"type":"string"},"cc":{"type":"string","nullable":true},"asn":{"type":"integer","nullable":true},"method":{"type":"string"},"path":{"type":"string"},"status":{"type":"integer"},"action":{"type":"string"},"error_code":{"type":"integer"},"cache":{"type":"string"},"bytes":{"type":"integer"},"duration_ms":{"type":"integer"},"ua":{"type":"string"},"referer":{"type":"string","nullable":true},"proto":{"type":"string","nullable":true,"example":"HTTP/2.0"},"tls":{"type":"string","nullable":true,"example":"TLS1.3"},"scheme":{"type":"string","nullable":true},"pop_city":{"type":"string","nullable":true,"description":"City of the point of presence that served the request"},"headers":{"type":"object","nullable":true,"additionalProperties":{"type":"string"},"description":"Request headers as received; cookie / authorization values are redacted at the edge. `_truncated: true` marks a header set cut at 4 KB."}}},"LogPage":{"type":"object","properties":{"items":{"type":"array","items":{"$ref":"#/components/schemas/LogEntry"}},"next_cursor":{"type":"string","nullable":true,"description":"Pass as `cursor` for the next (older) page; null on the last page"},"sampled":{"type":"boolean","description":"Always true: logs are a sample, counters in /analytics are exact"}}},"TopRow":{"type":"object","properties":{"key":{"type":"string"},"count":{"type":"integer"}}},"SiteAnalytics":{"type":"object","properties":{"range":{"type":"string","enum":["1h","24h","7d"]},"since":{"type":"string"},"until":{"type":"string"},"bucket_seconds":{"type":"integer"},"totals":{"type":"object","description":"Exact counters from the per-minute statistics","properties":{"requests":{"type":"integer"},"blocked":{"type":"integer"},"challenged":{"type":"integer"},"ratelimited":{"type":"integer"},"waiting":{"type":"integer"},"cache_hit":{"type":"integer"},"bytes":{"type":"integer"},"s2xx":{"type":"integer"},"s3xx":{"type":"integer"},"s4xx":{"type":"integer"},"s5xx":{"type":"integer"}}},"series":{"type":"array","description":"One point per bucket, oldest first, zero-filled","items":{"type":"object","properties":{"t":{"type":"string"},"req":{"type":"integer"},"blocked":{"type":"integer"},"challenged":{"type":"integer"},"ratelimited":{"type":"integer"},"waiting":{"type":"integer"},"cache_hit":{"type":"integer"},"bytes":{"type":"integer"},"s2xx":{"type":"integer"},"s3xx":{"type":"integer"},"s4xx":{"type":"integer"},"s5xx":{"type":"integer"}}}},"by_city":{"type":"array","description":"Exact counters per point-of-presence city","items":{"type":"object","properties":{"city":{"type":"string"},"requests":{"type":"integer"},"blocked":{"type":"integer"},"bytes":{"type":"integer"}}}},"latency_ms":{"type":"object","nullable":true,"description":"From the sampled logs","properties":{"p50":{"type":"integer"},"p95":{"type":"integer"},"samples":{"type":"integer"}}},"top":{"type":"object","description":"Top 10 from the sampled logs","properties":{"paths":{"type":"array","items":{"$ref":"#/components/schemas/TopRow"}},"countries":{"type":"array","items":{"$ref":"#/components/schemas/TopRow"}},"ips":{"type":"array","items":{"$ref":"#/components/schemas/TopRow"}},"user_agents":{"type":"array","items":{"$ref":"#/components/schemas/TopRow"}},"actions":{"type":"array","items":{"$ref":"#/components/schemas/TopRow"}}}},"sampled_sections":{"type":"array","items":{"type":"string"},"description":"Which sections derive from the sample rather than exact counters"}}}}},"paths":{"/me":{"get":{"operationId":"me.get","summary":"Who am I","tags":["Account"],"x-scope":"read","parameters":[],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Me"}}}},"400":{"description":"validation_error / limit_exceeded","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"forbidden (scope or ownership)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"not_found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"rate_limited","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/account/quota":{"get":{"operationId":"account.quota","summary":"Quota, usage and the packs it comes from","tags":["Account"],"x-scope":"read","parameters":[],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Quota"}}}},"400":{"description":"validation_error / limit_exceeded","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"forbidden (scope or ownership)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"not_found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"rate_limited","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/services":{"get":{"operationId":"services.list","summary":"List my services","tags":["Services"],"x-scope":"read","parameters":[{"name":"limit","in":"query","required":false,"schema":{"type":"integer","minimum":1,"maximum":500,"default":100},"description":"Rows per page (1-500)."},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","minimum":0,"default":0},"description":"Rows to skip."}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/Service"}},"pagination":{"$ref":"#/components/schemas/Pagination"}}}}}},"400":{"description":"validation_error / limit_exceeded","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"forbidden (scope or ownership)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"not_found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"rate_limited","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/services/{id}":{"get":{"operationId":"services.get","summary":"Get a service","tags":["Services"],"x-scope":"read","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"integer"},"description":"Service ID"}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Service"}}}},"400":{"description":"validation_error / limit_exceeded","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"forbidden (scope or ownership)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"not_found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"rate_limited","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/services/{id}/transfer":{"post":{"operationId":"services.transfer","summary":"Move a service (with its zones, sites and rules) to yourself or to a team you administer","tags":["Services"],"x-scope":"write","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"integer"},"description":"Service ID"}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Service"}}}},"400":{"description":"validation_error / limit_exceeded","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"forbidden (scope or ownership)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"not_found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"rate_limited","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Transfer"}}}}}},"/services/{id}/filter":{"get":{"operationId":"services.filter.get","summary":"Resolver filter lists and rewrites","tags":["Services"],"x-scope":"read","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"integer"},"description":"Resolver service ID"}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Filter"}}}},"400":{"description":"validation_error / limit_exceeded","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"forbidden (scope or ownership)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"not_found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"rate_limited","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}},"put":{"operationId":"services.filter.put","summary":"Replace resolver filter lists / rewrites","tags":["Services"],"x-scope":"write","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"integer"},"description":"Resolver service ID"}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Filter"}}}},"400":{"description":"validation_error / limit_exceeded","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"forbidden (scope or ownership)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"not_found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"rate_limited","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Filter"}}}}}},"/dns/zones":{"get":{"operationId":"zones.list","summary":"List zones","tags":["DNS"],"x-scope":"read","parameters":[{"name":"limit","in":"query","required":false,"schema":{"type":"integer","minimum":1,"maximum":500,"default":100},"description":"Rows per page (1-500)."},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","minimum":0,"default":0},"description":"Rows to skip."},{"name":"service_id","in":"query","schema":{"type":"integer"}}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/Zone"}},"pagination":{"$ref":"#/components/schemas/Pagination"}}}}}},"400":{"description":"validation_error / limit_exceeded","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"forbidden (scope or ownership)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"not_found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"rate_limited","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}},"post":{"operationId":"zones.create","summary":"Create a zone","tags":["DNS"],"x-scope":"write","parameters":[],"responses":{"201":{"description":"Created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Zone"}}}},"400":{"description":"validation_error / limit_exceeded","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"forbidden (scope or ownership)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"not_found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"rate_limited","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ZoneCreate"}}}}}},"/dns/zones/{id}":{"get":{"operationId":"zones.get","summary":"Get a zone","tags":["DNS"],"x-scope":"read","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"integer"},"description":"Zone ID"}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Zone"}}}},"400":{"description":"validation_error / limit_exceeded","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"forbidden (scope or ownership)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"not_found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"rate_limited","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}},"patch":{"operationId":"zones.patch","summary":"Enable/disable or set secondary master","tags":["DNS"],"x-scope":"write","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"integer"},"description":"Zone ID"}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Zone"}}}},"400":{"description":"validation_error / limit_exceeded","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"forbidden (scope or ownership)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"not_found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"rate_limited","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ZonePatch"}}}}},"delete":{"operationId":"zones.delete","summary":"Delete a zone (and its records, Shield sites, rules)","tags":["DNS"],"x-scope":"write","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"integer"},"description":"Zone ID"}],"responses":{"204":{"description":"No content"},"400":{"description":"validation_error / limit_exceeded","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"forbidden (scope or ownership)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"not_found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"rate_limited","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/dns/zones/{id}/verify":{"post":{"operationId":"zones.verify","summary":"Check NS delegation; activates the zone when it points at ns1/ns2","tags":["DNS"],"x-scope":"write","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"integer"},"description":"Zone ID"}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ZoneVerify"}}}},"400":{"description":"validation_error / limit_exceeded","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"forbidden (scope or ownership)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"not_found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"rate_limited","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/dns/zones/{id}/dnssec":{"get":{"operationId":"zones.dnssec.get","summary":"DNSSEC status with DS / DNSKEY","tags":["DNS"],"x-scope":"read","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"integer"},"description":"Zone ID"}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Dnssec"}}}},"400":{"description":"validation_error / limit_exceeded","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"forbidden (scope or ownership)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"not_found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"rate_limited","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}},"put":{"operationId":"zones.dnssec.put","summary":"Enable or disable DNSSEC (online-signed ECDSA P-256)","tags":["DNS"],"x-scope":"write","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"integer"},"description":"Zone ID"}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Dnssec"}}}},"400":{"description":"validation_error / limit_exceeded","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"forbidden (scope or ownership)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"not_found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"rate_limited","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/DnssecPut"}}}}}},"/dns/zones/{id}/grants":{"get":{"operationId":"zones.grants.list","summary":"People this zone is shared with","tags":["DNS"],"x-scope":"read","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"integer"},"description":"Zone ID"}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/Grant"}},"pagination":{"$ref":"#/components/schemas/Pagination"}}}}}},"400":{"description":"validation_error / limit_exceeded","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"forbidden (scope or ownership)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"not_found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"rate_limited","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/dns/zones/{id}/grants/{email}":{"put":{"operationId":"zones.grants.put","summary":"Share the zone with a person (viewer or operator)","tags":["DNS"],"x-scope":"write","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"integer"},"description":"Zone ID"},{"name":"email","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Grant"}}}},"400":{"description":"validation_error / limit_exceeded","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"forbidden (scope or ownership)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"not_found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"rate_limited","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/GrantPut"}}}}},"delete":{"operationId":"zones.grants.delete","summary":"Stop sharing the zone with a person","tags":["DNS"],"x-scope":"write","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"integer"},"description":"Zone ID"},{"name":"email","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"204":{"description":"No content"},"400":{"description":"validation_error / limit_exceeded","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"forbidden (scope or ownership)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"not_found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"rate_limited","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/dns/zones/{id}/transfer":{"get":{"operationId":"zones.transfer.get","summary":"Outbound AXFR allowlist, NOTIFY targets, TSIG","tags":["DNS"],"x-scope":"read","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"integer"},"description":"Zone ID"}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Transfer"}}}},"400":{"description":"validation_error / limit_exceeded","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"forbidden (scope or ownership)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"not_found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"rate_limited","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}},"put":{"operationId":"zones.transfer.put","summary":"Set transfer settings","tags":["DNS"],"x-scope":"write","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"integer"},"description":"Zone ID"}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Transfer"}}}},"400":{"description":"validation_error / limit_exceeded","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"forbidden (scope or ownership)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"not_found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"rate_limited","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TransferPut"}}}}}},"/dns/zones/{id}/analytics":{"get":{"operationId":"zones.analytics","summary":"Query analytics merged across PoPs","tags":["DNS"],"x-scope":"read","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"integer"},"description":"Zone ID"}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Analytics"}}}},"400":{"description":"validation_error / limit_exceeded","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"forbidden (scope or ownership)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"not_found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"rate_limited","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/dns/zones/{id}/export":{"get":{"operationId":"zones.export","summary":"Export as a BIND zone file","tags":["DNS"],"x-scope":"read","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"integer"},"description":"Zone ID"}],"responses":{"200":{"description":"OK","content":{"text/plain":{"schema":{"type":"string"}}}},"400":{"description":"validation_error / limit_exceeded","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"forbidden (scope or ownership)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"not_found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"rate_limited","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/dns/zones/{id}/import":{"post":{"operationId":"zones.import","summary":"Import BIND-style records","tags":["DNS"],"x-scope":"write","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"integer"},"description":"Zone ID"}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ImportResult"}}}},"400":{"description":"validation_error / limit_exceeded","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"forbidden (scope or ownership)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"not_found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"rate_limited","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ImportBody"}}}}}},"/dns/zones/{id}/records":{"get":{"operationId":"records.list","summary":"List records","tags":["DNS"],"x-scope":"read","parameters":[{"name":"limit","in":"query","required":false,"schema":{"type":"integer","minimum":1,"maximum":500,"default":100},"description":"Rows per page (1-500)."},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","minimum":0,"default":0},"description":"Rows to skip."},{"name":"id","in":"path","required":true,"schema":{"type":"integer"},"description":"Zone ID"}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/Record"}},"pagination":{"$ref":"#/components/schemas/Pagination"}}}}}},"400":{"description":"validation_error / limit_exceeded","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"forbidden (scope or ownership)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"not_found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"rate_limited","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}},"post":{"operationId":"records.create","summary":"Add a record","tags":["DNS"],"x-scope":"write","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"integer"},"description":"Zone ID"}],"responses":{"201":{"description":"Created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Record"}}}},"400":{"description":"validation_error / limit_exceeded","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"forbidden (scope or ownership)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"not_found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"rate_limited","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RecordCreate"}}}}}},"/dns/zones/{id}/records/{rid}":{"get":{"operationId":"records.get","summary":"Get a record","tags":["DNS"],"x-scope":"read","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"integer"},"description":"Zone ID"},{"name":"rid","in":"path","required":true,"schema":{"type":"integer"},"description":"Record ID"}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Record"}}}},"400":{"description":"validation_error / limit_exceeded","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"forbidden (scope or ownership)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"not_found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"rate_limited","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}},"patch":{"operationId":"records.patch","summary":"Update a record (content, TTL, steering, enabled, proxied)","tags":["DNS"],"x-scope":"write","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"integer"},"description":"Zone ID"},{"name":"rid","in":"path","required":true,"schema":{"type":"integer"},"description":"Record ID"}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Record"}}}},"400":{"description":"validation_error / limit_exceeded","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"forbidden (scope or ownership)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"not_found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"rate_limited","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RecordPatch"}}}}},"delete":{"operationId":"records.delete","summary":"Delete a record","tags":["DNS"],"x-scope":"write","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"integer"},"description":"Zone ID"},{"name":"rid","in":"path","required":true,"schema":{"type":"integer"},"description":"Record ID"}],"responses":{"204":{"description":"No content"},"400":{"description":"validation_error / limit_exceeded","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"forbidden (scope or ownership)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"not_found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"rate_limited","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/cdn/sites":{"get":{"operationId":"sites.list","summary":"List Shield sites (proxied hostnames)","tags":["Shield CDN"],"x-scope":"read","parameters":[{"name":"limit","in":"query","required":false,"schema":{"type":"integer","minimum":1,"maximum":500,"default":100},"description":"Rows per page (1-500)."},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","minimum":0,"default":0},"description":"Rows to skip."}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/Site"}},"pagination":{"$ref":"#/components/schemas/Pagination"}}}}}},"400":{"description":"validation_error / limit_exceeded","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"forbidden (scope or ownership)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"not_found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"rate_limited","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"502":{"description":"upstream_error (Krill / ACME)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}},"post":{"operationId":"sites.create","summary":"Onboard a hostname by CNAME (DNS stays at your provider)","tags":["CDN"],"x-scope":"write","parameters":[],"responses":{"201":{"description":"Created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Site"}}}},"400":{"description":"validation_error / limit_exceeded","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"forbidden (scope or ownership)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"not_found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"rate_limited","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"502":{"description":"upstream_error (Krill / ACME)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SiteCreate"}}}}}},"/cdn/sites/{id}":{"delete":{"operationId":"sites.delete","summary":"Remove a CNAME-mode site (zone-hosted sites are removed by un-proxying their record)","tags":["CDN"],"x-scope":"write","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"integer"},"description":"Site ID"}],"responses":{"204":{"description":"No content"},"400":{"description":"validation_error / limit_exceeded","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"forbidden (scope or ownership)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"not_found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"rate_limited","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"502":{"description":"upstream_error (Krill / ACME)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}},"get":{"operationId":"sites.get","summary":"Get a site","tags":["Shield CDN"],"x-scope":"read","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"integer"},"description":"Site ID"}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Site"}}}},"400":{"description":"validation_error / limit_exceeded","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"forbidden (scope or ownership)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"not_found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"rate_limited","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"502":{"description":"upstream_error (Krill / ACME)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}},"patch":{"operationId":"sites.patch","summary":"Update site settings (partial)","tags":["Shield CDN"],"x-scope":"write","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"integer"},"description":"Site ID"}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Site"}}}},"400":{"description":"validation_error / limit_exceeded","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"forbidden (scope or ownership)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"not_found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"rate_limited","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"502":{"description":"upstream_error (Krill / ACME)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SitePatch"}}}}}},"/cdn/sites/{id}/verify":{"post":{"operationId":"sites.verify","summary":"Check the CNAMEs in public DNS; request the certificate once seen","tags":["CDN"],"x-scope":"write","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"integer"},"description":"Site ID"}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SiteVerify"}}}},"400":{"description":"validation_error / limit_exceeded","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"forbidden (scope or ownership)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"not_found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"rate_limited","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"502":{"description":"upstream_error (Krill / ACME)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/onboard/recommend":{"get":{"operationId":"onboard.recommend","summary":"Which onboarding modes fit a hostname, best first","tags":["CDN"],"x-scope":"read","parameters":[{"name":"hostname","in":"query","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Recommendation"}}}},"400":{"description":"validation_error / limit_exceeded","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"forbidden (scope or ownership)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"not_found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"rate_limited","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/cdn/sites/{id}/purge":{"post":{"operationId":"sites.purge","summary":"Purge cache (everything, or given paths)","tags":["Shield CDN"],"x-scope":"write","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"integer"},"description":"Site ID"}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PurgeResult"}}}},"400":{"description":"validation_error / limit_exceeded","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"forbidden (scope or ownership)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"not_found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"rate_limited","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"502":{"description":"upstream_error (Krill / ACME)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Purge"}}}}}},"/cdn/sites/{id}/origin-certificate":{"post":{"operationId":"sites.origincert","summary":"Issue an Orbit Origin CA certificate for the origin","tags":["Shield CDN"],"x-scope":"write","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"integer"},"description":"Site ID"}],"responses":{"201":{"description":"Created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/OriginCert"}}}},"400":{"description":"validation_error / limit_exceeded","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"forbidden (scope or ownership)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"not_found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"rate_limited","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"502":{"description":"upstream_error (Krill / ACME)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/cdn/sites/{id}/acme":{"post":{"operationId":"sites.acme","summary":"Start automated Let's Encrypt issuance (dns-01)","tags":["Shield CDN"],"x-scope":"write","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"integer"},"description":"Site ID"}],"responses":{"202":{"description":"Accepted","content":{"application/json":{"schema":{"type":"object","properties":{"state":{"type":"string"}}}}}},"400":{"description":"validation_error / limit_exceeded","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"forbidden (scope or ownership)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"not_found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"rate_limited","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"502":{"description":"upstream_error (Krill / ACME)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/cdn/sites/{id}/logs":{"get":{"operationId":"logs.list","summary":"Request logs (sampled), newest first, cursor-paged; format=csv exports up to 10 000 rows","tags":["Shield CDN"],"x-scope":"read","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"integer"},"description":"Site ID"},{"name":"since","in":"query","schema":{"type":"string"},"description":"ISO timestamp (inclusive). Logs are kept 7 days."},{"name":"until","in":"query","schema":{"type":"string"},"description":"ISO timestamp (inclusive)"},{"name":"ray","in":"query","schema":{"type":"string"},"description":"Exact Ray ID"},{"name":"ip","in":"query","schema":{"type":"string"},"description":"Exact client IP"},{"name":"path","in":"query","schema":{"type":"string"},"description":"Substring of path + query"},{"name":"status","in":"query","schema":{"type":"string"},"description":"Exact code (404) or class (4xx)"},{"name":"action","in":"query","schema":{"type":"string","enum":["pass","netrule_block","waf","challenge","ratelimit","waiting","origin_error","redirect"]}},{"name":"cc","in":"query","schema":{"type":"string"},"description":"Client country, ISO alpha-2"},{"name":"limit","in":"query","schema":{"type":"integer","minimum":1,"maximum":500,"default":100}},{"name":"cursor","in":"query","schema":{"type":"string"},"description":"`next_cursor` from the previous page"},{"name":"format","in":"query","schema":{"type":"string","enum":["json","csv"],"default":"json"},"description":"csv returns text/csv with the current filter (cursor ignored, at most 10 000 rows)"}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/LogPage"}}}},"400":{"description":"validation_error / limit_exceeded","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"forbidden (scope or ownership)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"not_found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"rate_limited","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/cdn/sites/{id}/logs/{ray}":{"get":{"operationId":"logs.get","summary":"One request by Ray ID, with every header","tags":["Shield CDN"],"x-scope":"read","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"integer"},"description":"Site ID"},{"name":"ray","in":"path","required":true,"schema":{"type":"string"},"description":"Orbit Ray ID"}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/LogDetail"}}}},"400":{"description":"validation_error / limit_exceeded","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"forbidden (scope or ownership)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"not_found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"rate_limited","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/cdn/sites/{id}/analytics":{"get":{"operationId":"sites.analytics","summary":"Traffic analytics: exact per-minute counters plus top lists and latency from the sampled logs","tags":["Shield CDN"],"x-scope":"read","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"integer"},"description":"Site ID"},{"name":"range","in":"query","schema":{"type":"string","enum":["1h","24h","7d"],"default":"24h"}}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SiteAnalytics"}}}},"400":{"description":"validation_error / limit_exceeded","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"forbidden (scope or ownership)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"not_found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"rate_limited","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"502":{"description":"upstream_error (Krill / ACME)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/security/rules":{"get":{"operationId":"rules.list","summary":"List security rules","tags":["Security"],"x-scope":"read","parameters":[{"name":"limit","in":"query","required":false,"schema":{"type":"integer","minimum":1,"maximum":500,"default":100},"description":"Rows per page (1-500)."},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","minimum":0,"default":0},"description":"Rows to skip."},{"name":"site_id","in":"query","schema":{"type":"integer"}},{"name":"zone_id","in":"query","schema":{"type":"integer"}}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/Rule"}},"pagination":{"$ref":"#/components/schemas/Pagination"}}}}}},"400":{"description":"validation_error / limit_exceeded","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"forbidden (scope or ownership)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"not_found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"rate_limited","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}},"post":{"operationId":"rules.create","summary":"Add a rule for a site or a whole zone","tags":["Security"],"x-scope":"write","parameters":[],"responses":{"201":{"description":"Created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Rule"}}}},"400":{"description":"validation_error / limit_exceeded","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"forbidden (scope or ownership)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"not_found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"rate_limited","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RuleCreate"}}}}}},"/security/rules/{id}":{"patch":{"operationId":"rules.patch","summary":"Enable/disable a rule","tags":["Security"],"x-scope":"write","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"integer"},"description":"Rule ID"}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Rule"}}}},"400":{"description":"validation_error / limit_exceeded","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"forbidden (scope or ownership)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"not_found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"rate_limited","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RulePatch"}}}}},"delete":{"operationId":"rules.delete","summary":"Delete a rule","tags":["Security"],"x-scope":"write","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"integer"},"description":"Rule ID"}],"responses":{"204":{"description":"No content"},"400":{"description":"validation_error / limit_exceeded","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"forbidden (scope or ownership)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"not_found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"rate_limited","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/rpki/cas":{"get":{"operationId":"cas.list","summary":"List hosted CAs (with their ROAs)","tags":["RPKI"],"x-scope":"read","parameters":[],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/CA"}},"configured":{"type":"boolean","description":"false when the platform's RPKI backend is offline — writes will fail"}}}}}},"400":{"description":"validation_error / limit_exceeded","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"forbidden (scope or ownership)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"not_found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"rate_limited","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"502":{"description":"upstream_error (Krill / ACME)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}},"post":{"operationId":"cas.create","summary":"Create a hosted CA (Krill)","tags":["RPKI"],"x-scope":"write","parameters":[],"responses":{"201":{"description":"Created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CA"}}}},"400":{"description":"validation_error / limit_exceeded","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"forbidden (scope or ownership)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"not_found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"rate_limited","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"502":{"description":"upstream_error (Krill / ACME)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CACreate"}}}}}},"/rpki/cas/{id}":{"get":{"operationId":"cas.get","summary":"Get a CA","tags":["RPKI"],"x-scope":"read","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"integer"},"description":"CA ID"}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CA"}}}},"400":{"description":"validation_error / limit_exceeded","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"forbidden (scope or ownership)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"not_found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"rate_limited","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"502":{"description":"upstream_error (Krill / ACME)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}},"patch":{"operationId":"cas.patch","summary":"Update origin ASNs / note","tags":["RPKI"],"x-scope":"write","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"integer"},"description":"CA ID"}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CA"}}}},"400":{"description":"validation_error / limit_exceeded","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"forbidden (scope or ownership)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"not_found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"rate_limited","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"502":{"description":"upstream_error (Krill / ACME)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CAPatch"}}}}},"delete":{"operationId":"cas.delete","summary":"Delete a CA and its ROAs","tags":["RPKI"],"x-scope":"write","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"integer"},"description":"CA ID"}],"responses":{"204":{"description":"No content"},"400":{"description":"validation_error / limit_exceeded","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"forbidden (scope or ownership)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"not_found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"rate_limited","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"502":{"description":"upstream_error (Krill / ACME)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/rpki/cas/{id}/child-request":{"get":{"operationId":"cas.childrequest","summary":"RFC 8183 child request XML to hand to your RIR","tags":["RPKI"],"x-scope":"read","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"integer"},"description":"CA ID"}],"responses":{"200":{"description":"OK","content":{"application/xml":{"schema":{"type":"string"}}}},"400":{"description":"validation_error / limit_exceeded","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"forbidden (scope or ownership)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"not_found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"rate_limited","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"502":{"description":"upstream_error (Krill / ACME)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/rpki/cas/{id}/parent-response":{"post":{"operationId":"cas.parentresponse","summary":"Submit the RIR's parent response XML","tags":["RPKI"],"x-scope":"write","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"integer"},"description":"CA ID"}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CA"}}}},"400":{"description":"validation_error / limit_exceeded","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"forbidden (scope or ownership)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"not_found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"rate_limited","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"502":{"description":"upstream_error (Krill / ACME)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ParentResponse"}}}}}},"/rpki/cas/{id}/sync":{"post":{"operationId":"cas.sync","summary":"Refresh certified resources from Krill","tags":["RPKI"],"x-scope":"write","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"integer"},"description":"CA ID"}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Sync"}}}},"400":{"description":"validation_error / limit_exceeded","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"forbidden (scope or ownership)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"not_found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"rate_limited","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"502":{"description":"upstream_error (Krill / ACME)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/rpki/cas/{id}/roas":{"get":{"operationId":"roas.list","summary":"List ROAs","tags":["RPKI"],"x-scope":"read","parameters":[{"name":"limit","in":"query","required":false,"schema":{"type":"integer","minimum":1,"maximum":500,"default":100},"description":"Rows per page (1-500)."},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","minimum":0,"default":0},"description":"Rows to skip."},{"name":"id","in":"path","required":true,"schema":{"type":"integer"},"description":"CA ID"}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/Roa"}},"pagination":{"$ref":"#/components/schemas/Pagination"}}}}}},"400":{"description":"validation_error / limit_exceeded","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"forbidden (scope or ownership)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"not_found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"rate_limited","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"502":{"description":"upstream_error (Krill / ACME)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}},"post":{"operationId":"roas.create","summary":"Add a ROA","tags":["RPKI"],"x-scope":"write","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"integer"},"description":"CA ID"}],"responses":{"201":{"description":"Created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Roa"}}}},"400":{"description":"validation_error / limit_exceeded","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"forbidden (scope or ownership)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"not_found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"rate_limited","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"502":{"description":"upstream_error (Krill / ACME)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RoaCreate"}}}}}},"/rpki/cas/{id}/roas/{rid}":{"delete":{"operationId":"roas.delete","summary":"Delete a ROA","tags":["RPKI"],"x-scope":"write","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"integer"},"description":"CA ID"},{"name":"rid","in":"path","required":true,"schema":{"type":"integer"},"description":"ROA ID"}],"responses":{"204":{"description":"No content"},"400":{"description":"validation_error / limit_exceeded","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"forbidden (scope or ownership)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"not_found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"rate_limited","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"502":{"description":"upstream_error (Krill / ACME)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/rpki/cas/{id}/suggestions":{"get":{"operationId":"cas.suggestions","summary":"Prefixes announced by the CA's ASNs (RIPEstat) and whether a ROA covers them","tags":["RPKI"],"x-scope":"read","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"integer"},"description":"CA ID"}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/Suggestion"}},"pagination":{"$ref":"#/components/schemas/Pagination"}}}}}},"400":{"description":"validation_error / limit_exceeded","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"forbidden (scope or ownership)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"not_found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"rate_limited","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"502":{"description":"upstream_error (Krill / ACME)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/rpki/cas/{id}/rpsl":{"get":{"operationId":"cas.rpsl","summary":"ROAs as RPSL route/route6 objects","tags":["RPKI"],"x-scope":"read","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"integer"},"description":"CA ID"}],"responses":{"200":{"description":"OK","content":{"text/plain":{"schema":{"type":"string"}}}},"400":{"description":"validation_error / limit_exceeded","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"forbidden (scope or ownership)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"not_found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"rate_limited","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"502":{"description":"upstream_error (Krill / ACME)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/vms":{"get":{"operationId":"vms.list","summary":"List my VMs","tags":["Compute"],"x-scope":"read","parameters":[{"name":"limit","in":"query","required":false,"schema":{"type":"integer","minimum":1,"maximum":500,"default":100},"description":"Rows per page (1-500)."},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","minimum":0,"default":0},"description":"Rows to skip."}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/VM"}},"pagination":{"$ref":"#/components/schemas/Pagination"}}}}}},"400":{"description":"validation_error / limit_exceeded","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"forbidden (scope or ownership)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"not_found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"rate_limited","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/vms/{id}":{"get":{"operationId":"vms.get","summary":"Get a VM","tags":["Compute"],"x-scope":"read","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"integer"},"description":"VM ID"}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/VM"}}}},"400":{"description":"validation_error / limit_exceeded","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"forbidden (scope or ownership)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"not_found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"rate_limited","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/vms/{id}/power":{"post":{"operationId":"vms.power","summary":"Power on / off / restart","tags":["Compute"],"x-scope":"write","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"integer"},"description":"VM ID"}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/VM"}}}},"400":{"description":"validation_error / limit_exceeded","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"forbidden (scope or ownership)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"not_found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"rate_limited","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Power"}}}}}},"/vms/{id}/reinstall":{"post":{"operationId":"vms.reinstall","summary":"Reinstall from image; returns a new root password once","tags":["Compute"],"x-scope":"write","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"integer"},"description":"VM ID"}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Reinstall"}}}},"400":{"description":"validation_error / limit_exceeded","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"forbidden (scope or ownership)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"not_found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"rate_limited","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/tokens":{"get":{"operationId":"tokens.list","summary":"List API tokens","tags":["Account"],"x-scope":"read","x-auth":"session","description":"Browser session only — API tokens cannot call this.","parameters":[],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/Token"}},"pagination":{"$ref":"#/components/schemas/Pagination"}}}}}},"400":{"description":"validation_error / limit_exceeded","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"forbidden (scope or ownership)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"not_found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"rate_limited","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}},"post":{"operationId":"tokens.create","summary":"Create an API token (max 10)","tags":["Account"],"x-scope":"write","x-auth":"session","description":"Browser session only — API tokens cannot call this.","parameters":[],"responses":{"201":{"description":"Created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TokenCreated"}}}},"400":{"description":"validation_error / limit_exceeded","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"forbidden (scope or ownership)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"not_found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"rate_limited","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TokenCreate"}}}}}},"/tokens/{id}":{"delete":{"operationId":"tokens.delete","summary":"Revoke a token","tags":["Account"],"x-scope":"write","x-auth":"session","description":"Browser session only — API tokens cannot call this.","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"integer"},"description":"Token ID"}],"responses":{"204":{"description":"No content"},"400":{"description":"validation_error / limit_exceeded","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"forbidden (scope or ownership)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"not_found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"rate_limited","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/sessions":{"get":{"operationId":"sessions.list","summary":"List my console sessions","tags":["Account"],"x-scope":"read","x-auth":"session","description":"Browser session only — API tokens cannot call this.","parameters":[],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/Session"}},"pagination":{"$ref":"#/components/schemas/Pagination"}}}}}},"400":{"description":"validation_error / limit_exceeded","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"forbidden (scope or ownership)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"not_found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"rate_limited","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}},"delete":{"operationId":"sessions.deleteOthers","summary":"Revoke every other session","tags":["Account"],"x-scope":"write","x-auth":"session","description":"Browser session only — API tokens cannot call this.","parameters":[{"name":"others","in":"query","required":true,"schema":{"type":"boolean","enum":[true]}}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object","properties":{"revoked":{"type":"integer"}}}}}},"400":{"description":"validation_error / limit_exceeded","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"forbidden (scope or ownership)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"not_found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"rate_limited","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/sessions/{id}":{"delete":{"operationId":"sessions.delete","summary":"Revoke a session (not the current one)","tags":["Account"],"x-scope":"write","x-auth":"session","description":"Browser session only — API tokens cannot call this.","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"integer"},"description":"Session ID"}],"responses":{"204":{"description":"No content"},"400":{"description":"validation_error / limit_exceeded","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"forbidden (scope or ownership)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"not_found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"rate_limited","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/ripe/link":{"get":{"operationId":"ripe.link.get","summary":"RIPE account link status","tags":["RIPE"],"x-scope":"read","parameters":[],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RipeLink"}}}},"400":{"description":"validation_error / limit_exceeded","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"forbidden (scope or ownership)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"not_found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"rate_limited","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}},"put":{"operationId":"ripe.link.put","summary":"Link a RIPE Database API key (verified against the maintainer, stored encrypted)","tags":["RIPE"],"x-scope":"write","parameters":[],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RipeLink"}}}},"400":{"description":"validation_error / limit_exceeded","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"forbidden (scope or ownership)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"not_found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"rate_limited","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RipeLinkPut"}}}}},"delete":{"operationId":"ripe.link.delete","summary":"Unlink and forget the key","tags":["RIPE"],"x-scope":"write","parameters":[],"responses":{"204":{"description":"No content"},"400":{"description":"validation_error / limit_exceeded","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"forbidden (scope or ownership)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"not_found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"rate_limited","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/ripe/sync":{"post":{"operationId":"ripe.sync","summary":"Discover organisations, address blocks, ASNs and domain objects behind the maintainer","tags":["RIPE"],"x-scope":"write","parameters":[],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object","properties":{"counts":{"type":"object","additionalProperties":{"type":"integer"}},"synced_at":{"type":"string"}}}}}},"400":{"description":"validation_error / limit_exceeded","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"forbidden (scope or ownership)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"not_found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"rate_limited","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/ripe/resources":{"get":{"operationId":"ripe.resources","summary":"Discovered resources with reverse-DNS status per block","tags":["RIPE"],"x-scope":"read","parameters":[],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/RipeResource"}},"synced_at":{"type":"string","nullable":true,"description":"When the last complete sync finished"},"incomplete":{"type":"boolean","description":"true when a cache exists but the last sync did not finish — re-run Sync"}}}}}},"400":{"description":"validation_error / limit_exceeded","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"forbidden (scope or ownership)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"not_found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"rate_limited","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/ripe/rdns/plan":{"post":{"operationId":"ripe.rdns.plan","summary":"Plan reverse-DNS onboarding for a block: domain objects, conflicts, diffs","tags":["RIPE"],"x-scope":"read","parameters":[],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RdnsPlan"}}}},"400":{"description":"validation_error / limit_exceeded","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"forbidden (scope or ownership)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"not_found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"rate_limited","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RdnsPlanBody"}}}}}},"/ripe/rdns/apply":{"post":{"operationId":"ripe.rdns.apply","summary":"Create/migrate the reverse zones on Orbit, enable DNSSEC and point the RIPE domain objects here","tags":["RIPE"],"x-scope":"write","parameters":[],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RdnsApplyResult"}}}},"400":{"description":"validation_error / limit_exceeded","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"forbidden (scope or ownership)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"not_found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"rate_limited","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RdnsApplyBody"}}}}}},"/ripe/domains":{"get":{"operationId":"ripe.domains.list","summary":"Domain objects your maintainer controls","tags":["RIPE"],"x-scope":"read","parameters":[],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/RipeDomain"}},"pagination":{"$ref":"#/components/schemas/Pagination"}}}}}},"400":{"description":"validation_error / limit_exceeded","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"forbidden (scope or ownership)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"not_found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"rate_limited","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/ripe/domains/{name}":{"put":{"operationId":"ripe.domains.put","summary":"Edit a domain object's name servers / DS records (dry-run first)","tags":["RIPE"],"x-scope":"write","parameters":[{"name":"name","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RipeDomain"}}}},"400":{"description":"validation_error / limit_exceeded","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"forbidden (scope or ownership)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"not_found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"rate_limited","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RipeDomainPut"}}}}},"delete":{"operationId":"ripe.domains.delete","summary":"Delete a domain object","tags":["RIPE"],"x-scope":"write","parameters":[{"name":"name","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"204":{"description":"No content"},"400":{"description":"validation_error / limit_exceeded","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"forbidden (scope or ownership)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"not_found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"rate_limited","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/ripe/rpki/plan":{"get":{"operationId":"ripe.rpki.plan","summary":"ROA suggestions from discovered ASNs/prefixes and the delegated-RPKI steps","tags":["RIPE"],"x-scope":"read","parameters":[],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RpkiPlan"}}}},"400":{"description":"validation_error / limit_exceeded","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"forbidden (scope or ownership)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"not_found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"rate_limited","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/dns/zones/{id}/migration/plan":{"post":{"operationId":"zones.migration.plan","summary":"Where is this zone served today, and how can it move to Orbit","tags":["Migration"],"x-scope":"read","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"integer"},"description":"Zone ID"}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MigrationPlan"}}}},"400":{"description":"validation_error / limit_exceeded","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"forbidden (scope or ownership)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"not_found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"rate_limited","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/dns/zones/{id}/migration/apply":{"post":{"operationId":"zones.migration.apply","summary":"Import the zone (AXFR from the current master, or a zone file), then follow the registrar steps","tags":["Migration"],"x-scope":"write","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"integer"},"description":"Zone ID"}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MigrationApplyResult"}}}},"400":{"description":"validation_error / limit_exceeded","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"forbidden (scope or ownership)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"not_found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"rate_limited","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/MigrationApplyBody"}}}}}},"/webhooks":{"get":{"operationId":"hooks.list","summary":"List webhook endpoints","tags":["Webhooks"],"x-scope":"read","parameters":[{"name":"limit","in":"query","required":false,"schema":{"type":"integer","minimum":1,"maximum":500,"default":100},"description":"Rows per page (1-500)."},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","minimum":0,"default":0},"description":"Rows to skip."}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/Webhook"}},"pagination":{"$ref":"#/components/schemas/Pagination"}}}}}},"400":{"description":"validation_error / limit_exceeded","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"forbidden (scope or ownership)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"not_found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"rate_limited","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}},"post":{"operationId":"hooks.create","summary":"Register an endpoint (max 10)","tags":["Webhooks"],"x-scope":"write","parameters":[],"responses":{"201":{"description":"Created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Webhook"}}}},"400":{"description":"validation_error / limit_exceeded","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"forbidden (scope or ownership)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"not_found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"rate_limited","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/WebhookCreate"}}}}}},"/webhooks/{id}":{"get":{"operationId":"hooks.get","summary":"Get an endpoint","tags":["Webhooks"],"x-scope":"read","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"integer"},"description":"Webhook ID"}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Webhook"}}}},"400":{"description":"validation_error / limit_exceeded","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"forbidden (scope or ownership)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"not_found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"rate_limited","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}},"patch":{"operationId":"hooks.patch","summary":"Update an endpoint","tags":["Webhooks"],"x-scope":"write","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"integer"},"description":"Webhook ID"}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Webhook"}}}},"400":{"description":"validation_error / limit_exceeded","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"forbidden (scope or ownership)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"not_found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"rate_limited","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/WebhookPatch"}}}}},"delete":{"operationId":"hooks.delete","summary":"Delete an endpoint","tags":["Webhooks"],"x-scope":"write","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"integer"},"description":"Webhook ID"}],"responses":{"204":{"description":"No content"},"400":{"description":"validation_error / limit_exceeded","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"forbidden (scope or ownership)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"not_found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"rate_limited","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/webhooks/{id}/test":{"post":{"operationId":"hooks.test","summary":"Send a ping event now","tags":["Webhooks"],"x-scope":"write","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"integer"},"description":"Webhook ID"}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Delivery"}}}},"400":{"description":"validation_error / limit_exceeded","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"forbidden (scope or ownership)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"not_found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"rate_limited","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/webhooks/{id}/deliveries":{"get":{"operationId":"hooks.deliveries","summary":"Recent deliveries for an endpoint","tags":["Webhooks"],"x-scope":"read","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"integer"},"description":"Webhook ID"},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","minimum":1,"maximum":500,"default":100},"description":"Rows per page (1-500)."},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","minimum":0,"default":0},"description":"Rows to skip."}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/Delivery"}},"pagination":{"$ref":"#/components/schemas/Pagination"}}}}}},"400":{"description":"validation_error / limit_exceeded","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"forbidden (scope or ownership)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"not_found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"rate_limited","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/webhook-events":{"get":{"operationId":"hooks.events","summary":"Event names an endpoint can subscribe to","tags":["Webhooks"],"x-scope":"read","parameters":[],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"array","items":{"type":"string"}}}}}}},"400":{"description":"validation_error / limit_exceeded","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"forbidden (scope or ownership)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"not_found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"rate_limited","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}}}}