{"openapi":"3.1.0","info":{"title":"veldhost customer API","version":"1.1","description":"Programmatic access to your veldhost sites, domains and DNS. Authenticate with a personal API token (portal \u2192 API tokens) sent as a bearer token. Tokens carry capability scopes: read (all GETs), deploy, manage (staging\/cron\/backups\/restore), dns (DNS writes). Rate limit: 120 requests\/minute. Anything that would charge money or destroy data is not in this API \u2014 those return a portal URL where you confirm as a signed-in human."},"servers":[{"url":"https:\/\/manage.veldhost.eu\/api\/v1"}],"components":{"securitySchemes":{"bearerToken":{"type":"http","scheme":"bearer","description":"Personal API token (mpc_...)"}}},"paths":{"\/sites":{"get":{"summary":"List your sites","security":[{"bearerToken":[]}],"responses":{"200":{"description":"Sites with state, url, health, deploy_state"}}},"post":{"summary":"Quote a new site (returns a portal continuation URL \u2014 never creates or charges)","security":[{"bearerToken":[]}],"requestBody":{"required":true,"content":{"application\/json":{"schema":{"type":"object","required":["name","plan"],"properties":{"name":{"type":"string"},"stack":{"type":"string"},"plan":{"type":"string"}}}}}},"responses":{"200":{"description":"Quote + continue_url for human confirmation"}}}},"\/sites\/{slug}\/deploy":{"post":{"summary":"Deploy from the configured git repository","security":[{"bearerToken":[]}],"parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string"},"description":"Site slug (from GET \/sites)."}],"requestBody":{"content":{"application\/json":{"schema":{"type":"object","properties":{"ref":{"type":"string","description":"Branch\/tag; defaults to the configured ref"}}}}}},"responses":{"202":{"description":"Deploy (queued)"}}}},"\/sites\/{slug}\/deploys":{"get":{"summary":"Deploy history","security":[{"bearerToken":[]}],"parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string"},"description":"Site slug (from GET \/sites)."}],"responses":{"200":{"description":"Last 20 deploys"}}}},"\/sites\/{slug}\/logs":{"get":{"summary":"Recent log lines","security":[{"bearerToken":[]}],"parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string"},"description":"Site slug (from GET \/sites)."},{"name":"log","in":"query","schema":{"type":"string","enum":["app","php","nginx-error","access"]}}],"responses":{"200":{"description":"Last 200 lines"}}}},"\/sites\/{slug}\/health":{"get":{"summary":"Live health + open incidents (works on non-active sites too)","security":[{"bearerToken":[]}],"parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string"},"description":"Site slug (from GET \/sites)."}],"responses":{"200":{"description":"health, freshness, open_incidents"}}}},"\/sites\/{slug}\/traffic":{"get":{"summary":"Disk + network usage (billing-period traffic when available)","security":[{"bearerToken":[]}],"parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string"},"description":"Site slug (from GET \/sites)."}],"responses":{"200":{"description":"usage sample"}}}},"\/sites\/{slug}\/backups":{"get":{"summary":"List backups","security":[{"bearerToken":[]}],"parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string"},"description":"Site slug (from GET \/sites)."}],"responses":{"200":{"description":"Last 20 backups"}}},"post":{"summary":"Back up now","security":[{"bearerToken":[]}],"parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string"},"description":"Site slug (from GET \/sites)."}],"responses":{"202":{"description":"Backup (queued)"}}}},"\/sites\/{slug}\/restore":{"post":{"summary":"Restore a backup over the live site (replaces current content)","security":[{"bearerToken":[]}],"parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string"},"description":"Site slug (from GET \/sites)."}],"requestBody":{"required":true,"content":{"application\/json":{"schema":{"type":"object","required":["backup_id"],"properties":{"backup_id":{"type":"integer"}}}}}},"responses":{"202":{"description":"Restore (queued)"}}}},"\/sites\/{slug}\/staging":{"get":{"summary":"Staging status","security":[{"bearerToken":[]}],"parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string"},"description":"Site slug (from GET \/sites)."}],"responses":{"200":{"description":"enabled, state, url"}}},"post":{"summary":"Create \/ refresh \/ turn off the staging copy (owner-only; billed on plans without staging included)","security":[{"bearerToken":[]}],"parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string"},"description":"Site slug (from GET \/sites)."}],"requestBody":{"required":true,"content":{"application\/json":{"schema":{"type":"object","required":["action"],"properties":{"action":{"type":"string","enum":["create","refresh","off"]}}}}}},"responses":{"202":{"description":"Staging action (queued)"}}}},"\/sites\/{slug}\/cron":{"get":{"summary":"List scheduled tasks","security":[{"bearerToken":[]}],"parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string"},"description":"Site slug (from GET \/sites)."}],"responses":{"200":{"description":"cron_jobs with index"}}},"post":{"summary":"Add a scheduled task (php\/wp commands only, max 5)","security":[{"bearerToken":[]}],"parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string"},"description":"Site slug (from GET \/sites)."}],"requestBody":{"required":true,"content":{"application\/json":{"schema":{"type":"object","required":["schedule","command"],"properties":{"schedule":{"type":"string","description":"5-field cron, e.g. *\/5 * * * *"},"command":{"type":"string"}}}}}},"responses":{"201":{"description":"Saved"}}}},"\/sites\/{slug}\/cron\/{index}":{"delete":{"summary":"Remove a scheduled task by index","security":[{"bearerToken":[]}],"parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string"},"description":"Site slug (from GET \/sites)."},{"name":"index","in":"path","required":true,"schema":{"type":"integer"}}],"responses":{"200":{"description":"Removed"}}}},"\/domains":{"get":{"summary":"List domains registered on your account","security":[{"bearerToken":[]}],"responses":{"200":{"description":"expiry, auto_renew, dnssec, transfer_state"}}}},"\/domains\/search":{"get":{"summary":"Domain availability + yearly price (read-only; registering happens in the portal via continue_url)","security":[{"bearerToken":[]}],"parameters":[{"name":"query","in":"query","required":true,"schema":{"type":"string"},"description":"Keyword (fans out over common TLDs) or full domain."}],"responses":{"200":{"description":"results with price, min_years, total_price"}}}},"\/domains\/{domain}":{"get":{"summary":"One registered domain","security":[{"bearerToken":[]}],"parameters":[{"name":"domain","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Domain detail"}}}},"\/dns":{"get":{"summary":"List your DNS zones","security":[{"bearerToken":[]}],"responses":{"200":{"description":"zones with DNSSEC state"}}}},"\/dns\/{zone}\/records":{"get":{"summary":"List zone records (system\/DNSSEC records hidden)","security":[{"bearerToken":[]}],"parameters":[{"name":"zone","in":"path","required":true,"schema":{"type":"string"},"description":"Zone name, e.g. example.com (from GET \/dns)."}],"responses":{"200":{"description":"records + nameservers"}}},"post":{"summary":"Add a record (live in under a second)","security":[{"bearerToken":[]}],"parameters":[{"name":"zone","in":"path","required":true,"schema":{"type":"string"},"description":"Zone name, e.g. example.com (from GET \/dns)."}],"requestBody":{"required":true,"content":{"application\/json":{"schema":{"type":"object","required":["name","type","ttl","content"],"properties":{"name":{"type":"string","description":"@ for the apex, * for wildcard, or a label like www"},"type":{"type":"string","enum":["A","AAAA","CNAME","MX","TXT","NS","SRV","CAA","PTR"]},"ttl":{"type":"integer","minimum":60,"maximum":604800},"content":{"type":"string","maxLength":2000}}}}}},"responses":{"201":{"description":"Added"}}}},"\/dns\/{zone}\/records\/{record}":{"put":{"summary":"Update a record","security":[{"bearerToken":[]}],"parameters":[{"name":"zone","in":"path","required":true,"schema":{"type":"string"},"description":"Zone name, e.g. example.com (from GET \/dns)."},{"name":"record","in":"path","required":true,"schema":{"type":"integer"}}],"requestBody":{"required":true,"content":{"application\/json":{"schema":{"type":"object","required":["name","type","ttl","content"],"properties":{"name":{"type":"string","description":"@ for the apex, * for wildcard, or a label like www"},"type":{"type":"string","enum":["A","AAAA","CNAME","MX","TXT","NS","SRV","CAA","PTR"]},"ttl":{"type":"integer","minimum":60,"maximum":604800},"content":{"type":"string","maxLength":2000}}}}}},"responses":{"200":{"description":"Updated"}}},"delete":{"summary":"Delete a record","security":[{"bearerToken":[]}],"parameters":[{"name":"zone","in":"path","required":true,"schema":{"type":"string"},"description":"Zone name, e.g. example.com (from GET \/dns)."},{"name":"record","in":"path","required":true,"schema":{"type":"integer"}}],"responses":{"200":{"description":"Deleted"}}}},"\/apps":{"get":{"summary":"Managed apps overview (fleet health)","security":[{"bearerToken":[]}],"responses":{"200":{"description":"apps with production\/staging health"}}}},"\/apps\/{app}":{"get":{"summary":"One managed app with component states","security":[{"bearerToken":[]}],"parameters":[{"name":"app","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"App detail"}}}},"\/apps\/{app}\/incidents":{"get":{"summary":"Incident history for a managed app","security":[{"bearerToken":[]}],"parameters":[{"name":"app","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Incidents"}}}}}}