HydraCore
API by router

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)

GET
/v1/instances/{instance_id}/website
AuthorizationBearer <token>

In: header

Path Parameters

instance_idInstance Id
Formatuuid

Header Parameters

X-Api-Key?X-Api-Key

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)

PUT
/v1/instances/{instance_id}/website
AuthorizationBearer <token>

In: header

Path Parameters

instance_idInstance Id
Formatuuid

Header Parameters

X-Api-Key?X-Api-Key
content_mode?Content Mode
custom_upload_id?Custom Upload Id
customer_id?Customer Id
faq?Faq
features?Features
hero_cta_text?Hero Cta Text
hero_subtitle?Hero Subtitle
hero_title?Hero Title
is_primary?Is Primary
pricing_currency?Pricing Currency
pricing_plans?Pricing Plans
robots_txt_custom?Robots Txt Custom
seo_description?Seo Description
seo_keywords?Seo Keywords
seo_og_image_url?Seo Og Image Url
seo_title?Seo Title
sitemap_enabled?Sitemap Enabled
stripe_connect_account_id?Stripe Connect Account Id
stripe_publishable_key?Stripe Publishable Key
template_id?Template Id
testimonials?Testimonials
trial_days?Trial Days

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)

POST
/v1/instances/{instance_id}/website/deploy
AuthorizationBearer <token>

In: header

Path Parameters

instance_idInstance Id
Formatuuid

Header Parameters

X-Api-Key?X-Api-Key

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

GET
/v1/instances/{instance_id}/website/history
AuthorizationBearer <token>

In: header

Path Parameters

instance_idInstance Id
Formatuuid

Header Parameters

X-Api-Key?X-Api-Key

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)

GET
/v1/instances/{instance_id}/website/preview
AuthorizationBearer <token>

In: header

Path Parameters

instance_idInstance Id
Formatuuid

Header Parameters

X-Api-Key?X-Api-Key

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

POST
/v1/instances/{instance_id}/website/rollback
AuthorizationBearer <token>

In: header

Path Parameters

instance_idInstance Id
Formatuuid

Header Parameters

X-Api-Key?X-Api-Key
git_ref?Git Ref
release_id?Release Id

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)

POST
/v1/instances/{instance_id}/website/upload
AuthorizationBearer <token>

In: header

Path Parameters

instance_idInstance Id
Formatuuid

Header Parameters

X-Api-Key?X-Api-Key
fileFile
Formatbinary

Response 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

GET
/v1/instances/{instance_id}/website/uploads
AuthorizationBearer <token>

In: header

Path Parameters

instance_idInstance Id
Formatuuid

Header Parameters

X-Api-Key?X-Api-Key

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)

GET
/v1/website
AuthorizationBearer <token>

In: header

Query Parameters

customer_id?Customer Id

Filter by customer owner

Header Parameters

X-Api-Key?X-Api-Key

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)

PUT
/v1/website
AuthorizationBearer <token>

In: header

Header Parameters

X-Api-Key?X-Api-Key
content_mode?Content Mode
custom_upload_id?Custom Upload Id
customer_id?Customer Id
faq?Faq
features?Features
hero_cta_text?Hero Cta Text
hero_subtitle?Hero Subtitle
hero_title?Hero Title
is_primary?Is Primary
pricing_currency?Pricing Currency
pricing_plans?Pricing Plans
robots_txt_custom?Robots Txt Custom
seo_description?Seo Description
seo_keywords?Seo Keywords
seo_og_image_url?Seo Og Image Url
seo_title?Seo Title
sitemap_enabled?Sitemap Enabled
stripe_connect_account_id?Stripe Connect Account Id
stripe_publishable_key?Stripe Publishable Key
template_id?Template Id
testimonials?Testimonials
trial_days?Trial Days

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)

POST
/v1/website/deploy
AuthorizationBearer <token>

In: header

Header Parameters

X-Api-Key?X-Api-Key
instance_id?Instance Id
preset_id?Preset Id
Default"support_agent"
region_idRegion Id
tier_idTier Id

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)

GET
/v1/website/preview
AuthorizationBearer <token>

In: header

Header Parameters

X-Api-Key?X-Api-Key

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)

POST
/v1/website/upload
AuthorizationBearer <token>

In: header

Header Parameters

X-Api-Key?X-Api-Key
fileFile
Formatbinary

Response 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.

GET
/v1/website/uploads
AuthorizationBearer <token>

In: header

Header Parameters

X-Api-Key?X-Api-Key

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"
    }
  ]
}