Getwebup Cloud API V1 API

Manage your Getwebup Cloud servers from code. Production keys (cx_live_…) act on your real account; sandbox keys (cx_test_…) on a simulated copy where nothing is built or billed. Full guide: https://cloud.getwebup.in/docs/api

Operations 140

GET /v1/key The key you are using #
GET /v1/requests Your API calls #
POST /v1/sandbox/reset Reset the sandbox #
GET /v1/account Your account #
PATCH /v1/account Change your name or phone #
GET /v1/account/billing-address Your billing address #
PUT /v1/account/billing-address Set your billing address #
GET /v1/account/renewals Auto-renew for new servers #
PUT /v1/account/renewals Set auto-renew for new servers #
GET /v1/account/alerts Alerts for new servers #
PUT /v1/account/alerts Set alerts for new servers #
GET /v1/account/email-preferences E-mail preferences #
PUT /v1/account/email-preferences Set e-mail preferences #
GET /v1/account/emails E-mails we sent you #
GET /v1/account/emails/{id} One e-mail #
GET /v1/catalog Locations, images, apps, types and prices #
POST /v1/quotes Price a server #
POST /v1/coupons/check Check a coupon #
GET /v1/servers List servers #
POST /v1/servers Create a server #
GET /v1/servers/{id} Get a server #
PATCH /v1/servers/{id} Rename a server #
DELETE /v1/servers/{id} Destroy a server #
POST /v1/servers/{id}/actions Power a server on or off #
GET /v1/servers/{id}/activity What happened to a server #
GET /v1/servers/{id}/stats Live usage #
GET /v1/servers/{id}/metrics Usage graphs #
GET /v1/servers/{id}/bandwidth Bandwidth this month #
GET /v1/servers/{id}/uptime Uptime by calendar month #
GET /v1/servers/{id}/credentials Its login #
POST /v1/servers/{id}/password Set a new login password #
POST /v1/servers/{id}/console Open the console #
GET /v1/servers/{id}/rebuild What it can be rebuilt with #
POST /v1/servers/{id}/rebuild Rebuild with a fresh system #
DELETE /v1/servers/{id}/rebuild Drop an unpaid rebuild elsewhere #
GET /v1/servers/{id}/move Where it can move, and what it costs #
POST /v1/servers/{id}/move Move it to another location or host #
DELETE /v1/servers/{id}/move Drop an unpaid move #
GET /v1/servers/{id}/upgrade An upgrade waiting for payment #
POST /v1/servers/{id}/upgrade Upgrade a server #
DELETE /v1/servers/{id}/upgrade Drop an unpaid upgrade #
POST /v1/servers/{id}/upgrade/quote Price an upgrade #
POST /v1/servers/{id}/coupon/quote What a coupon would do to a server #
POST /v1/servers/{id}/coupon Apply a coupon to a server #
GET /v1/servers/{id}/main-ipv4 What its main IPv4 can become #
POST /v1/servers/{id}/main-ipv4 Change its main IPv4 #
POST /v1/servers/{id}/licence Activate Windows with your key #
GET /v1/servers/{id}/app The app on a server #
GET /v1/servers/{id}/app/credentials The app's login #
POST /v1/servers/{id}/app/access Who may reach its login #
GET /v1/servers/{id}/alerts Its alerts #
PATCH /v1/servers/{id}/alerts Change its alerts #
POST /v1/servers/{id}/alerts/test Send a test alert #
GET /v1/servers/{id}/addons Its add-ons #
POST /v1/servers/{id}/addons Add an add-on #
DELETE /v1/servers/{id}/addons/{addon_id} Remove an add-on #
GET /v1/servers/{id}/backups Its backups #
POST /v1/servers/{id}/backups Back up now #
POST /v1/servers/{id}/backups/{backup_id}/restore Restore a backup #
DELETE /v1/servers/{id}/backups/{backup_id} Delete a backup #
GET /v1/servers/{id}/firewall Its firewall #
PATCH /v1/servers/{id}/firewall Switch it on or off; policies #
POST /v1/servers/{id}/firewall/rules Add a rule #
DELETE /v1/servers/{id}/firewall/rules/{rule_id} Remove a rule #
POST /v1/servers/{id}/firewall/rules/{rule_id}/move Move a rule up or down #
POST /v1/servers/{id}/firewall/security-groups Use a security group #
DELETE /v1/servers/{id}/firewall/security-groups/{group_id} Stop using a security group #
POST /v1/servers/{id}/firewall/apply Apply it to the server #
GET /v1/security-groups List security groups #
POST /v1/security-groups Create a security group #
GET /v1/security-groups/{id} Get a security group #
PATCH /v1/security-groups/{id} Rename a security group #
DELETE /v1/security-groups/{id} Delete a security group #
POST /v1/security-groups/{id}/rules Add a rule to a group #
DELETE /v1/security-groups/{id}/rules/{rule_id} Remove a rule from a group #
POST /v1/security-groups/{id}/rules/{rule_id}/move Move a group's rule #
POST /v1/security-groups/{id}/servers Use it on a server #
DELETE /v1/security-groups/{id}/servers/{server_id} Stop using it on a server #
POST /v1/security-groups/{id}/apply Apply a group everywhere #
GET /v1/disks List disks #
POST /v1/disks Buy a disk #
GET /v1/disks/{id} Get a disk #
DELETE /v1/disks/{id} Delete a disk #
POST /v1/disks/{id}/resize Grow a disk #
POST /v1/disks/{id}/attach Put a disk on a server #
POST /v1/disks/{id}/detach Take a disk off its server #
GET /v1/disks/{id}/move Where a disk can move, and what it costs #
POST /v1/disks/{id}/move Move a disk #
DELETE /v1/disks/{id}/move Drop an unpaid disk move #
GET /v1/ips List addresses #
POST /v1/ips Buy an IPv4 address #
GET /v1/ips/{id} Get an address of your own #
DELETE /v1/ips/{id} Release an address #
POST /v1/ips/{id}/attach Put an address on a server #
POST /v1/ips/{id}/detach Take an address off its server #
GET /v1/invoices List invoices #
GET /v1/invoices/{id} Get an invoice #
GET /v1/invoices/{id}/pdf An invoice as a PDF #
POST /v1/invoices/{id}/pay Pay an invoice #
POST /v1/invoices/{id}/coupon Put a coupon on an invoice #
DELETE /v1/invoices/{id}/coupon Take the coupon off an invoice #
GET /v1/wallet Wallet balance and recent movements #
GET /v1/wallet/ledger Wallet history #
POST /v1/wallet/top-ups Top up the wallet #
GET /v1/payments/{id} Follow a payment #
GET /v1/subscriptions What renews, and when #
PUT /v1/subscriptions/{id}/renewal-periods How long it renews for #
PUT /v1/subscriptions/{id}/auto-renew Auto-renew a server, or not #
POST /v1/servers/{id}/renew Renew a server #
GET /v1/servers/{id}/renew What renewing costs #
GET /v1/credit-notes List credit notes #
GET /v1/credit-notes/{id} Get a credit note #
GET /v1/credit-notes/{id}/pdf A credit note as a PDF #
GET /v1/tickets List tickets #
POST /v1/tickets Open a ticket #
GET /v1/tickets/{id} Get a ticket #
POST /v1/tickets/{id}/replies Reply to a ticket #
GET /v1/tickets/{id}/attachments/{attachment_id} Download an attachment #
POST /v1/tickets/{id}/close Close a ticket #
GET /v1/ssh-keys List SSH keys #
POST /v1/ssh-keys Add an SSH key #
POST /v1/ssh-keys/generate Generate an SSH key pair #
GET /v1/ssh-keys/{id}/private-key Download a kept private key #
DELETE /v1/ssh-keys/{id} Delete an SSH key #
GET /v1/tunnels/account Your Tunnels account and plan #
GET /v1/tunnels/plans The plans, and what you can do with each #
POST /v1/tunnels/order Order a Tunnels plan #
POST /v1/tunnels/change Change your plan #
DELETE /v1/tunnels/change Call a plan change off #
GET /v1/tunnels/usage A month's traffic #
GET /v1/tunnels/setup Install and connect the agent #
GET /v1/tunnels/live Tunnels open now #
DELETE /v1/tunnels/live/{id} Stop a tunnel #
GET /v1/tunnels/domains Reserved subdomains and custom domains #
POST /v1/tunnels/domains Reserve a subdomain or add your own domain #
POST /v1/tunnels/domains/{id}/verify Check a custom domain's DNS records #
DELETE /v1/tunnels/domains/{id} Remove a domain #
GET /v1/tunnels/tcp-addresses Reserved TCP addresses #
POST /v1/tunnels/tcp-addresses Reserve a TCP address #
DELETE /v1/tunnels/tcp-addresses/{id} Release a TCP address #

Work with this as data

Every API here is available over the APIs.io API and to AI agents over MCP.

MCP server

One button, every client — Claude, Cursor, VS Code and the rest.

https://apis.io/mcp

Tools for apis

7 MCP tools reach this
  • find_apisBrowse and filter every API in the catalog.
  • get_api_artifactsOne API's artifacts, grouped by type.
  • get_openapiThe primary OpenAPI for this API.
  • find_similar_apisAPIs that look like this one.
  • apis_io_searchSTART HERE — APIs, providers and tags for one query, each with its total.
  • resolveTurn a domain, URL or GitHub org into the provider it belongs to.
  • find_cohortsEvery scored population of providers in the catalog.
All 92 tools →

Call it yourself

curl for this page
This API
curl "https://apis.io/api/v1/apis/getwebup:getwebup-cloud-api-v1-api"
All apis
curl "https://apis.io/api/v1/apis?limit=25"

Discovery needs no key. Ratings and market analysis are Pro.

Get an API key

Free tier, no form to fill in. Signing in shares your email address with us — we store it to create your key and to recognise you if you sign in with another provider. See our Privacy Policy and Terms.

A second provider on the same verified email joins the account you already have.

OpenAPI Specification

getwebup-v1-openapi.json Raw ↑
{"openapi":"3.1.0","info":{"title":"Getwebup Cloud API","version":"1.21.0","description":"Manage your Getwebup Cloud servers from code. Production keys (cx_live_…) act on your real account; sandbox keys (cx_test_…) on a simulated copy where nothing is built or billed. Full guide: https://cloud.getwebup.in/docs/api"},"servers":[{"url":"https://cloud.getwebup.in/api","description":"Production and sandbox — the key decides which"}],"security":[{"apiKey":[]}],"tags":[{"name":"Authentication"},{"name":"Request log"},{"name":"Sandbox reset"},{"name":"Account"},{"name":"Catalogue"},{"name":"Servers"},{"name":"Server access"},{"name":"Server tools"},{"name":"Upgrades"},{"name":"Apps on servers"},{"name":"Alerts"},{"name":"Add-ons"},{"name":"Backups"},{"name":"Firewall"},{"name":"Security groups"},{"name":"Disks"},{"name":"IP addresses"},{"name":"Billing"},{"name":"Support"},{"name":"SSH keys"},{"name":"Tunnels"}],"paths":{"/v1/key":{"get":{"operationId":"key","summary":"The key you are using","description":"Who the key belongs to, whether it is a production or a sandbox key, its scopes, IP allowlist, expiry and rate limit. Needs no scope — handy to check a key works. API 1.12.0: connects_tunnels — whether the getwebup tunnel agent can sign in with it: a production key with tunnels:connect, or a full-access key from before Tunnels (which can't show that permission).\n\nNeeds a valid key; no particular permission.","tags":["Authentication"],"x-scope":null,"parameters":[],"responses":{"200":{"description":"OK","headers":{"X-RateLimit-Limit":{"schema":{"type":"integer"},"description":"Requests allowed a minute for this key."},"X-RateLimit-Remaining":{"schema":{"type":"integer"},"description":"Left in the current minute."},"X-RateLimit-Reset":{"schema":{"type":"integer"},"description":"When the minute ends (Unix time)."},"X-Request-Id":{"schema":{"type":"string"},"description":"Quote it to support."},"X-Api-Mode":{"schema":{"type":"string","enum":["production","sandbox"]}}},"content":{"application/json":{"example":{"data":{"id":"01a1…","name":"Deploy bot","mode":"production","scopes":["servers:read","servers:power"],"ip_allowlist":["203.0.113.5"],"expires_at":null,"rate_limit_per_minute":120,"account":{"id":42,"email":"asha@example.com"},"connects_tunnels":false}}}}},"401":{"description":"missing_api_key, invalid_api_key, key_revoked, key_expired","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"insufficient_scope, ip_not_allowed, account_suspended","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"rate_limited — see Retry-After","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/requests":{"get":{"operationId":"listRequests","summary":"Your API calls","description":"The request log the panel shows under API → Request log, newest first (API 1.9.0): every call made with the account's keys — answered, refused or failed — with the key, when, the caller's address and user agent, the endpoint (route) and the permission it needs, the status and error code, how long it took and the Idempotency-Key (replayed: answered from an earlier call). A production key sees the calls of every key of the account, production and sandbox; a sandbox key only the sandbox's (mode=production gives it none). Calls with a key that isn't yours, or none, aren't here. Kept as long as the request log keeps calls (see Request log above); this call is in it from the next one.\n\nRequires the `account:read` permission.","tags":["Request log"],"x-scope":"account:read","parameters":[{"name":"page","in":"query","required":false,"description":"Page number, from 1.","schema":{"type":"integer"}},{"name":"per_page","in":"query","required":false,"description":"Items per page, 1–100 (default 25).","schema":{"type":"integer"}},{"name":"key","in":"query","required":false,"description":"Only this key's calls, by its id (GET /v1/key gives the id of the one you are using).","schema":{"type":"string"}},{"name":"mode","in":"query","required":false,"description":"production or sandbox: only the calls made with that kind of key.","schema":{"type":"string"}},{"name":"status","in":"query","required":false,"description":"2xx (answered), 4xx (refused) or 5xx (failed) — or one status, like 404.","schema":{"type":"string"}},{"name":"q","in":"query","required":false,"description":"Part of the path (/v1/servers), a request id (req_…) or an error code (insufficient_scope).","schema":{"type":"string"}},{"name":"ip","in":"query","required":false,"description":"Only the calls from this address.","schema":{"type":"string"}}],"responses":{"200":{"description":"OK","headers":{"X-RateLimit-Limit":{"schema":{"type":"integer"},"description":"Requests allowed a minute for this key."},"X-RateLimit-Remaining":{"schema":{"type":"integer"},"description":"Left in the current minute."},"X-RateLimit-Reset":{"schema":{"type":"integer"},"description":"When the minute ends (Unix time)."},"X-Request-Id":{"schema":{"type":"string"},"description":"Quote it to support."},"X-Api-Mode":{"schema":{"type":"string","enum":["production","sandbox"]}}},"content":{"application/json":{"example":{"data":[{"id":"req_3f9a…","method":"POST","path":"/api/v1/servers","route":"POST /v1/servers","scope":"servers:write","status":201,"error_code":null,"duration_ms":840,"ip":"203.0.113.5","user_agent":"deploy-bot/2.1","key":{"id":"01a1…","name":"Deploy bot","prefix":"cx_live_Ab12Cd"},"mode":"production","idempotency_key":"b7c1…","replayed":false,"created_at":"2026-10-06T07:49:12Z"}],"pagination":{"page":1,"per_page":25,"total":1,"pages":1}}}}},"401":{"description":"missing_api_key, invalid_api_key, key_revoked, key_expired","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"insufficient_scope, ip_not_allowed, account_suspended","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"rate_limited — see Retry-After","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/sandbox/reset":{"post":{"operationId":"resetSandbox","summary":"Reset the sandbox","description":"What the panel's Reset sandbox does (API 1.9.0): everything made in the sandbox is wiped — servers, disks, addresses, SSH keys, security groups, invoices, payments, tickets and the account settings changed there — and its make-believe wallet is full again. wiped: how many servers (not counting destroyed ones), SSH keys, invoices and tickets went. Your keys, the request log and your real account are never touched. With a sandbox key only: a production key gets 403 sandbox_only.\n\nRequires the `account:write` permission.","tags":["Sandbox reset"],"x-scope":"account:write","parameters":[],"responses":{"200":{"description":"OK","headers":{"X-RateLimit-Limit":{"schema":{"type":"integer"},"description":"Requests allowed a minute for this key."},"X-RateLimit-Remaining":{"schema":{"type":"integer"},"description":"Left in the current minute."},"X-RateLimit-Reset":{"schema":{"type":"integer"},"description":"When the minute ends (Unix time)."},"X-Request-Id":{"schema":{"type":"string"},"description":"Quote it to support."},"X-Api-Mode":{"schema":{"type":"string","enum":["production","sandbox"]}}},"content":{"application/json":{"example":{"data":{"reset":true,"wiped":{"servers":2,"ssh_keys":1,"invoices":5,"tickets":1},"balance":1000000,"balance_display":"₹10,000.00","currency":"INR"}}}}},"401":{"description":"missing_api_key, invalid_api_key, key_revoked, key_expired","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"insufficient_scope, ip_not_allowed, account_suspended","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"the request conflicts with the current state (e.g. not_active, idempotency_in_progress)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"422":{"description":"validation_failed — see fields","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"rate_limited — see Retry-After","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/account":{"get":{"operationId":"account","summary":"Your account","description":"Profile, the group the account is in, its limits and how much of them is used — and what it takes to move up a group. team: true for a Team account (API 1.8.0) — nothing it orders is invoiced or charged, so orders and purchases come back with payment.required false, and renewing answers 409 team_not_billed. API 1.9.0: email_verified; last_sign_in_at — the last sign-in to the panel (API calls don't count); identity_verification — status none, pending, review (with our team), verified or failed, how and when it was verified, and whether the account must verify (required) and before what (required_for: orders, or panel — using the panel at all; verifying is done in the panel); tax — how its invoices are taxed: type registered (a GSTIN, or a tax ID at home), unregistered or export (billed abroad), the place of supply, the taxes with their rates, whether it is exempt or reverse-charged, the note printed on its invoices, and whether prices include tax; null until a billing address is added. In the sandbox, verification and sign-in are the real account's; tax follows the sandbox's own billing address once one is set there (its invoices still carry no tax).\n\nRequires the `account:read` permission.","tags":["Account"],"x-scope":"account:read","parameters":[],"responses":{"200":{"description":"OK","headers":{"X-RateLimit-Limit":{"schema":{"type":"integer"},"description":"Requests allowed a minute for this key."},"X-RateLimit-Remaining":{"schema":{"type":"integer"},"description":"Left in the current minute."},"X-RateLimit-Reset":{"schema":{"type":"integer"},"description":"When the minute ends (Unix time)."},"X-Request-Id":{"schema":{"type":"string"},"description":"Quote it to support."},"X-Api-Mode":{"schema":{"type":"string","enum":["production","sandbox"]}}},"content":{"application/json":{"example":{"data":{"id":42,"email":"asha@example.com","name":"Asha Verma","phone":"+919820000000","phone_verified":true,"group":{"name":"Advanced","server_limit":8,"ipv4_limit":5},"team":false,"email_verified":true,"last_sign_in_at":"2026-10-12T08:30:05Z","identity_verification":{"status":"verified","verified":true,"verified_at":"2026-10-01T09:40:12Z","method":"digilocker","verified_name":"ASHA VERMA","required":false,"required_for":null},"created_at":"2026-10-01T09:12:44Z","tax":{"type":"registered","country":"IN","place_of_supply":"Maharashtra (27)","taxes":[{"name":"IGST","percent":18.0}],"label":"IGST 18%","percent":18.0,"exempt":false,"reverse_charge":false,"note":null,"prices_include_tax":false},"limits":{"servers":3,"server_limit":8,"ipv4":4,"ipv4_limit":5,"next_group":{"name":"Pro","top_up_needed":800000,"server_limit":20,"ipv4_limit":15}},"mode":"production"}}}}},"401":{"description":"missing_api_key, invalid_api_key, key_revoked, key_expired","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"insufficient_scope, ip_not_allowed, account_suspended","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"rate_limited — see Retry-After","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}},"patch":{"operationId":"updateAccount","summary":"Change your name or phone","description":"Your name, and your phone number while it isn't confirmed (one confirmed with a code at sign-up stays). Fields left out stay as they are. The e-mail address and password are changed in the panel. The answer is the profile as GET /v1/account gives it, without limits and tax.\n\nRequires the `account:write` permission.","tags":["Account"],"x-scope":"account:write","parameters":[],"responses":{"200":{"description":"OK","headers":{"X-RateLimit-Limit":{"schema":{"type":"integer"},"description":"Requests allowed a minute for this key."},"X-RateLimit-Remaining":{"schema":{"type":"integer"},"description":"Left in the current minute."},"X-RateLimit-Reset":{"schema":{"type":"integer"},"description":"When the minute ends (Unix time)."},"X-Request-Id":{"schema":{"type":"string"},"description":"Quote it to support."},"X-Api-Mode":{"schema":{"type":"string","enum":["production","sandbox"]}}},"content":{"application/json":{"example":{"data":{"id":42,"email":"asha@example.com","name":"Asha Verma","phone":"+919820000000"}}}}},"401":{"description":"missing_api_key, invalid_api_key, key_revoked, key_expired","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"insufficient_scope, ip_not_allowed, account_suspended","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"the request conflicts with the current state (e.g. not_active, idempotency_in_progress)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"422":{"description":"validation_failed — see fields","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"rate_limited — see Retry-After","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"requestBody":{"required":false,"content":{"application/json":{"schema":{"type":"object","properties":{"name":{"type":"string","description":"Your name.","example":"Asha Verma"},"phone":{"type":"string","description":"International format.","example":"+919820000000"}}}}}}}},"/v1/account/billing-address":{"get":{"operationId":"billingAddress","summary":"Your billing address","description":"The address and tax number printed on your invoices. null until one is added — every order needs one.\n\nRequires the `account:read` permission.","tags":["Account"],"x-scope":"account:read","parameters":[],"responses":{"200":{"description":"OK","headers":{"X-RateLimit-Limit":{"schema":{"type":"integer"},"description":"Requests allowed a minute for this key."},"X-RateLimit-Remaining":{"schema":{"type":"integer"},"description":"Left in the current minute."},"X-RateLimit-Reset":{"schema":{"type":"integer"},"description":"When the minute ends (Unix time)."},"X-Request-Id":{"schema":{"type":"string"},"description":"Quote it to support."},"X-Api-Mode":{"schema":{"type":"string","enum":["production","sandbox"]}}},"content":{"application/json":{"example":{"data":{"name":"Asha Verma","company":"Verma Labs Pvt Ltd","line1":"12 MG Road","line2":null,"city":"Pune","state":"Maharashtra","postal_code":"411001","country":"IN","phone":null,"tax_id":"27AAPFU0939F1ZV","tax_exempt":false,"updated_at":"2026-10-01T09:20:00Z"}}}}},"401":{"description":"missing_api_key, invalid_api_key, key_revoked, key_expired","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"insufficient_scope, ip_not_allowed, account_suspended","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"rate_limited — see Retry-After","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}},"put":{"operationId":"saveBillingAddress","summary":"Set your billing address","description":"New invoices use it; ones already issued keep the address they were made with. In India: a 6-digit PIN, your state, and a GSTIN registered in that state (optional).\n\nRequires the `account:write` permission.","tags":["Account"],"x-scope":"account:write","parameters":[],"responses":{"200":{"description":"OK","headers":{"X-RateLimit-Limit":{"schema":{"type":"integer"},"description":"Requests allowed a minute for this key."},"X-RateLimit-Remaining":{"schema":{"type":"integer"},"description":"Left in the current minute."},"X-RateLimit-Reset":{"schema":{"type":"integer"},"description":"When the minute ends (Unix time)."},"X-Request-Id":{"schema":{"type":"string"},"description":"Quote it to support."},"X-Api-Mode":{"schema":{"type":"string","enum":["production","sandbox"]}}},"content":{"application/json":{"example":{"data":{"name":"Asha Verma","company":"Verma Labs Pvt Ltd","line1":"12 MG Road","line2":null,"city":"Pune","state":"Maharashtra","postal_code":"411001","country":"IN","phone":null,"tax_id":"27AAPFU0939F1ZV","tax_exempt":false,"updated_at":"2026-10-01T09:20:00Z"}}}}},"401":{"description":"missing_api_key, invalid_api_key, key_revoked, key_expired","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"insufficient_scope, ip_not_allowed, account_suspended","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"the request conflicts with the current state (e.g. not_active, idempotency_in_progress)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"422":{"description":"validation_failed — see fields","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"rate_limited — see Retry-After","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"name":{"type":"string","description":"The name to bill.","example":"Asha Verma"},"company":{"type":"string","description":"Company name.","example":"Verma Labs Pvt Ltd"},"line1":{"type":"string","description":"Street address.","example":"12 MG Road"},"line2":{"type":"string","description":"More of the address."},"city":{"type":"string","description":"City.","example":"Pune"},"state":{"type":"string","description":"State or union territory (or region).","example":"Maharashtra"},"postal_code":{"type":"string","description":"PIN or postal code.","example":"411001"},"country":{"type":"string","description":"Two-letter country code.","example":"IN"},"phone":{"type":"string","description":"A phone number for the invoice."},"tax_id":{"type":"string","description":"GSTIN (India) or VAT number.","example":"27AAPFU0939F1ZV"}},"required":["name","line1","city","state","postal_code","country"]}}}}}},"/v1/account/renewals":{"get":{"operationId":"renewalPreferences","summary":"Auto-renew for new servers","description":"Whether a new server starts with auto-renew on (its renewals paid from the wallet by themselves) or off.\n\nRequires the `account:read` permission.","tags":["Account"],"x-scope":"account:read","parameters":[],"responses":{"200":{"description":"OK","headers":{"X-RateLimit-Limit":{"schema":{"type":"integer"},"description":"Requests allowed a minute for this key."},"X-RateLimit-Remaining":{"schema":{"type":"integer"},"description":"Left in the current minute."},"X-RateLimit-Reset":{"schema":{"type":"integer"},"description":"When the minute ends (Unix time)."},"X-Request-Id":{"schema":{"type":"string"},"description":"Quote it to support."},"X-Api-Mode":{"schema":{"type":"string","enum":["production","sandbox"]}}},"content":{"application/json":{"example":{"data":{"auto_renew":true}}}}},"401":{"description":"missing_api_key, invalid_api_key, key_revoked, key_expired","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"insufficient_scope, ip_not_allowed, account_suspended","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"rate_limited — see Retry-After","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}},"put":{"operationId":"saveRenewalPreferences","summary":"Set auto-renew for new servers","description":"What servers ordered from now on start with. Servers you have keep theirs: PUT /v1/subscriptions/{id}/auto-renew.\n\nRequires the `account:write` permission.","tags":["Account"],"x-scope":"account:write","parameters":[],"responses":{"200":{"description":"OK","headers":{"X-RateLimit-Limit":{"schema":{"type":"integer"},"description":"Requests allowed a minute for this key."},"X-RateLimit-Remaining":{"schema":{"type":"integer"},"description":"Left in the current minute."},"X-RateLimit-Reset":{"schema":{"type":"integer"},"description":"When the minute ends (Unix time)."},"X-Request-Id":{"schema":{"type":"string"},"description":"Quote it to support."},"X-Api-Mode":{"schema":{"type":"string","enum":["production","sandbox"]}}},"content":{"application/json":{"example":{"data":{"auto_renew":false}}}}},"401":{"description":"missing_api_key, invalid_api_key, key_revoked, key_expired","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"insufficient_scope, ip_not_allowed, account_suspended","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"the request conflicts with the current state (e.g. not_active, idempotency_in_progress)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"422":{"description":"validation_failed — see fields","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"rate_limited — see Retry-After","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"auto_renew":{"type":"boolean","description":"true or false.","example":false}},"required":["auto_renew"]}}}}}},"/v1/account/alerts":{"get":{"operationId":"alertDefaults","summary":"Alerts for new servers","description":"The free e-mail alerts a new server starts with: when it goes down or comes back (email_alerts), and when CPU, memory or network stay high (usage_alerts).\n\nRequires the `account:read` permission.","tags":["Account"],"x-scope":"account:read","parameters":[],"responses":{"200":{"description":"OK","headers":{"X-RateLimit-Limit":{"schema":{"type":"integer"},"description":"Requests allowed a minute for this key."},"X-RateLimit-Remaining":{"schema":{"type":"integer"},"description":"Left in the current minute."},"X-RateLimit-Reset":{"schema":{"type":"integer"},"description":"When the minute ends (Unix time)."},"X-Request-Id":{"schema":{"type":"string"},"description":"Quote it to support."},"X-Api-Mode":{"schema":{"type":"string","enum":["production","sandbox"]}}},"content":{"application/json":{"example":{"data":{"email_alerts":true,"usage_alerts":true}}}}},"401":{"description":"missing_api_key, invalid_api_key, key_revoked, key_expired","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"insufficient_scope, ip_not_allowed, account_suspended","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"rate_limited — see Retry-After","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}},"put":{"operationId":"saveAlertDefaults","summary":"Set alerts for new servers","description":"What servers ordered from now on start with; only the fields you give change. With apply_to_servers, every server you have now takes them too (applied: how many). One server on its own: PATCH /v1/servers/{id}/alerts.\n\nRequires the `account:write` permission.","tags":["Account"],"x-scope":"account:write","parameters":[],"responses":{"200":{"description":"OK","headers":{"X-RateLimit-Limit":{"schema":{"type":"integer"},"description":"Requests allowed a minute for this key."},"X-RateLimit-Remaining":{"schema":{"type":"integer"},"description":"Left in the current minute."},"X-RateLimit-Reset":{"schema":{"type":"integer"},"description":"When the minute ends (Unix time)."},"X-Request-Id":{"schema":{"type":"string"},"description":"Quote it to support."},"X-Api-Mode":{"schema":{"type":"string","enum":["production","sandbox"]}}},"content":{"application/json":{"example":{"data":{"email_alerts":true,"usage_alerts":false,"applied":3}}}}},"401":{"description":"missing_api_key, invalid_api_key, key_revoked, key_expired","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"insufficient_scope, ip_not_allowed, account_suspended","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"the request conflicts with the current state (e.g. not_active, idempotency_in_progress)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"422":{"description":"validation_failed — see fields","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"rate_limited — see Retry-After","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"requestBody":{"required":false,"content":{"application/json":{"schema":{"type":"object","properties":{"email_alerts":{"type":"boolean","description":"E-mail when a server goes down and comes back.","example":true},"usage_alerts":{"type":"boolean","description":"E-mail when CPU, memory or network stay at 85 % or more.","example":false},"apply_to_servers":{"type":"boolean","description":"Set them on every server you have now as well.","example":true}}}}}}}},"/v1/account/email-preferences":{"get":{"operationId":"emailPreferences","summary":"E-mail preferences","description":"Whether you get product updates and offers. Notices about your own servers (maintenance, bills, alerts) always come.\n\nRequires the `account:read` permission.","tags":["Account"],"x-scope":"account:read","parameters":[],"responses":{"200":{"description":"OK","headers":{"X-RateLimit-Limit":{"schema":{"type":"integer"},"description":"Requests allowed a minute for this key."},"X-RateLimit-Remaining":{"schema":{"type":"integer"},"description":"Left in the current minute."},"X-RateLimit-Reset":{"schema":{"type":"integer"},"description":"When the minute ends (Unix time)."},"X-Request-Id":{"schema":{"type":"string"},"description":"Quote it to support."},"X-Api-Mode":{"schema":{"type":"string","enum":["production","sandbox"]}}},"content":{"application/json":{"example":{"data":{"updates":true,"offers":false}}}}},"401":{"description":"missing_api_key, invalid_api_key, key_revoked, key_expired","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"insufficient_scope, ip_not_allowed, account_suspended","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"rate_limited — see Retry-After","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}},"put":{"operationId":"saveEmailPreferences","summary":"Set e-mail preferences","description":"Product updates and offers, on or off. Fields left out stay as they are.\n\nRequires the `account:write` permission.","tags":["Account"],"x-scope":"account:write","parameters":[],"responses":{"200":{"description":"OK","headers":{"X-RateLimit-Limit":{"schema":{"type":"integer"},"description":"Requests allowed a minute for this key."},"X-RateLimit-Remaining":{"schema":{"type":"integer"},"description":"Left in the current minute."},"X-RateLimit-Reset":{"schema":{"type":"integer"},"description":"When the minute ends (Unix time)."},"X-Request-Id":{"schema":{"type":"string"},"description":"Quote it to support."},"X-Api-Mode":{"schema":{"type":"string","enum":["production","sandbox"]}}},"content":{"application/json":{"example":{"data":{"updates":true,"offers":false}}}}},"401":{"description":"missing_api_key, invalid_api_key, key_revoked, key_expired","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"insufficient_scope, ip_not_allowed, account_suspended","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"the request conflicts with the current state (e.g. not_active, idempotency_in_progress)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"422":{"description":"validation_failed — see fields","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"rate_limited — see Retry-After","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"requestBody":{"required":false,"content":{"application/json":{"schema":{"type":"object","properties":{"updates":{"type":"boolean","description":"Product updates.","example":true},"offers":{"type":"boolean","description":"Offers.","example":false}}}}}}}},"/v1/account/emails":{"get":{"operationId":"listEmails","summary":"E-mails we sent you","description":"Every e-mail sent to the account, newest first — or sorted (API 1.9.0) by date (when it went, or was queued), subject or status, as the panel's E-mails page sorts them.\n\nRequires the `account:read` permission.","tags":["Account"],"x-scope":"account:read","parameters":[{"name":"page","in":"query","required":false,"description":"Page number, from 1.","schema":{"type":"integer"}},{"name":"per_page","in":"query","required":false,"description":"Items per page, 1–100 (default 25).","schema":{"type":"integer"}},{"name":"sort","in":"query","required":false,"description":"Sort by (API 1.9.0): date (when it was sent, else queued); subject (A → Z); status (by its status). Left out: the usual order. Another word: 422.","schema":{"type":"string"}},{"name":"dir","in":"query","required":false,"description":"asc (default) or desc. Empty values come last either way; equal ones newest first.","schema":{"type":"string"}}],"responses":{"200":{"description":"OK","headers":{"X-RateLimit-Limit":{"schema":{"type":"integer"},"description":"Requests allowed a minute for this key."},"X-RateLimit-Remaining":{"schema":{"type":"integer"},"description":"Left in the current minute."},"X-RateLimit-Reset":{"schema":{"type":"integer"},"description":"When the minute ends (Unix time)."},"X-Request-Id":{"schema":{"type":"string"},"description":"Quote it to support."},"X-Api-Mode":{"schema":{"type":"string","enum":["production","sandbox"]}}},"content":{"application/json":{"example":{"data":[{"id":"01a1…","to":"asha@example.com","subject":"web-01.example.com is ready","status":"sent","private":false,"created_at":"2026-10-06T07:51:00Z","sent_at":"2026-10-06T07:51:02Z"}],"pagination":{"page":1,"per_page":25,"total":1,"pages":1}}}}},"401":{"description":"missing_api_key, invalid_api_key, key_revoked, key_expired","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"insufficient_scope, ip_not_allowed, account_suspended","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"rate_limited — see Retry-After","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/account/emails/{id}":{"get":{"operationId":"getEmail","summary":"One e-mail","description":"With its HTML and text. Ones that carried a one-time link or code (a sign-up or sign-in code, an address confirmation, a password reset) show a plain subject such as \"Your sign-in code\" and no body: private is true.\n\nRequires the `account:read` permission.","tags":["Account"],"x-scope":"account:read","parameters":[{"name":"id","in":"path","required":true,"description":"The e-mail's id.","schema":{"type":"string"}}],"responses":{"200":{"description":"OK","headers":{"X-RateLimit-Limit":{"schema":{"type":"integer"},"description":"Requests allowed a minute for this key."},"X-RateLimit-Remaining":{"schema":{"type":"integer"},"description":"Left in the current minute."},"X-RateLimit-Reset":{"schema":{"type":"integer"},"description":"When the minute ends (Unix time)."},"X-Request-Id":{"schema":{"type":"string"},"description":"Quote it to support."},"X-Api-Mode":{"schema":{"type":"string","enum":["production","sandbox"]}}},"content":{"application/json":{"example":{"data":{"id":"01a1…","to":"asha@example.com","subject":"web-01.example.com is ready","status":"sent","private":false,"created_at":"2026-10-06T07:51:00Z","sent_at":"2026-10-06T07:51:02Z","html":"<!doctype html>…","text":"Your server web-01 is ready…"}}}}},"401":{"description":"missing_api_key, invalid_api_key, key_revoked, key_expired","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"insufficient_scope, ip_not_allowed, account_suspended","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"not found (or not yours)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429"

# --- truncated at 32 KB (426 KB total) ---
# Full source: https://artifacts.apis.io/getwebup/openapi/_original/getwebup-v1-openapi.json