Websites
Get Instance Website Config
Get the website configuration for a specific instance.
Returns a fresh draft if no config exists yet for this instance. "Houston, we have a problem." — Apollo 13 (when website config is missing)
In: header
Path Parameters
uuidHeader Parameters
Response Body
curl -X GET "https://loading/v1/instances/497f6eca-6276-4993-bfeb-53cbbbba6f08/website" \ -H "X-Api-Key: string"{
"content_mode": "bundle",
"created_at": "2019-08-24T14:15:22Z",
"custom_upload_id": "32c143b7-3420-4cb9-8ea3-6d8d9a659ee2",
"customer_id": "160c0c4b-9966-4dc1-a916-8407eb10d74e",
"deployed_at": "2019-08-24T14:15:22Z",
"deployed_instance_id": "5d02be4a-43b3-42f1-9872-f2bfe2e6f121",
"faq": [],
"features": [],
"hero_cta_text": "string",
"hero_subtitle": "string",
"hero_title": "string",
"id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
"instance_id": "06587974-2dbe-4e10-8bf9-38cce0f5a366",
"is_primary": true,
"pricing_currency": "USD",
"pricing_plans": [],
"robots_txt_custom": "string",
"seo_description": "string",
"seo_keywords": "string",
"seo_og_image_url": "string",
"seo_title": "string",
"sitemap_enabled": true,
"status": "draft",
"stripe_connect_account_id": "string",
"stripe_publishable_key": "string",
"template_id": "c6d67e98-83ea-49f0-8812-e4abae2b68bc",
"tenant_id": "34f5c98e-f430-457b-a812-92637d0c6fd0",
"testimonials": [],
"trial_days": 14,
"updated_at": "2019-08-24T14:15:22Z"
}{
"detail": [
{
"loc": [
"string"
],
"msg": "string",
"type": "string"
}
]
}Update Instance Website Config
Update the website configuration for a specific instance.
Admin only. Partial update — only provided fields are changed. "Make it so." — Captain Picard (about deploying website config changes)
In: header
Path Parameters
uuidHeader Parameters
Response Body
curl -X PUT "https://loading/v1/instances/497f6eca-6276-4993-bfeb-53cbbbba6f08/website" \ -H "X-Api-Key: string" \ -H "Content-Type: application/json" \ -d '{}'{
"content_mode": "bundle",
"created_at": "2019-08-24T14:15:22Z",
"custom_upload_id": "32c143b7-3420-4cb9-8ea3-6d8d9a659ee2",
"customer_id": "160c0c4b-9966-4dc1-a916-8407eb10d74e",
"deployed_at": "2019-08-24T14:15:22Z",
"deployed_instance_id": "5d02be4a-43b3-42f1-9872-f2bfe2e6f121",
"faq": [],
"features": [],
"hero_cta_text": "string",
"hero_subtitle": "string",
"hero_title": "string",
"id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
"instance_id": "06587974-2dbe-4e10-8bf9-38cce0f5a366",
"is_primary": true,
"pricing_currency": "USD",
"pricing_plans": [],
"robots_txt_custom": "string",
"seo_description": "string",
"seo_keywords": "string",
"seo_og_image_url": "string",
"seo_title": "string",
"sitemap_enabled": true,
"status": "draft",
"stripe_connect_account_id": "string",
"stripe_publishable_key": "string",
"template_id": "c6d67e98-83ea-49f0-8812-e4abae2b68bc",
"tenant_id": "34f5c98e-f430-457b-a812-92637d0c6fd0",
"testimonials": [],
"trial_days": 14,
"updated_at": "2019-08-24T14:15:22Z"
}{
"detail": [
{
"loc": [
"string"
],
"msg": "string",
"type": "string"
}
]
}Deploy Instance Website
Re-deploy the website for this specific instance.
Pushes updated website assets to the EXISTING running instance. Does NOT create a new server — that's what the tenant-scoped deploy endpoint does (via provision_instance).
"Gentlemen, you can't fight in here! This is the War Room!" — President Merkin Muffley, Dr. Strangelove (about deploying websites)
In: header
Path Parameters
uuidHeader Parameters
Response Body
curl -X POST "https://loading/v1/instances/497f6eca-6276-4993-bfeb-53cbbbba6f08/website/deploy" \ -H "X-Api-Key: string"{
"instance_id": "06587974-2dbe-4e10-8bf9-38cce0f5a366",
"message": "string",
"status": "string",
"website_config_id": "c0aa0662-77a9-4227-8f52-c7a29b8a3ad3"
}{
"detail": [
{
"loc": [
"string"
],
"msg": "string",
"type": "string"
}
]
}Get Instance Website History
In: header
Path Parameters
uuidHeader Parameters
Response Body
curl -X GET "https://loading/v1/instances/497f6eca-6276-4993-bfeb-53cbbbba6f08/website/history" \ -H "X-Api-Key: string"[
{
"artifact_hash": "string",
"change_source": "string",
"commit_sha": "string",
"created_at": "2019-08-24T14:15:22Z",
"deployed_at": "2019-08-24T14:15:22Z",
"id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
"notes": "string",
"release_id": "string",
"status": "string"
}
]{
"detail": [
{
"loc": [
"string"
],
"msg": "string",
"type": "string"
}
]
}Preview Instance Website
Preview the website config for a specific instance.
"Frankly, my dear, I don't give a damn." — Rhett Butler (about rendering previews without deploying)
In: header
Path Parameters
uuidHeader Parameters
Response Body
curl -X GET "https://loading/v1/instances/497f6eca-6276-4993-bfeb-53cbbbba6f08/website/preview" \ -H "X-Api-Key: string"{
"brand": {},
"content": {},
"content_mode": "bundle",
"custom_upload": false,
"pricing": {},
"seo": {},
"template_name": "string",
"template_slug": "string"
}{
"detail": [
{
"loc": [
"string"
],
"msg": "string",
"type": "string"
}
]
}Rollback Instance Website
In: header
Path Parameters
uuidHeader Parameters
Response Body
curl -X POST "https://loading/v1/instances/497f6eca-6276-4993-bfeb-53cbbbba6f08/website/rollback" \ -H "X-Api-Key: string" \ -H "Content-Type: application/json" \ -d '{}'{
"instance_id": "06587974-2dbe-4e10-8bf9-38cce0f5a366",
"message": "string",
"status": "string",
"website_config_id": "c0aa0662-77a9-4227-8f52-c7a29b8a3ad3"
}{
"detail": [
{
"loc": [
"string"
],
"msg": "string",
"type": "string"
}
]
}Upload Instance Custom Site
Upload a custom website archive for this instance.
Uploads are tenant-shared — this is a convenience route that verifies instance ownership then delegates to the tenant-scoped upload logic.
"I love the smell of napalm in the morning." — Lt. Col. Kilgore (about freshly uploaded website archives)
In: header
Path Parameters
uuidHeader Parameters
binaryResponse Body
curl -X POST "https://loading/v1/instances/497f6eca-6276-4993-bfeb-53cbbbba6f08/website/upload" \ -H "X-Api-Key: string" \ -F file="string"{
"content_type": "string",
"created_at": "2019-08-24T14:15:22Z",
"detected_framework": "string",
"filename": "string",
"has_index_html": true,
"has_package_json": true,
"id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
"is_active": true,
"preview_url": "string",
"scan_findings": [],
"scan_status": "pending",
"scan_threat_level": "string",
"sha256_hash": "string",
"size_bytes": 0,
"tenant_id": "34f5c98e-f430-457b-a812-92637d0c6fd0",
"validation_errors": [],
"validation_status": "string"
}{
"detail": [
{
"loc": [
"string"
],
"msg": "string",
"type": "string"
}
]
}List Instance Uploads
List tenant's custom site uploads (shared across instances).
"We're on a mission from God." — Elwood Blues, The Blues Brothers
In: header
Path Parameters
uuidHeader Parameters
Response Body
curl -X GET "https://loading/v1/instances/497f6eca-6276-4993-bfeb-53cbbbba6f08/website/uploads" \ -H "X-Api-Key: string"[
{
"content_type": "string",
"created_at": "2019-08-24T14:15:22Z",
"detected_framework": "string",
"filename": "string",
"has_index_html": true,
"has_package_json": true,
"id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
"is_active": true,
"preview_url": "string",
"scan_findings": [],
"scan_status": "pending",
"scan_threat_level": "string",
"sha256_hash": "string",
"size_bytes": 0,
"tenant_id": "34f5c98e-f430-457b-a812-92637d0c6fd0",
"validation_errors": [],
"validation_status": "string"
}
]{
"detail": [
{
"loc": [
"string"
],
"msg": "string",
"type": "string"
}
]
}List Website Configs
List all website configurations for the current tenant.
Returns one config per instance (plus any unlinked drafts). Optionally filter by customer_id to get a specific customer's sites. "I see dead pixels." — Cole Sear, The Sixth Sense (on empty config lists)
In: header
Query Parameters
Filter by customer owner
Header Parameters
Response Body
curl -X GET "https://loading/v1/website?customer_id=497f6eca-6276-4993-bfeb-53cbbbba6f08" \ -H "X-Api-Key: string"[
{
"content_mode": "bundle",
"created_at": "2019-08-24T14:15:22Z",
"custom_upload_id": "32c143b7-3420-4cb9-8ea3-6d8d9a659ee2",
"customer_id": "160c0c4b-9966-4dc1-a916-8407eb10d74e",
"deployed_at": "2019-08-24T14:15:22Z",
"deployed_instance_id": "5d02be4a-43b3-42f1-9872-f2bfe2e6f121",
"faq": [],
"features": [],
"hero_cta_text": "string",
"hero_subtitle": "string",
"hero_title": "string",
"id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
"instance_id": "06587974-2dbe-4e10-8bf9-38cce0f5a366",
"is_primary": true,
"pricing_currency": "USD",
"pricing_plans": [],
"robots_txt_custom": "string",
"seo_description": "string",
"seo_keywords": "string",
"seo_og_image_url": "string",
"seo_title": "string",
"sitemap_enabled": true,
"status": "draft",
"stripe_connect_account_id": "string",
"stripe_publishable_key": "string",
"template_id": "c6d67e98-83ea-49f0-8812-e4abae2b68bc",
"tenant_id": "34f5c98e-f430-457b-a812-92637d0c6fd0",
"testimonials": [],
"trial_days": 14,
"updated_at": "2019-08-24T14:15:22Z"
}
]{
"detail": [
{
"loc": [
"string"
],
"msg": "string",
"type": "string"
}
]
}Update Website Config Legacy
Legacy: update the tenant's most recent website config.
Backwards compat for /dashboard/website page. Picks the newest config. New code should use PUT /v1/instances/{id}/website instead.
"I'm not dead yet!" — Plague victim, Monty Python and the Holy Grail (about legacy endpoints that refuse to die)
In: header
Header Parameters
Response Body
curl -X PUT "https://loading/v1/website" \ -H "X-Api-Key: string" \ -H "Content-Type: application/json" \ -d '{}'{
"content_mode": "bundle",
"created_at": "2019-08-24T14:15:22Z",
"custom_upload_id": "32c143b7-3420-4cb9-8ea3-6d8d9a659ee2",
"customer_id": "160c0c4b-9966-4dc1-a916-8407eb10d74e",
"deployed_at": "2019-08-24T14:15:22Z",
"deployed_instance_id": "5d02be4a-43b3-42f1-9872-f2bfe2e6f121",
"faq": [],
"features": [],
"hero_cta_text": "string",
"hero_subtitle": "string",
"hero_title": "string",
"id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
"instance_id": "06587974-2dbe-4e10-8bf9-38cce0f5a366",
"is_primary": true,
"pricing_currency": "USD",
"pricing_plans": [],
"robots_txt_custom": "string",
"seo_description": "string",
"seo_keywords": "string",
"seo_og_image_url": "string",
"seo_title": "string",
"sitemap_enabled": true,
"status": "draft",
"stripe_connect_account_id": "string",
"stripe_publishable_key": "string",
"template_id": "c6d67e98-83ea-49f0-8812-e4abae2b68bc",
"tenant_id": "34f5c98e-f430-457b-a812-92637d0c6fd0",
"testimonials": [],
"trial_days": 14,
"updated_at": "2019-08-24T14:15:22Z"
}{
"detail": [
{
"loc": [
"string"
],
"msg": "string",
"type": "string"
}
]
}Deploy Website
Deploy a website by creating a new VPS instance.
Creates a NEW instance with website template + brand config injected. For the first deploy or when no instance_id is in the body, creates an unlinked config then provisions. The provisioning callback links them.
"Yippee-ki-yay." — John McClane, Die Hard (what every reseller says when their branded site goes live)
In: header
Header Parameters
"support_agent"Response Body
curl -X POST "https://loading/v1/website/deploy" \ -H "X-Api-Key: string" \ -H "Content-Type: application/json" \ -d '{ "region_id": "string", "tier_id": "string" }'{
"instance_id": "06587974-2dbe-4e10-8bf9-38cce0f5a366",
"message": "string",
"status": "string",
"website_config_id": "c0aa0662-77a9-4227-8f52-c7a29b8a3ad3"
}{
"detail": [
{
"loc": [
"string"
],
"msg": "string",
"type": "string"
}
]
}Preview Website Legacy
Legacy: preview the tenant's most recent website config.
Backwards compat for /dashboard/website page. New code should use GET /v1/instances/{id}/website/preview.
"What we've got here is failure to communicate." — Captain, Cool Hand Luke (about legacy endpoints that still need to work)
In: header
Header Parameters
Response Body
curl -X GET "https://loading/v1/website/preview" \ -H "X-Api-Key: string"{
"brand": {},
"content": {},
"content_mode": "bundle",
"custom_upload": false,
"pricing": {},
"seo": {},
"template_name": "string",
"template_slug": "string"
}{
"detail": [
{
"loc": [
"string"
],
"msg": "string",
"type": "string"
}
]
}Upload Custom Site
Upload a custom website archive (zip or tarball).
Admin only. Max 100MB. Archive is validated synchronously before persistence — bad uploads are rejected immediately, nothing hits R2 or the database until structural checks pass. Supported: .zip, .tar.gz, .tgz
"I'll be back." — T-800 (after uploading a custom site)
In: header
Header Parameters
binaryResponse Body
curl -X POST "https://loading/v1/website/upload" \ -H "X-Api-Key: string" \ -F file="string"{
"content_type": "string",
"created_at": "2019-08-24T14:15:22Z",
"detected_framework": "string",
"filename": "string",
"has_index_html": true,
"has_package_json": true,
"id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
"is_active": true,
"preview_url": "string",
"scan_findings": [],
"scan_status": "pending",
"scan_threat_level": "string",
"sha256_hash": "string",
"size_bytes": 0,
"tenant_id": "34f5c98e-f430-457b-a812-92637d0c6fd0",
"validation_errors": [],
"validation_status": "string"
}{
"detail": [
{
"loc": [
"string"
],
"msg": "string",
"type": "string"
}
]
}List Uploads
List the current tenant's custom site uploads.
In: header
Header Parameters
Response Body
curl -X GET "https://loading/v1/website/uploads" \ -H "X-Api-Key: string"[
{
"content_type": "string",
"created_at": "2019-08-24T14:15:22Z",
"detected_framework": "string",
"filename": "string",
"has_index_html": true,
"has_package_json": true,
"id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
"is_active": true,
"preview_url": "string",
"scan_findings": [],
"scan_status": "pending",
"scan_threat_level": "string",
"sha256_hash": "string",
"size_bytes": 0,
"tenant_id": "34f5c98e-f430-457b-a812-92637d0c6fd0",
"validation_errors": [],
"validation_status": "string"
}
]{
"detail": [
{
"loc": [
"string"
],
"msg": "string",
"type": "string"
}
]
}