> For the complete documentation index, see [llms.txt](https://docs.statuspal.io/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://docs.statuspal.io/platform/api-reference/status-pages.md).

# Status Pages

Manage your organization's status pages — create, update, delete, and configure custom domains.

### Custom Domains

You can serve your status page on a custom domain (e.g. `status.example.com`) by configuring the `domain_config` object on a status page. StatusPal supports two CDN providers: **Cloudflare** and **Bunny**.

#### Setup flow

**1. Enable the custom domain:** Update the status page with `domain_config.provider` and `domain_config.domain`:

```bash
curl -X PUT \
  https://statuspal.eu/api/v2/orgs/{organizationId}/status_pages/{subdomain} \
  -H 'Authorization: <your-api-key>' \
  -H 'Content-Type: application/json' \
  -d '{
    "status_page": {
      "domain_config": {
        "provider": "cloudflare",
        "domain": "status.example.com"
      }
    }
  }'
```

StatusPal begins provisioning the domain asynchronously. The `domain_config.status` field starts as `configuring`.

**2. Retrieve DNS records:** Poll `GET /orgs/{organizationId}/status_pages/{subdomain}` until `domain_config.validation_records` is populated (typically a few seconds). The records you need depend on the provider:

| Provider       | Records required                                                                                                                                                                                                         |
| -------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
| **Cloudflare** | 1 CNAME (`hostname_cname_name` → `hostname_cname_value`), 1 TXT for hostname verification (`hostname_txt_name` / `hostname_txt_value`), and 1 TXT for SSL certificate (`certificate_txt_name` / `certificate_txt_value`) |
| **Bunny**      | 1 CNAME (`hostname_cname_name` → `hostname_cname_value`)                                                                                                                                                                 |

> **Note:** For the Cloudflare provider, the `certificate_txt_*` fields may not appear immediately. Poll every 10–15 seconds until they are present.

> **Note:** For the Bunny provider, the `hostname_cname_value` field may be empty on the initial response while the pull zone is being created. Poll every 2–5 seconds until it is populated (typically a few seconds).

**3. Create DNS records:** Add the records at your DNS provider. If your DNS provider is Cloudflare, make sure the CNAME has **proxy disabled** (DNS-only / grey cloud).

**4. Wait for activation:** Poll the status page until `domain_config.status` becomes `active`. This typically takes 1–10 minutes.

#### Removing a custom domain

Set `domain_config.provider` and `domain_config.domain` to `null`:

```bash
curl -X PUT \
  https://statuspal.eu/api/v2/orgs/{organizationId}/status_pages/{subdomain} \
  -H 'Authorization: <your-api-key>' \
  -H 'Content-Type: application/json' \
  -d '{
    "status_page": {
      "domain_config": {
        "provider": null,
        "domain": null
      }
    }
  }'
```

#### Retrying a failed configuration

If `domain_config.status` is `failed_to_configure`, re-submit the same `domain_config` to restart provisioning.

#### Changing the domain

Update `domain_config.domain` to the new value. StatusPal will revoke the old domain's certificate and begin provisioning the new one. Follow steps 2–4 again.

#### Domain status values

| Status                | Meaning                                                   |
| --------------------- | --------------------------------------------------------- |
| `disabled`            | No custom domain configured.                              |
| `configuring`         | Provisioning in progress or waiting for DNS verification. |
| `active`              | Domain is live with SSL.                                  |
| `failed_to_configure` | Setup failed — check `domain_config.error` for details.   |

## GET /orgs/{organizationId}/status\_pages

> List status pages

````json
{"openapi":"3.0.1","info":{"title":"StatusPal API Reference","version":"2.0.0"},"tags":[{"name":"Status Pages","description":"Manage your organization's status pages — create, update, delete, and configure custom domains.\n\n## Custom Domains\n\nYou can serve your status page on a custom domain (e.g. `status.example.com`) by configuring the `domain_config` object on a status page. StatusPal supports two CDN providers: **Cloudflare** and **Bunny**.\n\n### Setup flow\n\n**1. Enable the custom domain:** Update the status page with `domain_config.provider` and `domain_config.domain`:\n\n```bash\ncurl -X PUT \\\n  https://statuspal.eu/api/v2/orgs/{organizationId}/status_pages/{subdomain} \\\n  -H 'Authorization: <your-api-key>' \\\n  -H 'Content-Type: application/json' \\\n  -d '{\n    \"status_page\": {\n      \"domain_config\": {\n        \"provider\": \"cloudflare\",\n        \"domain\": \"status.example.com\"\n      }\n    }\n  }'\n```\n\nStatusPal begins provisioning the domain asynchronously. The `domain_config.status` field starts as `configuring`.\n\n**2. Retrieve DNS records:** Poll `GET /orgs/{organizationId}/status_pages/{subdomain}` until `domain_config.validation_records` is populated (typically a few seconds). The records you need depend on the provider:\n\n| Provider | Records required |\n|---|---|\n| **Cloudflare** | 1 CNAME (`hostname_cname_name` → `hostname_cname_value`), 1 TXT for hostname verification (`hostname_txt_name` / `hostname_txt_value`), and 1 TXT for SSL certificate (`certificate_txt_name` / `certificate_txt_value`) |\n| **Bunny** | 1 CNAME (`hostname_cname_name` → `hostname_cname_value`) |\n\n> **Note:** For the Cloudflare provider, the `certificate_txt_*` fields may not appear immediately. Poll every 10–15 seconds until they are present.\n\n> **Note:** For the Bunny provider, the `hostname_cname_value` field may be empty on the initial response while the pull zone is being created. Poll every 2–5 seconds until it is populated (typically a few seconds).\n\n**3. Create DNS records:** Add the records at your DNS provider. If your DNS provider is Cloudflare, make sure the CNAME has **proxy disabled** (DNS-only / grey cloud).\n\n**4. Wait for activation:** Poll the status page until `domain_config.status` becomes `active`. This typically takes 1–10 minutes.\n\n### Removing a custom domain\n\nSet `domain_config.provider` and `domain_config.domain` to `null`:\n\n```bash\ncurl -X PUT \\\n  https://statuspal.eu/api/v2/orgs/{organizationId}/status_pages/{subdomain} \\\n  -H 'Authorization: <your-api-key>' \\\n  -H 'Content-Type: application/json' \\\n  -d '{\n    \"status_page\": {\n      \"domain_config\": {\n        \"provider\": null,\n        \"domain\": null\n      }\n    }\n  }'\n```\n\n### Retrying a failed configuration\n\nIf `domain_config.status` is `failed_to_configure`, re-submit the same `domain_config` to restart provisioning.\n\n### Changing the domain\n\nUpdate `domain_config.domain` to the new value. StatusPal will revoke the old domain's certificate and begin provisioning the new one. Follow steps 2–4 again.\n\n### Domain status values\n\n| Status | Meaning |\n|---|---|\n| `disabled` | No custom domain configured. |\n| `configuring` | Provisioning in progress or waiting for DNS verification. |\n| `active` | Domain is live with SSL. |\n| `failed_to_configure` | Setup failed — check `domain_config.error` for details. |\n"}],"servers":[{"url":"https://statuspal.io/api/v2"},{"url":"https://statuspal.eu/api/v2"}],"security":[{"api_key":[]}],"components":{"securitySchemes":{"api_key":{"type":"apiKey","name":"Authorization","in":"header"}},"parameters":{"OrganizationId":{"name":"organizationId","in":"path","description":"The ID of the organization","required":true,"schema":{"type":"integer"}}},"schemas":{"OrganizationStatusPage":{"description":"Represents the Status Page.","type":"object","required":["name","url","time_zone"],"properties":{"organization_id":{"type":"integer","readOnly":true},"inserted_at":{"type":"string","description":"Datetime at which the record was inserted","format":"date-time","readOnly":true},"updated_at":{"type":"string","description":"Datetime at which the record was last updated","format":"date-time","readOnly":true},"name":{"type":"string","description":"Company, project or service name."},"url":{"type":"string","description":"The website to your company, project or service."},"time_zone":{"type":"string","description":"The primary timezone the status page uses to display incidents (e.g. \"Europe/Berlin\")."},"subdomain":{"type":"string","description":"Subdomain on statuspal."},"support_email":{"type":"string","description":"Your company's support email."},"twitter_public_screen_name":{"type":"string","nullable":true,"description":"Twitter handle name (e.g. yourcompany)."},"about":{"type":"string","nullable":true,"description":"Customize the about information displayed in your status page."},"display_about":{"type":"boolean","description":"Display about information."},"domain_config":{"type":"object","description":"Custom domain configuration. Set `provider` and `domain` to enable a custom domain,\nthen poll until `status` becomes `active`. See the [Status Pages tag description](#tag/Status-Pages)\nfor a step-by-step setup guide.\n","properties":{"provider":{"type":"string","enum":["cloudflare","bunny"],"description":"* `cloudflare`: provided by [Cloudflare](https://www.cloudflare.com)\n* `bunny`: provided by [Bunny.net](https://bunny.net)\n"},"domain":{"type":"string","description":"The custom domain name."},"previous_domain":{"type":"string","description":"The previous custom domain name.","readOnly":true},"status":{"type":"string","enum":["disabled","configuring","failed_to_configure","active"],"readOnly":true,"description":"* `disabled`: The custom domain is disabled.\n* `configuring`: We are configuring the custom domain.\n* `failed_to_configure`: Failed to configure the custom domain.\n* `active`: The custom domain is active.\n"},"validation_records":{"description":"To activate the custom hostname domain, please create a CNAME DNS record.\n* **Cloudflare**: As soon as the TXT listed, the SSL certificates will be issued and deployed. Please allow a few minutes after the TXT record has been added before attempting to connect via HTTPS.\n* **Bunny.net**: After the domain is activated, it will be automatically configured with SSL and linked to this Pull Zone.\n\n**Note (Bunny):** The `hostname_cname_value` field may be empty on the initial response while the pull zone is being created. Poll every 2–5 seconds until it is populated (typically a few seconds).\n","type":"object","readOnly":true,"properties":{"hostname_cname_name":{"type":"string","description":"The CNAME record name to add to your DNS provider in order to point your custom domain to StatusPal."},"hostname_cname_value":{"type":"string","description":"The CNAME record value to add to your DNS provider in order to point your custom domain to StatusPal."},"certificate_txt_name":{"type":"string","description":"The TXT record name to add to your DNS provider in order to validate the custom domain ownership. Only for Cloudflare provider."},"certificate_txt_value":{"type":"string","description":"The TXT record value to add to your DNS provider in order to validate the custom domain ownership. Only for Cloudflare provider."},"hostname_txt_name":{"type":"string","description":"The TXT record name to add to your DNS provider in order to verify custom hostname ownership. Only for Cloudflare provider."},"hostname_txt_value":{"type":"string","description":"The TXT record value to add to your DNS provider in order to verify custom hostname ownership. Only for Cloudflare provider."}}},"external_id":{"type":"string","description":"The custom hostname ID in the provider.","readOnly":true},"error":{"type":"string","description":"If something goes wrong during the custom domain setup, we show the errors here.","readOnly":true}}},"restricted_ips":{"type":"string","nullable":true,"description":"Your status page will be accessible only from this IPs (e.g. \"1.1.1.1, 2.2.2.2\")."},"member_restricted":{"description":"Only signed in members will be allowed to access your status page.","type":"boolean"},"scheduled_maintenance_days":{"type":"integer","description":"Display scheduled maintenance."},"custom_js":{"type":"string","nullable":true,"description":"We'll insert this content inside the `<script>` tag at the bottom of your status page `<body>` tag."},"head_code":{"type":"string","nullable":true,"description":"We'll insert this content inside the `<head>` tag."},"date_format":{"type":"string","nullable":true,"description":"Display timestamps of incidents and updates in this format."},"time_format":{"type":"string","nullable":true,"description":"Display timestamps of incidents and updates in this format."},"date_format_enforce_everywhere":{"type":"boolean","description":"The above date format will be used everywhere in the status page. Timezone conversion to client's will be disabled."},"display_calendar":{"type":"boolean","description":"Display uptime calendar at status page."},"hide_watermark":{"type":"boolean","description":"Hide \"Powered by Statuspal.io\"."},"minor_notification_hours":{"type":"integer","description":"Long-running incident notification (Minor incident)."},"major_notification_hours":{"type":"integer","description":"Long-running incident notification (Major incident)."},"maintenance_notification_hours":{"type":"integer","description":"Long-running incident notification (Maintenance)."},"history_limit_days":{"type":"integer","nullable":true,"description":"Incident history limit (use null for No Limit)."},"custom_incident_types_enabled":{"type":"boolean","description":"Enable custom incident types."},"info_notices_enabled":{"type":"boolean","description":"Enable information notices."},"locked_when_maintenance":{"type":"boolean","description":"Lock from adding incidents when under maintenance."},"noindex":{"type":"boolean","description":"Remove status page from being indexed by search engines (e.g. Google)."},"enable_auto_translations":{"type":"boolean","description":"Enable auto translations when creating incidents, maintenances and info notices."},"captcha_enabled":{"type":"boolean","description":"Enable captchas. (This option is only available when the status page is member restricted)."},"enable_embedding":{"type":"boolean","description":"Enable iframe embedding."},"strict_csp":{"type":"boolean","description":"Enable strict Content Security Policy headers."},"translations":{"type":"object","additionalProperties":true,"properties":{"[lang]":{"description":"e.g. `en`.","type":"object","properties":{"public_company_name":{"type":"string"},"header_logo_text":{"type":"string"}}}},"description":"A translations object. For example:\n```json\n{\n  \"en\": {\n    \"public_company_name\": \"Your company\",\n    \"header_logo_text\": \"Your company status page\"\n  },\n  \"fr\": {\n    \"public_company_name\": \"Votre entreprise\",\n    \"header_logo_text\": \"Page d'état de votre entreprise\"\n  }\n}\n```\n"},"header_logo_text":{"type":"string","description":"Displayed at the header of the status page."},"public_company_name":{"type":"string","nullable":true,"description":"Displayed at the footer of the status page."},"logo":{"type":"string","nullable":true,"description":"Logo url of the status page.","readOnly":true},"bg_image":{"type":"string","nullable":true,"description":"Background image url of the status page.","readOnly":true},"favicon":{"type":"string","nullable":true,"description":"Favicon url of the status page.","readOnly":true},"display_uptime_graph":{"type":"boolean","description":"Display the uptime graph in the status page."},"uptime_graph_days":{"type":"integer","description":"Uptime graph period."},"current_incidents_position":{"type":"string","enum":["below_services","above_services"],"description":"The incident position displayed in the status page."},"theme_selected":{"type":"string","description":"The selected theme for the status page."},"theme_configs":{"type":"object","nullable":true,"description":"Theme configuration for the status page."},"link_color":{"type":"string","description":"The links color in the status page."},"header_bg_color1":{"type":"string","description":"The background color at left side of the status page header."},"header_bg_color2":{"type":"string","description":"The background color at right side of the status page header."},"header_fg_color":{"type":"string","description":"The text color in the status page."},"incident_header_color":{"type":"string","description":"Incidents header color in the status page."},"incident_link_color":{"type":"string","nullable":true,"description":"Incidents link color in the status page."},"status_ok_color":{"type":"string","description":"The status page colors when there is no incident."},"status_minor_color":{"type":"string","description":"The status page colors when there is a minor incident."},"status_major_color":{"type":"string","description":"The status page colors when there is a major incident."},"status_maintenance_color":{"type":"string","description":"The status page colors when there is a maintenance incident."},"custom_css":{"type":"string","nullable":true,"description":"We'll insert this content inside the `<style>` tag."},"custom_header":{"type":"string","nullable":true,"description":"A custom header for the status page (e.g. \"`<header>...</header>`\")."},"custom_footer":{"type":"string","nullable":true,"description":"A custom footer for the status page (e.g. \"`<footer>...</footer>`\")."},"notify_by_default":{"type":"boolean","description":"Check the Notify subscribers checkbox by default."},"tweet_by_default":{"type":"boolean","description":"Check the Tweet checkbox by default."},"slack_subscriptions_enabled":{"type":"boolean","nullable":true,"description":"Allow your customers to subscribe via Slack to updates on your status page's status."},"discord_notifications_enabled":{"type":"boolean","description":"Allow your customers to receive notifications on a Discord channel."},"teams_notifications_enabled":{"type":"boolean","description":"Allow your customers to receive notifications on Microsoft Teams."},"google_chat_notifications_enabled":{"type":"boolean","description":"Allow your customers to receive notifications on Google Chat."},"mattermost_notifications_enabled":{"type":"boolean","description":"Allow your customers to receive notifications on Mattermost."},"sms_notifications_enabled":{"type":"boolean","nullable":true,"description":"Allow your customers to receive SMS notifications on your status page's status (to enable this you need to have a Twilio or Esendex integration)."},"feed_enabled":{"type":"boolean","description":"Allow your customers to receive updates as RSS and Atom feeds."},"calendar_enabled":{"type":"boolean","description":"Allow your customers to receive updates via iCalendar feed."},"google_calendar_enabled":{"type":"boolean","description":"Allow your customers to import Google Calendar with Status Pages maintenance (business only)."},"subscribers_enabled":{"type":"boolean","description":"Allow email customers to receive email notifications."},"notification_email":{"type":"string","nullable":true,"description":"Allow your customers to subscribe via email to updates on your status page's status."},"reply_to_email":{"type":"string","nullable":true,"description":"The email address we'll use in the 'reply_to' field in emails to your subscribers. So they can reply to your notification emails."},"tweeting_enabled":{"type":"boolean","description":"Allows to send tweets when creating or updating an incident."},"email_layout_template":{"type":"string","nullable":true,"description":"Custom email layout template, see the documentation: [Custom email templates](https://docs.statuspal.io/platform/subscriptions-and-notifications/custom-email-templates)."},"email_confirmation_template":{"type":"string","nullable":true,"description":"Custom confirmation email template, see the documentation: [Custom email templates](https://docs.statuspal.io/platform/subscriptions-and-notifications/custom-email-templates)."},"email_notification_template":{"type":"string","nullable":true,"description":"Custom email notification template, see the documentation: [Custom email templates](https://docs.statuspal.io/platform/subscriptions-and-notifications/custom-email-templates)."},"email_templates_enabled":{"type":"boolean","nullable":true,"description":"The templates won't be used until this is enabled, but you can send test emails."},"allowed_email_domains":{"type":"string","description":"Allowed email domains. Each domain should be separated by `\n`"},"zoom_notifications_enabled":{"type":"boolean","description":"Enables customers to receive notifications via Zoom for updates and alerts related to the services."}}},"UnauthorizedError":{"type":"object","properties":{"error":{"type":"integer","description":"Unauthorized"}}},"ServerError":{"type":"object","properties":{"error":{"type":"string","description":"Internal server error :("}}}},"responses":{"UnauthorizedError":{"description":"Authorization information is missing or invalid.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnauthorizedError"}}}},"ServerError":{"description":"Unexpected error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerError"}}}}}},"paths":{"/orgs/{organizationId}/status_pages":{"get":{"tags":["Status Pages"],"summary":"List status pages","operationId":"getOrganizationStatusPages","parameters":[{"$ref":"#/components/parameters/OrganizationId"}],"responses":{"200":{"description":"The list of Status Pages","content":{"application/json":{"schema":{"properties":{"status_pages":{"type":"array","items":{"$ref":"#/components/schemas/OrganizationStatusPage"}},"links":{"type":"object","properties":{"next":{"type":"string","description":"Link for the next page."},"prev":{"type":"string","description":"Link for the previous page."}}},"meta":{"type":"object","properties":{"total_count":{"type":"integer","description":"Shows the total amount of status pages."}}}}}}}},"401":{"$ref":"#/components/responses/UnauthorizedError"},"500":{"$ref":"#/components/responses/ServerError"}}}}}}
````

## POST /orgs/{organizationId}/status\_pages

> Adds a new status page

````json
{"openapi":"3.0.1","info":{"title":"StatusPal API Reference","version":"2.0.0"},"tags":[{"name":"Status Pages","description":"Manage your organization's status pages — create, update, delete, and configure custom domains.\n\n## Custom Domains\n\nYou can serve your status page on a custom domain (e.g. `status.example.com`) by configuring the `domain_config` object on a status page. StatusPal supports two CDN providers: **Cloudflare** and **Bunny**.\n\n### Setup flow\n\n**1. Enable the custom domain:** Update the status page with `domain_config.provider` and `domain_config.domain`:\n\n```bash\ncurl -X PUT \\\n  https://statuspal.eu/api/v2/orgs/{organizationId}/status_pages/{subdomain} \\\n  -H 'Authorization: <your-api-key>' \\\n  -H 'Content-Type: application/json' \\\n  -d '{\n    \"status_page\": {\n      \"domain_config\": {\n        \"provider\": \"cloudflare\",\n        \"domain\": \"status.example.com\"\n      }\n    }\n  }'\n```\n\nStatusPal begins provisioning the domain asynchronously. The `domain_config.status` field starts as `configuring`.\n\n**2. Retrieve DNS records:** Poll `GET /orgs/{organizationId}/status_pages/{subdomain}` until `domain_config.validation_records` is populated (typically a few seconds). The records you need depend on the provider:\n\n| Provider | Records required |\n|---|---|\n| **Cloudflare** | 1 CNAME (`hostname_cname_name` → `hostname_cname_value`), 1 TXT for hostname verification (`hostname_txt_name` / `hostname_txt_value`), and 1 TXT for SSL certificate (`certificate_txt_name` / `certificate_txt_value`) |\n| **Bunny** | 1 CNAME (`hostname_cname_name` → `hostname_cname_value`) |\n\n> **Note:** For the Cloudflare provider, the `certificate_txt_*` fields may not appear immediately. Poll every 10–15 seconds until they are present.\n\n> **Note:** For the Bunny provider, the `hostname_cname_value` field may be empty on the initial response while the pull zone is being created. Poll every 2–5 seconds until it is populated (typically a few seconds).\n\n**3. Create DNS records:** Add the records at your DNS provider. If your DNS provider is Cloudflare, make sure the CNAME has **proxy disabled** (DNS-only / grey cloud).\n\n**4. Wait for activation:** Poll the status page until `domain_config.status` becomes `active`. This typically takes 1–10 minutes.\n\n### Removing a custom domain\n\nSet `domain_config.provider` and `domain_config.domain` to `null`:\n\n```bash\ncurl -X PUT \\\n  https://statuspal.eu/api/v2/orgs/{organizationId}/status_pages/{subdomain} \\\n  -H 'Authorization: <your-api-key>' \\\n  -H 'Content-Type: application/json' \\\n  -d '{\n    \"status_page\": {\n      \"domain_config\": {\n        \"provider\": null,\n        \"domain\": null\n      }\n    }\n  }'\n```\n\n### Retrying a failed configuration\n\nIf `domain_config.status` is `failed_to_configure`, re-submit the same `domain_config` to restart provisioning.\n\n### Changing the domain\n\nUpdate `domain_config.domain` to the new value. StatusPal will revoke the old domain's certificate and begin provisioning the new one. Follow steps 2–4 again.\n\n### Domain status values\n\n| Status | Meaning |\n|---|---|\n| `disabled` | No custom domain configured. |\n| `configuring` | Provisioning in progress or waiting for DNS verification. |\n| `active` | Domain is live with SSL. |\n| `failed_to_configure` | Setup failed — check `domain_config.error` for details. |\n"}],"servers":[{"url":"https://statuspal.io/api/v2"},{"url":"https://statuspal.eu/api/v2"}],"security":[{"api_key":[]}],"components":{"securitySchemes":{"api_key":{"type":"apiKey","name":"Authorization","in":"header"}},"parameters":{"OrganizationId":{"name":"organizationId","in":"path","description":"The ID of the organization","required":true,"schema":{"type":"integer"}}},"schemas":{"OrganizationStatusPage":{"description":"Represents the Status Page.","type":"object","required":["name","url","time_zone"],"properties":{"organization_id":{"type":"integer","readOnly":true},"inserted_at":{"type":"string","description":"Datetime at which the record was inserted","format":"date-time","readOnly":true},"updated_at":{"type":"string","description":"Datetime at which the record was last updated","format":"date-time","readOnly":true},"name":{"type":"string","description":"Company, project or service name."},"url":{"type":"string","description":"The website to your company, project or service."},"time_zone":{"type":"string","description":"The primary timezone the status page uses to display incidents (e.g. \"Europe/Berlin\")."},"subdomain":{"type":"string","description":"Subdomain on statuspal."},"support_email":{"type":"string","description":"Your company's support email."},"twitter_public_screen_name":{"type":"string","nullable":true,"description":"Twitter handle name (e.g. yourcompany)."},"about":{"type":"string","nullable":true,"description":"Customize the about information displayed in your status page."},"display_about":{"type":"boolean","description":"Display about information."},"domain_config":{"type":"object","description":"Custom domain configuration. Set `provider` and `domain` to enable a custom domain,\nthen poll until `status` becomes `active`. See the [Status Pages tag description](#tag/Status-Pages)\nfor a step-by-step setup guide.\n","properties":{"provider":{"type":"string","enum":["cloudflare","bunny"],"description":"* `cloudflare`: provided by [Cloudflare](https://www.cloudflare.com)\n* `bunny`: provided by [Bunny.net](https://bunny.net)\n"},"domain":{"type":"string","description":"The custom domain name."},"previous_domain":{"type":"string","description":"The previous custom domain name.","readOnly":true},"status":{"type":"string","enum":["disabled","configuring","failed_to_configure","active"],"readOnly":true,"description":"* `disabled`: The custom domain is disabled.\n* `configuring`: We are configuring the custom domain.\n* `failed_to_configure`: Failed to configure the custom domain.\n* `active`: The custom domain is active.\n"},"validation_records":{"description":"To activate the custom hostname domain, please create a CNAME DNS record.\n* **Cloudflare**: As soon as the TXT listed, the SSL certificates will be issued and deployed. Please allow a few minutes after the TXT record has been added before attempting to connect via HTTPS.\n* **Bunny.net**: After the domain is activated, it will be automatically configured with SSL and linked to this Pull Zone.\n\n**Note (Bunny):** The `hostname_cname_value` field may be empty on the initial response while the pull zone is being created. Poll every 2–5 seconds until it is populated (typically a few seconds).\n","type":"object","readOnly":true,"properties":{"hostname_cname_name":{"type":"string","description":"The CNAME record name to add to your DNS provider in order to point your custom domain to StatusPal."},"hostname_cname_value":{"type":"string","description":"The CNAME record value to add to your DNS provider in order to point your custom domain to StatusPal."},"certificate_txt_name":{"type":"string","description":"The TXT record name to add to your DNS provider in order to validate the custom domain ownership. Only for Cloudflare provider."},"certificate_txt_value":{"type":"string","description":"The TXT record value to add to your DNS provider in order to validate the custom domain ownership. Only for Cloudflare provider."},"hostname_txt_name":{"type":"string","description":"The TXT record name to add to your DNS provider in order to verify custom hostname ownership. Only for Cloudflare provider."},"hostname_txt_value":{"type":"string","description":"The TXT record value to add to your DNS provider in order to verify custom hostname ownership. Only for Cloudflare provider."}}},"external_id":{"type":"string","description":"The custom hostname ID in the provider.","readOnly":true},"error":{"type":"string","description":"If something goes wrong during the custom domain setup, we show the errors here.","readOnly":true}}},"restricted_ips":{"type":"string","nullable":true,"description":"Your status page will be accessible only from this IPs (e.g. \"1.1.1.1, 2.2.2.2\")."},"member_restricted":{"description":"Only signed in members will be allowed to access your status page.","type":"boolean"},"scheduled_maintenance_days":{"type":"integer","description":"Display scheduled maintenance."},"custom_js":{"type":"string","nullable":true,"description":"We'll insert this content inside the `<script>` tag at the bottom of your status page `<body>` tag."},"head_code":{"type":"string","nullable":true,"description":"We'll insert this content inside the `<head>` tag."},"date_format":{"type":"string","nullable":true,"description":"Display timestamps of incidents and updates in this format."},"time_format":{"type":"string","nullable":true,"description":"Display timestamps of incidents and updates in this format."},"date_format_enforce_everywhere":{"type":"boolean","description":"The above date format will be used everywhere in the status page. Timezone conversion to client's will be disabled."},"display_calendar":{"type":"boolean","description":"Display uptime calendar at status page."},"hide_watermark":{"type":"boolean","description":"Hide \"Powered by Statuspal.io\"."},"minor_notification_hours":{"type":"integer","description":"Long-running incident notification (Minor incident)."},"major_notification_hours":{"type":"integer","description":"Long-running incident notification (Major incident)."},"maintenance_notification_hours":{"type":"integer","description":"Long-running incident notification (Maintenance)."},"history_limit_days":{"type":"integer","nullable":true,"description":"Incident history limit (use null for No Limit)."},"custom_incident_types_enabled":{"type":"boolean","description":"Enable custom incident types."},"info_notices_enabled":{"type":"boolean","description":"Enable information notices."},"locked_when_maintenance":{"type":"boolean","description":"Lock from adding incidents when under maintenance."},"noindex":{"type":"boolean","description":"Remove status page from being indexed by search engines (e.g. Google)."},"enable_auto_translations":{"type":"boolean","description":"Enable auto translations when creating incidents, maintenances and info notices."},"captcha_enabled":{"type":"boolean","description":"Enable captchas. (This option is only available when the status page is member restricted)."},"enable_embedding":{"type":"boolean","description":"Enable iframe embedding."},"strict_csp":{"type":"boolean","description":"Enable strict Content Security Policy headers."},"translations":{"type":"object","additionalProperties":true,"properties":{"[lang]":{"description":"e.g. `en`.","type":"object","properties":{"public_company_name":{"type":"string"},"header_logo_text":{"type":"string"}}}},"description":"A translations object. For example:\n```json\n{\n  \"en\": {\n    \"public_company_name\": \"Your company\",\n    \"header_logo_text\": \"Your company status page\"\n  },\n  \"fr\": {\n    \"public_company_name\": \"Votre entreprise\",\n    \"header_logo_text\": \"Page d'état de votre entreprise\"\n  }\n}\n```\n"},"header_logo_text":{"type":"string","description":"Displayed at the header of the status page."},"public_company_name":{"type":"string","nullable":true,"description":"Displayed at the footer of the status page."},"logo":{"type":"string","nullable":true,"description":"Logo url of the status page.","readOnly":true},"bg_image":{"type":"string","nullable":true,"description":"Background image url of the status page.","readOnly":true},"favicon":{"type":"string","nullable":true,"description":"Favicon url of the status page.","readOnly":true},"display_uptime_graph":{"type":"boolean","description":"Display the uptime graph in the status page."},"uptime_graph_days":{"type":"integer","description":"Uptime graph period."},"current_incidents_position":{"type":"string","enum":["below_services","above_services"],"description":"The incident position displayed in the status page."},"theme_selected":{"type":"string","description":"The selected theme for the status page."},"theme_configs":{"type":"object","nullable":true,"description":"Theme configuration for the status page."},"link_color":{"type":"string","description":"The links color in the status page."},"header_bg_color1":{"type":"string","description":"The background color at left side of the status page header."},"header_bg_color2":{"type":"string","description":"The background color at right side of the status page header."},"header_fg_color":{"type":"string","description":"The text color in the status page."},"incident_header_color":{"type":"string","description":"Incidents header color in the status page."},"incident_link_color":{"type":"string","nullable":true,"description":"Incidents link color in the status page."},"status_ok_color":{"type":"string","description":"The status page colors when there is no incident."},"status_minor_color":{"type":"string","description":"The status page colors when there is a minor incident."},"status_major_color":{"type":"string","description":"The status page colors when there is a major incident."},"status_maintenance_color":{"type":"string","description":"The status page colors when there is a maintenance incident."},"custom_css":{"type":"string","nullable":true,"description":"We'll insert this content inside the `<style>` tag."},"custom_header":{"type":"string","nullable":true,"description":"A custom header for the status page (e.g. \"`<header>...</header>`\")."},"custom_footer":{"type":"string","nullable":true,"description":"A custom footer for the status page (e.g. \"`<footer>...</footer>`\")."},"notify_by_default":{"type":"boolean","description":"Check the Notify subscribers checkbox by default."},"tweet_by_default":{"type":"boolean","description":"Check the Tweet checkbox by default."},"slack_subscriptions_enabled":{"type":"boolean","nullable":true,"description":"Allow your customers to subscribe via Slack to updates on your status page's status."},"discord_notifications_enabled":{"type":"boolean","description":"Allow your customers to receive notifications on a Discord channel."},"teams_notifications_enabled":{"type":"boolean","description":"Allow your customers to receive notifications on Microsoft Teams."},"google_chat_notifications_enabled":{"type":"boolean","description":"Allow your customers to receive notifications on Google Chat."},"mattermost_notifications_enabled":{"type":"boolean","description":"Allow your customers to receive notifications on Mattermost."},"sms_notifications_enabled":{"type":"boolean","nullable":true,"description":"Allow your customers to receive SMS notifications on your status page's status (to enable this you need to have a Twilio or Esendex integration)."},"feed_enabled":{"type":"boolean","description":"Allow your customers to receive updates as RSS and Atom feeds."},"calendar_enabled":{"type":"boolean","description":"Allow your customers to receive updates via iCalendar feed."},"google_calendar_enabled":{"type":"boolean","description":"Allow your customers to import Google Calendar with Status Pages maintenance (business only)."},"subscribers_enabled":{"type":"boolean","description":"Allow email customers to receive email notifications."},"notification_email":{"type":"string","nullable":true,"description":"Allow your customers to subscribe via email to updates on your status page's status."},"reply_to_email":{"type":"string","nullable":true,"description":"The email address we'll use in the 'reply_to' field in emails to your subscribers. So they can reply to your notification emails."},"tweeting_enabled":{"type":"boolean","description":"Allows to send tweets when creating or updating an incident."},"email_layout_template":{"type":"string","nullable":true,"description":"Custom email layout template, see the documentation: [Custom email templates](https://docs.statuspal.io/platform/subscriptions-and-notifications/custom-email-templates)."},"email_confirmation_template":{"type":"string","nullable":true,"description":"Custom confirmation email template, see the documentation: [Custom email templates](https://docs.statuspal.io/platform/subscriptions-and-notifications/custom-email-templates)."},"email_notification_template":{"type":"string","nullable":true,"description":"Custom email notification template, see the documentation: [Custom email templates](https://docs.statuspal.io/platform/subscriptions-and-notifications/custom-email-templates)."},"email_templates_enabled":{"type":"boolean","nullable":true,"description":"The templates won't be used until this is enabled, but you can send test emails."},"allowed_email_domains":{"type":"string","description":"Allowed email domains. Each domain should be separated by `\n`"},"zoom_notifications_enabled":{"type":"boolean","description":"Enables customers to receive notifications via Zoom for updates and alerts related to the services."}}},"BadRequestError":{"type":"object","properties":{"error":{"type":"string","description":"Bad request!"}}},"UnauthorizedError":{"type":"object","properties":{"error":{"type":"integer","description":"Unauthorized"}}},"ForbiddenError":{"type":"object","properties":{"error":{"type":"string","description":"Forbidden"}}},"NotFoundError":{"type":"object","properties":{"error":{"type":"string","description":"Resource not found!"}}},"ServerError":{"type":"object","properties":{"error":{"type":"string","description":"Internal server error :("}}}},"responses":{"BadRequestError":{"description":"Bad request error. Probably JSON syntax is wrong, check with jsonlint.com.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"}}}},"UnauthorizedError":{"description":"Authorization information is missing or invalid.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnauthorizedError"}}}},"ForbiddenError":{"description":"You lack the necessary permissions to access this resource.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ForbiddenError"}}}},"NotFoundError":{"description":"A resource with the provided ID was not found.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"}}}},"ServerError":{"description":"Unexpected error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerError"}}}}}},"paths":{"/orgs/{organizationId}/status_pages":{"post":{"tags":["Status Pages"],"summary":"Adds a new status page","operationId":"addOrganizationStatusPage","parameters":[{"$ref":"#/components/parameters/OrganizationId"}],"requestBody":{"description":"The status page","content":{"application/json":{"schema":{"type":"object","properties":{"status_page":{"$ref":"#/components/schemas/OrganizationStatusPage"}}}}}},"responses":{"201":{"description":"The Status Page was created","content":{"application/json":{"schema":{"type":"object","properties":{"status_page":{"$ref":"#/components/schemas/OrganizationStatusPage"}}}}}},"400":{"$ref":"#/components/responses/BadRequestError"},"401":{"$ref":"#/components/responses/UnauthorizedError"},"403":{"$ref":"#/components/responses/ForbiddenError"},"404":{"$ref":"#/components/responses/NotFoundError"},"500":{"$ref":"#/components/responses/ServerError"}}}}}}
````

## GET /orgs/{organizationId}/status\_pages/{subdomain}

> Get a status page

````json
{"openapi":"3.0.1","info":{"title":"StatusPal API Reference","version":"2.0.0"},"tags":[{"name":"Status Pages","description":"Manage your organization's status pages — create, update, delete, and configure custom domains.\n\n## Custom Domains\n\nYou can serve your status page on a custom domain (e.g. `status.example.com`) by configuring the `domain_config` object on a status page. StatusPal supports two CDN providers: **Cloudflare** and **Bunny**.\n\n### Setup flow\n\n**1. Enable the custom domain:** Update the status page with `domain_config.provider` and `domain_config.domain`:\n\n```bash\ncurl -X PUT \\\n  https://statuspal.eu/api/v2/orgs/{organizationId}/status_pages/{subdomain} \\\n  -H 'Authorization: <your-api-key>' \\\n  -H 'Content-Type: application/json' \\\n  -d '{\n    \"status_page\": {\n      \"domain_config\": {\n        \"provider\": \"cloudflare\",\n        \"domain\": \"status.example.com\"\n      }\n    }\n  }'\n```\n\nStatusPal begins provisioning the domain asynchronously. The `domain_config.status` field starts as `configuring`.\n\n**2. Retrieve DNS records:** Poll `GET /orgs/{organizationId}/status_pages/{subdomain}` until `domain_config.validation_records` is populated (typically a few seconds). The records you need depend on the provider:\n\n| Provider | Records required |\n|---|---|\n| **Cloudflare** | 1 CNAME (`hostname_cname_name` → `hostname_cname_value`), 1 TXT for hostname verification (`hostname_txt_name` / `hostname_txt_value`), and 1 TXT for SSL certificate (`certificate_txt_name` / `certificate_txt_value`) |\n| **Bunny** | 1 CNAME (`hostname_cname_name` → `hostname_cname_value`) |\n\n> **Note:** For the Cloudflare provider, the `certificate_txt_*` fields may not appear immediately. Poll every 10–15 seconds until they are present.\n\n> **Note:** For the Bunny provider, the `hostname_cname_value` field may be empty on the initial response while the pull zone is being created. Poll every 2–5 seconds until it is populated (typically a few seconds).\n\n**3. Create DNS records:** Add the records at your DNS provider. If your DNS provider is Cloudflare, make sure the CNAME has **proxy disabled** (DNS-only / grey cloud).\n\n**4. Wait for activation:** Poll the status page until `domain_config.status` becomes `active`. This typically takes 1–10 minutes.\n\n### Removing a custom domain\n\nSet `domain_config.provider` and `domain_config.domain` to `null`:\n\n```bash\ncurl -X PUT \\\n  https://statuspal.eu/api/v2/orgs/{organizationId}/status_pages/{subdomain} \\\n  -H 'Authorization: <your-api-key>' \\\n  -H 'Content-Type: application/json' \\\n  -d '{\n    \"status_page\": {\n      \"domain_config\": {\n        \"provider\": null,\n        \"domain\": null\n      }\n    }\n  }'\n```\n\n### Retrying a failed configuration\n\nIf `domain_config.status` is `failed_to_configure`, re-submit the same `domain_config` to restart provisioning.\n\n### Changing the domain\n\nUpdate `domain_config.domain` to the new value. StatusPal will revoke the old domain's certificate and begin provisioning the new one. Follow steps 2–4 again.\n\n### Domain status values\n\n| Status | Meaning |\n|---|---|\n| `disabled` | No custom domain configured. |\n| `configuring` | Provisioning in progress or waiting for DNS verification. |\n| `active` | Domain is live with SSL. |\n| `failed_to_configure` | Setup failed — check `domain_config.error` for details. |\n"}],"servers":[{"url":"https://statuspal.io/api/v2"},{"url":"https://statuspal.eu/api/v2"}],"security":[{"api_key":[]}],"components":{"securitySchemes":{"api_key":{"type":"apiKey","name":"Authorization","in":"header"}},"parameters":{"OrganizationId":{"name":"organizationId","in":"path","description":"The ID of the organization","required":true,"schema":{"type":"integer"}},"StatusPageSubdomain":{"name":"subdomain","in":"path","description":"The subdomain of your status page.\n\nYou can find this under your status page settings, the Subdomain field is found under the \"Domain name\" section. Alternatively find it in the URL of your admin dashboard (e.g. statuspal.io/admin/`subdomain`).\n","required":true,"schema":{"type":"string"}}},"schemas":{"OrganizationStatusPage":{"description":"Represents the Status Page.","type":"object","required":["name","url","time_zone"],"properties":{"organization_id":{"type":"integer","readOnly":true},"inserted_at":{"type":"string","description":"Datetime at which the record was inserted","format":"date-time","readOnly":true},"updated_at":{"type":"string","description":"Datetime at which the record was last updated","format":"date-time","readOnly":true},"name":{"type":"string","description":"Company, project or service name."},"url":{"type":"string","description":"The website to your company, project or service."},"time_zone":{"type":"string","description":"The primary timezone the status page uses to display incidents (e.g. \"Europe/Berlin\")."},"subdomain":{"type":"string","description":"Subdomain on statuspal."},"support_email":{"type":"string","description":"Your company's support email."},"twitter_public_screen_name":{"type":"string","nullable":true,"description":"Twitter handle name (e.g. yourcompany)."},"about":{"type":"string","nullable":true,"description":"Customize the about information displayed in your status page."},"display_about":{"type":"boolean","description":"Display about information."},"domain_config":{"type":"object","description":"Custom domain configuration. Set `provider` and `domain` to enable a custom domain,\nthen poll until `status` becomes `active`. See the [Status Pages tag description](#tag/Status-Pages)\nfor a step-by-step setup guide.\n","properties":{"provider":{"type":"string","enum":["cloudflare","bunny"],"description":"* `cloudflare`: provided by [Cloudflare](https://www.cloudflare.com)\n* `bunny`: provided by [Bunny.net](https://bunny.net)\n"},"domain":{"type":"string","description":"The custom domain name."},"previous_domain":{"type":"string","description":"The previous custom domain name.","readOnly":true},"status":{"type":"string","enum":["disabled","configuring","failed_to_configure","active"],"readOnly":true,"description":"* `disabled`: The custom domain is disabled.\n* `configuring`: We are configuring the custom domain.\n* `failed_to_configure`: Failed to configure the custom domain.\n* `active`: The custom domain is active.\n"},"validation_records":{"description":"To activate the custom hostname domain, please create a CNAME DNS record.\n* **Cloudflare**: As soon as the TXT listed, the SSL certificates will be issued and deployed. Please allow a few minutes after the TXT record has been added before attempting to connect via HTTPS.\n* **Bunny.net**: After the domain is activated, it will be automatically configured with SSL and linked to this Pull Zone.\n\n**Note (Bunny):** The `hostname_cname_value` field may be empty on the initial response while the pull zone is being created. Poll every 2–5 seconds until it is populated (typically a few seconds).\n","type":"object","readOnly":true,"properties":{"hostname_cname_name":{"type":"string","description":"The CNAME record name to add to your DNS provider in order to point your custom domain to StatusPal."},"hostname_cname_value":{"type":"string","description":"The CNAME record value to add to your DNS provider in order to point your custom domain to StatusPal."},"certificate_txt_name":{"type":"string","description":"The TXT record name to add to your DNS provider in order to validate the custom domain ownership. Only for Cloudflare provider."},"certificate_txt_value":{"type":"string","description":"The TXT record value to add to your DNS provider in order to validate the custom domain ownership. Only for Cloudflare provider."},"hostname_txt_name":{"type":"string","description":"The TXT record name to add to your DNS provider in order to verify custom hostname ownership. Only for Cloudflare provider."},"hostname_txt_value":{"type":"string","description":"The TXT record value to add to your DNS provider in order to verify custom hostname ownership. Only for Cloudflare provider."}}},"external_id":{"type":"string","description":"The custom hostname ID in the provider.","readOnly":true},"error":{"type":"string","description":"If something goes wrong during the custom domain setup, we show the errors here.","readOnly":true}}},"restricted_ips":{"type":"string","nullable":true,"description":"Your status page will be accessible only from this IPs (e.g. \"1.1.1.1, 2.2.2.2\")."},"member_restricted":{"description":"Only signed in members will be allowed to access your status page.","type":"boolean"},"scheduled_maintenance_days":{"type":"integer","description":"Display scheduled maintenance."},"custom_js":{"type":"string","nullable":true,"description":"We'll insert this content inside the `<script>` tag at the bottom of your status page `<body>` tag."},"head_code":{"type":"string","nullable":true,"description":"We'll insert this content inside the `<head>` tag."},"date_format":{"type":"string","nullable":true,"description":"Display timestamps of incidents and updates in this format."},"time_format":{"type":"string","nullable":true,"description":"Display timestamps of incidents and updates in this format."},"date_format_enforce_everywhere":{"type":"boolean","description":"The above date format will be used everywhere in the status page. Timezone conversion to client's will be disabled."},"display_calendar":{"type":"boolean","description":"Display uptime calendar at status page."},"hide_watermark":{"type":"boolean","description":"Hide \"Powered by Statuspal.io\"."},"minor_notification_hours":{"type":"integer","description":"Long-running incident notification (Minor incident)."},"major_notification_hours":{"type":"integer","description":"Long-running incident notification (Major incident)."},"maintenance_notification_hours":{"type":"integer","description":"Long-running incident notification (Maintenance)."},"history_limit_days":{"type":"integer","nullable":true,"description":"Incident history limit (use null for No Limit)."},"custom_incident_types_enabled":{"type":"boolean","description":"Enable custom incident types."},"info_notices_enabled":{"type":"boolean","description":"Enable information notices."},"locked_when_maintenance":{"type":"boolean","description":"Lock from adding incidents when under maintenance."},"noindex":{"type":"boolean","description":"Remove status page from being indexed by search engines (e.g. Google)."},"enable_auto_translations":{"type":"boolean","description":"Enable auto translations when creating incidents, maintenances and info notices."},"captcha_enabled":{"type":"boolean","description":"Enable captchas. (This option is only available when the status page is member restricted)."},"enable_embedding":{"type":"boolean","description":"Enable iframe embedding."},"strict_csp":{"type":"boolean","description":"Enable strict Content Security Policy headers."},"translations":{"type":"object","additionalProperties":true,"properties":{"[lang]":{"description":"e.g. `en`.","type":"object","properties":{"public_company_name":{"type":"string"},"header_logo_text":{"type":"string"}}}},"description":"A translations object. For example:\n```json\n{\n  \"en\": {\n    \"public_company_name\": \"Your company\",\n    \"header_logo_text\": \"Your company status page\"\n  },\n  \"fr\": {\n    \"public_company_name\": \"Votre entreprise\",\n    \"header_logo_text\": \"Page d'état de votre entreprise\"\n  }\n}\n```\n"},"header_logo_text":{"type":"string","description":"Displayed at the header of the status page."},"public_company_name":{"type":"string","nullable":true,"description":"Displayed at the footer of the status page."},"logo":{"type":"string","nullable":true,"description":"Logo url of the status page.","readOnly":true},"bg_image":{"type":"string","nullable":true,"description":"Background image url of the status page.","readOnly":true},"favicon":{"type":"string","nullable":true,"description":"Favicon url of the status page.","readOnly":true},"display_uptime_graph":{"type":"boolean","description":"Display the uptime graph in the status page."},"uptime_graph_days":{"type":"integer","description":"Uptime graph period."},"current_incidents_position":{"type":"string","enum":["below_services","above_services"],"description":"The incident position displayed in the status page."},"theme_selected":{"type":"string","description":"The selected theme for the status page."},"theme_configs":{"type":"object","nullable":true,"description":"Theme configuration for the status page."},"link_color":{"type":"string","description":"The links color in the status page."},"header_bg_color1":{"type":"string","description":"The background color at left side of the status page header."},"header_bg_color2":{"type":"string","description":"The background color at right side of the status page header."},"header_fg_color":{"type":"string","description":"The text color in the status page."},"incident_header_color":{"type":"string","description":"Incidents header color in the status page."},"incident_link_color":{"type":"string","nullable":true,"description":"Incidents link color in the status page."},"status_ok_color":{"type":"string","description":"The status page colors when there is no incident."},"status_minor_color":{"type":"string","description":"The status page colors when there is a minor incident."},"status_major_color":{"type":"string","description":"The status page colors when there is a major incident."},"status_maintenance_color":{"type":"string","description":"The status page colors when there is a maintenance incident."},"custom_css":{"type":"string","nullable":true,"description":"We'll insert this content inside the `<style>` tag."},"custom_header":{"type":"string","nullable":true,"description":"A custom header for the status page (e.g. \"`<header>...</header>`\")."},"custom_footer":{"type":"string","nullable":true,"description":"A custom footer for the status page (e.g. \"`<footer>...</footer>`\")."},"notify_by_default":{"type":"boolean","description":"Check the Notify subscribers checkbox by default."},"tweet_by_default":{"type":"boolean","description":"Check the Tweet checkbox by default."},"slack_subscriptions_enabled":{"type":"boolean","nullable":true,"description":"Allow your customers to subscribe via Slack to updates on your status page's status."},"discord_notifications_enabled":{"type":"boolean","description":"Allow your customers to receive notifications on a Discord channel."},"teams_notifications_enabled":{"type":"boolean","description":"Allow your customers to receive notifications on Microsoft Teams."},"google_chat_notifications_enabled":{"type":"boolean","description":"Allow your customers to receive notifications on Google Chat."},"mattermost_notifications_enabled":{"type":"boolean","description":"Allow your customers to receive notifications on Mattermost."},"sms_notifications_enabled":{"type":"boolean","nullable":true,"description":"Allow your customers to receive SMS notifications on your status page's status (to enable this you need to have a Twilio or Esendex integration)."},"feed_enabled":{"type":"boolean","description":"Allow your customers to receive updates as RSS and Atom feeds."},"calendar_enabled":{"type":"boolean","description":"Allow your customers to receive updates via iCalendar feed."},"google_calendar_enabled":{"type":"boolean","description":"Allow your customers to import Google Calendar with Status Pages maintenance (business only)."},"subscribers_enabled":{"type":"boolean","description":"Allow email customers to receive email notifications."},"notification_email":{"type":"string","nullable":true,"description":"Allow your customers to subscribe via email to updates on your status page's status."},"reply_to_email":{"type":"string","nullable":true,"description":"The email address we'll use in the 'reply_to' field in emails to your subscribers. So they can reply to your notification emails."},"tweeting_enabled":{"type":"boolean","description":"Allows to send tweets when creating or updating an incident."},"email_layout_template":{"type":"string","nullable":true,"description":"Custom email layout template, see the documentation: [Custom email templates](https://docs.statuspal.io/platform/subscriptions-and-notifications/custom-email-templates)."},"email_confirmation_template":{"type":"string","nullable":true,"description":"Custom confirmation email template, see the documentation: [Custom email templates](https://docs.statuspal.io/platform/subscriptions-and-notifications/custom-email-templates)."},"email_notification_template":{"type":"string","nullable":true,"description":"Custom email notification template, see the documentation: [Custom email templates](https://docs.statuspal.io/platform/subscriptions-and-notifications/custom-email-templates)."},"email_templates_enabled":{"type":"boolean","nullable":true,"description":"The templates won't be used until this is enabled, but you can send test emails."},"allowed_email_domains":{"type":"string","description":"Allowed email domains. Each domain should be separated by `\n`"},"zoom_notifications_enabled":{"type":"boolean","description":"Enables customers to receive notifications via Zoom for updates and alerts related to the services."}}},"UnauthorizedError":{"type":"object","properties":{"error":{"type":"integer","description":"Unauthorized"}}},"NotFoundError":{"type":"object","properties":{"error":{"type":"string","description":"Resource not found!"}}},"ServerError":{"type":"object","properties":{"error":{"type":"string","description":"Internal server error :("}}}},"responses":{"UnauthorizedError":{"description":"Authorization information is missing or invalid.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnauthorizedError"}}}},"NotFoundError":{"description":"A resource with the provided ID was not found.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"}}}},"ServerError":{"description":"Unexpected error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerError"}}}}}},"paths":{"/orgs/{organizationId}/status_pages/{subdomain}":{"get":{"tags":["Status Pages"],"summary":"Get a status page","operationId":"getOrganizationStatusPage","parameters":[{"$ref":"#/components/parameters/OrganizationId"},{"$ref":"#/components/parameters/StatusPageSubdomain"}],"responses":{"200":{"description":"The Status Page","content":{"application/json":{"schema":{"type":"object","properties":{"status_page":{"$ref":"#/components/schemas/OrganizationStatusPage"}}}}}},"401":{"$ref":"#/components/responses/UnauthorizedError"},"404":{"$ref":"#/components/responses/NotFoundError"},"500":{"$ref":"#/components/responses/ServerError"}}}}}}
````

## PUT /orgs/{organizationId}/status\_pages/{subdomain}

> Updates a status page

````json
{"openapi":"3.0.1","info":{"title":"StatusPal API Reference","version":"2.0.0"},"tags":[{"name":"Status Pages","description":"Manage your organization's status pages — create, update, delete, and configure custom domains.\n\n## Custom Domains\n\nYou can serve your status page on a custom domain (e.g. `status.example.com`) by configuring the `domain_config` object on a status page. StatusPal supports two CDN providers: **Cloudflare** and **Bunny**.\n\n### Setup flow\n\n**1. Enable the custom domain:** Update the status page with `domain_config.provider` and `domain_config.domain`:\n\n```bash\ncurl -X PUT \\\n  https://statuspal.eu/api/v2/orgs/{organizationId}/status_pages/{subdomain} \\\n  -H 'Authorization: <your-api-key>' \\\n  -H 'Content-Type: application/json' \\\n  -d '{\n    \"status_page\": {\n      \"domain_config\": {\n        \"provider\": \"cloudflare\",\n        \"domain\": \"status.example.com\"\n      }\n    }\n  }'\n```\n\nStatusPal begins provisioning the domain asynchronously. The `domain_config.status` field starts as `configuring`.\n\n**2. Retrieve DNS records:** Poll `GET /orgs/{organizationId}/status_pages/{subdomain}` until `domain_config.validation_records` is populated (typically a few seconds). The records you need depend on the provider:\n\n| Provider | Records required |\n|---|---|\n| **Cloudflare** | 1 CNAME (`hostname_cname_name` → `hostname_cname_value`), 1 TXT for hostname verification (`hostname_txt_name` / `hostname_txt_value`), and 1 TXT for SSL certificate (`certificate_txt_name` / `certificate_txt_value`) |\n| **Bunny** | 1 CNAME (`hostname_cname_name` → `hostname_cname_value`) |\n\n> **Note:** For the Cloudflare provider, the `certificate_txt_*` fields may not appear immediately. Poll every 10–15 seconds until they are present.\n\n> **Note:** For the Bunny provider, the `hostname_cname_value` field may be empty on the initial response while the pull zone is being created. Poll every 2–5 seconds until it is populated (typically a few seconds).\n\n**3. Create DNS records:** Add the records at your DNS provider. If your DNS provider is Cloudflare, make sure the CNAME has **proxy disabled** (DNS-only / grey cloud).\n\n**4. Wait for activation:** Poll the status page until `domain_config.status` becomes `active`. This typically takes 1–10 minutes.\n\n### Removing a custom domain\n\nSet `domain_config.provider` and `domain_config.domain` to `null`:\n\n```bash\ncurl -X PUT \\\n  https://statuspal.eu/api/v2/orgs/{organizationId}/status_pages/{subdomain} \\\n  -H 'Authorization: <your-api-key>' \\\n  -H 'Content-Type: application/json' \\\n  -d '{\n    \"status_page\": {\n      \"domain_config\": {\n        \"provider\": null,\n        \"domain\": null\n      }\n    }\n  }'\n```\n\n### Retrying a failed configuration\n\nIf `domain_config.status` is `failed_to_configure`, re-submit the same `domain_config` to restart provisioning.\n\n### Changing the domain\n\nUpdate `domain_config.domain` to the new value. StatusPal will revoke the old domain's certificate and begin provisioning the new one. Follow steps 2–4 again.\n\n### Domain status values\n\n| Status | Meaning |\n|---|---|\n| `disabled` | No custom domain configured. |\n| `configuring` | Provisioning in progress or waiting for DNS verification. |\n| `active` | Domain is live with SSL. |\n| `failed_to_configure` | Setup failed — check `domain_config.error` for details. |\n"}],"servers":[{"url":"https://statuspal.io/api/v2"},{"url":"https://statuspal.eu/api/v2"}],"security":[{"api_key":[]}],"components":{"securitySchemes":{"api_key":{"type":"apiKey","name":"Authorization","in":"header"}},"parameters":{"OrganizationId":{"name":"organizationId","in":"path","description":"The ID of the organization","required":true,"schema":{"type":"integer"}},"StatusPageSubdomain":{"name":"subdomain","in":"path","description":"The subdomain of your status page.\n\nYou can find this under your status page settings, the Subdomain field is found under the \"Domain name\" section. Alternatively find it in the URL of your admin dashboard (e.g. statuspal.io/admin/`subdomain`).\n","required":true,"schema":{"type":"string"}}},"schemas":{"OrganizationStatusPage":{"description":"Represents the Status Page.","type":"object","required":["name","url","time_zone"],"properties":{"organization_id":{"type":"integer","readOnly":true},"inserted_at":{"type":"string","description":"Datetime at which the record was inserted","format":"date-time","readOnly":true},"updated_at":{"type":"string","description":"Datetime at which the record was last updated","format":"date-time","readOnly":true},"name":{"type":"string","description":"Company, project or service name."},"url":{"type":"string","description":"The website to your company, project or service."},"time_zone":{"type":"string","description":"The primary timezone the status page uses to display incidents (e.g. \"Europe/Berlin\")."},"subdomain":{"type":"string","description":"Subdomain on statuspal."},"support_email":{"type":"string","description":"Your company's support email."},"twitter_public_screen_name":{"type":"string","nullable":true,"description":"Twitter handle name (e.g. yourcompany)."},"about":{"type":"string","nullable":true,"description":"Customize the about information displayed in your status page."},"display_about":{"type":"boolean","description":"Display about information."},"domain_config":{"type":"object","description":"Custom domain configuration. Set `provider` and `domain` to enable a custom domain,\nthen poll until `status` becomes `active`. See the [Status Pages tag description](#tag/Status-Pages)\nfor a step-by-step setup guide.\n","properties":{"provider":{"type":"string","enum":["cloudflare","bunny"],"description":"* `cloudflare`: provided by [Cloudflare](https://www.cloudflare.com)\n* `bunny`: provided by [Bunny.net](https://bunny.net)\n"},"domain":{"type":"string","description":"The custom domain name."},"previous_domain":{"type":"string","description":"The previous custom domain name.","readOnly":true},"status":{"type":"string","enum":["disabled","configuring","failed_to_configure","active"],"readOnly":true,"description":"* `disabled`: The custom domain is disabled.\n* `configuring`: We are configuring the custom domain.\n* `failed_to_configure`: Failed to configure the custom domain.\n* `active`: The custom domain is active.\n"},"validation_records":{"description":"To activate the custom hostname domain, please create a CNAME DNS record.\n* **Cloudflare**: As soon as the TXT listed, the SSL certificates will be issued and deployed. Please allow a few minutes after the TXT record has been added before attempting to connect via HTTPS.\n* **Bunny.net**: After the domain is activated, it will be automatically configured with SSL and linked to this Pull Zone.\n\n**Note (Bunny):** The `hostname_cname_value` field may be empty on the initial response while the pull zone is being created. Poll every 2–5 seconds until it is populated (typically a few seconds).\n","type":"object","readOnly":true,"properties":{"hostname_cname_name":{"type":"string","description":"The CNAME record name to add to your DNS provider in order to point your custom domain to StatusPal."},"hostname_cname_value":{"type":"string","description":"The CNAME record value to add to your DNS provider in order to point your custom domain to StatusPal."},"certificate_txt_name":{"type":"string","description":"The TXT record name to add to your DNS provider in order to validate the custom domain ownership. Only for Cloudflare provider."},"certificate_txt_value":{"type":"string","description":"The TXT record value to add to your DNS provider in order to validate the custom domain ownership. Only for Cloudflare provider."},"hostname_txt_name":{"type":"string","description":"The TXT record name to add to your DNS provider in order to verify custom hostname ownership. Only for Cloudflare provider."},"hostname_txt_value":{"type":"string","description":"The TXT record value to add to your DNS provider in order to verify custom hostname ownership. Only for Cloudflare provider."}}},"external_id":{"type":"string","description":"The custom hostname ID in the provider.","readOnly":true},"error":{"type":"string","description":"If something goes wrong during the custom domain setup, we show the errors here.","readOnly":true}}},"restricted_ips":{"type":"string","nullable":true,"description":"Your status page will be accessible only from this IPs (e.g. \"1.1.1.1, 2.2.2.2\")."},"member_restricted":{"description":"Only signed in members will be allowed to access your status page.","type":"boolean"},"scheduled_maintenance_days":{"type":"integer","description":"Display scheduled maintenance."},"custom_js":{"type":"string","nullable":true,"description":"We'll insert this content inside the `<script>` tag at the bottom of your status page `<body>` tag."},"head_code":{"type":"string","nullable":true,"description":"We'll insert this content inside the `<head>` tag."},"date_format":{"type":"string","nullable":true,"description":"Display timestamps of incidents and updates in this format."},"time_format":{"type":"string","nullable":true,"description":"Display timestamps of incidents and updates in this format."},"date_format_enforce_everywhere":{"type":"boolean","description":"The above date format will be used everywhere in the status page. Timezone conversion to client's will be disabled."},"display_calendar":{"type":"boolean","description":"Display uptime calendar at status page."},"hide_watermark":{"type":"boolean","description":"Hide \"Powered by Statuspal.io\"."},"minor_notification_hours":{"type":"integer","description":"Long-running incident notification (Minor incident)."},"major_notification_hours":{"type":"integer","description":"Long-running incident notification (Major incident)."},"maintenance_notification_hours":{"type":"integer","description":"Long-running incident notification (Maintenance)."},"history_limit_days":{"type":"integer","nullable":true,"description":"Incident history limit (use null for No Limit)."},"custom_incident_types_enabled":{"type":"boolean","description":"Enable custom incident types."},"info_notices_enabled":{"type":"boolean","description":"Enable information notices."},"locked_when_maintenance":{"type":"boolean","description":"Lock from adding incidents when under maintenance."},"noindex":{"type":"boolean","description":"Remove status page from being indexed by search engines (e.g. Google)."},"enable_auto_translations":{"type":"boolean","description":"Enable auto translations when creating incidents, maintenances and info notices."},"captcha_enabled":{"type":"boolean","description":"Enable captchas. (This option is only available when the status page is member restricted)."},"enable_embedding":{"type":"boolean","description":"Enable iframe embedding."},"strict_csp":{"type":"boolean","description":"Enable strict Content Security Policy headers."},"translations":{"type":"object","additionalProperties":true,"properties":{"[lang]":{"description":"e.g. `en`.","type":"object","properties":{"public_company_name":{"type":"string"},"header_logo_text":{"type":"string"}}}},"description":"A translations object. For example:\n```json\n{\n  \"en\": {\n    \"public_company_name\": \"Your company\",\n    \"header_logo_text\": \"Your company status page\"\n  },\n  \"fr\": {\n    \"public_company_name\": \"Votre entreprise\",\n    \"header_logo_text\": \"Page d'état de votre entreprise\"\n  }\n}\n```\n"},"header_logo_text":{"type":"string","description":"Displayed at the header of the status page."},"public_company_name":{"type":"string","nullable":true,"description":"Displayed at the footer of the status page."},"logo":{"type":"string","nullable":true,"description":"Logo url of the status page.","readOnly":true},"bg_image":{"type":"string","nullable":true,"description":"Background image url of the status page.","readOnly":true},"favicon":{"type":"string","nullable":true,"description":"Favicon url of the status page.","readOnly":true},"display_uptime_graph":{"type":"boolean","description":"Display the uptime graph in the status page."},"uptime_graph_days":{"type":"integer","description":"Uptime graph period."},"current_incidents_position":{"type":"string","enum":["below_services","above_services"],"description":"The incident position displayed in the status page."},"theme_selected":{"type":"string","description":"The selected theme for the status page."},"theme_configs":{"type":"object","nullable":true,"description":"Theme configuration for the status page."},"link_color":{"type":"string","description":"The links color in the status page."},"header_bg_color1":{"type":"string","description":"The background color at left side of the status page header."},"header_bg_color2":{"type":"string","description":"The background color at right side of the status page header."},"header_fg_color":{"type":"string","description":"The text color in the status page."},"incident_header_color":{"type":"string","description":"Incidents header color in the status page."},"incident_link_color":{"type":"string","nullable":true,"description":"Incidents link color in the status page."},"status_ok_color":{"type":"string","description":"The status page colors when there is no incident."},"status_minor_color":{"type":"string","description":"The status page colors when there is a minor incident."},"status_major_color":{"type":"string","description":"The status page colors when there is a major incident."},"status_maintenance_color":{"type":"string","description":"The status page colors when there is a maintenance incident."},"custom_css":{"type":"string","nullable":true,"description":"We'll insert this content inside the `<style>` tag."},"custom_header":{"type":"string","nullable":true,"description":"A custom header for the status page (e.g. \"`<header>...</header>`\")."},"custom_footer":{"type":"string","nullable":true,"description":"A custom footer for the status page (e.g. \"`<footer>...</footer>`\")."},"notify_by_default":{"type":"boolean","description":"Check the Notify subscribers checkbox by default."},"tweet_by_default":{"type":"boolean","description":"Check the Tweet checkbox by default."},"slack_subscriptions_enabled":{"type":"boolean","nullable":true,"description":"Allow your customers to subscribe via Slack to updates on your status page's status."},"discord_notifications_enabled":{"type":"boolean","description":"Allow your customers to receive notifications on a Discord channel."},"teams_notifications_enabled":{"type":"boolean","description":"Allow your customers to receive notifications on Microsoft Teams."},"google_chat_notifications_enabled":{"type":"boolean","description":"Allow your customers to receive notifications on Google Chat."},"mattermost_notifications_enabled":{"type":"boolean","description":"Allow your customers to receive notifications on Mattermost."},"sms_notifications_enabled":{"type":"boolean","nullable":true,"description":"Allow your customers to receive SMS notifications on your status page's status (to enable this you need to have a Twilio or Esendex integration)."},"feed_enabled":{"type":"boolean","description":"Allow your customers to receive updates as RSS and Atom feeds."},"calendar_enabled":{"type":"boolean","description":"Allow your customers to receive updates via iCalendar feed."},"google_calendar_enabled":{"type":"boolean","description":"Allow your customers to import Google Calendar with Status Pages maintenance (business only)."},"subscribers_enabled":{"type":"boolean","description":"Allow email customers to receive email notifications."},"notification_email":{"type":"string","nullable":true,"description":"Allow your customers to subscribe via email to updates on your status page's status."},"reply_to_email":{"type":"string","nullable":true,"description":"The email address we'll use in the 'reply_to' field in emails to your subscribers. So they can reply to your notification emails."},"tweeting_enabled":{"type":"boolean","description":"Allows to send tweets when creating or updating an incident."},"email_layout_template":{"type":"string","nullable":true,"description":"Custom email layout template, see the documentation: [Custom email templates](https://docs.statuspal.io/platform/subscriptions-and-notifications/custom-email-templates)."},"email_confirmation_template":{"type":"string","nullable":true,"description":"Custom confirmation email template, see the documentation: [Custom email templates](https://docs.statuspal.io/platform/subscriptions-and-notifications/custom-email-templates)."},"email_notification_template":{"type":"string","nullable":true,"description":"Custom email notification template, see the documentation: [Custom email templates](https://docs.statuspal.io/platform/subscriptions-and-notifications/custom-email-templates)."},"email_templates_enabled":{"type":"boolean","nullable":true,"description":"The templates won't be used until this is enabled, but you can send test emails."},"allowed_email_domains":{"type":"string","description":"Allowed email domains. Each domain should be separated by `\n`"},"zoom_notifications_enabled":{"type":"boolean","description":"Enables customers to receive notifications via Zoom for updates and alerts related to the services."}}},"BadRequestError":{"type":"object","properties":{"error":{"type":"string","description":"Bad request!"}}},"UnauthorizedError":{"type":"object","properties":{"error":{"type":"integer","description":"Unauthorized"}}},"ForbiddenError":{"type":"object","properties":{"error":{"type":"string","description":"Forbidden"}}},"NotFoundError":{"type":"object","properties":{"error":{"type":"string","description":"Resource not found!"}}},"ServerError":{"type":"object","properties":{"error":{"type":"string","description":"Internal server error :("}}}},"responses":{"BadRequestError":{"description":"Bad request error. Probably JSON syntax is wrong, check with jsonlint.com.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BadRequestError"}}}},"UnauthorizedError":{"description":"Authorization information is missing or invalid.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnauthorizedError"}}}},"ForbiddenError":{"description":"You lack the necessary permissions to access this resource.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ForbiddenError"}}}},"NotFoundError":{"description":"A resource with the provided ID was not found.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"}}}},"ServerError":{"description":"Unexpected error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerError"}}}}}},"paths":{"/orgs/{organizationId}/status_pages/{subdomain}":{"put":{"tags":["Status Pages"],"summary":"Updates a status page","operationId":"updateOrganizationStatusPage","parameters":[{"$ref":"#/components/parameters/OrganizationId"},{"$ref":"#/components/parameters/StatusPageSubdomain"}],"requestBody":{"description":"The status page","content":{"application/json":{"schema":{"type":"object","properties":{"status_page":{"$ref":"#/components/schemas/OrganizationStatusPage"}}}}}},"responses":{"200":{"description":"The Status Page was updated","content":{"application/json":{"schema":{"type":"object","properties":{"status_page":{"$ref":"#/components/schemas/OrganizationStatusPage"}}}}}},"400":{"$ref":"#/components/responses/BadRequestError"},"401":{"$ref":"#/components/responses/UnauthorizedError"},"403":{"$ref":"#/components/responses/ForbiddenError"},"404":{"$ref":"#/components/responses/NotFoundError"},"500":{"$ref":"#/components/responses/ServerError"}}}}}}
````

## DELETE /orgs/{organizationId}/status\_pages/{subdomain}

> Deletes a status page permanently

````json
{"openapi":"3.0.1","info":{"title":"StatusPal API Reference","version":"2.0.0"},"tags":[{"name":"Status Pages","description":"Manage your organization's status pages — create, update, delete, and configure custom domains.\n\n## Custom Domains\n\nYou can serve your status page on a custom domain (e.g. `status.example.com`) by configuring the `domain_config` object on a status page. StatusPal supports two CDN providers: **Cloudflare** and **Bunny**.\n\n### Setup flow\n\n**1. Enable the custom domain:** Update the status page with `domain_config.provider` and `domain_config.domain`:\n\n```bash\ncurl -X PUT \\\n  https://statuspal.eu/api/v2/orgs/{organizationId}/status_pages/{subdomain} \\\n  -H 'Authorization: <your-api-key>' \\\n  -H 'Content-Type: application/json' \\\n  -d '{\n    \"status_page\": {\n      \"domain_config\": {\n        \"provider\": \"cloudflare\",\n        \"domain\": \"status.example.com\"\n      }\n    }\n  }'\n```\n\nStatusPal begins provisioning the domain asynchronously. The `domain_config.status` field starts as `configuring`.\n\n**2. Retrieve DNS records:** Poll `GET /orgs/{organizationId}/status_pages/{subdomain}` until `domain_config.validation_records` is populated (typically a few seconds). The records you need depend on the provider:\n\n| Provider | Records required |\n|---|---|\n| **Cloudflare** | 1 CNAME (`hostname_cname_name` → `hostname_cname_value`), 1 TXT for hostname verification (`hostname_txt_name` / `hostname_txt_value`), and 1 TXT for SSL certificate (`certificate_txt_name` / `certificate_txt_value`) |\n| **Bunny** | 1 CNAME (`hostname_cname_name` → `hostname_cname_value`) |\n\n> **Note:** For the Cloudflare provider, the `certificate_txt_*` fields may not appear immediately. Poll every 10–15 seconds until they are present.\n\n> **Note:** For the Bunny provider, the `hostname_cname_value` field may be empty on the initial response while the pull zone is being created. Poll every 2–5 seconds until it is populated (typically a few seconds).\n\n**3. Create DNS records:** Add the records at your DNS provider. If your DNS provider is Cloudflare, make sure the CNAME has **proxy disabled** (DNS-only / grey cloud).\n\n**4. Wait for activation:** Poll the status page until `domain_config.status` becomes `active`. This typically takes 1–10 minutes.\n\n### Removing a custom domain\n\nSet `domain_config.provider` and `domain_config.domain` to `null`:\n\n```bash\ncurl -X PUT \\\n  https://statuspal.eu/api/v2/orgs/{organizationId}/status_pages/{subdomain} \\\n  -H 'Authorization: <your-api-key>' \\\n  -H 'Content-Type: application/json' \\\n  -d '{\n    \"status_page\": {\n      \"domain_config\": {\n        \"provider\": null,\n        \"domain\": null\n      }\n    }\n  }'\n```\n\n### Retrying a failed configuration\n\nIf `domain_config.status` is `failed_to_configure`, re-submit the same `domain_config` to restart provisioning.\n\n### Changing the domain\n\nUpdate `domain_config.domain` to the new value. StatusPal will revoke the old domain's certificate and begin provisioning the new one. Follow steps 2–4 again.\n\n### Domain status values\n\n| Status | Meaning |\n|---|---|\n| `disabled` | No custom domain configured. |\n| `configuring` | Provisioning in progress or waiting for DNS verification. |\n| `active` | Domain is live with SSL. |\n| `failed_to_configure` | Setup failed — check `domain_config.error` for details. |\n"}],"servers":[{"url":"https://statuspal.io/api/v2"},{"url":"https://statuspal.eu/api/v2"}],"security":[{"api_key":[]}],"components":{"securitySchemes":{"api_key":{"type":"apiKey","name":"Authorization","in":"header"}},"parameters":{"OrganizationId":{"name":"organizationId","in":"path","description":"The ID of the organization","required":true,"schema":{"type":"integer"}},"StatusPageSubdomain":{"name":"subdomain","in":"path","description":"The subdomain of your status page.\n\nYou can find this under your status page settings, the Subdomain field is found under the \"Domain name\" section. Alternatively find it in the URL of your admin dashboard (e.g. statuspal.io/admin/`subdomain`).\n","required":true,"schema":{"type":"string"}}},"responses":{"UnauthorizedError":{"description":"Authorization information is missing or invalid.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnauthorizedError"}}}},"ForbiddenError":{"description":"You lack the necessary permissions to access this resource.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ForbiddenError"}}}},"NotFoundError":{"description":"A resource with the provided ID was not found.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundError"}}}},"ServerError":{"description":"Unexpected error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerError"}}}}},"schemas":{"UnauthorizedError":{"type":"object","properties":{"error":{"type":"integer","description":"Unauthorized"}}},"ForbiddenError":{"type":"object","properties":{"error":{"type":"string","description":"Forbidden"}}},"NotFoundError":{"type":"object","properties":{"error":{"type":"string","description":"Resource not found!"}}},"ServerError":{"type":"object","properties":{"error":{"type":"string","description":"Internal server error :("}}}}},"paths":{"/orgs/{organizationId}/status_pages/{subdomain}":{"delete":{"tags":["Status Pages"],"summary":"Deletes a status page permanently","operationId":"deleteOrganizationStatusPage","parameters":[{"$ref":"#/components/parameters/OrganizationId"},{"$ref":"#/components/parameters/StatusPageSubdomain"}],"responses":{"200":{"description":"The Status Page was deleted","content":{}},"401":{"$ref":"#/components/responses/UnauthorizedError"},"403":{"$ref":"#/components/responses/ForbiddenError"},"404":{"$ref":"#/components/responses/NotFoundError"},"500":{"$ref":"#/components/responses/ServerError"}}}}}}
````
