{"openapi":"3.1.0","info":{"title":"InstantDeploy.site API","description":"Agent-first hosting: POST a zip of static files, get a live URL at `https://<slug>.instantdeploy.site` in ~2 seconds.\n\n**Auth modes**\n- Anonymous: no header needed. Deploys expire after 24 hours.\n- API key: `Authorization: Bearer <api_key>`. Deploys are permanent and claimed to your account. Works on `/v1/ship`, `/v1/auth/me`, and all `/v1/dashboard/*` endpoints.\n\n**Quickstart**\n```\ncurl -X POST \"https://api.instantdeploy.site/v1/ship\" \\\n  -F \"file=@site.zip;type=application/zip\"\n```\n\nAgent guide: https://instantdeploy.site/llms.txt · CLI: `curl -fsSL https://instantdeploy.site/install.sh | bash`","version":"1.1.0"},"servers":[{"url":"https://api.instantdeploy.site","description":"Production"}],"paths":{"/v1/ship":{"post":{"tags":["deployments"],"summary":"Ship","description":"Accept a file upload and create a deployment.\n\nAccepts multipart/form-data with a ZIP or Gzip archive (max 100MB).\nOptional `visibility` field: \"public\" (default, shown in the live feed)\nor \"unlisted\" (anyone with the link; excluded from the feed, noindexed).\nReturns the deployment URL, slug, and creation timestamp.","operationId":"ship_v1_ship_post","requestBody":{"content":{"multipart/form-data":{"schema":{"$ref":"#/components/schemas/Body_ship_v1_ship_post"}}},"required":true},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/v1/publish":{"post":{"tags":["deployments"],"summary":"Start Publish","description":"Reserve a deployment and get a presigned upload URL.\n\nPUT your zip to `upload_url` (header `x-ms-blob-type: BlockBlob`), then\ncall POST /v1/publish/{slug}/finalize with the returned `publish_token`.\nThe URL expires after 30 minutes.","operationId":"start_publish_v1_publish_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublishRequest"}}},"required":true},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/publish/{slug}/finalize":{"post":{"tags":["deployments"],"summary":"Finalize Publish","description":"Process a staged upload into a live deployment.","operationId":"finalize_publish_v1_publish__slug__finalize_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string","title":"Slug"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/FinalizeRequest"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/deployments":{"get":{"tags":["deployments"],"summary":"List Deployments","description":"Retrieve recent deployments for the homepage feed.","operationId":"list_deployments_v1_deployments_get","parameters":[{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":50,"title":"Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/remix/{slug}":{"get":{"tags":["remix"],"summary":"Get Remix Files","description":"Retrieve original files from blob storage for remix functionality.","operationId":"get_remix_files_v1_remix__slug__get","parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string","title":"Slug"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/auth/signup":{"post":{"tags":["auth"],"summary":"Signup","description":"Create account with email and password, then sign in.","operationId":"signup_v1_auth_signup_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SignupRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/auth/login":{"post":{"tags":["auth"],"summary":"Login","description":"Sign in with email and password.","operationId":"login_v1_auth_login_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/LoginRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/auth/verify-email":{"post":{"tags":["auth"],"summary":"Verify Email","description":"Confirm an email-verification token and mark the account verified.","operationId":"verify_email_v1_auth_verify_email_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/VerifyEmailRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/auth/resend-verification":{"post":{"tags":["auth"],"summary":"Resend Verification","description":"Send a fresh verification link to the signed-in user's email.","operationId":"resend_verification_v1_auth_resend_verification_post","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"session","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Session"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/auth/me":{"get":{"tags":["auth"],"summary":"Me","description":"Return the authenticated user's basic profile.","operationId":"me_v1_auth_me_get","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"session","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Session"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/auth/sign-out":{"post":{"tags":["auth"],"summary":"Sign Out","description":"Sign out by clearing the session cookie.","operationId":"sign_out_v1_auth_sign_out_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/v1/dashboard/sites":{"get":{"tags":["dashboard"],"summary":"List Sites","description":"List deployments owned by the authenticated user.","operationId":"list_sites_v1_dashboard_sites_get","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"session","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Session"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/dashboard/sites/{slug}/analytics":{"get":{"tags":["dashboard"],"summary":"Site Analytics","description":"Daily view counts for one of your sites (last 30 days).","operationId":"site_analytics_v1_dashboard_sites__slug__analytics_get","parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string","title":"Slug"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"session","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Session"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/dashboard/sites/{slug}/visibility":{"patch":{"tags":["dashboard"],"summary":"Set Site Visibility","description":"Toggle one of your sites between public (in the feed) and unlisted.\n\nNote: the robots-noindex tag is baked into HTML at ship time, so\ntoggling here changes feed listing immediately but search-engine\nhints only change on the next deploy.","operationId":"set_site_visibility_v1_dashboard_sites__slug__visibility_patch","parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string","title":"Slug"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"session","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Session"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/VisibilityRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/dashboard/me":{"get":{"tags":["dashboard"],"summary":"Dashboard Me","description":"Return authenticated user profile for dashboard.","operationId":"dashboard_me_v1_dashboard_me_get","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"session","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Session"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/dashboard/regenerate-api-key":{"post":{"tags":["dashboard"],"summary":"Regenerate Api Key","description":"Generate a new random API key for the authenticated user.","operationId":"regenerate_api_key_v1_dashboard_regenerate_api_key_post","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"session","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Session"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/dashboard/set-api-key":{"post":{"tags":["dashboard"],"summary":"Set Api Key","description":"Set a custom API key. Must be 24-64 chars, url-safe (A-Za-z0-9_-).","operationId":"set_api_key_v1_dashboard_set_api_key_post","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"session","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Session"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SetApiKeyRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/dashboard/api-keys":{"get":{"tags":["dashboard"],"summary":"List Api Keys","description":"List the user's named API keys. Key values are shown truncated.","operationId":"list_api_keys_v1_dashboard_api_keys_get","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"session","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Session"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["dashboard"],"summary":"Create Api Key","description":"Create a named API key. The full key is returned only once.","operationId":"create_api_key_v1_dashboard_api_keys_post","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"session","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Session"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateApiKeyRequest"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/dashboard/api-keys/{key_id}":{"delete":{"tags":["dashboard"],"summary":"Revoke Api Key","description":"Revoke a named API key. Revocation is immediate and permanent.","operationId":"revoke_api_key_v1_dashboard_api_keys__key_id__delete","parameters":[{"name":"key_id","in":"path","required":true,"schema":{"type":"string","title":"Key Id"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"session","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Session"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/dashboard/claim":{"post":{"tags":["dashboard"],"summary":"Claim Deployment","description":"Claim an anonymous deployment using the 6-char claim code.\n\nThe deployment is linked to the current user's account and will\nno longer expire after 24 hours.","operationId":"claim_deployment_v1_dashboard_claim_post","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"session","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Session"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ClaimRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/report":{"post":{"tags":["report"],"summary":"Report Site","description":"Report a deployed site for abuse (phishing, malware, illegal content, ...).\n\nNo authentication required. Reports are reviewed by admins, who can take\nthe site down. Valid reasons: phishing, malware, illegal, spam,\ncopyright, other.","operationId":"report_site_v1_report_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ReportRequest"}}},"required":true},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/dashboard/domains":{"get":{"tags":["domains"],"summary":"List Domains","description":"List the user's custom domains with their DNS instructions.","operationId":"list_domains_v1_dashboard_domains_get","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"session","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Session"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["domains"],"summary":"Add Domain","description":"Map a domain you own to one of your deployments.\n\nReturns the two DNS records to add: a TXT record proving ownership and\nan A record pointing the domain at InstantDeploy. Verify with\nPOST /v1/dashboard/domains/{id}/verify once DNS propagates.","operationId":"add_domain_v1_dashboard_domains_post","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"session","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Session"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateDomainRequest"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/dashboard/domains/{domain_id}/verify":{"post":{"tags":["domains"],"summary":"Verify Domain","description":"Check the ownership TXT record and activate the domain.","operationId":"verify_domain_v1_dashboard_domains__domain_id__verify_post","parameters":[{"name":"domain_id","in":"path","required":true,"schema":{"type":"string","title":"Domain Id"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"session","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Session"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/dashboard/domains/{domain_id}":{"delete":{"tags":["domains"],"summary":"Remove Domain","description":"Remove a domain mapping. The domain stops serving immediately.","operationId":"remove_domain_v1_dashboard_domains__domain_id__delete","parameters":[{"name":"domain_id","in":"path","required":true,"schema":{"type":"string","title":"Domain Id"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}},{"name":"session","in":"cookie","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Session"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/stats":{"get":{"tags":["admin"],"summary":"Get Stats","description":"Return platform overview statistics.","operationId":"get_stats_admin_stats_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"HTTPBearer":[]}]}},"/admin/deployments":{"get":{"tags":["admin"],"summary":"List Deployments","description":"Return a paginated list of deployments with optional status filter.","operationId":"list_deployments_admin_deployments_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":200,"minimum":1,"default":50,"title":"Limit"}},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","minimum":0,"default":0,"title":"Offset"}},{"name":"status","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Status"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/deployments/{slug}":{"get":{"tags":["admin"],"summary":"Get Deployment Detail","description":"Return full detail for a single deployment.","operationId":"get_deployment_detail_admin_deployments__slug__get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string","title":"Slug"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["admin"],"summary":"Delete Deployment","description":"Force-delete a deployment: blobs first, then metadata.","operationId":"delete_deployment_admin_deployments__slug__delete","security":[{"HTTPBearer":[]}],"parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string","title":"Slug"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/activity":{"get":{"tags":["admin"],"summary":"Get Activity","description":"Return recent platform activity.","operationId":"get_activity_admin_activity_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":200,"minimum":1,"default":50,"title":"Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/storage":{"get":{"tags":["admin"],"summary":"Get Storage","description":"Return storage analytics. Times out after 20s to avoid hanging.","operationId":"get_storage_admin_storage_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"slug","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Slug"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/rate-limits":{"get":{"tags":["admin"],"summary":"Get Rate Limits","description":"Return rate limit status for all tracked IPs.","operationId":"get_rate_limits_admin_rate_limits_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"above_threshold","in":"query","required":false,"schema":{"anyOf":[{"type":"integer","maximum":100,"minimum":0},{"type":"null"}],"title":"Above Threshold"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/users":{"get":{"tags":["admin"],"summary":"List Users","description":"All accounts with verification state and deploy counts, newest first.","operationId":"list_users_admin_users_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":500,"minimum":1,"default":100,"title":"Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/emails":{"get":{"tags":["admin"],"summary":"List Emails","description":"Automated email send log (verification etc.), newest first.","operationId":"list_emails_admin_emails_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":500,"minimum":1,"default":100,"title":"Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/analytics":{"get":{"tags":["admin"],"summary":"Platform Analytics","description":"Platform-wide view analytics: totals and top sites.","operationId":"platform_analytics_admin_analytics_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"HTTPBearer":[]}]}},"/admin/reports":{"get":{"tags":["admin"],"summary":"List Reports","description":"List abuse reports, newest first. Filter with ?status=open|resolved.","operationId":"list_reports_admin_reports_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"status","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Status"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":200,"minimum":1,"default":50,"title":"Limit"}},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","minimum":0,"default":0,"title":"Offset"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/reports/{report_id}/resolve":{"post":{"tags":["admin"],"summary":"Resolve Report","description":"Close a report. action=takedown deletes the site's blobs; action=dismiss just closes it.","operationId":"resolve_report_admin_reports__report_id__resolve_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"report_id","in":"path","required":true,"schema":{"type":"string","title":"Report Id"}},{"name":"action","in":"query","required":true,"schema":{"type":"string","pattern":"^(takedown|dismiss)$","title":"Action"}},{"name":"note","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Note"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/deployments/{slug}/expire":{"post":{"tags":["admin"],"summary":"Expire Deployment","description":"Force-expire a deployment: delete blobs but keep metadata.","operationId":"expire_deployment_admin_deployments__slug__expire_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string","title":"Slug"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/":{"get":{"summary":"Root","operationId":"root__get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/health":{"get":{"summary":"Health","operationId":"health_health_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/health/db":{"get":{"summary":"Health Db","description":"Database health check endpoint.","operationId":"health_db_health_db_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/health/storage":{"get":{"summary":"Health Storage","description":"Azure Blob Storage health check.","operationId":"health_storage_health_storage_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}}},"components":{"schemas":{"Body_ship_v1_ship_post":{"properties":{"file":{"type":"string","format":"binary","title":"File"},"visibility":{"type":"string","title":"Visibility","default":"public"}},"type":"object","required":["file"],"title":"Body_ship_v1_ship_post"},"ClaimRequest":{"properties":{"claim_code":{"type":"string","title":"Claim Code"}},"type":"object","required":["claim_code"],"title":"ClaimRequest"},"CreateApiKeyRequest":{"properties":{"name":{"type":"string","title":"Name"}},"type":"object","required":["name"],"title":"CreateApiKeyRequest"},"CreateDomainRequest":{"properties":{"domain":{"type":"string","title":"Domain"},"slug":{"type":"string","title":"Slug"}},"type":"object","required":["domain","slug"],"title":"CreateDomainRequest"},"FinalizeRequest":{"properties":{"publish_token":{"type":"string","title":"Publish Token"}},"type":"object","required":["publish_token"],"title":"FinalizeRequest"},"HTTPValidationError":{"properties":{"detail":{"items":{"$ref":"#/components/schemas/ValidationError"},"type":"array","title":"Detail"}},"type":"object","title":"HTTPValidationError"},"LoginRequest":{"properties":{"email":{"type":"string","format":"email","title":"Email"},"password":{"type":"string","title":"Password"}},"type":"object","required":["email","password"],"title":"LoginRequest"},"PublishRequest":{"properties":{"filename":{"type":"string","maxLength":255,"title":"Filename","default":"site.zip"},"file_size_bytes":{"type":"integer","exclusiveMinimum":0.0,"title":"File Size Bytes"},"visibility":{"type":"string","title":"Visibility","default":"public"}},"type":"object","required":["file_size_bytes"],"title":"PublishRequest"},"ReportRequest":{"properties":{"slug":{"type":"string","maxLength":64,"minLength":1,"title":"Slug"},"reason":{"type":"string","title":"Reason"},"details":{"anyOf":[{"type":"string","maxLength":2000},{"type":"null"}],"title":"Details"}},"type":"object","required":["slug","reason"],"title":"ReportRequest"},"SetApiKeyRequest":{"properties":{"api_key":{"type":"string","title":"Api Key"}},"type":"object","required":["api_key"],"title":"SetApiKeyRequest"},"SignupRequest":{"properties":{"email":{"type":"string","format":"email","title":"Email"},"password":{"type":"string","title":"Password"}},"type":"object","required":["email","password"],"title":"SignupRequest"},"ValidationError":{"properties":{"loc":{"items":{"anyOf":[{"type":"string"},{"type":"integer"}]},"type":"array","title":"Location"},"msg":{"type":"string","title":"Message"},"type":{"type":"string","title":"Error Type"}},"type":"object","required":["loc","msg","type"],"title":"ValidationError"},"VerifyEmailRequest":{"properties":{"token":{"type":"string","title":"Token"}},"type":"object","required":["token"],"title":"VerifyEmailRequest"},"VisibilityRequest":{"properties":{"visibility":{"type":"string","title":"Visibility"}},"type":"object","required":["visibility"],"title":"VisibilityRequest"}},"securitySchemes":{"HTTPBearer":{"type":"http","scheme":"bearer"}}},"tags":[{"name":"ship","description":"Deploy static sites"},{"name":"deployments","description":"Public feed of recent deployments"},{"name":"remix","description":"Fetch a deployment's files for remixing"},{"name":"auth","description":"Signup, login, and account info"},{"name":"dashboard","description":"Your sites, API keys, and claims (session cookie or Bearer API key)"},{"name":"admin","description":"Platform administration (admin key required)"}]}