Skip to main content

Documentation Index

Fetch the complete documentation index at: https://docs.simplehost.dev/llms.txt

Use this file to discover all available pages before exploring further.

Error Response Format

All API errors return JSON with a consistent structure. Error messages are written in a conversational tone — they tell you what went wrong and often include a hint field with a suggestion for how to fix it.
{
  "error": "You've hit the limit of 1 custom domain(s) on your current plan. Remove one or upgrade for more.",
  "code": "PLAN_LIMIT",
  "status": 403,
  "hint": "Upgrade to Hobby ($5/mo) for 5 domains."
}
Some errors also include contextual fields like upgrade with actionable next steps (e.g., a checkout endpoint to call). Some publishing errors also include structured remediation details so an agent can recover safely.

Error Codes

CodeHTTP StatusDescription
INVALID_REQUEST400Request validation failed — missing or invalid fields
INVALID_PATH400File path validation failed (contains .., starts with /, etc.)
INVALID_HASH400Hash is not a valid 64-character lowercase hex string
UNAUTHORIZED401Missing, invalid, or expired API key
NOT_FOUND404Resource not found or not owned by the authenticated user
RATE_LIMITED429Rate limit exceeded — check X-RateLimit-Reset header
FILE_TOO_LARGE413Individual file exceeds plan limit (250 MB free, 5 GB hobby)
STORAGE_EXCEEDED413Total storage quota exceeded (10 GB free, 100 GB hobby)
SITE_LIMIT_EXCEEDED403Maximum site count reached (500 for free plan)
PLAN_LIMIT403Feature not available on current plan
SECRET_DETECTED400Finalize found exposed private keys or secrets in files that would be publicly visible
INTERNAL_ERROR500Unexpected server error

Common Scenarios

Invalid API Key

{
  "error": "Invalid API key",
  "code": "UNAUTHORIZED",
  "status": 401
}
Fix: Check that your API key starts with sh_live_ and is complete (no truncation).

Rate Limited

{
  "error": "Rate limit exceeded. Try again later.",
  "code": "RATE_LIMITED",
  "status": 429
}
Fix: Wait until the time indicated by the X-RateLimit-Reset header. See Rate Limits.

Storage Exceeded

{
  "error": "Storage quota exceeded. Current usage: 9.8 GB of 10 GB.",
  "code": "STORAGE_EXCEEDED",
  "status": 413
}
Fix: Delete unused sites to free storage, or upgrade to the Hobby plan for 100 GB.

File Path Invalid

{
  "error": "Invalid file path: ../etc/passwd",
  "code": "INVALID_PATH",
  "status": 400
}
Fix: File paths must be relative (no leading /), cannot contain .., and must be under 500 characters.

Exposed Secret Detected During Publish

{
  "error": "We detected what looks like exposed secret material in files that would be publicly accessible after publish.",
  "code": "SECRET_DETECTED",
  "status": 400,
  "detectedSecrets": [
    {
      "path": "app.js",
      "type": "openai_api_key",
      "line": 22,
      "suggestedVariableName": "OPENAI_API_KEY",
      "suggestedProxyHosts": ["api.openai.com"]
    }
  ],
  "remediation": {
    "suggestedVariableNames": ["OPENAI_API_KEY"],
    "suggestedProxyHosts": ["api.openai.com"],
    "steps": [
      "Ask the user for permission to secure the key before publishing.",
      "Store the key as a site variable.",
      "Approve the required outbound host.",
      "Update only the published output to use the site proxy.",
      "Retry the publish."
    ]
  }
}
Fix: Do not publish the site as-is. Ask the user for permission, move the secret into Site Variables, approve the destination in Proxy Host Allowlist, update only the published output to use the Site Proxy, and then retry finalize.