# Introduction

Learn about StatusPal hosted status pages & monitoring.

StatusPal is a platform for CTOs, DevOps/SRE, and Support teams that enable you to effectively communicate about incidents, maintenance, and system status in general to your customers and stakeholders.

StatusPal status pages can be public or private, and they support full design customization and branding with a custom domain.

Enable your customers to subscribe to your status page to receive real-time incident & maintenance notifications exactly where they are (Email, Slack, SMS, Slack, Google Chat, MS Teams, Google Calendar, and more).

{% embed url="<https://www.youtube.com/watch?v=frLuX8DpE_8>" %}
Watch our tutorial
{% endembed %}

<table data-card-size="large" data-view="cards" data-full-width="false"><thead><tr><th></th><th></th><th data-hidden></th><th data-hidden data-card-target data-type="content-ref"></th></tr></thead><tbody><tr><td>📕 <strong>Start with a tutorial →</strong></td><td>Follow our step-by-step tutorial</td><td></td><td><a href="/pages/cU6KLUpwXSEFRLLDGJmr">/pages/cU6KLUpwXSEFRLLDGJmr</a></td></tr><tr><td>🚀 <strong>Create your status page ↗</strong></td><td>It takes 3 minutes or less!</td><td></td><td><a href="https://statuspal.io/registrations/new?try=1">https://statuspal.io/registrations/new?try=1</a></td></tr></tbody></table>

### What problems does StatusPal solve?

StatusPal helps with every step in the incident communication lifecycle:

1. Keep your customers informed during outages to increase trust.
2. Reduce support burden thanks to proactive incident communication.
3. Save time during each incident by automating the incident communication process.
4. Showcase reliability with a centralized status dashboard.

### What is a status page?

A status page is a website, separate from your main website and infrastructure, that your customer can visit in the event that you experience any technical issues with your product or service.

Your customers and stakeholders of your product or services can subscribe to receive notifications on your status page. These notifications can go through various channels like Email, SMS, Slack, Google Chat, MS Teams, and more.

### Join the community

Stay connected to the team at StatusPal and get updates on the latest releases:

1. Participate in our product roadmap and feedback board: [feedback.statuspal.io](https://feedback.statuspal.io).
2. Follow StatusPal on [𝕏 (Formerly Twitter)](https://x.com/statuspalio) and [LinkedIn](https://www.linkedin.com/company/statuspal) for product updates and tips for DevOps/SRE, support, and CTOs.
3. Visit [StatusPal's Blog](https://www.statuspal.io/blog) to read about new features and DevOps/SRE topics.


# Get Started

Follow this guide to get up and running with your StatusPal status page.

{% embed url="<https://www.youtube.com/watch?v=frLuX8DpE_8>" %}

{% hint style="info" %}
Start using StatusPal by signing into your [Admin Dashboard](https://statuspal.io/session/new) ([EU](https://statuspal.eu/session/new))
{% endhint %}

Upon completion of these simple 5 steps, you'll have a working status page with services, personalized design, and real-time notifications. You will, as well, have your team members invited, and you will know how to report an incident or maintenance.

<table data-card-size="large" data-view="cards"><thead><tr><th></th><th></th><th data-hidden></th><th data-hidden data-card-target data-type="content-ref"></th></tr></thead><tbody><tr><td>🔑 <strong>Key concepts</strong></td><td>Learn the basics before you jump in</td><td></td><td><a href="/pages/AQjuYZqgHD2GHwbs87lD">/pages/AQjuYZqgHD2GHwbs87lD</a></td></tr><tr><td>⚙️ <strong>Step 1 - Configure services</strong></td><td>Configure your status page components</td><td></td><td><a href="/pages/eTJsaiWOOvAyoyqAsuyU">/pages/eTJsaiWOOvAyoyqAsuyU</a></td></tr><tr><td>🏢 <strong>Step 2 - Add your team</strong></td><td>Admin, Editors, Viewers and Billers</td><td></td><td><a href="/pages/bWh8eT96VK899TrNtsvw">/pages/bWh8eT96VK899TrNtsvw</a></td></tr><tr><td>🎨 <strong>Step 3 - Personalize design</strong></td><td>Customize your status page branding</td><td></td><td><a href="/pages/4iFmGcPIhm2PKK8pqdgm">/pages/4iFmGcPIhm2PKK8pqdgm</a></td></tr><tr><td>🚨 <strong>Step 4 - Enable notifications</strong></td><td>Email, SMS, Slack, MS Teams, Google</td><td></td><td><a href="/pages/n0ktFjVVoVuhXhoMoOa1">/pages/n0ktFjVVoVuhXhoMoOa1</a></td></tr><tr><td>🔥 <strong>Step 5 - Report an incident</strong></td><td>Report an incident or maintenance</td><td></td><td><a href="/pages/wWFfJAVKgR6DEW7ARTVX">/pages/wWFfJAVKgR6DEW7ARTVX</a></td></tr></tbody></table>


# Key concepts

Here are a few concepts that'll help you better understand StatusPal and how you can take advantage of it.

### Status Page

A status page is a website, separate from your main website and infrastructure, that your customer can visit in the event that you experience any technical issues with your product or service.

On your status page, customers can find out not only about incidents but also about maintenance windows and, most importantly, the current status of your services.

It's common for companies to have one status page where they report the incidents of all their products and services. However, other companies might need multiple status pages, like one per product, service, or customer.

<figure><img src="/files/mPM8V3zlTMikWUEfUhtN" alt="status page example"><figcaption></figcaption></figure>

### Service/component

Your product or application (the one your status page is about) might have multiple services that comprise it or that it relies on. You'll want to represent them in your status page so that you are able to report incidents that affect them individually.

<figure><img src="/files/BzRVmw3szX95sb1vYr3A" alt="status page services/components example"><figcaption><p>Services in StatusPal Admin UI</p></figcaption></figure>

You don't need to expose all of your services, but the ones you want your customers or stakeholders to be aware of their status.

Another thing you can do with the services you configure in your status page is monitor them, we can notify you and even automatically create an incident when they go down, to find out more read [Configure monitoring for a service](/monitoring-and-automation/out-of-the-box-monitoring).

### Incident

An incident report allows you to communicate to your customers that something is wrong in your system, either something that causes general downtime, slow responsiveness, data inconsistency, etc.

#### Incident severity

When you create an incident, you can select its severity in the type field. By default, it can be Minor or Major:

* **Minor Incident**: We recommend this type of incident when it does not cause downtime on your system, and your customers can still use your site, perhaps with some annoyance.
* **Major Incident**: If the incident is causing downtime and/or disrupting the normal use of your systems.

These are the default incident types we provide you by default, but you can configure custom incident types by accessing `Incidents > Types` from the sidebar.

### Scheduled Maintenance

Scheduled maintenance is a special kind of incident, mostly because it's something that is planned, even if it will cause system disruption.

A good example of scheduled maintenance is if you want to switch DNS providers, and you know this will cause some downtime, you should communicate this to your customers ahead of time so they can take preventive measures beforehand.

You can do this with a scheduled maintenance; when you create them, we can notify your subscribers with the schedule you entered for the maintenance; we also display the maintenance a week ahead, so your customers get informed.

Once the scheduled time comes, your status page automatically reflects that your system is under maintenance.

### Subscribers

Subscribers are customers or stakeholders that subscribe to your status page to receive notifications about your site's status; once they subscribe, they will receive a notification whenever you create or update an incident/maintenance as long as you check the box "Notify subscribers."

They can easily opt out with a link provided in every notification they will receive; you also have the option to remove them from your subscriber list.


# Step 1 - Configure services

Set up your status page services to reflect your systems.

Upon completing the "new status page" form, you'll have the opportunity to configure your services and components:

<figure><img src="/files/SGZLbthp1X7OtX9cOVBN" alt="Status page services configuration" width="563"><figcaption></figcaption></figure>

You can quickly enter your services in text format on the above screen, even with parent/child relationships. For instance, the following text would generate a service `API` with two children, US and EU, representing two regions where `API` is available.

```
API
- US region
- EU region
```

Once you click "Continue," you'll still have the chance to add/remove services via our friendly UI. Click on "Services" from the sidebar, and you should see your editable and sortable services list:

<figure><img src="/files/DP6p57MXMBZc6BwSislU" alt="status page admin console > services/components"><figcaption></figcaption></figure>

Here, you can add or edit services and select their parents in order to re-arrange their parent/child relationship.


# Step 2 - Add your team

After configuring your services in the previous screen, you'll have the chance to invite your team to collaborate on your new status page.

You can add as many team members as you wish, one on each line. They will get invited as "Editors," which grants them access to report and update incidents, maintenance, and information notices.

<figure><img src="/files/GKFARIMT96QYageq8jFc" alt="status page team members collaboration" width="563"><figcaption></figcaption></figure>

You can later change their role by visiting the "Members" page from the sidebar and editing their memberships.


# Step 3 - Personalize design

Bring your branding. to your status page in a few simple steps

From the theme and status colors to the logo, favicon, custom CSS/JS, and HTML. Our powerful Design page enables you to fully customize your status page to your branding and stylistic needs.

Simply click on `Status page > Design` to access a full-screen, live-preview-enabled designer tool. Make changes and see them take effect side by side in real-time.

<figure><img src="/files/CBPL5NUhIhJR25sJgeZR" alt="status page design settings. logo, favicon, header background."><figcaption></figcaption></figure>


# Step 4 - Enable notifications

Configure what type of notifications should be sent when reporting incidents & maintenance

By default, the StatusPal status page comes with the following notification channels enabled:

* **Email**. Sends carefully crafted emails to your subscribers when reporting incidents & maintenance.
* **RSS/Atom feed**. Allows to subscribe via RSS client to the feed of incidents & maintenance.
* **Tweeting**. Sends Tweets automatically to a specific Twitter account.

### Configure your notification channels

You can turn on/off notification channels by visiting your <mark style="background-color:green;">Subscriptions > Settings</mark> page. If you deactivate all of them, the "Subscribe" button on your status page will disappear.

<div align="left"><figure><img src="/files/ybGl9E2xLuQd8qpbY2em" alt="status page subscription notification settings" width="563"><figcaption></figcaption></figure></div>

### Create your first subscription

After enabling your notifications channels, your customers or stakeholders can subscribe to receive notifications from your status page.

This can be done either from the status page UI or the Admin UI, which you use to manage the status page.

Let's create a "test" subscription for you to receive a notification and see for yourself what it looks like.

Head over to the <mark style="background-color:green;">Subscriptions</mark> page from the sidebar and click on `New subscription`:

### New subscription

<div align="left"><figure><img src="/files/wSGK28X9j4BcjhwkGFUM" alt="status page subscription form" width="563"><figcaption></figcaption></figure></div>

You can enable multiple channels in one subscription, but only the ones you enabled in the previous step will be selectable.

For this test, Email would be enough. So, enter your email address and click on `Create`.

Now, whenever you report an incident in the next step, you should be able to get a notification.


# Step 5 - Report an incident

Report a "test" incident to familiarize yourself with the process and even send an incident notification.

Reporting incidents, maintenance, or information notices in your StatusPal Admin Dashboard couldn't be easier.

From anywhere in the Admin UI, you'll always have available an "Update status" button at the top left, next to the StatusPal logo:

<figure><img src="/files/YMcYLSjR5NusjIw4aUHm" alt="Status page update status button to report incident, maintenance, information notice" width="322"><figcaption></figcaption></figure>

The "Update status" button lets you not only create a new incident but also update existing ones.

Alternatively, if you're on the Dashboard or Incidents page, you'll have a "Create new" button that allows you to create new incidents, maintenance, or information notices.

### Reporting a new incident

The main components when reporting incidents are:

1. **Title**: Short description of what the incident is about
2. **Incident type**: The severity of the incident. By default, you can select from minor and major, but you can customize these types.
3. **Affected services**: Select the services that are impacted by this incident.
4. **Initial update**:
   1. Type: Describes the initial status of the incident. Is it already being investigated or monitored? Is it a retroactive report?
   2. Description: Describe in more detail what the incident is about and what's the current status of it.
5. **Tweet**: Send a tweet automatically from the incident details. The first time you check this, you'll be asked to authenticate with the desired Twitter account.
6. **Notify subscribers:** Send notifications according to your [previously configured notification channels](/get-started/step-4-enable-notifications) and according to the subscriptions configured.

<div align="left"><figure><img src="/files/u1H8aUjPwXbYB6XTVCYJ" alt="status page new incident form" width="563"><figcaption></figcaption></figure></div>

After filling out the necessary fields in the "New incident" form, make sure to check "Notify subscribers," click on `Create,` and the incident should be created. And, if you followed our previous [Step 4 - Enable notifications](/get-started/step-4-enable-notifications), a notification should be sent to you.

### Report a maintenance

Reporting maintenance is not very different than reporting an incident.

1. A maintenance, unlike an incident, can be **reported for the future**, for "scheduled" maintenances. An end date is automatically calculated one hour after the future date, but this can be easily changed.
2. The **initial update type** can be one of
   1. Scheduled: for planned maintenance window in the future.
   2. Essential: for unplanned maintenance that's required to start right away.
3. **Auto-maintenance notifications**: When reporting maintenance in the future, we can send automatic notifications before, on start, and at the end of the maintenance. This is all configurable in the `Subscription settings` page.


# Next Steps

### Enable monitoring

StatusPal supports monitoring out-of-the-box, so we can be a replacement for tools like Pingdom, Datadog, and Newrelic when you have basic monitoring needs.

StatusPal monitoring can be useful for the following:

1. get an email alert when one of your services goes down.
2. Automate incident reporting on your status page.

To enable monitoring, click on Edit on a given service and scroll down to the "Monitoring and Incident Automation" section:

<div align="left"><figure><img src="/files/wgG2UDot1fWC6eu6S5h9" alt="status page monitoring &#x26; incident automation" width="563"><figcaption></figcaption></figure></div>

### Custom domain configuration

To enable custom domain, click on `Status page` from the sidebar and scroll down to the "Domain name" section:

<div align="left"><figure><img src="/files/eYpddCjmuRIoChNSjws6" alt="" width="563"><figcaption></figcaption></figure></div>

Follow the full guide with more information at [Custom Domain](/platform/status-page-settings-and-design/custom-domain).


# FAQ

Frequently asked questions regarding StatusPal status pages.

### Subscribers vs viewer members in a private status page

When configuring a status page as a [Private Status Page](/platform/private-status-page), you'll need to grant users access to the status page so they can visit it.

However, this authenticated access (membership) does not mean that the user will automatically receive email notifications. They still need to opt to subscribe for [Notifications](/platform/subscriptions-and-notifications/notifications).

It's also important to note that no email subscriptions will be sent if there's no matching membership for a given email address.

### How to access my StatusPal organization's settings?

You might want to access your organization's settings to view and add status pages, configure billing, enable Single Sign-On, and more.

Access your organization's settings by clicking on the "←" arrow next to your status page name at the top left if you're currently managing your status page.

<figure><img src="/files/hamUfqPhTQjIFcIcBcpT" alt="" width="563"><figcaption></figcaption></figure>

### How do I create a new status page in StatusPal?

In StatusPal, you can have an unlimited number of status pages within your organization, meaning within one billing subscription.

Follow these simple steps to add new status pages to your existing organization:

1. Access your organization's settings section by following [#how-to-access-my-statuspal-organizations-settings](#how-to-access-my-statuspal-organizations-settings "mention").<br>
2. You are now on the Status pages page of your organization's section.<br>

   <figure><img src="/files/QdRDu4Xy5QQk8H5wo2W7" alt=""><figcaption></figcaption></figure>
3. This page shows your existing status pages. You can add a new one by clicking on the <mark style="background-color:green;">New status page</mark> button.

### How do I create a new organization and billing subscription?

In StatusPal, you can have multiple organizations, each one with a separate billing subscription.

Follow these simple steps to add a new organization to your StatusPal account:

1. Access your organization's settings section by following [#how-to-access-my-statuspal-organizations-settings](#how-to-access-my-statuspal-organizations-settings "mention").
2. Click on the organization's dropdown and select <mark style="background-color:green;">New organization</mark>.![](/files/dWA19lAuHgnJnmk9xAO1)

### How to transfer a status page from one organization to another?

You can change the organization of a status page by clicking on Status page > Settings from the sidebar.

From there, you should have a dropdown "Organization" where you can select the other organization to which you'd like to transfer the status page.

{% hint style="danger" %}
If you can't see the "Organization" dropdown or the other organization in the dropdown options, that means you don't have the necessary permissions for the target organization.
{% endhint %}

<figure><img src="/files/MucooiPeHGQkz6cDsUBC" alt=""><figcaption></figcaption></figure>

### How do I find a service ID?

You can identify the ID of one of your services by visiting its Edit page:

<figure><img src="/files/jxS71Qi5A3L8uz9ll1Jl" alt="Status page service/component edit page"><figcaption></figcaption></figure>

From there, you can find the service's ID by looking at the browser's URL. The ID is right before the `/edit` at the end.

<figure><img src="/files/RAdqCAI56nVV2ok7hapX" alt="Status page service edit URL and ID"><figcaption></figcaption></figure>

### How can I tell who created or updated a status page incident?

In the StatusPal admin UI, you can tell who created an incident by hovering over the "person" icon at the left of an incident card.

<figure><img src="/files/AKGcBMtYeOx4sLfUO8Ir" alt="status page incident creator information in StatusPal admin UI"><figcaption></figcaption></figure>

You can find a similar icon by clicking the "actions" drop-down to the right of the incident card and then clicking "List updates." Each update will have a "person" icon, which you can hover over to see who created it.

<div align="left"><figure><img src="/files/Zx2QmAusufUcXgaCbgvL" alt="" width="563"><figcaption></figcaption></figure></div>

<div align="left"><figure><img src="/files/ig0JvxRLUedURIas6AAd" alt="" width="563"><figcaption></figcaption></figure></div>

### How can I change the copy of my status page or notification email subject?

You can change any part of the copy of your status page, as well as the subject line of the notification emails, by configuring a custom language: [Multi-Language](/platform/multi-language#custom-app-translations-with-inline-yaml-editor).

### How to delete my user account?

1. Sign in to StatusPal and click on the "person" icon at the top right corner and click on <mark style="background-color:green;">My Details</mark>
2. Scroll down and click to expand the <mark style="background-color:green;">DANGER</mark> section
3. Click on <mark style="background-color:red;">**Delete account permanently**</mark> (Note that this cannot be undone)


# 1-Click Import

Switch your status page to StatusPal from another provider with just one click!


# Atlassian Statuspage Importer

Import your Atlassian status page to StatusPal including it's settings, components, subscriptions, and incident history with one simple click.

Migrating from Atlassian Statuspage onto StatusPal couldn't be easier with our 1-click importer. Follow these two simple steps to get the following data imported from Statuspage:

1. Services (Atlassian Statuspage's components).
2. Incidents and maintenances.
3. Email and SMS subscriptions.

### 1) Obtain your Atlassian Statuspage API key and page ID

Head over to your [Atlassian Statuspage dashboard](https://manage.statuspage.io/) and click on <mark style="background-color:green;">API info</mark> from the top left menu:

<figure><img src="/files/n91lEZjA6wogykaZoiZK" alt=""><figcaption></figcaption></figure>

Create a new Organization API key by clicking the <mark style="background-color:green;">Create key</mark> button. Copy the newly created API key and Page ID for the next step.

### 2) Use the 1-Click Atlassian Importer in StatusPal

{% hint style="info" %}
Access the Atlassian Statuspage to StatusPal importer by signing up at <https://statuspal.io/registrations/new> (US) and <https://statuspal.eu/registrations/new> (EU).
{% endhint %}

After signing up for a StatusPal account, the onboarding wizard should prompt you to create your status page. At the bottom, you will find the importer:

<figure><img src="/files/7Qw7G9EgU2hHaO6imBPs" alt=""><figcaption></figcaption></figure>

In the next screen, paste the API key from the previous step onto the "Statuspage user key" field and your Page ID onto the "Statuspage page ID" field.

Click on the "Import" button to start the import process. You will promptly receive an email with the status of your page import into StatusPal.

### Get Help

Experience any issues with the 1-Click Importer? Shoot us an email at <support@statuspal.io> to get immediate help.


# Status.io Importer (beta)

Import your Status.io status page to StatusPal including it's settings, components, and subscriptions with one simple click.

Migrating from the Status.io status page onto StatusPal couldn't be easier with our 1-click importer. Follow these two simple steps to get the following data imported from Status.io:

1. Services (Status.io status page's components).
2. Email and SMS subscriptions.

## **1) Obtain your Status.io status page API key, API ID, and page ID**

Head over to your [Status.io status page dashboard](https://app.status.io) and click on <mark style="background-color:green;">API</mark> from the left menu:<br>

<figure><img src="/files/SQ4m03ApIWdN46is1YHd" alt=""><figcaption></figcaption></figure>

Click on `Display API Credentials` to view the API key and API ID. Copy the API key, API ID, and Page ID for the next step.

## **2) Use the 1-Click Status.io Importer in StatusPal**

{% hint style="warning" %}
Access the Status.io status page to StatusPal importer by signing up at <https://statuspal.io/registrations/new> (US) and <https://statuspal.eu/registrations/new> (EU).
{% endhint %}

After signing up for a StatusPal account, the onboarding wizard should prompt you to create your status page. At the bottom, you will find the importer:

<figure><img src="/files/0NoFQk95THLvb81Vl8KP" alt=""><figcaption></figcaption></figure>

In the next screen, paste the API key from the previous step onto the "API key" field, API ID onto the "API ID" field, and your Page ID onto the "Status.io status page ID" field.

Click on the "Import" button to start the import process. You will promptly receive an email with the status of your page import into StatusPal.

## Get Help <a href="#get-help" id="get-help"></a>

Experience any issues with the 1-Click Importer? Shoot us an email at <support@statuspal.io> to get immediate help.


# Services/components

Understand how to take advantage of your status page services.

The product or application your status page is about will most likely have multiple services that comprise it or dependencies it relies on.

You'll want to represent the services for which you want to report incidents on your status page.

<figure><img src="/files/BzRVmw3szX95sb1vYr3A" alt=""><figcaption><p>Services in StatusPal Admin UI</p></figcaption></figure>

### Nested services

In StatusPal, you can group services in parent/child relationship in order to represent your system logical grouping. This can be useful to represent regions, individual product categories, data-centers, etc.

In order to assign a service as a child of another, simply edit the child service, and select the parent service from the `Parent` dropdown.

<div align="left"><figure><img src="/files/hpZajVRXFkq5tRLaV5Yf" alt="" width="563"><figcaption></figcaption></figure></div>

### Private service

Set a service as "private" when you want it to be visible ***only*** to your managing team. This is handy for services you want to monitor and get alerted if they have disruptions, but only internally instead of customer-facing.

To set a service as private, check the "Private" checkbox in the service form.

{% hint style="info" %}
Private services are not to be confused with [Private Status Page](/platform/private-status-page), where you want to allow authenticated users access to your status page.
{% endhint %}


# Dependencies

Configure a "status hub" or showcase your company's SaaS provider's status on your status page.

{% hint style="info" %}
Find the Dependencies page under `Services > Dependencies` in your sidebar.
{% endhint %}

Dependencies in StatusPal can be used in two distinct ways:

### Internal dependencies

Use "internal dependencies" to embed the status of one status page as a dependency of another. This can be useful to have on the status page act as a "status hub" and centralize the status of all your other relevant status pages in it.

<div align="left"><figure><img src="/files/Wse5p0gZnLmpHCkdQOSQ" alt="status page internal dependency, status page hub, shared status page" width="563"><figcaption></figcaption></figure></div>

Internal dependencies can also come in handy when you need to share the status of some services across different status pages. Placing those services in one status page and then using it as a dependency of the other status pages that need to share them.

### External dependencies

Use external dependencies to display the status of your external SaaS providers like GCP, AWS, DigitalOcea, Github, etc. directly in your status page.

This way when your provider suffers an outage, this can be automatically reflected in your status page, and we'll notify you about it.

This way, your customer will know you're on top of these external incidents even before you have to manually report them.

<div align="left"><figure><img src="/files/yRot4ueCykxw5E8wp1z7" alt="status page external SaaS provider service dependency" width="563"><figcaption></figcaption></figure></div>


# Service “Red button” (Beta)

Allow visitors to report issues for a specific service by opening their email client with a prefilled message.

{% hint style="info" %}
This feature is currently in **beta**. It must be enabled by the StatusPal team.
{% endhint %}

#### How to enable it

To enable the red button, [contact StatusPal support](mailto:support@statuspal.io?subject=Enable%20service%20red%20button%20on%20a%20status%20page\&body=Please%20enable%20the%20service%20red%20button%20on%20our%20status%20page%3A%0A%0AStatus%20page%20URL%3A%20%5Bpaste%20URL%5D%0AIssue%20reports%20email%3A%20%5Bpaste%20email%20address%5D) by email.

When contacting us, make sure to include:

* the **status page URL**
* the **email address** where issue reports should be sent

#### What visitors see

On the status page, hovering a service shows a red “report issue” button.

<figure><img src="/files/6AZOuRlFbwcNX6ESWT8b" alt=""><figcaption></figcaption></figure>

Clicking it opens a `mailto:` draft addressed to your configured email, referencing the status page and the selected service.


# Migrating services to another status page

The “Migrate to another status page” action is designed to move a service group to a different status page.

<div data-full-width="true"><figure><img src="/files/UHZgPC5tNPQWsOPFgeBj" alt="" width="563"><figcaption></figcaption></figure></div>

This action is only available for root services (services with no parent). Migrating a root service also migrates its child services as "root services" to the new status page, preserving the hierarchy. To move child services, migrate their parent service.


# Subscriptions & Notifications

In order to receive notifications about your status page, users need to create a subscription (subscribe).

Send real-time notifications to your customers or stakeholders thanks to powerful and highly customizable subscriptions that enable notifications over a large variety of channels.

<table data-card-size="large" data-view="cards"><thead><tr><th></th><th></th><th data-hidden></th><th data-hidden data-card-target data-type="content-ref"></th></tr></thead><tbody><tr><td>📥 <strong>Subscriptions</strong></td><td>Subscribe to receive status page notifications.</td><td></td><td><a href="/pages/07lcW9i69nIhZjBp82nE">/pages/07lcW9i69nIhZjBp82nE</a></td></tr><tr><td><strong>🚨 Notifications</strong></td><td>Receive incident &#x26; maintenance alerts based on your subscription.</td><td></td><td><a href="/pages/yWVf5yFC2y8npWt8cNC8">/pages/yWVf5yFC2y8npWt8cNC8</a></td></tr><tr><td><strong>📅 Auto-maintenance notifications</strong></td><td>Send notifications automatically before, on start, and completion of maintenance.</td><td></td><td></td></tr><tr><td>⚙️ <strong>Subscription Groups</strong></td><td>Notify a specific segment of your subscribers.</td><td></td><td><a href="/pages/VQ2780OpdxINPRojQLTG">/pages/VQ2780OpdxINPRojQLTG</a></td></tr><tr><td><strong>⬇️ Import email subscribers</strong></td><td>Import subscribers from a CSV file.</td><td></td><td><a href="/pages/iL9oR2rk0a92wxWWsdUz">/pages/iL9oR2rk0a92wxWWsdUz</a></td></tr><tr><td>🛡️ <strong>Auto-subscribe to private status page</strong></td><td>Automatically subscribe users of your private status page.</td><td></td><td><a href="/pages/df5HOPSIJsFA5aMsKSpo">/pages/df5HOPSIJsFA5aMsKSpo</a></td></tr><tr><td>📜 <strong>Custom Email Templates</strong></td><td>Customize the notifications email templates.</td><td></td><td><a href="/pages/WXpmzisOsZ6hQ8eZh5uk">/pages/WXpmzisOsZ6hQ8eZh5uk</a></td></tr></tbody></table>


# Subscriptions

Subscriptions allow your customers and stakeholders to define what types of notifications they want to receive about your status page.

### Enable subscriptions

By default, email and RSS subscription channels will be enabled on your status page. You can enable/disable subscription notification channels under `Subscriptions > Settings`.

<div align="left"><figure><img src="/files/ybGl9E2xLuQd8qpbY2em" alt="status page subscription notification channels settings" width="563"><figcaption></figcaption></figure></div>

When you have at least a subscription notification channel enabled, your status page visitors will see a "Subscribe" button at the top of your status page.

### Subscribing to a status page

<figure><img src="/files/7AVOnBHqlxRn3JfWpEQ6" alt="status page > subscribe to updates button"><figcaption></figcaption></figure>

Upon clicking "Subscribe to updates," a modal is opened with all the possible notification channels as tabs.

<figure><img src="/files/B96zLNQc81N8EbqGpkJz" alt="status page subscribe to notifications - filter by incident type/severity, component specific"><figcaption></figcaption></figure>

### Subscription filters

#### Filter notifications by incident type/severity

Subscribers have the option to choose what types of incidents and severity to get notifications about. For example, they might choose to get notifications only about major incidents or only about scheduled maintenance.

#### Filter notifications by service

Your subscribers can choose to receive notifications from incidents affecting any service in your status page by checking "All," or they can select exactly what services they want to get notifications about by checking "Select services" and then checking the services they care about.

#### Filter notifications to a specific incident

Subscribers can also choose to receive notifications only for a specific incident. In order to do this, they simply need to visit an incident report page on your status page and click on the "Subscribe to updates" button.

<div align="left"><figure><img src="/files/zknzhtp1dLtWOIInd9IW" alt="status page subscription on specific incident only" width="563"><figcaption></figcaption></figure></div>

### Multi-channel subscriptions

On the status page, visitors can select one notification channel when initially creating their subscription, but upon subscribing, they will receive a confirmation message with a link to manage their subscription; on this "subscription management" page, they can select multiple channels.

<div align="left"><figure><img src="/files/9fL5pyxOAUeQkYkNodru" alt="status page multi-channel subscription edit page" width="563"><figcaption></figcaption></figure></div>


# Notifications

Send status page notifications to subscribers over various channels like Email, SMS, Slack, MS Teams, Google Chat, and much more.

Once a user is subscribed to your status page, and depending on their subscription settings, they will receive notifications automatically when you create/update incidents and maintenance.

{% hint style="info" %}
A subscription to the status page is required to send notifications. Users can configure which notification channels to be used and powerful filters on what to get notifications about. Learn more at [Subscriptions](/platform/subscriptions-and-notifications/subscriptions).
{% endhint %}

## Notification channels

Below, you can find examples of StatusPal status page notifications for incidents and maintenance on the different notification channels we support.

### Email notification

<figure><img src="/files/cfCrllZWmFY8Q2T3pKwa" alt="status page: incident email notification"><figcaption></figcaption></figure>

### Slack incident notification

<figure><img src="/files/zFdKqmJnaf17bEnkwVCF" alt="status page Slack incident notification"><figcaption></figcaption></figure>

### Slack maintenance notification

<figure><img src="/files/sEZ5lSU0JETGqtkiIhwa" alt="status page scheduled maintenance Slack notification"><figcaption></figcaption></figure>

### Microsoft Teams notifications

<figure><img src="/files/rAS2T7Z9HOoUsfDxYlxj" alt="Microsoft Teams notifications"><figcaption></figcaption></figure>

### Google Chat notifications

<figure><img src="/files/MnITLWVneYQuGJSHkC9r" alt="Google Chat notifications"><figcaption></figcaption></figure>

{% hint style="info" %}
**\[WIP]** Some notification examples are pending: SMS, Discord, iCal, and Google Calendar.
{% endhint %}

## Setting up notification channels

Enable notification channels from **Subscriptions > Sub. Settings** in your status page admin sidebar. Once a channel is enabled, subscribers can choose it when subscribing.

For detailed setup instructions for each channel, see the dedicated integration pages:

{% content-ref url="/pages/RZV3URZeMFCi2pBPFtYU" %}
[Slack Notifications](/platform/integrations/slack-notifications)
{% endcontent-ref %}

{% content-ref url="/pages/DIlQMDZcie4lFmLnNn6s" %}
[Microsoft Teams Notifications](/platform/integrations/microsoft-teams-notifications)
{% endcontent-ref %}

{% content-ref url="/pages/OCo2O8i1KeHnWjmSP5Jf" %}
[Google Chat Notifications](/platform/integrations/google-chat-notifications)
{% endcontent-ref %}

{% content-ref url="/pages/zOSh25IwzWZsiMMatmeH" %}
[Mattermost Notifications](/platform/integrations/mattermost-notifications)
{% endcontent-ref %}


# Auto-maintenance notifications

Automatically notify before, on start, and completion of your status page maintenance windows.

When scheduling a planned maintenance on your status page, you'll probably want to notify your subscribers not only when it starts but also sometime before and once it's been completed.

StatusPal makes this quite easy, thanks to auto-maintenance notifications!

### Enable auto-maintenance notifications

{% hint style="info" %}
Enable and customize auto-maintenance notifications by clicking <mark style="background-color:green;">Subscriptions > Settings</mark> in the sidebar of your status page admin dashboard.
{% endhint %}

<figure><img src="/files/imX7K5uIamlSgIQBzclo" alt=""><figcaption></figcaption></figure>

* You can schedule up to **two automatic notifications before the start** of the maintenance.
  * Picking from as early as 28 days before and as late as 5 minutes before the start of the maintenance.
  * <mark style="background-color:yellow;">Keep in mind that if the time you select has already passed, no notification will be sent.</mark>
  * You can also select Immediately to send a notification right away.
* You can also opt to send automatic notifications on the start and end of the scheduled maintenance.

{% hint style="danger" %}
If you change the auto-maintenance notification settings, you might have to update any maintenance that you reported before and review its notification settings.
{% endhint %}

### Send auto-maintenance notifications

Once you've enabled auto-maintenance notifications at your status page level, and made sure the settings are as you want them, you can start sending notifications automatically from your status page maintenance.

When creating a maintenance, make sure to check the "Notify subscribers." If you click on the `Configure →` link below, you can override the auto-maintenance notifications settings for this specific maintenance.

<figure><img src="/files/ByPhLjs9utIfCIc112hs" alt="Auto-maintenance notifications - status page individual maintenance settings"><figcaption></figcaption></figure>

## Manually triggering a notification

If you created a maintenance with auto-notifications enabled but the pre-start notification window has already passed, you can manually trigger the notification:

1. Find the maintenance in your admin dashboard and click **List updates**.
2. In the updates list, click **Edit** on the update you want to send out.
3. In the update form, check **Notify subscribers** and click **Update**.

This sends the notification to your subscribers immediately.


# Subscription Groups

Configure subscription audiences for your status page.

Subscriptions in StatusPal already contain powerful filtering options, allowing your customers and stakeholders to subscribe to precisely the services and incident types they care about.

Subscription groups give you an extra layer of segregation for your subscribers, allowing you (status page manager) to send some subscription notifications only to a subset of your subscribers.

### How to use Subscription Groups

{% hint style="info" %}
Configure subscription groups by clicking on <mark style="background-color:green;">Subscriptions > Groups</mark> in the sidebar.
{% endhint %}

<figure><img src="/files/holwSQ3ZfiUxuLjQPzTV" alt="status page subscription groups - send incident notifications to specific customers"><figcaption></figcaption></figure>

You can enter a name for your subscription group and select any subscriptions to be part of it. Once you have some subscription groups configured, you should be able to select them when reporting an incident, maintenance, or information notice.

<figure><img src="/files/gKn3NvNy4ByVL5G1Yv3k" alt="Notifying a specific subscription group about your status page incident or maintenance"><figcaption></figcaption></figure>

### When to use Subscription Groups?

Most of the time, your customers will select the relevant services for them, and this should be enough to send your incident or maintenance notifications to the right people.

However, some customers will select "All" since they're interested in getting notified about any incidents, even when they're not exactly relevant to them.

Furthermore, there are some times when you want to make sure to send a notification only to a small subset of your customers who have subscribed.

Subscription groups can be used in both situations described above to reduce the noise in notifications that your customers will receive.


# Import email subscribers

Bulk import email subscribers to your status page.

StatusPal lets you easily import email subscribers to your status page from a CVS file.

{% hint style="info" %}
Click on <mark style="background-color:green;">Subscriptions</mark> from the sidebar of your status page admin console.
{% endhint %}

On the Subscriptions page, you'll find a button "Import subscribers", when clicking it, you'll see a modal:

<figure><img src="/files/kZUZUREuhEWUs1QSbg15" alt="status page subscribers bulk import modal" width="563"><figcaption></figcaption></figure>

You have two options when importing email subscribers:

### **Import with a confirmation email**

If you check the "Send confirmation email to subscribers" checkbox, we'll send a confirmation email to all the email subscribers from your CSV, and they will be required to click on the confirmation link they receive in their email in order to start receiving email notifications.

### **Importing without a confirmation email**

In this case, you won't check the checkbox above, and your imported subscribers will immediately start to receive notifications.

This option requires that you configure an email integration like SMTP, Mailgun, Sendgrid, etc., unless you're a Business or Enterprise customer.

{% hint style="info" %}
If you're a Business or Enterprise customer and want to email imported subscribers without email confirmation, [**please reach out to us**](mailto:support@statuspal.io?subject=Configure%20my%20status%20page%20sending%20domain\&body=I'd%20like%20to%20configure%20my%20sending%20domain).
{% endhint %}

### The CSV file format

You can download an example CSV file by clicking on the respective link at the bottom of the modal. There, you can see what the format of the CSV you upload should follow.

The following columns are currently supported:

* **Email** should be a valid email address.
* **Service IDs**: If you want a subscriber to receive notifications only about specific services. Learn how to obtain a service id in [FAQ](/faq#how-do-i-find-a-service-id).
* **Incident ID**: If the subscriber should receive notifications only about an specific incident, place its ID in this column. Should not be used in combination with **Service IDs**.


# Auto-subscribe to private status page

Enable this functionality to have viewer members automatically subscribed to your private status page as they get added.

### Requirements

1. A [private status page](/platform/private-status-page) with the "Restrict access to members" setting set to true
2. A Startup plan or higher

{% hint style="info" %}
Access this feature by going to your status page's Settings > Privacy.
{% endhint %}

<figure><img src="/files/F0DFALsG0hta9K2aijya" alt=""><figcaption></figcaption></figure>


# Custom email templates

Easily customize your email notifications templates with subscriptions settings.

Statuspal allows you to fully customize the look of your subscriber emails (confirmation and status notifications), you'll find this settings under `Sidebar > Subscriptions > Settings`:

![](https://d33v4339jhl8k0.cloudfront.net/docs/assets/5b7c6e932c7d3a03f89df563/images/5fd1d9d7db2fa3720c7d7e44/file-TYMywW53so.png)

### **The Layout Template**

First you'll need to configure a layout template, basically the parent template that will render the content template under `{{ content }}`, this way you can reuse some HTML and styles across the content templates, see an example [here](/platform/subscriptions-and-notifications/custom-email-templates/template-examples#layout-template-example).

### **The Content Templates**

Then you can configure the template for both types of emails, you can see examples of both containing the supported variables [here](/platform/subscriptions-and-notifications/custom-email-templates/template-examples#content-template-examples).

### **Premailer**

We use Premailer on the email templates before sending the emails, so CSS styles are converted to inline style attributes and [other niceties](http://premailer.dialect.ca/).

### **Test and Enable**

Once you've configured the templates (and clicked on Submit) you can send a test email before you enable the templates, if they look good you can enable them so they are used on all future emails.

### **Available email template variables**

When customizing the email templates HTML the following variables are available:

| Translations            |                                                     |
| ----------------------- | --------------------------------------------------- |
| `t_update`              | "Update"                                            |
| `t_affected_services`   | "Affected services"                                 |
| `t_find_out_more`       | "Find out more at our"                              |
| `t_status_page`         | "Status Page"                                       |
| `t_manage_subscription` | "Manage subscription"                               |
| `t_open_report`         | "Open incident report" or "Open maintenance report" |

<table data-full-width="false"><thead><tr><th>Incident variables</th><th></th></tr></thead><tbody><tr><td><code>status_page.name</code></td><td>The status page name</td></tr><tr><td><code>incident.type_name</code></td><td>The incident type name (Minor, Major)</td></tr><tr><td><code>incident.title</code></td><td>The title of the incident</td></tr><tr><td><code>incident.type_color_class</code></td><td>The CSS class that we'll apply to set the color of the notification<br>• <code>ok</code> <em>when it's a maintenance</em><br>• <code>bad</code> <em>when it's a major incident</em><br>• <code>warning</code> <em>when it's a minor incident</em><br>• <code>good</code> <em>when it's a resolved incident</em><br>• <code>info</code> <em>when it's an information notice</em></td></tr><tr><td><code>incident.url</code></td><td>The URL to the incident</td></tr><tr><td><code>activity.activity_type_name</code></td><td>The incident update type name (Issue, Investigating, Monitoring, Resolved, etc)</td></tr><tr><td><code>activity.description</code></td><td>The incident update description</td></tr><tr><td><code>maintenance_information</code></td><td>If a maintenance, the start and end of the maintenance will be here</td></tr><tr><td><code>services</code></td><td>The list of services, rendered as HTML (<code>&#x3C;div class="services">...&#x3C;/div></code>)</td></tr><tr><td><code>subscription.manage_url</code></td><td>The URL where the subscribers can manage their subscription</td></tr></tbody></table>

### **Notification email subject variables**

You can customize the incident notification subject via a [custom translation](/platform/multi-language) editing the `subscriber_email.subject` field, you can reference variables through the format `{{ variable_name }}`.

The following variables are available:

| `activity_type_name` | The incident update type name (Issue, Investigating, Monitoring, Resolved, etc) |
| -------------------- | ------------------------------------------------------------------------------- |
| `status_page_name`   | The status page name                                                            |
| `incident_type_name` | The incident type name (Minor, Major)                                           |
| `incident_id`        | The incident ID                                                                 |
| `incident_title`     | The title of the incident                                                       |

### Customizing your Templates to Include your Company Logo

Including your company logo is easy with the fields described above, after adding your company logo this is how the emails will look:

<figure><img src="/files/7ZufSBnN1rT1HBs4E6uZ" alt=""><figcaption></figcaption></figure>

Simply use the HTML content found in [Template exampes](/platform/subscriptions-and-notifications/custom-email-templates/template-examples) and replace the logo image (`<img ... class="logo"/>`) with your logo image.


# Template examples

Email template examples that you can use to customize your email templates.

Use this HTML files to customize your [Statuspal status page](https://www.statuspal.io/features/status-page) email template in order to include a company logo, add your business address or otherwise to modify the looks to suit your branding.

<figure><img src="/files/R6vennkfqSszM9MSQDqX" alt=""><figcaption></figcaption></figure>

### Configure your logo

In order to configure your company logo just replace the image under the `.header` class.

```html
<div class="header">
  <img src="https://www.statuspal.io/images/acme_inc_logo.svg" alt="Company logo" class="logo">
 </div>
```

### Configure your company address

Simply override the generic address found in status-notification-email-template.html and confirmation-email-template.html:

```html
<!-- Company Address Information -->
<tr class="aligncenter content-block">
  <td>YourCompany Inc, 26985 Brighton Lane, Lake Forest, CA, United States</td>
</tr>
<!-- Company Address Information -->
```

Find more information at [Custom email templates](/platform/subscriptions-and-notifications/custom-email-templates).

***

### Layout template example

```html
<html>
  <head>
    <meta name="viewport" content="width=device-width" />
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />

    <style>
      /* -------------------------------------
          GLOBAL
          A very basic CSS reset
      ------------------------------------- */
      * {
        margin: 0;
        font-family: "Helvetica Neue", Helvetica, Arial, sans-serif;
        box-sizing: border-box;
        font-size: 14px;
      }

      img {
        max-width: 100%;
      }

      body {
        -webkit-font-smoothing: antialiased;
        -webkit-text-size-adjust: none;
        width: 100% !important;
        height: 100%;
        line-height: 1.6em;
        /* 1.6em * 14px = 22.4px, use px to get airier line-height also in Thunderbird, and Yahoo!, Outlook.com, AOL webmail clients */
        /*line-height: 22px;*/
      }

      /* Let's make sure all tables have defaults */
      table td {
        vertical-align: top;
      }

      /* -------------------------------------
          BODY & CONTAINER
      ------------------------------------- */
      body {
        background-color: #f6f6f6;
      }

      .body-wrap {
        background-color: #f6f6f6;
        width: 100%;
      }

      .container {
        display: block !important;
        max-width: 600px !important;
        margin: 0 auto !important;
        /* makes it centered */
        clear: both !important;
      }

      .content {
        max-width: 600px;
        margin: 0 auto;
        display: block;
        padding: 20px;
      }

      /* -------------------------------------
          HEADER, FOOTER, MAIN
      ------------------------------------- */
      .main {
        background-color: #fff;
        border: 1px solid #e9e9e9;
        border-radius: 3px;
      }

      .content-wrap {
        padding: 20px;
      }

      .content-block {
        padding: 0 0 20px;
      }

      .header {
        width: 100%;
        padding-top: 20px;
        text-align: center;
      }

      .header td {
        color: #999;
      }

      .logo {
        max-width: 300px;
      }

      .footer {
        width: 100%;
        clear: both;
        color: #999;
        padding: 20px;
      }

      .footer p, .footer a, .footer td {
        color: #999;
        font-size: 12px;
      }

      /* -------------------------------------
          TYPOGRAPHY
      ------------------------------------- */
      h1, h2, h3 {
        font-family: "Helvetica Neue", Helvetica, Arial, "Lucida Grande", sans-serif;
        color: #000;
        margin: 40px 0 0;
        line-height: 1.2em;
        font-weight: 400;
      }

      h1 {
        font-size: 32px;
        font-weight: 500;
        /* 1.2em * 32px = 38.4px, use px to get airier line-height also in Thunderbird, and Yahoo!, Outlook.com, AOL webmail clients */
        /*line-height: 38px;*/
      }

      h2 {
        font-size: 24px;
        /* 1.2em * 24px = 28.8px, use px to get airier line-height also in Thunderbird, and Yahoo!, Outlook.com, AOL webmail clients */
        /*line-height: 29px;*/
      }

      h3 {
        font-size: 18px;
        /* 1.2em * 18px = 21.6px, use px to get airier line-height also in Thunderbird, and Yahoo!, Outlook.com, AOL webmail clients */
        /*line-height: 22px;*/
      }

      h4 {
        font-size: 14px;
        font-weight: 600;
      }

      p, ul, ol {
        margin-bottom: 10px;
        font-weight: normal;
      }

      p li, ul li, ol li {
        margin-left: 5px;
        list-style-position: inside;
      }

      /* -------------------------------------
          LINKS & BUTTONS
      ------------------------------------- */
      a {
        color: #348eda;
        text-decoration: underline;
      }

      .btn-primary {
        text-decoration: none;
        color: #FFF;
        background-color: #348eda;
        border: solid #348eda;
        border-width: 8px 16px;
        line-height: 2em;
        /* 2em * 14px = 28px, use px to get airier line-height also in Thunderbird, and Yahoo!, Outlook.com, AOL webmail clients */
        /*line-height: 28px;*/
        font-weight: bold;
        text-align: center;
        cursor: pointer;
        display: inline-block;
        border-radius: 5px;
        text-transform: capitalize;
      }

      .powered-by {
        margin-left: 30px;
        font-size: 12px;
      }

      /* -------------------------------------
          OTHER STYLES THAT MIGHT BE USEFUL
      ------------------------------------- */
      .last {
        margin-bottom: 0;
      }

      .first {
        margin-top: 0;
      }

      .aligncenter {
        text-align: center;
      }

      .alignright {
        text-align: right;
      }

      .alignleft {
        text-align: left;
      }

      .clear {
        clear: both;
      }

      /* -------------------------------------
          ALERTS
          Change the class depending on warning email, good email or bad email
      ------------------------------------- */
      .alert {
        font-size: 16px;
        color: #fff;
        font-weight: 500;
        padding: 20px;
        text-align: center;
        border-radius: 3px 3px 0 0;
      }

      .alert a {
        color: #fff;
        text-decoration: none;
        font-weight: 500;
        font-size: 16px;
      }

      .alert b {
        font-size: 16px;
      }

      .alert.alert-warning {
        background-color: #FF9F00;
      }

      .alert.alert-bad {
        background-color: #D0021B;
      }

      .alert.alert-good {
        background-color: #68B90F;
      }

      .alert.alert-ok {
        background-color: #2f81ff;
      }

      .alert.alert-info {
        background-color: #48CBA5;
      }

      /* -------------------------------------
          SERVICES
      ------------------------------------- */
      .services {
        color: #808080;
        text-wrap: pretty;
        word-wrap: break-word;
      }

      .services span.service{
        display: inline-block;
        white-space: nowrap;
        border: 1px solid rgb(0, 132, 255);
        padding: 1px 3px;
        margin-bottom: 5px;
        border-radius: 3px;
      }

      /* -------------------------------------
          RESPONSIVE AND MOBILE FRIENDLY STYLES
      ------------------------------------- */
      @media only screen and (max-width: 640px) {
        body {
          padding: 0 !important;
        }

        h1, h2, h3, h4 {
          font-weight: 800 !important;
          margin: 20px 0 5px !important;
        }

        h1 {
          font-size: 22px !important;
        }

        h2 {
          font-size: 18px !important;
        }

        h3 {
          font-size: 16px !important;
        }

        .container {
          padding: 0 !important;
          width: 100% !important;
        }

        .content {
          padding: 0 !important;
        }

        .content-wrap {
          padding: 10px !important;
        }
      }

      /*# sourceMappingURL=styles.css.map */
    </style>

  </head>
  <body itemscope itemtype="http://schema.org/EmailMessage">
    {{ content }}
  </body>
</html>
```

### Content template examples

#### Confirmation template example

```html
<table class="body-wrap">
  <tr>
    <td></td>
    <td class="container" width="600">
      <div class="header">
        <img src="https://www.statuspal.io/images/acme_inc_logo.svg" alt="Company logo" class="logo">
      </div>
      <div class="content">
        <table class="main" width="100%" cellpadding="0" cellspacing="0" itemprop="action" itemscope itemtype="http://schema.org/ConfirmAction">
          <tr>
            <td class="content-wrap">
              <meta itemprop="name" content="Confirm Email"/>
              <table width="100%" cellpadding="0" cellspacing="0">
                <tr>
                  <td class="content-block">
                    <p>
                      {{ t_body_confirm_p }}.
                    </p>
                    <p>
                      <a href="{{ subscription.do_confirm_url }}" class="btn-primary" itemprop="url">
                        {{ t_body_confirm_p_action }}
                      </a>
                    </p>
                  </td>
                </tr>
              </table>
            </td>
          </tr>
        </table>
        <div class="footer">
          <table width="100%">
            <tr>
              <td class="aligncenter content-block">
                <a href="{{ unsubscribe_url }}">{{ t_body_unsubscribe_p_action }}</a>
                {{ t_body_unsubscribe_p }}
                <span class="powered-by">Powered by
                  <a href="https://www.statuspal.io?utm_medium=email&amp;utm_source=status-update&amp;company={{ status_page.name }}">StatusPal</a>
                </span>
              </td>
            </tr>
            <!-- Company Address Information -->
            <tr class="aligncenter content-block">
              <td>YourCompany Inc, 26985 Brighton Lane, Lake Forest, CA, United States</td>
            </tr>
            <!-- Company Address Information -->
          </table>
        </div>
      </div>
    </td>
    <td></td>
  </tr>
</table>
```

#### Status notification template example

```html
<table class="body-wrap">
  <tr>
    <td></td>
    <td class="container" width="600">
      <div class="header">
        <table width="100%">
          <tr>
            <td class="aligncenter">
              {{ status_page.name }} {{ incident.type_name }} {{ t_update }}
            </td>
          </tr>
        </table>
        <br />
        <img src="https://www.statuspal.io/images/acme_inc_logo.svg" alt="Company logo" class="logo">
      </div>
      <div class="content">
        <table class="main" width="100%" cellpadding="0" cellspacing="0">
          <tr>
            <td class="alert alert-{{ incident.type_color_class }}">
              <b>[{{ t_update }}]</b> {{ incident.title }}
            </td>
          </tr>
          <tr>
            <td class="content-wrap">
              <table width="100%" cellpadding="0" cellspacing="0">
                <tr>
                  <td class="content-block">
                    {{ maintenance_information }}

                    <p>
                      {{ activity.description }}
                    </p>
                    <br />

                    <p>
                      <b>{{ t_affected_services }}:</b>
                      {{ services }}
                    </p>
                    <br />

                    <a href="{{ incident.url }}" class="btn-primary" itemprop="url">
                      {{ t_open_report }}
                    </a>
                  </td>
                </tr>
              </table>
            </td>
          </tr>
        </table>
        <div class="footer">
          <table width="100%">
            <tr>
              <td class="aligncenter content-block">
                <a href="{{ subscription.manage_url }}">{{ t_manage_subscription }}</a>
                <span class="powered-by">Powered by
                  <a href="https://www.statuspal.io?utm_medium=email&amp;utm_source=status-update&amp;company={{ status_page.name }}">StatusPal</a>
                </span>
              </td>
            </tr>
            <!-- Company Address Information -->
            <tr class="aligncenter content-block">
              <td>YourCompany Inc, 26985 Brighton Lane, Lake Forest, CA, United States</td>
            </tr>
            <!-- Company Address Information -->
          </table>
        </div>
      </div>
    </td>
    <td></td>
  </tr>
</table>
```


# Incidents & Maintenance

Report incidents & maintenance in your StatusPal status page.

{% hint style="info" %}
We explain the concept of incident & maintenance in [Key concepts](/get-started/key-concepts#incident)
{% endhint %}

Reporting an incident or maintenance in StatusPal couldn't be easier. We've already covered the basics in our Get Started guide [Step 5 - Report an incident](/get-started/step-5-report-an-incident), in this article, we dig a little deeper.

### Ways an incident can be created

In StatusPal, reporting an incident or maintenance can be done in a couple of different ways:

1. [Via the Admin UI](/platform/incidents-and-maintenance/reporting-an-incident).
2. Via our [API](https://docs.statuspal.io/platform/api-reference).
3. Via incident automation thanks to our integrated monitoring or an external monitoring tool.
4. Via integration with an incident alerting (on-call) tool like PagerDuty, VictorOps or Incident.io.
5. Maintenance can be automatically duplicated thanks to our powerful recurring maintenance tasks.

### Incidents & maintenance notifications

StatusPal enables you to send real-time notifications about the incidents and maintenance reported on your status page.

Learn about how to send notifications about incidents and maintenance at [Notifications](/platform/subscriptions-and-notifications/notifications).


# Reporting an Incident

Easily manage and document incidents by providing details such as affected services, timelines, and updates, using a streamlined and user-friendly interface.

As mentioned earlier, there are [many ways to report an incident](/platform/incidents-and-maintenance#ways-an-incident-can-be-created). This is how to do it via the StatusPal Admin UI.

### Understanding the fields for reporting an incident

<div align="left"><figure><img src="/files/2Orndt3IGFiZVg7cxxK0" alt="" width="563"><figcaption></figcaption></figure></div>

* **Title**: Add a short, descriptive title summarizing the incident.
* **Incident Type**: Select the type of incident (e.g., Minor incident, Major incident) to indicate its severity and impact level.
* **Starts At / Ends At**: Specify when the incident began and, if applicable, when it is expected to or has already ended.
* **Affected Services**: Choose the impacted services from the list. You can select one or multiple services.
* **Private Notes**: Include internal notes or sensitive details, such as troubleshooting steps or resolution context. These notes are only visible to team members with Admin UI access.
* **Initial Update**: Provide an update for subscribers describing the nature of the incident.
* **Type**: Define the type of issue.
* **Description**: Add more context or detailed information about the incident. This field supports Markdown for formatting.
* **Tweet**: Check this box to send an update via Twitter.
* **Notify Subscribers**: Check this box to notify subscribers via email, SMS, or other configured channels.


# Incident Templates

Create reusable templates to speed up incident and update creation.

Statuspal lets you create incident templates to speed up the process of creating and updating incidents — useful for recurring incident patterns where you'd otherwise be copying and pasting the same content repeatedly.

## Creating and managing templates

Navigate to **Dashboard > Templates** in your admin panel to access the incident templates section.

![Incident templates tab](/files/hVhR7b3GLwYbSkTdbjUa)

Click **New Template** to create one. Each template has the following fields:

* **Template title** *(optional)* — An internal label used only to identify the template in the templates list and the **Templates** dropdown. It is never shown to your subscribers. Leave it blank to identify the template by its Incident title instead.
* **Incident title** — Used as the incident title when the template is applied.
* **Description** — Applied to the incident update description.

![New template form](/files/4gJnjNaPjB3kCbVEUNgJ)

## Using a template

When creating or updating an incident, click the **Templates** dropdown and select a template (listed by its Template title, or its Incident title when none is set). The template's Incident title and description will automatically populate the corresponding fields.

Templates work in both places:

* When **creating a new incident**:\
  \
  ![Templates dropdown when creating incident](/files/rIm94eM3yxsyIsVFRM9z)
* When **adding an update** to an existing incident:\
  \
  ![Templates dropdown when adding an update](/files/f5fU4w035gUZoPce5KY6)


# The Uptime Calendar Page

Showcase your status page incidents & maintenance history, as well as upcoming maintenance, in a navigable and filterable calendar view.

{% hint style="info" %}
Your customers can access the Uptime Calendar Page by clicking on <mark style="background-color:green;">Incident & maintenance history</mark> at the bottom of your status page and then on <mark style="background-color:green;">Uptime Calendar</mark>.
{% endhint %}

<figure><img src="/files/wyZ1s8s5EUZnrBTWz3Fl" alt=""><figcaption></figcaption></figure>

### Enable/Disable Uptime Calendar Page

You can enable and disable the Uptime Calendar Page by visiting your status page settings under the field `Display uptime calendar`.


# Custom Incident Types

Configure custom incident types and severities for your StatusPal status page.

StatusPal comes preconfigured with two types of incidents (minor and major) and scheduled maintenance.

You can customize this in order to have different incident severities and maintenance by clicking on <mark style="background-color:green;">Incidents > Custom types</mark> from the sidebar. However, you will first need to enable this feature under your status page advanced settings.

<figure><img src="/files/8lVASqonwGu7agD9qfmy" alt="status page > custom inciden types/severities"><figcaption></figcaption></figure>

When configuring an incident type, you can set it as a "maintenance type" when checking "Is maintenance?".

If you don't set it as a maintenance, you'll have a couple more options:

* **Affects uptime**. Defines if incidents of this type should reduce the uptime percentage displayed in the uptime graph on your status page.
* **Escalates to**. Defines to what other type/severity incidents should escalate to when creating an incident update of type "Escalate."
* **De-escalates to.** Defines to what other type/severity incidents should de-escalate to when creating an incident update of type "De-escalate."

<div align="left"><figure><img src="/files/WAtkxBCkuCSAnkbjWUge" alt="status page custom incident type/severity form" width="563"><figcaption></figcaption></figure></div>


# Exporting your incidents

Export your status page invoices as CSV format & as JSON thanks to our powerful API,

There are two ways to export your incident history in StatusPal:

### Export as CSV

On the Incidents page, you will find a button titled "Download CSV report," which will enable you to download a CSV with your incident history.

<figure><img src="/files/HxVSrwv295EfUXNqFLa8" alt=""><figcaption></figcaption></figure>

The CSV report will contain the full list of incidents and maintenance, including the following details:

<table><thead><tr><th width="173">Column</th><th>Description</th></tr></thead><tbody><tr><td>ID</td><td>The ID of the incident</td></tr><tr><td>Starts at</td><td>The start date of the incident</td></tr><tr><td>Ends at</td><td>The end date</td></tr><tr><td>Title</td><td>The title of the incident</td></tr><tr><td>Active</td><td>A boolean saying if the incident is still ongoing or not</td></tr><tr><td>Services</td><td>A comma-separated list of services</td></tr></tbody></table>

### Export incident history from StatusPal API

If you require more details than the provided via CSV export, you can use our API to pull the complete information of your incident history.

{% hint style="info" %}
Access the status page incident's API at [docs.statuspal.io/platform/api-reference](https://docs.statuspal.io/platform/api-reference/incidents).
{% endhint %}


# Filtering incidents & Maintenance

Finding a specific incident or maintenance can become challenging as they grow in number. To assist you in that task, the Incidents / Maintenance listing page has a search feature, which you can use by clicking on the "Filter" button.

<figure><img src="/files/khCatZgWXzXE7IaC0FkK" alt=""><figcaption></figcaption></figure>

Submitting a search term will trigger a search request looking for incidents & maintenance with a matching title.

We also offer a minimal search query language to filter incidents & maintenance by the "starts at" and "ends at" dates. Here are some examples of how you can use it:

```
starts_at:>2025-06-30
```

(finds incidents & maintenance that start after 2025-06-30)

```
ends_at:<2025-07-21
```

(finds incidents & maintenance that end before 2025-07-21)

```
starts_at:2025-05-18 DoS Attack
```

(finds incidents & maintenance that start on 2025-05-18 with title containing "DDoS Attack")


# Statuses lifecycle & side effects

### Incidents

#### Lifecycle

Below is the lifecycle of an incident. However, an incident can be created with the initial status of investigating, monitoring, or issue. To report incidents that have already been resolved, use the "retroactive" type.

```mermaid
graph TD
  Investigating --> Monitoring
  Monitoring --> Issue
  Issue --> Resolved
```

#### Update types and their side effects

Posting an update to an incident adds information to its timeline and gives you the option of notifying your subscribers. However, some update types also have side effects on the incident.

* **De-escalate**: Will de-escalate a major incident to minor.
* **Escalate**: Escalates a minor incident to major.
* **Resolve**: Marks the incident as resolved.

### Maintenance

#### Lifecycle

Below is the lifecycle of a maintenance. The "monitoring" status is optional and not used automatically. To report a maintenance that has already started, use the "essential" update type.

```mermaid
graph TD
  Scheduled --> Started
  Started --> Monitoring["Monitoring (optional)"]
  Monitoring --> Completed
```

#### Update types and their side effects

Posting an update to a maintenance adds information to its timeline and gives you the option of notifying your subscribers. However, some update types also have side effects on the incident.

* **Started**: Starts a planned maintenance immediately. Its end date won't be automatically adjusted; this will require editing the maintenance.
* **Resolve**: Marks the maintenance as completed.
* **Postponed**: This update <mark style="background-color:$warning;">does not</mark> have a side effect, so a manual editing of the maintenance will be needed to set the new start/end dates.


# Information Notices

Use information notices on your status page to communicate about system events that don't affect your uptime.

Sometimes, you want to notify your customers and stakeholders about system events that don't fit in the incident or maintenance categories; information notices are exactly what you need in these cases.

Some examples of situations where information notices can be used:

* Significant changes will be performed on your platform at some specific date that might affect some components.
* Important product updates that might cause some incompatibilities to your customers.
* Some component in your system are working differently than usual but without causing real issues.

{% hint style="info" %}
Access information notices at <mark style="background-color:green;">Incidents > Information</mark> notices from the sidebar of your status page Admin UI.
{% endhint %}

<figure><img src="/files/NjewWmU9YRBCFgWDeDaw" alt="status page system information notices"><figcaption></figcaption></figure>

Upon creating an information notice and marking it as "featured," it will be displayed at the top of your status page, right below the status badge.

<figure><img src="/files/O58K0Y1nXO5C3NAXjERB" alt="status page showcasing an information notice"><figcaption></figcaption></figure>


# Private Status Page

Configure a status page to be restricted only to authenticated users or to specific network IPs.

In order to configure a status page to be private/restricted, you can configure it under your status page settings (Click on <mark style="background-color:green;">Status page</mark> in the sidebar) in the "Privacy" section.

<div align="left"><figure><img src="/files/gY6lU03OeWWHOXr76ZwX" alt="" width="563"><figcaption></figcaption></figure></div>

### Restrict by network IP

In the Restrict to IPs field, enter a comma-separated list to define which IPs have access to the status page. You can use:

* Individual IPs
* CIDR notation (grants access to the full IP block)

### Restrict access to members

Upon checking this checkbox (and clicking on Update), only members with permission to the status page will be able to visit it.

Unauthenticated users will be greeted by a "Sign-in" page which prevents access to the status page without authenticating.

<div align="left"><figure><img src="/files/wcp30Wmnlq0mukoO9Smo" alt="" width="375"><figcaption></figcaption></figure></div>

In StatusPal, there is a special member role called "Viewer," which grants a user viewing access to a status page or organization.

Each subscription plan comes with as many viewer members as subscription seats, which makes StatusPal <mark style="background-color:yellow;">much more affordable</mark> than competitors.

{% hint style="info" %}
Automatically subscribe your private status page users as they get added. Learn more at [Auto-subscribe to private status page](/platform/subscriptions-and-notifications/auto-subscribe-to-private-status-page).
{% endhint %}


# Adding people to your status page

Add your customers or stakeholders to your private status page so they can view and subscribe to get incident notifications.

When you configure your status page as private (via the "Restrict access to members" checkbox), users will need to authenticate to access it.

{% hint style="info" %}
Note that adding a person to your status page will not automatically turn on incident notifications for them unless you enable [Auto-subscribe to private status page](/platform/subscriptions-and-notifications/auto-subscribe-to-private-status-page).
{% endhint %}

There are a few different ways users can obtain a user to authenticate to your private status page.

### Manually invite them as Viewer members

The first option is for your status page manager (with Owner role) to manually invite them with the Viewer role, which grants users the ability to view and subscribe to your private status page.

{% hint style="info" %}
Click on <mark style="background-color:green;">Members</mark> and then on **Invite new member** and select the role "**Viewer"**.
{% endhint %}

Besides the possibility of adding your Viewer members via our UI, it's also possible to use our Restful API for this: [https://docs.statuspal.io/platform/api-reference](https://docs.statuspal.io/platform/api-reference/status-page-members#post-status_pages-subdomain-members).

### Share an Invite Link

Another option you might find more handy is to share a special Invite Link with your customers or stakeholders, which they can use to sign up to get access to your private status page.

This will automatically create a Viewer member for them on your status page.

#### Obtain your status page Invite Link

Follow these simple steps to generate your status page's Invite Link.

{% hint style="info" %}
Click on <mark style="background-color:green;">Status page > Settings</mark> and scroll down to your Privacy settings.
{% endhint %}

1. Check the "Restrict access to members" checkbox to set your status page as private.
2. Enter the email domains that should be allowed to sign up for your status page.
3. Click on **Update**
4. Profit—Copy your **Invite Link** and share it with your customers and stakeholders, who should have access to your private status page.

<figure><img src="/files/0agU4IuC3w0dajF3UBos" alt=""><figcaption></figcaption></figure>

### Provide access to your private status page via SSO

Another way to give your users access to your status page is through Single Sign-On, which we support via the SAML 2 standard.

{% hint style="info" %}
Learn more about our SSO integration at [Single Sign-On](/security/single-sign-on).
{% endhint %}


# Access Groups/Audience Specific

Access groups allow you to configure your private status page to adapt according to the audience visiting it.

You might have a status page with some services that should be visible to some customers, while other services should be visible to others, and admins should have the ability to manage all of them.

This comes particularly handy when you need to communicate incidents and maintenance to different customers, while in some cases some incidents or maintenance might affect multiple of their systems at once.

This can be achieved by configuring access groups for a private status page. You can access this feature by clicking on <mark style="background-color:green;">Members > Access groups</mark> from the sidebar of your status page.

<figure><img src="/files/AC0ZsR0YMIhpEapbaJa2" alt="status page access groups for audience specific private status page"><figcaption></figcaption></figure>

### Configuration

The following are the requirements to use Access Groups:

1. A [private status page](/platform/private-status-page).
2. You have invited your customers or stakeholders to your private status page as "viewer members" so they can access your status page.

Once the above is in place, visit <mark style="background-color:green;">Members > Access groups</mark> and click on "New access group".

<figure><img src="/files/k90iHgMIGoanzy86vsSg" alt="status page audience specific settings" width="563"><figcaption></figcaption></figure>

You can select what services this group should have access to and who should be part of this group, granting them access to the selected services.

Any viewer member visiting your status page will only be able to see and subscribe to the services they have assigned to them via an access group.


# Team Members

Manage your StatusPal status page team members to give them access to specific status pages or at the organization's level.

### Two levels of membership

StatusPal offers two distinct levels of team membership, enabling you to organize your teams with the granularity you require.

#### **Status page level members**

These members have access to a specific status page and are managed via the <mark style="background-color:green;">Members</mark> link in the sidebar of your status page admin dashboard.

<figure><img src="/files/czHvsRvVgnfwfB3m3WzA" alt="Status page level members"><figcaption></figcaption></figure>

#### **Organization-level members**

These members have access to all the status pages within an organization, as well as the settings of the organization itself, depending on the team member's role. You can manage the organization-level memberships via the <mark style="background-color:green;">Members</mark> link in the sidebar of your organization's admin section.

<figure><img src="/files/OHzTDIkm9HZugYMNzyQx" alt="Organization-level members"><figcaption></figcaption></figure>

### Roles

The following roles are available in StatusPal memberships:

* **Editor**: Members with this role can create and update incidents, maintenance, and information notices.
* **Admin**: These members can fully manage status pages but not delete them.
* **Owner**: These members can fully manage a status page or organization, depending on what level the membership is.
* **Billing**: These members can list and download invoices for your organization. This role is only available at the organization level.
* **Viewer**: This is a special role that doesn't allow for managing status pages, only for viewing and subscribing to [private status pages](/platform/private-status-page). Members with this role won't reduce your number of team member seats. Instead, you have the same number of viewer seats as you have subscriptions in your billing plan.


# Status Page Settings & Design

Configure your status page to suit exactly your organization's needs.

### Basic settings

The following settings are available for customization of your status page:

<figure><img src="/files/tfTjxpff2hcMgvDIhUvP" alt=""><figcaption></figcaption></figure>

* **Organization** allows you to move your status page to another organization you're the owner of.
* **Company, project or service name** will be used internally to refer to your status page and also externally if no "Public company name" is configured in the Design page.
* **Website** should point to the website this status page is about, if any. It will be used in the footer of your status page.
* **Support email** will be displayed on your status page below the status banner, asking status page visitors to reach out here if they have complaints.
* **Twitter handle** will also be used in the footer of your status page. This is mostly useful if you also report your status on this Twitter account.
* **About information** is displayed in your status page and meta description explaining to your visitors about what's the purpose of your status page.

### Custom domain & privacy settings

Next are the custom domain and privacy settings. Follow these guides to learn more about them:

<table data-card-size="large" data-view="cards"><thead><tr><th></th><th></th><th data-hidden></th><th data-hidden data-card-target data-type="content-ref"></th></tr></thead><tbody><tr><td>🌎 <strong>Custom Domain</strong></td><td>Configure your branded domain like <code>status.yourcompany.com</code>.</td><td></td><td><a href="/pages/BCff1HyniC3uIWw9KNcN">/pages/BCff1HyniC3uIWw9KNcN</a></td></tr><tr><td><strong>🔒 Private Status Page</strong></td><td>Restrict access to your status page by IP or to authenticated users.</td><td></td><td><a href="/pages/1WpLSrw8ExC5zdzCq1VU">/pages/1WpLSrw8ExC5zdzCq1VU</a></td></tr></tbody></table>

### Other settings

The rest of the settings for your status page are the following:

<figure><img src="/files/H4V4uLanWfNCWQcYyqq7" alt=""><figcaption></figcaption></figure>

### Advanced settings

{% hint style="info" %}
Visit [Advanced Settings](/platform/status-page-settings-and-design/advanced-settings) to learn about your status page's advanced settings.
{% endhint %}


# Custom Domain

Configure a custom domain with a managed SSL certificate for your status page.

StatusPal allows you to easily configure a custom domain for your status page secured with `HTTPS` endpoint, like `https://status.company.com`. We'll generate and automatically renew the SSL certificate for you!

To get started, log in to your StatusPal admin dashboard. From the left sidebar, click on “Status page” and then select “Settings”.

<div align="left"><figure><img src="/files/TFrEaQlVsSu2WmOREtrS" alt="" width="375"><figcaption></figcaption></figure></div>

In the “Domain name” section, locate the select field labeled “Domain provider” and change its value to “Custom domain with SSL”. When selected, additional configuration fields will appear.

<div align="left"><figure><img src="/files/ijQ4aifmBOxXFsWtkU1i" alt="" width="563"><figcaption></figcaption></figure></div>

The domain you enter can be any domain you own and have access to manage via DNS. After clicking “Update” to save your changes, the custom domain configuration process will begin and you'll be prompted to add the required DNS records in your DNS provider.

<div align="left"><figure><img src="/files/V2PYhPGjJJO2BR42RzCE" alt="" width="563"><figcaption></figcaption></figure></div>

Keep in mind that the required DNS records vary depending on whether you're using `statuspal.io` or `statuspal.eu`.

If you want to save some time, you can configure the CNAME DNS record in advance. Create a CNAME record where the hostname is your desired custom domain. The value should point to `domains-proxies.statuspal.io` if you're using `statuspal.io`, or to `statuspal-eu.b-cdn.net` if you're using `statuspal.eu`.

Once your DNS records are in place, click “Refresh” to confirm that the configuration has succeeded.

### Migrate legacy custom domains

Users who have the legacy custom domain configuration will eventually be asked to migrate to the new custom domain setup.

To migrate, go to the same status page settings used to configure custom domains. From the left sidebar, open “Status page“, then “Settings“, and scroll to the Domain name section. Change the Domain provider from “Legacy custom domain with SSL” to “Custom domain with SSL”.

After switching the domain provider, follow the same steps described above to complete the configuration. Your existing custom domain can be reused, but you may be asked to update your DNS records as part of the migration.


# Advanced Settings

Your status page advanced settings.

{% hint style="info" %}
You can access your status page's advanced settings by scrolling to the bottom of the <mark style="background-color:green;">Status page > Settings</mark> page and clicking to expand the "Advanced" section.
{% endhint %}

<figure><img src="/files/8GFGzLDi0x2QJ7k4ZMNO" alt=""><figcaption></figcaption></figure>

### Long-running incident notification

These settings configure how soon the status page admins and owners should be notified if an incident has been open for too long.

You can select the number of hours for each incident severity. The screenshot above shows the default settings.

### Incident history limit

Select how long you wish to display your incident history on your status page. This will not delete incidents older than this setting; it will only hide them from your status page.

The default is "no limit," but you can select from 30 days to one year.

### Enable custom incident types

This setting will enable the custom incident types feature, allowing you to have more severities than minor and major or different ones according to your needs.

{% hint style="info" %}
Learn more about this feature in [Custom Incident Types](/platform/incidents-and-maintenance/custom-incident-types).
{% endhint %}

### Enable information notices

This setting will enable information notices, which can be used to communicate about system events that don't affect your uptime.

{% hint style="info" %}
Learn more about this feature in [Information Notices](/platform/information-notices)
{% endhint %}

### Lock from adding incidents when under maintenance

This setting will prevent the creation of incidents on your status page for periods where there's a maintenance window in place.

### Remove status page from being indexed by Google

Remove your status page from Google by adding the following to your status page `<head>`.

```html
<meta name="robots" content="noindex" />
```

### Enable captchas

By default, as a security measure to prevent spam, we require captcha solving for your visitors as a requirement to subscribe to your status page.

Since private status pages are already protected by authentication, you can disable the captcha step for private status pages with this setting.


# Date & Time Formatting

Customize how dates and times are displayed on your status page using strftime-style directives.

Statuspal allows you to customize how dates and times are displayed on your status page. To configure this, click **Status Page** in the admin sidebar and look for the date/time formatting fields.

You can configure:

* **Time format** — 24-hour or AM/PM, applies globally across the status page.
* **Short date string** — Used in places like the incidents and maintenance list.

## Directive format

A directive is a percent sign (`%`) followed by a character. Optional specifiers can be inserted between them:

```
%<flag><width><modifier><directive>
```

**Flags:**

| Flag      | Description                 |
| --------- | --------------------------- |
| `-`       | Don't pad numerical results |
| `0`       | Pad with zeros              |
| `_`       | Pad with spaces             |
| `:`, `::` | Used with `%z` only         |

`<width>` is a non-negative decimal number specifying the minimum field width.

`<modifier>` can be `E` or `O` (locale-sensitive, currently ignored).

## Directive reference

| Directive             | Description                           | Example      |
| --------------------- | ------------------------------------- | ------------ |
| `%%`                  | Literal `%`                           | `%`          |
| **Years**             |                                       |              |
| `%Y`                  | Full year (0–9999)                    | `2024`       |
| `%y`                  | Last two digits of year (00–99)       | `24`         |
| `%C`                  | Century number (00–99)                | `20`         |
| `%G`                  | ISO week year (0–9999)                | `2024`       |
| `%g`                  | ISO week year, 2 digits (00–99)       | `24`         |
| **Months**            |                                       |              |
| `%m`                  | Month number (1–12)                   | `03`         |
| `%b`                  | Abbreviated month name                | `Mar`        |
| `%h`                  | Same as `%b`                          | `Mar`        |
| `%B`                  | Full month name                       | `March`      |
| **Days**              |                                       |              |
| `%d`                  | Day of month (1–31)                   | `05`         |
| `%e`                  | Day of month, space-padded (1–31)     | `5`          |
| `%j`                  | Day of year (001–366)                 | `064`        |
| `%u`                  | Weekday, Monday first (1–7)           | `2`          |
| `%w`                  | Weekday, Sunday first (0–6)           | `2`          |
| `%a`                  | Abbreviated weekday name              | `Tue`        |
| `%A`                  | Full weekday name                     | `Tuesday`    |
| **Hours**             |                                       |              |
| `%H`                  | Hour, 24-hour clock (00–23)           | `14`         |
| `%I`                  | Hour, 12-hour clock (01–12)           | `02`         |
| `%k`                  | Hour, 24-hour, space-padded (0–23)    | `14`         |
| `%l`                  | Hour, 12-hour, space-padded (1–12)    | `2`          |
| `%P`                  | `am` or `pm`                          | `pm`         |
| `%p`                  | `AM` or `PM`                          | `PM`         |
| **Minutes & seconds** |                                       |              |
| `%M`                  | Minute (00–59)                        | `30`         |
| `%S`                  | Second (00–60)                        | `45`         |
| **Timezone**          |                                       |              |
| `%z`                  | UTC offset (e.g. `+0200`)             | `+0200`      |
| `%:z`                 | UTC offset with colon (e.g. `+02:00`) | `+02:00`     |
| `%Z`                  | Timezone abbreviation                 | `CET`        |
| **Composite**         |                                       |              |
| `%D`                  | Equivalent to `%m/%d/%y`              | `03/05/24`   |
| `%F`                  | Equivalent to `%Y-%m-%d` (ISO 8601)   | `2024-03-05` |
| `%R`                  | Equivalent to `%H:%M`                 | `14:30`      |
| `%T`                  | Equivalent to `%H:%M:%S`              | `14:30:45`   |


# Design Customization

Thanks to the live preview designer and custom CSS/HMTL, you can design your status page to fit your brand and any custom needs.

{% hint style="info" %}
Access your status page's Design settings by clicking on <mark style="background-color:green;">Status page > Design</mark> from the sidebar.
{% endhint %}

<figure><img src="/files/PSFRUBebuGZeK7cn4b0F" alt="status page custom design"><figcaption></figcaption></figure>

Our full-screen, live-preview-enabled designer tool allows you to make changes and see them take effect side by side in real-time, enabling you to quickly personalize your status page design to suit your needs.

### Basic fields

<table><thead><tr><th width="244">Field</th><th>Description</th></tr></thead><tbody><tr><td><strong>Header logo text</strong></td><td>The text displayed in your logo in the status page's header.</td></tr><tr><td><strong>Public company name</strong></td><td>You can override your company or project name displayed in your status page's footer.</td></tr><tr><td><strong>Logo</strong></td><td>Upload a logo to be used in the header.</td></tr><tr><td><strong>Favicon</strong></td><td>Upload a favicon.</td></tr><tr><td><strong>Header background</strong></td><td>Upload an image to be used as the background for the header.</td></tr></tbody></table>

### Theme options

You can select from two themes currently:

* **Default**: The theme is based on a standard top navigation bar.
* **Big logo**: Display a larger logo as well as a bigger background image.

You can personalize a couple of colors based on the theme you select:

<div align="left"><figure><img src="/files/i4DfuDmmhZrpU6UKueTV" alt="status page theme options" width="563"><figcaption></figcaption></figure></div>

### System status colors

You can also customize the colors used to communicate the different system statuses on your status page.

<div align="left"><figure><img src="/files/jLBx0HbpEnlxutcVF8sN" alt="status page system status colors settings" width="563"><figcaption></figcaption></figure></div>

### Custom CSS

If the above theme options are not enough, leverage the full power of CSS to customize every style of your status page.

<div align="left"><figure><img src="/files/CRCS1j9JUleIWyFXrPWt" alt="status page custom CSS" width="563"><figcaption></figcaption></figure></div>

### Custom HTML

If customizing CSS doesn't cut it, it might be time to pull out the big guns. Configure custom HTML header and footer for your status page.

<div align="left"><figure><img src="/files/I1v5o8OGn0ia5HayCZLP" alt="status page custom HTML" width="563"><figcaption></figcaption></figure></div>

#### Template tags

Use these special tags inside your custom header/footer HTML to control where Statuspal inserts built-in elements:

| Tag                    | Description                                                                                 |
| ---------------------- | ------------------------------------------------------------------------------------------- |
| `{{subscribe_button}}` | Inserts the subscribe button in your chosen position in the header.                         |
| `{{lang_selector}}`    | Inserts the language selector dropdown (only appears if multiple languages are configured). |

{% hint style="info" %}
If you omit these tags, the subscribe button and language selector won't appear on your status page. You can combine custom HTML with [custom CSS](/platform/status-page-settings-and-design/advanced-settings) and head code for full control over the layout.
{% endhint %}


# Design recipes

Design recipes to help you customize your status page easily.

Paste one of the following "recipes" into your status page's "Custom CSS" Design setting field to implement a customization.

### Hide the past incidents section and link

```css
.past-incidents, .previous-incidents { display: none !important }
```

### Hide the uptime percentage from your Uptime Graphs

```css
.uptime { display: none }
```

### Auto-select "Select services" Checkbox and Hide "All" in the Subscription Modal

This recipe automatically selects the "Select services" checkbox and hides the "All" option in the subscription modal. Ideal for when you want to make sure your customers select the specific status page services they should get notifications about.

<figure><img src="/files/Lacg40KSeC4HOEeAR7AG" alt="" width="536"><figcaption></figcaption></figure>

**JavaScript Snippet:**\
This JavaScript code automatically selects the "Select services" checkbox when the subscription modal is opened. Add this to the **Status Page Settings** section:

```javascript
document.addEventListener("sp:subscribeModalOpened", function() {
  document.querySelectorAll('[name="subscription[filter]"][value="services"]').forEach(checkbox => {
    checkbox.checked = true;
  });
});
```

**CSS Snippet:**\
This CSS code hides the "All" option in the subscription modal. Add this to the **Status Page Design** section:

```css
.filter-toggle label:first-child { 
  display: none; 
}
```


# Multi-Language

StatusPal supports 10+ languages by default—also out-of-the-box AI-powered multi-language status pages.

StatusPal is the better status page alternative for companies that are serious about supporting multiple languages.

Our powerful multi-language implementation allows you to easily communicate about your incidents & maintenance in any number of languages and to translate every field down to your notifications.

### Enable multi-language

Enabling multi-language support in StatusPal is quick and easy. Go to the Languages section from the sidebar in your dashboard.

By default, English is used when no other languages are configured.

<figure><img src="/files/5rEylA0FSZGDwER7VoB5" alt=""><figcaption></figcaption></figure>

Click New Language to open the language editor. From there, you can select any language from the list. If a translation already exists for that language, it will be automatically loaded; otherwise, English will be used as the base.

Once you have configured two or more languages, multi-language support will be enabled for your status page.

### Multi-language incidents, services, and more

Upon enabling multi-language, you'll have the ability to report your incidents, maintenance, and information notices in multiple languages. A new tab will appear above the fields that support multi-language, like the incident title, for example:

<figure><img src="/files/1c9GKQkW0Ltp0Nqng3uJ" alt="Multi-language incidents, services, and more in your status page"><figcaption></figcaption></figure>

#### Fields that support multi-language

* Incident and maintenance
* Information notices
* Custom incident types
* Services
* Incident templates
* Some status page fields like company name and header logo text.

### AI-powered translations

Thanks to AI, StatusPal supports the auto-translation of the above fields. Simply leave a field without translation, and we'll translate it for you!

<figure><img src="/files/ozBdOKs31wHAyR7qZ8eS" alt="AI-powered translations in status page"><figcaption></figcaption></figure>

You can enable/disable AI-powered auto translations for your status page under your status page advanced settings.

{% hint style="info" %}
You can access your status page's advanced settings by clicking on <mark style="background-color:green;">Status page > Settings</mark> from the sidebar, then scrolling down and expanding the "Advanced" section.
{% endhint %}

<div align="left"><figure><img src="/files/PDZaKXX5oKsYOUJVA5kg" alt="status page AI-powered auto translations settings"><figcaption></figcaption></figure></div>

{% hint style="warning" %}
Note that this feature is available only on the Business plan and above.
{% endhint %}

### Custom app translations with inline YAML editor

The inline YAML text editor allows for easy customization of any translation language in order for it to fit your needs.

<div align="left"><figure><img src="/files/KWsAkIJtNjRzs10N4Ewh" alt="" width="563"><figcaption></figcaption></figure></div>


# Status Badge & Banner Widget

Embed your status page's reported status in your website or help portal as a badge and/or banner.

StatusPal lets you easily embed a status banner and badge widget to display the status of your service/app directly on your website or HelpDesk site.

This way, your customers can quickly find out if there are ongoing outages or planned maintenance.

This is how the status banner looks on your website:

<figure><img src="https://d33v4339jhl8k0.cloudfront.net/docs/assets/5b7c6e932c7d3a03f89df563/images/635be52d9171a91e374a5214/file-cR2ei6aAKk.png" alt="Status page banner widget embed"><figcaption></figcaption></figure>

And here is what the status badge looks like when embedded in your site:

<figure><img src="https://d33v4339jhl8k0.cloudfront.net/docs/assets/5b7c6e932c7d3a03f89df563/images/5dd3e6ed04286364bc91e8f7/file-X3RBoCuVmm.png" alt="Status page badge embed widget"><figcaption></figcaption></figure>

### Configure your status banner and badge

In order to configure the status widget, simply click on <mark style="background-color:green;">Developers > Status widget</mark> on the sidebar of the status page admin site.

![](https://d33v4339jhl8k0.cloudfront.net/docs/assets/5b7c6e932c7d3a03f89df563/images/635be68473d6a22819f07492/file-PhsSIMN40v.png)

You will find a three-step instruction page detailing how to set up your status banner and/or badge.

### **Customize the colors of your status badge**

Customizing the colors displayed depending on the current status can be easily achieved through CSS:

```html
<style>
  .sp-status .sp-status-badge.sp-status-ok        { background: darkgreen; }
  .sp-status .sp-status-badge.sp-status-scheduled { background: darkblue; }
  .sp-status .sp-status-badge.sp-status-minor     { background: darkorange; }
  .sp-status .sp-status-badge.sp-status-major     { background: darkred; }
</style>
```

Simply put the desired colors next to "`background:` ", and make sure to add this style after the widget `<script>`.

### Customize the translations

There are seven supported languages by default (Danish, German, English, Spanish, French, Dutch and Portuguese).

You can customize the translations by adding the following Javascript lines below the provided code snipped:

#### Badge translations

```javascript
window.statuspalWidget.badge.translations = {
  en: {
    status: {
      ok: 'All systems operational',
      scheduled: 'Ongoing scheduled maintenance',
      minor: 'Ongoing minor incident',
      major: 'Ongoing major incident'
    }
  }
};
```

#### Banner translations

```javascript
window.statuspalWidget.banner.translations = {
  en: {
    lates_updates: 'View latest updates',
    ongoing: 'Ongoing for {{time_diff}}',
    dates: {
      same_day: '{{date}} from {{time_from}} to {{time_to}}',
      different_day: 'From {{date_time_from}} to {{date_time_to}}'
    }
  }
};
```


# Metrics

Publish custom performance metrics to your status page and display them as charts for your customers.

Statuspal lets you publish custom metrics to your status page and display them as line charts. Metrics can represent anything in your system — response times, error rates, throughput, or any other time-series value.

![Example custom metric chart](/files/cMTx05F9MhKHoo2cVUBw)

## Create a custom metric

1. In your status page's dashboard, click **Metrics**, then **New Metric**.
2. Select **Custom Metric** from the **Source** dropdown.\
   \
   ![New custom metric form](/files/tNt7gOYT7CTNdJkZ6Sx6)
3. Fill in the fields:
   * **Title** — Displayed at the top of the chart.
   * **Unit** — Displayed next to values and the average (e.g. `ms`, `%`, `req/s`).
4. Check **Enabled** and **Visible**, then click **Submit**.

Once created, Statuspal shows you the API endpoint and format for pushing data to this metric.

![API data push instructions](/files/yXXqyH9UoaRxxMzymx0j)

## Push data via API

Each data entry requires two fields:

* `timestamp` — UNIX timestamp (seconds)
* `value` — Decimal number

Example using cURL (replace `YOUR_API_KEY`, `STATUS_PAGE_SUBDOMAIN`, and `METRIC_ID` with your values):

```bash
curl -X POST "https://statuspal.io/api/v2/status_pages/STATUS_PAGE_SUBDOMAIN/metrics/METRIC_ID/data_points" \
  -H "Content-Type: application/json" \
  -H "x-api-key: YOUR_API_KEY" \
  -d '{"timestamp": 1700000000, "value": 42.5}'
```

{% hint style="info" %}
Data points appear on the chart as you push them. Use the cURL example shown on the metric's page in the dashboard to run a quick test.
{% endhint %}


# Integrations

Connect Statuspal with your monitoring tools, alert managers, notification channels, email providers, SSO providers, and more.

<table data-card-size="large" data-view="cards"><thead><tr><th></th><th></th><th data-hidden></th><th data-hidden data-card-target data-type="content-ref"></th></tr></thead><tbody><tr><td>🪐 <strong>Terraform</strong></td><td>Provision your status page, monitoring, and incident automation with Terraform.</td><td></td><td><a href="/pages/MHZ9gUGW3VJlfVbT3TX7">/pages/MHZ9gUGW3VJlfVbT3TX7</a></td></tr><tr><td><strong>📊 Google Analytics</strong></td><td>Integrate your Google Analytics into your status page.</td><td></td><td><a href="/pages/1Ca0eTyLzET8dtozuHGx">/pages/1Ca0eTyLzET8dtozuHGx</a></td></tr><tr><td><strong>📅 Google Calendar</strong></td><td>Automatically synchronize your status page maintenance to Google Calendar.</td><td></td><td><a href="/pages/034iMswMoACmrtNYTkYB">/pages/034iMswMoACmrtNYTkYB</a></td></tr><tr><td>✉️ <strong>SendGrid Email Notifications</strong></td><td>Send incident &#x26; maintenance notifications via SendGrid.</td><td></td><td><a href="/pages/VFTi9MC5T1UFQ5BGpdnD">/pages/VFTi9MC5T1UFQ5BGpdnD</a></td></tr><tr><td>🚨 <strong>PagerDuty</strong></td><td>PagerDuty + Statuspal status page</td><td></td><td><a href="/pages/LfHb1RKHIs1X0jQlSjvD">/pages/LfHb1RKHIs1X0jQlSjvD</a></td></tr><tr><td>🔐 <strong>Okta</strong></td><td>Configure SSO for your status page with Okta.</td><td></td><td><a href="/pages/wBmq2UizUp02kz9yMIjS">/pages/wBmq2UizUp02kz9yMIjS</a></td></tr><tr><td>🔐 <strong>Auth0</strong></td><td>Configure SSO for your status page with Auth0.</td><td></td><td><a href="/pages/jKzRyBbxRGUFDRnI9xhg">/pages/jKzRyBbxRGUFDRnI9xhg</a></td></tr><tr><td>✉️ <strong>Mailgun</strong></td><td>Send email notifications via Mailgun.</td><td></td><td><a href="/pages/cOSpCDf2Ur0t5IoMSfjv">/pages/cOSpCDf2Ur0t5IoMSfjv</a></td></tr><tr><td>📲 <strong>Twilio</strong></td><td>Configure SMS Notifications via Twilio.</td><td></td><td><a href="/pages/DZWaF2mTcS3UxmPHVsiP">/pages/DZWaF2mTcS3UxmPHVsiP</a></td></tr><tr><td><strong>🗣️ Zoom</strong></td><td>Notify about incidents &#x26; maintenance directly to Zoom channels.</td><td></td><td><a href="/pages/PeeJ6EsjIKchabZp4g8k">/pages/PeeJ6EsjIKchabZp4g8k</a></td></tr><tr><td><strong>🐶 Datadog</strong></td><td>Configure Status Page metrics from Datadog Synthetics.</td><td></td><td><a href="/pages/7foucG90QB3oA7r5tIkU">/pages/7foucG90QB3oA7r5tIkU</a></td></tr><tr><td>📡 <strong>Zabbix</strong></td><td>Configure incident automation from Zabbix</td><td></td><td><a href="/pages/N3WnFpYDxH1F7xkyU0m7">/pages/N3WnFpYDxH1F7xkyU0m7</a></td></tr><tr><td>📍Pingdom</td><td>Automate reporting and closing incidents in your status page via webhook</td><td></td><td><a href="/pages/eJrt06SRaGzVFPhaVDIx">/pages/eJrt06SRaGzVFPhaVDIx</a></td></tr><tr><td>✅ Checkly</td><td>Automate reporting and closing incidents in your status page via webhook</td><td></td><td><a href="/pages/gQhFA6jj7b194kvdvuZu">/pages/gQhFA6jj7b194kvdvuZu</a></td></tr><tr><td>🔋New Relic</td><td>Automate reporting and closing incidents in your status page via webhook</td><td></td><td><a href="/pages/f5klAztT5u0vl1HGZxB4">/pages/f5klAztT5u0vl1HGZxB4</a></td></tr><tr><td>🐶 Datadog</td><td>Automate reporting and closing incidents in your status page via webhook</td><td></td><td><a href="/pages/7QGKQen7y0dEHK756hOy">/pages/7QGKQen7y0dEHK756hOy</a></td></tr><tr><td>📚 BetterUptime</td><td>Automate reporting and closing incidents in your status page via webhook</td><td></td><td><a href="/pages/vtytr5dEQlcUi7U8DV5t">/pages/vtytr5dEQlcUi7U8DV5t</a></td></tr><tr><td>🚨 <strong>OpsGenie</strong></td><td>Automatically create and resolve Statuspal incidents from OpsGenie alerts.</td><td></td><td><a href="/pages/AlsWn7ojww8cZeVhUoB1">/pages/AlsWn7ojww8cZeVhUoB1</a></td></tr><tr><td>💬 <strong>Intercom Messenger</strong></td><td>Display your status page inside your Intercom live-chat widget.</td><td></td><td><a href="/pages/wqL5ffgwjraFdgwYSTjG">/pages/wqL5ffgwjraFdgwYSTjG</a></td></tr><tr><td>✉️ <strong>Custom SMTP</strong></td><td>Send email notifications through your own SMTP server.</td><td></td><td><a href="/pages/xb9dpMQFPZ3Wtor8psJ0">/pages/xb9dpMQFPZ3Wtor8psJ0</a></td></tr><tr><td>🔗 <strong>Webhooks</strong></td><td>Receive real-time POST notifications for incidents and service status changes.</td><td></td><td><a href="https://github.com/statuspal/statushq/tree/dev/docs/users/platform/integrations/webhooks.md">https://github.com/statuspal/statushq/tree/dev/docs/users/platform/integrations/webhooks.md</a></td></tr><tr><td>🔐 <strong>Google SSO</strong></td><td>Configure SSO for your status page with Google Workspace.</td><td></td><td><a href="/pages/TFNcO7vtivkdS4IL52LF">/pages/TFNcO7vtivkdS4IL52LF</a></td></tr><tr><td>🔐 <strong>Azure Active Directory</strong></td><td>Configure SSO for your status page with Microsoft Azure AD.</td><td></td><td><a href="/pages/JBRjpyqa9XqdpuflIMFt">/pages/JBRjpyqa9XqdpuflIMFt</a></td></tr><tr><td>🔐 <strong>Keycloak</strong></td><td>Configure SSO for your status page with Keycloak.</td><td></td><td><a href="/pages/R7unVL89l7FWXWBaHKDT">/pages/R7unVL89l7FWXWBaHKDT</a></td></tr><tr><td>💬 <strong>Slack Notifications</strong></td><td>Let subscribers receive status page updates in their Slack workspace.</td><td></td><td><a href="/pages/RZV3URZeMFCi2pBPFtYU">/pages/RZV3URZeMFCi2pBPFtYU</a></td></tr><tr><td>💬 <strong>Microsoft Teams Notifications</strong></td><td>Let subscribers receive status page updates in Microsoft Teams.</td><td></td><td><a href="/pages/DIlQMDZcie4lFmLnNn6s">/pages/DIlQMDZcie4lFmLnNn6s</a></td></tr><tr><td>💬 <strong>Google Chat Notifications</strong></td><td>Let subscribers receive status page updates in Google Chat Spaces.</td><td></td><td><a href="/pages/OCo2O8i1KeHnWjmSP5Jf">/pages/OCo2O8i1KeHnWjmSP5Jf</a></td></tr><tr><td>💬 <strong>Mattermost Notifications</strong></td><td>Let subscribers receive status page updates in Mattermost channels.</td><td></td><td><a href="/pages/zOSh25IwzWZsiMMatmeH">/pages/zOSh25IwzWZsiMMatmeH</a></td></tr></tbody></table>


# Terraform

Provision your StatusPal status page, services, monitoring, and incident automation with Terraform.

Learn how to provision your status page with Terraform with our step-by-step guide:

{% embed url="<https://docs.statuspal.io/v/guides/platform/getting-started-with-terraform-and-statuspal-status-pages>" %}

Alternatively, if you're feeling adventurous, you can jump straight to our Terraform provider:

{% embed url="<https://registry.terraform.io/providers/statuspal/statuspal>" %}


# Datadog Metrics

Configure Status Page metrics from Datadog Synthetics

1. In order to set metrics in your status page from Datadog Synthetics, first head to your [Datadog dashboard](https://app.datadoghq.com/) and click on <mark style="background-color:green;">Application Keys</mark> from your organization's settings menu:<br>

   <figure><img src="/files/OYiUTazfclj0Zj3sWbUP" alt=""><figcaption></figcaption></figure>
2. Once there, create a new Application Key, making sure to Edit its scope to include `synthetics_read` permissions.

   <figure><img src="/files/JB7PNi2prGbEKvPhmaS3" alt=""><figcaption></figcaption></figure>
3. Now go to <mark style="background-color:green;">API Keys</mark> and create (or reuse) a Datadog API Key.

   <figure><img src="/files/g3x1tHiBXfvJN61QH8aU" alt=""><figcaption></figcaption></figure>
4. In your status page's Admin site click on **Integrations** > **New integration** and select **Datadog** from the dropdown.
5. Enter the API and Application keys you obtained in **steps 1-3**, making sure to select the <mark style="background-color:yellow;">correct region</mark> and click on **Create**.
6. Then click on **Metrics** > **New metrics** and select your Datadog integration in the Source dropdown.
7. Select the synthetic test that you would like to create the metric from and configure your metric (for browser tests only Uptime type is supported) then click **Create**.<br>

   <figure><img src="https://d33v4339jhl8k0.cloudfront.net/docs/assets/5b7c6e932c7d3a03f89df563/images/5f9165cc52faff0016af2730/file-pGRmkG2dWx.png" alt=""><figcaption></figcaption></figure>
8. Once you've created the metric it should start populating with the last hour, it will continue to get populated in the next hours after that.<br>

   <figure><img src="https://d33v4339jhl8k0.cloudfront.net/docs/assets/5b7c6e932c7d3a03f89df563/images/5f916689c9e77c001621a5a1/file-iGhAklycEy.png" alt=""><figcaption></figcaption></figure>

<br>


# Zoom Notifications

Notify about status page incidents & maintenance directly to Zoom channels.

{% hint style="info" %}
If you are a status page admin, you can enable Zoom notifications under <mark style="background-color:green;">Subscription > Settings</mark>. See [Subscriptions](/platform/subscriptions-and-notifications/subscriptions#enable-subscriptions) to learn more.
{% endhint %}

#### Configure the Incoming Webhook Chatbot <a href="#id-01h84ppqt1kfprnnakh09m6qm9" id="id-01h84ppqt1kfprnnakh09m6qm9"></a>

1. Sign in to the Zoom desktop client.
2. Click the **Team Chat** ![](https://assets.zoom.us/generic-images/common-buttons-and-icons/outline/unselected-team-chat-icon.png) tab.
3. Under **Apps** ![](https://assets.zoom.us/generic-images/common-buttons-and-icons/filled/chat-apps-icon.png), find and select **Incoming Webhook**, or select a chat channel from above that you would like to receive messages in.
4. Enter one of the following commands to make a new connection:

   `/inc connect <connectionName>`:\
   This will create a connection and respond with a 1:1 chat message with the following details:

   * Endpoint
   * Verification token
   * Example cURL requests
5. Back in the status page subscribe modal, copy the Endpoint (from the previous step) into the <mark style="background-color:green;">Webhook URL</mark> field and the <mark style="background-color:green;">Verification token</mark> into the field with the same name.

<figure><img src="/files/pcHyXVgNoYouCFOGZaiV" alt="status page zoom notifications for incidents &#x26; maintenance"><figcaption></figcaption></figure>

As with any other notification channel, you can also configure a Zoom notification directly from your status page's admin site.

<figure><img src="/files/DzGJXdT5UbFZ2ClT2qd5" alt=""><figcaption></figcaption></figure>


# Google Analytics

Integrate your Google Analytics into your StatusPal status page.

### Obtain Google Tag ID from Google Analytics

1. In your Google Analytics dashboard, click on **Admin**
2. Click on **Data Collection and modification**
3. Click on **Data streams**
4. Click on your Web data stream
5. Click on **View tag instructions**
6. Click on **Install manually**
7. You can find your Google Tag ID at `gtag('config', 'G-123');` (in this example, the Google Tag ID would be 'G-123').
8. Copy your Google Tag ID and save it for the next step.

### Configure Google Analytics on your StatusPal status page

{% hint style="info" %}
Visit your StatusPal status page settings by clicking on <mark style="background-color:green;">Status page</mark> from the sidebar of your admin dashboard.
{% endhint %}

Once in your status page settings page, scroll down to find the **Custom Javascript** text field.

Enter the following Javascript code snipped, making sure to replace the value of the `GTAG_ID` variable ('G-123') with the value you copied from the previous step.

{% code fullWidth="false" %}

```javascript
var GTAG_ID = 'G-123'; // Replace the 'G-123' with your own value
var gtagScript = document.createElement('script');
gtagScript.async = true;
gtagScript.src = 'https://www.googletagmanager.com/gtag/js?id='+GTAG_ID;
document.head.appendChild(gtagScript);

window.dataLayer = window.dataLayer || [];
function gtag() {dataLayer.push(arguments);}
gtag('js', new Date());
gtag('config', GTAG_ID);
```

{% endcode %}

Click on the Update button at the bottom, and your Google Analytics integration should start working on your StatusPal status page.


# Google Calendar

Automatically synchronize your status page maintenance to Google Calendar

{% hint style="info" %}
Enable Google Calendar notification channel under <mark style="background-color:green;">Subscription > Settings</mark>. See [Subscriptions](/platform/subscriptions-and-notifications/subscriptions#enable-subscriptions) to learn more.
{% endhint %}

Once Google Calendar integration is enabled in your status page, your status page visitors can subscribe to it by clicking on the Subscribe button and selecting the Google Calendar tab.

<figure><img src="/files/7P6qj3e9VoVBBDXrOKCj" alt="Status page maintenance notifications via Google Calendar"><figcaption></figcaption></figure>

Upon clicking on Subscribe, they should receive an email with instructions on how to add the status page's Calendar to their Google account. Once they click on the link provided and go through adding the new Calendar, the integration is ready.

From that moment on, they will see upcoming status page maintenance events automatically synchronized in their Google Calendar.

<figure><img src="/files/D0oM7I3iBRnzJ7t5hjH4" alt="Status page maintenance window synchronized in Google Calendar"><figcaption></figcaption></figure>

As with any other notification channel, you can also configure a Google Calendar subscription directly from your status page's admin site.

<figure><img src="/files/gw5f6fcCfB4CrznyMYyK" alt="Configure Google Calendar subscription for status page notifications on maintenance windows"><figcaption></figcaption></figure>


# SendGrid Email Notifications

Send status page incident, maintenance and information notice notifications via SendGrid.

Configuring StatusPal to send status page email notifications via your SendGrid account gives you the following advantages:

1. Send status page email notifications to imported subscribers without them having to confirm their email addresses.
2. Have full control and visibility of email notifications sent, delivered, read, etc.

Follow these simple steps to configure your SendGrid integration in StatusPal status pages:

### Obtain your SendGrid API key

To configure your Sendgrid integration in StatusPal, first, you'll need a Sendgrid API key:

{% hint style="info" %}
Obtain a Sendgrid API key under [**https://app.sendgrid.com/settings/api\_keys**](https://app.sendgrid.com/settings/api_keys)
{% endhint %}

1. Click on <mark style="background-color:green;">Create API key</mark>.
2. Select "Restricted access" and make sure to enable <mark style="background-color:green;">Mail Send</mark> access.<br>

   <figure><img src="/files/p1tWmKL2Lcqcmptobg8Y" alt="SendGrid <> StatusPal status page integration for incidents &#x26; maintenance notifications"><figcaption></figcaption></figure>
3. Click on <mark style="background-color:green;">Create & view</mark>.
4. Copy your new API key and save it for the next step.

### Configure your SendGrid integration in StatusPal

1. Click on Integrations from the sidebar of your status page's admin dashboard.
2. Click on Sendgrid from the list of integrations.
3. Enter the SendGrid API key that you copied from the step above.
4. Enter the email address to be used as the "From" address when sending email notifications. Make sure it matches with the sending domain you have configured in SendGrid.

Once the above is done, incidents, maintenance, and information notice notifications will be sent via your SendGrid account, and you should be able to email imported subscribers without them confirming their email addresses.

### Test your SendGrid integration

After installing your SendGrid integration, send a test email to confirm that it’s working correctly.

<figure><img src="/files/Po4HnmzSReIuBRWGHUQ3" alt=""><figcaption></figcaption></figure>

If you see an error like the one below, it typically means that your **SendGrid API key** is incorrect, expired, or has been revoked.

<figure><img src="/files/wz0kAUacDSw71DUbDEsB" alt=""><figcaption></figcaption></figure>

**How to fix it**

1. Go to your SendGrid dashboard and verify that your API key is valid and active.
2. In your StatusPal settings, reinstall or reconfigure the SendGrid integration using the correct API key.
3. Send a test email again to confirm the issue is resolved.


# PagerDuty + Statuspal status page

* Automate your Statuspal incident communication from your PagerDuty incidents.
* Configure rules in your Statuspal account to determine how/when incidents should be reported in your status page.
* Incidents get automatically resolved in your status page when they are resolved in PagerDuty.

### How it Works

* Statuspal will configure a PagerDury webhook, which will cause PagerDuty to notify Statuspal about incident events.
* According to the rules configured in Statuspal incidents will be created/resolved automatically whenever they are triggered/aknowledged and resolved in PagerDuty.

### Requirements

* You'll need a PagerDuty Admin role in order to create an API key. If you do not have this role, please reach out to an Admin or Account Owner within your organization to configure the integration.
* You'll need a Statuspal Admin or owner role in order to configure this integration. If you do not have this role, please reach out to an Admin or Account Owner within your organization to configure the integration.

### Support

If you need help with this integration, please contact [support@statuspal.io](mailto:mailto:support@statuspal.io).

### Integration Walkthrough

#### **In PagerDuty**

1. Go to you PagerDuty dashboard
2. Click on **Integrations > API Access Keys**
3. Click on **Create API Key**
4. In the modal form enter *Statuspal* as the description, and make sure to **uncheck** *"Read-only API Key"* (we need write access to PagerDuty in order to create webhooks with their API).\ <br>

   ![PagerDuty API key for status page & incident automation](https://d33v4339jhl8k0.cloudfront.net/docs/assets/5b7c6e932c7d3a03f89df563/images/611ba163f886c9486f8d9857/file-kPRH5bhcBJ.png)
5. Click on **Create Key**
6. A new modal with your newly created API key will appear, copy it and make sure to save it for the next step.

#### **In Statuspal**

1. From your status page's Dashboard click on **Integrations** in the sidebar.
2. Click on **New integration** and select PagerDuty from the service dropdown.
3. Enter your PagerDuty API key and click on **Create**.
4. You should now be able to start configuring your rules.<br>

   <figure><img src="https://d33v4339jhl8k0.cloudfront.net/docs/assets/5b7c6e932c7d3a03f89df563/images/611ba2f6b37d837a3d0e46e7/file-XJvbqyIzkt.png" alt=""><figcaption></figcaption></figure>

#### **PagerDuty Integration Rules**

In order to automate Statuspal incident creation and resolution from PagerDuty you need to configure what services and severity of PagerDuty incidents should be monitored and what services and severity should the corresponding Statuspal incident be created with.

You can also choose to notify subscribers automatically or not in this step.

![](https://d33v4339jhl8k0.cloudfront.net/docs/assets/5b7c6e932c7d3a03f89df563/images/64cb9f259d8cf153a015d5b4/file-YRCbZLPgBV.png)

You can also decide to use Statuspal incident templates in order to customize the content of the incidents automatically created from PagerDuty:

<figure><img src="https://d33v4339jhl8k0.cloudfront.net/docs/assets/5b7c6e932c7d3a03f89df563/images/64cba0073379714240cff142/file-96JiYTfKOK.png" alt=""><figcaption></figcaption></figure>

In the Statuspal incident templates you select above, you can use template variables with the data coming from PagerDuty in the format `{{pagerduty.incident.variable_name}}`; For example `{{pagerduty.incident.title}}`.

#### Template Variables

You can reference any variable coming from the PagerDuty webhook payload `data` object (see their docs to see the full list: <https://developer.pagerduty.com/docs/webhooks-overview#incident>).

<figure><img src="/files/g8WU7UtlusiMECMyn5Ok" alt=""><figcaption></figcaption></figure>

For incident creation we use the `incident.acknowledged` and `incident.triggered` webhook events. To close the incident we use the `incident.resolved` webhook event.

Once you have configured one or more rules, incidents in Statuspal should be automatically created/closed based on your PagerDuty incidents.

### How to Uninstall

In your Statuspal admin site, click on **Integrations** and find the PagerDuty integration and click on **Delete**, click no OK to confirm. The integration should be permanently deleted from Statuspal.


# Configure SSO for your status page with Okta

In order to configure a SAML application for Statuspal in Okta head out to your Okta admin panel and follow these steps:

1. Click on **Applications** then click on **Create App Integration.**
2. Check **SAML 2.0** and click on **Next**.<br>

   ![](https://d33v4339jhl8k0.cloudfront.net/docs/assets/5b7c6e932c7d3a03f89df563/images/60f524a36ffe270af2a9007e/file-U9f0XUrYGK.png)
3. Enter the **App Name** statuspal.io and click on **Next**.
4. Copy the **ACS URL** into **Single sign on URL**.
5. Copy the **SP entity ID**.
6. Click on **Show Advanced Settings** and check the "**Enable Single Logout**" field (to allow application to initiate Single Logout).
7. Copy the **Single Logout URL**.
8. Download the **SP certificate** and upload it into the **Signature certificate**, then click on **Upload Certificate** (in Windows you might need to use Edge for this step).
9. Scroll down and click on **Next** then click on **Finish**.
10. On the **Assignments** tab, make sure to assign yourself (the email you're signed in with in Statuspal) so you can test the configuration.
11. On the **Sign On** tab, Click on **View Instructions** and scroll down to find the **IDP metadata** then copy this into your organization and **Save** it.
12. Click **Save**, then **Test SAML configuration**, it should success and look like this.\
    ![](https://d33v4339jhl8k0.cloudfront.net/docs/assets/5b7c6e932c7d3a03f89df563/images/5f8023e252faff0016aee442/file-YlP4OdNKlO.png)

After successfully testing your SAML configurations you should be able to check the Require SSO field, which will cause all your team members to be required to be authenticated with SSO before accessing the organization.

<br>


# Configure SSO for your status page with Auth0

In order to enable your team members and/or status page users to authenticate via Auth0 Single Sign-On, follow these steps:

1\. Start by heading to your Statuspal organization's Security tab, enable SAML authentication, and click on **New SSO settings**.

2\. Copy the **ACS URL** and **Single Logout URL** from your newly created SSO Setting; you'll need them in the next steps.

3\. Head over to Auth0, click on Applications, select Applications, then click on **Create Application**.

4\. In the new modal window, enter Statuspal as the name, select Regular Web Applications, and click on **Create**.

![](https://d33v4339jhl8k0.cloudfront.net/docs/assets/5b7c6e932c7d3a03f89df563/images/63e624c78ae59c3643e3434f/file-cgULksTZLB.png)

5\. Now select the **Addons** tab and click on **SAML2**.

6\. Under the Usage tab, click on the "Identity Provider Metadata: **Download**" link

7\. Open the downloaded metadata text field with a plain text editor, copy its contents, and paste them onto your Statuspal SSO Settings **IDP metadata** field.

![](https://d33v4339jhl8k0.cloudfront.net/docs/assets/5b7c6e932c7d3a03f89df563/images/63e6279ef5e6e535e1a9688b/file-CU0oC6XzpJ.png)

8\. Back in Auth0, under the Settings tab of your Addon SAML2 modal window, paste your **ACS URL** from step 2 onto the **Application Callback URL** field.

9\. Now, under the Settings text field, uncomment the following lines of code:

```
// "nameIdentifierProbes": [
//   "http://schemas.xmlsoap.org/ws/2005/05/identity/claims/nameidentifier",
//   "http://schemas.xmlsoap.org/ws/2005/05/identity/claims/emailaddress",
//   "http://schemas.xmlsoap.org/ws/2005/05/identity/claims/name"
// ],
```

And change them so that the line that ends with "emailaddress" is the first one on the list. It should look like this:

```
 "nameIdentifierProbes": [
   "http://schemas.xmlsoap.org/ws/2005/05/identity/claims/emailaddress",
   "http://schemas.xmlsoap.org/ws/2005/05/identity/claims/nameidentifier",
   "http://schemas.xmlsoap.org/ws/2005/05/identity/claims/name"
 ],
```

![](https://d33v4339jhl8k0.cloudfront.net/docs/assets/5b7c6e932c7d3a03f89df563/images/63e6269df5e6e535e1a96889/file-pnPc12GSYT.png)

10. Under the same Settings text field, uncomment the following lines:

```
// "logout": {
//   "callback": "http://foo/logout",
//   "slo_enabled": true
// }
```

And replace the placeholder callback with the **Single Logout URL** you copied before. It should look like this:

```
"logout": {
  "callback": "https://statuspal.io/sso/logout",
  "slo_enabled": true
}
```

<figure><img src="/files/fVMXKyTafXMT4vDTznSV" alt=""><figcaption></figcaption></figure>

11\. Now scroll down and click on Enable.

12\. Back in your Statuspal SSO setting, to make sure the configuration worked, click on "Test SAML Configuration" and authenticate **with the same email address from your current StatusPal account**. After a successful test, you should see a success message like this:

![](https://d33v4339jhl8k0.cloudfront.net/docs/assets/5b7c6e932c7d3a03f89df563/images/63e62a81cd3e3454f2cdb2e9/file-TlzFSURo9B.png)

12\. You should now be able to check the Require SSO checkbox to enforce SSO to your team members.


# Configure SSO for your status page with Google

Configure SSO to enable access to your Statuspal status page through your Google Workspace account.

## 1. Enable SSO on your Statuspal organization

1. Head to your Statuspal admin site at [statuspal.io/admin](https://statuspal.io/admin).
2. Click the **Gear icon** next to your organization and select **Security**.
3. Check **Enable SAML authentication** and click **Save**.
4. Click **New SSO setting** and leave this tab open — you'll need the ACS URL and Entity ID in the next step.

## 2. Configure a SAML app in Google Workspace

1. Go to your [Google Admin Console](https://admin.google.com).
2. Navigate to **Apps > Web and mobile apps** from the sidebar.\
   \
   ![Google Admin Apps menu](/files/qPpHdDA64tLlKOFEkq1n)
3. Click **Add app > Add custom SAML app**.
4. Name the app after your status page (e.g. "Acme Status") and click **Continue**.
5. Click **Download Metadata** and save the XML file — you'll need it in step 3. Click **Continue**.
6. Paste the **ACS URL** and **Entity ID** from your Statuspal SSO settings into the corresponding fields, then click **Continue**.
7. Click **Finish**.
8. Click **User access**, then select a group you belong to from the left sidebar to grant yourself access.
9. Set **Service status** to **ON** and click **Save**.\
   \
   ![Google SAML app user access](/files/IcY3autfQsVxjFMSKLpy)

## 3. Finish SSO setup in Statuspal

1. Open the downloaded metadata XML file in a text editor and copy its full contents.
2. Paste the XML into the **IDP metadata** field in your Statuspal SSO setting and click **Update**.
3. Click **Test SAML configuration** to verify the setup. A successful test looks like this:\
   \
   ![Successful SAML test](/files/QmWdL3ttVW4VzQWjWNU9)

{% hint style="info" %}
After saving your SSO setting, contact Statuspal support via live chat or at <support@statuspal.io> to have your SSO setting enabled.
{% endhint %}

{% hint style="success" %}
Once the test passes, check the **Require SSO** checkbox to enforce SSO for all team members.
{% endhint %}


# Configure SSO for your status page with Azure Active Directory

Configure SAML SSO for Statuspal using Microsoft Azure Active Directory (Entra ID).

1. In your Statuspal admin, go to your organization's **Security** tab and **download its metadata file**.\
   \
   ![Download Statuspal org metadata](/files/6ilg6cphrSZ87Yy0GFjD)
2. Sign in to your **Microsoft Azure** account and open **Azure Active Directory** (Entra ID).
3. Click **Enterprise Applications**, then **New application > Create your own application**.
4. Enter the name **Statuspal** and click **Create**.\
   \
   ![Create Azure enterprise app](/files/afJpZDmy2Gkz3krQEqMD)
5. Click **Assign users and groups** and assign yourself (you can add the rest of your team later).
6. Click **Single sign-on** in the sidebar and select **SAML**.
7. Click **Upload metadata file**, select the file downloaded in step 1, then click **Add** and **Save**.
8. Reload the page — the **SAML Signing Certificate** section should now be populated.
9. In the **User Attributes & Claims** section, click **Edit** and set the claim name to `user.mail`. Click **Save**.\
   \
   ![Azure user attributes config](/files/uqrvWeAGDXHONTjKyE6U)
10. In the **SAML Signing Certificate** section, click **Edit**, set **Signing Option** to **Sign SAML response and assertion**, and click **Save**.\
    \
    ![Azure SAML signing option](/files/pkYQaz1ttLkJPEDewshp)
11. Download the **Federation Metadata XML**, copy its contents, and paste them into your Statuspal organization's **IDP metadata** field. Click **Save**.
12. Click **Test SAML configuration** to verify.\
    \
    ![Successful SAML test](/files/7SALfrOOXxc3lExlwC2M)

{% hint style="success" %}
Once the test passes, check the **Require SSO** checkbox in Statuspal to enforce SSO for all team members.
{% endhint %}


# Configure SSO for your status page with Keycloak

Configure SAML SSO for Statuspal using Keycloak as the identity provider.

## 1. Create a SAML client in Keycloak

1. Log in to the Keycloak admin portal and click **Clients** in the sidebar, then click **Create**.\
   \
   ![Keycloak Clients menu](/files/PKe1rbHhiKCWCN6bj5U6)
2. You can either upload the Statuspal metadata XML (from your organization's Security tab) via **Add File** beside the **Import** heading, or enter the client ID manually.\
   \
   ![Keycloak client import options](/files/TBWKgzERDtxQjlxj3Nmt)

## 2. Configure assertions

1. Set **Sign assertions** to **ON**.
2. Set **Encrypt assertions** and **Client Signature Required** to **OFF**.\
   \
   ![Keycloak assertion settings](/files/WdvVBh4nyuiEBkYCzYav)

## 3. Configure the Name ID format

Scroll down on the same screen and:

1. Set **Force Name ID Format** to **ON**.
2. Set **Name ID Format** to **email**.\
   \
   ![Keycloak Name ID format setting](/files/Wo80JXcaAIt85QtbMNPJ)

{% hint style="warning" %}
This step is critical. Statuspal requires the Name ID to be the user's email address. If you skip this, SAML authentication will fail. Also ensure that Keycloak admin users have an email address set before testing.
{% endhint %}

## 4. Share Keycloak metadata with Statuspal

1. Click **Realm Settings** in the left sidebar.\
   \
   ![Keycloak Realm Settings](/files/OBAhSvQIUwtD2PzJctD9)
2. Click **SAML 2.0 Identity Provider Metadata** to download the metadata XML.\
   \
   ![Keycloak SAML metadata link](/files/NE7uum2Fk0SCDGi3yhrJ)
3. Copy the contents and paste them into the **IDP metadata** field in your Statuspal SSO setting.\
   \
   ![Statuspal IDP metadata field](/files/dK595YY5MlMiqacSbFRL)
4. Click **Update**, then click **Test SAML configuration** to verify.


# Configure your Mailgun Integration

In order to configure your Mailgun integration you'll need to have a [Mailgun account](https://signup.mailgun.com/new/signup) and a domain configured, we recommend you follow [their guide](https://help.mailgun.com/hc/en-us/articles/203637190-How-do-I-add-a-domain-) on the subject.

Once you have your Mailgun account and domain configured you'll need your private API key, you can obtain it from the [Account Security page](https://app.mailgun.com/app/account/security/api_keys) in your Mailgun admin panel.

Then in the Integrations page in your status page admin panel ( *More > Integrations*) click on New integration, select Mailgun as the service and fill in your Mailgun domain and private API key:

![](https://d33v4339jhl8k0.cloudfront.net/docs/assets/5b7c6e932c7d3a03f89df563/images/62ce0da2eabe9a7235b3d1c2/file-e1sCgag80g.png)

Click create.

To import your email subscribers [follow this steps](/platform/subscriptions-and-notifications/import-email-subscribers).


# Configure SMS Notifications (Twilio Integration)

Statuspal supports SMS notifications through Twilio integration, this means that you can connect your Twilio account to your status page in order to be able to send SMS status updates to your subscribers.

The first step is for you to have a Twilio account with an active and SMS enabled phone number, this is very easy to do, if you don't have it yet follow these steps, if not jump to the next section.

### Configure your Twilio Account

#### **1. Get your Twilio phone number**

Create your Twilio account at <https://www.twilio.com/try-twilio>, you can start with a trial number for testing the waters but we recommend you upgrade and get a real number before enabling the SMS notifications in your status page, otherwise your customers will see a "Sent from your Twilio trial account - " at the beginning of every SMS, which is not so nice.

After you have upgraded click on [Phone numbers](https://www.twilio.com/console/phone-numbers/incoming), and click on the **Buy a number** button, make sure to check SMS and pick the country, for example USA.

![](https://d33v4339jhl8k0.cloudfront.net/docs/assets/5b7c6e932c7d3a03f89df563/images/5d5b92e90428634552d86442/file-IPjJ0YMIuQ.png)

Then click Search and pick one number, that's all the Twilio configuration required, save the **number**, you'll need it later.

#### **2. Get your Twilio account SID and token**

Now click on the [Dashboard](https://www.twilio.com/console) and copy the account **SID** and **token**, you'll need these two fields too.

### Configure your Twilio Integration on Statuspal

Once you have you Twilio account setup configuring it in Statuspal is quite easy, click on Integrations from the sidebar of your status page admin site, then click **New integration**, then select Twilio from the Service dropdown.

![](https://d33v4339jhl8k0.cloudfront.net/docs/assets/5b7c6e932c7d3a03f89df563/images/60e2d5ac05ff892e6bc2da27/file-Y6COdU4gYQ.png)

Enter your account SID, token and phone number (configured in the previous step) and click on Create.

Then click on Subscriptions > Sub. Settings and check the "Enable SMS notifications" checkbox and click on **Submit**, after this your customers should be able to see the option to subscribe via SMS.

![](https://d33v4339jhl8k0.cloudfront.net/docs/assets/5b7c6e932c7d3a03f89df563/images/5d5b96f90428634552d8646d/file-EqYwFoiTd2.png)

The moment they subscribe they should receive a confirmation with a link to manage their subscription, with which they can choose to cancel it at any time.

You also have access to the list of your SMS subscribers in the subscribers page (More -> Subscribers) where you can list and even delete them.

### Configure Geographic Permissions (Messaging)

Twilio uses Geographic Permissions to control which countries you can send SMS to. By default, some countries may be blocked. To avoid subscription failures for subscribers in certain regions, configure your Twilio account to allow SMS to the countries where your audience is located.

1. In the [Twilio Console](https://console.twilio.com/), go to Messaging → Settings → Geographic Permissions.
2. Enable the countries where your subscribers may be located.
3. Save your changes.

If a subscriber tries to subscribe from a blocked country, they will see a message asking them to contact you. Enabling the relevant countries here prevents that.


# Zabbix

Unlike other supported monitoring services, Zabbix does not provide webhooks with a fixed structure. Instead, you must create your own from scratch.

To set it up in Statuspal, first create or update your service and select "Zabbix" as the "Monitoring Service". You will then be given a Webhook URL, which you will need later in Zabbix.

<figure><img src="/files/KZFMMFOZCxT59FbcaMAw" alt="" width="464"><figcaption></figcaption></figure>

On your Zabbix server, go to **Alerts > Media types** and click on "Create"

For the type, select the "Webhook" option, and on the Parameters section, define one parameter with Name `status`, and Value `{EVENT.VALUE}`

<figure><img src="/files/rpdMVbUqT3rVejF6icq8" alt=""><figcaption></figcaption></figure>

Edit the Script, and put the following Javascript snipped

```javascript
function notifyStatusPal(params) {
    request = new HttpRequest()

    request.addHeader('Content-Type: application/json');

    var response = request.post('<WEBHOOK_URL>', JSON.stringify({
        status: params.status
    }))

    if (request.getStatus() !== 204) {
        throw "API request failed: " + response;
    }
}

try {
    var params = JSON.parse(value)

    notifyStatusPal(params)

    return 'OK'
}
catch (err) {
    Zabbix.log(4, 'StatusPal notification failed : ' + err)

    throw 'StatusPal notification failed : ' + err
}
```

Replace `<WEBHOOK_URL>` with the Webhook URL you generated on StatusPal for your Zabixx monitoring service.

To test your new integration, on the Media types listing, find your new media type and click on "Test"

<figure><img src="/files/JM0feyKBLAauIzXz56uY" alt=""><figcaption></figcaption></figure>

A status of 0 means the service is up; any other value will indicate that it is down.


# Pingdom

This guide outlines the steps to integrate StatusPal's monitoring service with Pingdom's synthetic uptime checks. This integration allows you to receive alerts in StatusPal via webhook

To automate the reporting and closing of incidents on your status page based on the status reported by Pingdom synthetic checks, follow these steps.

### Create your Webhook Integration in StatusPal

First, you need to create an <mark style="color:purple;">endpoint URL</mark> within StatusPal. This URL will act as the bridge between Pingdom and StatusPal, receiving notifications from Pingdom about uptime check results via webhook.

* **Navigate to Services:** On your Status Page, create a new service or edit an existing service.
* **Add Webhook:** On *Monitoring and incident automation section*, check on `Webhook` and select `Pingdom`.
* **Finish and Save:** Create or update the service, then copy the <mark style="color:purple;">endpoint URL</mark> that will be created for you.

<figure><img src="/files/PtZpEGidJnd3awJSpRFC" alt=""><figcaption></figcaption></figure>

### Create your Webhook Integration in Pingdom

Next, you need to create a webhook integration within Pingdom.

* **Navigate to Settings:** On the Pingdom navigation bar, click on `Settings`.
* **Access Integrations:** Go to the *Integrations section* and click on `Add integration`.
* **Add Webhook:** In the new integration configuration, you'll need to add the <mark style="color:purple;">endpoint URL</mark> provided by StatusPal. *This URL is specific to your StatusPal service configuration and is essential for the integration to work correctly*. Paste this URL into the appropriate field.

### Create your Synthetic Monitoring Service in Pingdom

Next, you need to configure your uptime check in Pingdom and link it to the webhook you just created.

* **Navigate to Synthetics:** On the Pingdom navigation bar, click on `Synthetics`.
* **Create Uptime Monitor:** Choose `Uptime` and create a new monitor for the synthetic you want to track. Configure the monitor according to your needs (e.g., check frequency, target URL).
* **Configure Webhook:** Within the monitor's configuration settings, locate the *Webhook section*. Check the box corresponding to the webhook you created in the previous step. This will enable Pingdom to send notifications to StatusPal whenever the uptime check status changes from **Up** or **Down**.

That's it! Once you have completed these steps, Pingdom will send notifications about your uptime checks to StatusPal, allowing you to monitor and manage your service availability from a centralized platform.

## Metrics from Pingdom

In addition to incident automation, you can display uptime metrics from a Pingdom check as a chart on your status page.

1. In your status page's dashboard, go to **Metrics > New Metric**.
2. In the **Source** field, select **Add new 3rd party integration (Pingdom)**. If you already have a Pingdom integration, select it and skip to step 4.
3. Fill in the required Pingdom integration fields and click **Submit**.
4. Select the Pingdom check you want to use, then configure the metric **Type** and **Unit**.
5. Check **Enabled** and **Visible** to make the metric appear on your status page.
6. Click **Submit** and wait about a minute for the metric to populate.

{% hint style="info" %}
Pingdom metrics display uptime percentage and response time data pulled directly from your existing Pingdom checks — no additional monitoring configuration needed.
{% endhint %}


# Checkly

This guide outlines the steps to integrate StatusPal's monitoring service with Checkly's synthetic checks. This integration allows you to receive alerts in StatusPal via webhook

To automate the reporting and closing of incidents on your status page based on the status reported by Checkly synthetic checks, follow these steps.

## Create your Webhook Integration in StatusPal

First, you need to create an <mark style="color:purple;">endpoint URL</mark> within StatusPal. This URL will act as the bridge between Checkly and StatusPal, receiving notifications from Checkly about uptime checks results via webhook.

* **Navigate to Services:** On your Status Page, create a new service or edit an existing service.
* **Add Webhook:** On *Monitoring and incident automation section*, check on `Webhook` and select `Checkly`.
* **Finish and Save:** Create or update the service, then copy the <mark style="color:purple;">endpoint URL</mark> that will be created for you.

<figure><img src="/files/4QCHomVoIfaNpHQgS3qq" alt=""><figcaption></figcaption></figure>

## Create your Webhook Integration in Checkly

Next, you need to create a webhook integration within Checkly.

* **Navigate to Alerts:** On the Checkly navigation bar, click on `Alerts`. Configure the alerts according to your needs (e.g., escalation time, reminders).
* **Add Webhook:** In the Alert configuration channels, by default you have only email so you need to click on `Add more channels` and choose `Webhook`.
* **Configure the Webhook:** After choosing Webhook, you'll need to add the <mark style="color:purple;">endpoint URL</mark> provided by StatusPal. *This URL is specific to your StatusPal service configuration and is essential for the integration to work correctly*. Paste this URL into the appropriate field and keep the *Method* as *POST.* Then you must add one more property to the body default properties: `"status": "{{ALERT_TYPE}}"`. Finally, on the *Notification Events section*, check on the options `a check recovers` and `a check fails`.

<figure><img src="/files/jHDkviWrMichAMNwElfc" alt=""><figcaption></figcaption></figure>

## Create your Synthetic Check Run Service in Checkly

Next, you need to configure your uptime check in Checkly and link it to the webhook you just created.

* **Create Check Monitor:** Click on `+ New` and create a new check for the synthetic you want to track by choosing `Browser check` or `API check`. Configure the check according to your needs (e.g., check frequency, target URL).
* **Configure Webhook:** Within the check monitor's configuration settings, locate the `Retries & Alerting` option. Check the box corresponding to the webhook you created in the previous step. This will enable Checkly to send notifications to StatusPal whenever the uptime check status changes from **Up** or **Down**.

That's it! Once you have completed these steps, Checkly will send notifications about your uptime checks to StatusPal, allowing you to monitor and manage your service availability from a centralized platform.


# New Relic

This guide outlines the steps to integrate StatusPal's monitoring service with New Relic's synthetic checks. This integration allows you to receive alerts in StatusPal via webhook

To automate the reporting and closing of incidents on your status page based on the status reported by New Relic synthetic checks, follow these steps.

### Create your Webhook Integration in StatusPal

First, you need to create an <mark style="color:purple;">endpoint URL</mark> within StatusPal. This URL will act as the bridge between New Relic and StatusPal, receiving notifications from New Relic about uptime check results via webhook.

* **Navigate to Services:** On your Status Page, create a new service or edit an existing service.
* **Add Webhook:** On *Monitoring and incident automation section*, check on `Webhook` and select `NewRelic`.
* **Finish and Save:** Create or update the service, then copy the <mark style="color:purple;">endpoint URL</mark> that will be created for you.

<figure><img src="/files/gzLeKoz9OLQVwNV8ratD" alt=""><figcaption></figcaption></figure>

### Create your Webhook Integration in New Relic

Next, you need to create a ***webhook*** and ***workflow*** within New Relic.

* **Navigate to Alerts:** On the New Relic navigation bar, click on `Alerts`.
* **Add a Destination:** On the Alerts' navigation bar, click on `Destinations` and them on `Webhook`.
* **Add Webhook:** In the new webhook configuration, you'll need to add the <mark style="color:purple;">endpoint URL</mark> provided by StatusPal. *This URL is specific to your StatusPal service configuration and is essential for the integration to work correctly*. Paste this URL into the appropriate field.
* **Create a Workflow:** On the Alert's navigation bar, click on `Workflows` and then click on `Add a workflow`.
* **Configure Workflow:** On the configuration of the workflow, on the *Filter data section*, select on *Priority* the option **CRITICAL**. *<mark style="color:yellow;">Please note that if you have more than one ping monitor, you need to set a tag in order to link it to the workflow.</mark>* Then on the *Add a channel section* click on `Webhook` to open the *notification message*. Furthermore on *Destination option*, select the *webhook* you created for StatusPal.
* **Payload configuration:** On the notification message, you can configure the payload that will be send to StatusPal. <mark style="color:green;">**We strongly suggest that you keep the default template**</mark>. However, if you prefer to configure it because you will use this *workflow* somewhere else, you must keep 2 properties on the json object:

```
{
  "priority": {{ json priority }},
  "state": {{ jason state }},
  Rest or your properties...
}
```

<figure><img src="/files/oTPJR5xmJkGweEAtcI2i" alt=""><figcaption></figcaption></figure>

### Create your Synthetic Monitor in New Relic

Next, you need to configure your synthetic monitor in New Relic and link it to the webhook you just created.

* **Navigate to Synthetics:** On the New Relic navigation bar, click on `Synthetic Monitoring`.
* **Create Monitor:** Click on `Create monitor` and create a new monitor for the synthetic you want to track using the **`Availability`**` `` ``- Ping ` template. Configure the monitor according to your needs (e.g., check frequency, target URL). *<mark style="color:yellow;">Please note that if you have more than one ping monitor, you need to set a tag in order to link it to the workflow.</mark>*

That's it! Once you have completed these steps, New Relic will send notifications about your uptime checks to StatusPal, allowing you to monitor and manage your service availability from a centralized platform.

## Metrics from New Relic

In addition to incident automation, you can pull uptime metrics from a New Relic Synthetic Monitor directly into your status page charts.

1. Go to your [New Relic API keys page](https://one.eu.newrelic.com/api-keys) and create a new **User** API key.
2. Copy your **Account ID** and the new **API key**.
3. In your Statuspal admin, go to your status page's **Dashboard > Integrations > New Integration** and select **New Relic**.
4. Enter your Account ID and API key, select the correct region, and click **Create**.
5. Go to **Metrics > New Metric** and select your New Relic integration as the **Source**.
6. Select the synthetic monitor to pull data from and configure the metric type and unit. Click **Create**.

{% hint style="info" %}
Once created, the metric will backfill data from the last hour and continue populating going forward.
{% endhint %}


# Datadog

This guide outlines the steps to integrate StatusPal's monitoring service with Datadog's synthetic checks. This integration allows you to receive alerts in StatusPal via webhook

To automate the reporting and closing of incidents on your status page based on the status reported by Datadog synthetic checks, follow these steps.

### Create your Webhook Integration in StatusPal

First, you need to create an <mark style="color:purple;">endpoint URL</mark> within StatusPal. This URL will act as the bridge between Datadog and StatusPal, receiving notifications from Datadog about uptime check results via webhook.

* **Navigate to Services:** On your Status Page, create a new service or edit an existing service.
* **Add Webhook:** On *Monitoring and incident automation section*, check on `Webhook` and select `Datadog`.
* **Finish and Save:** Create or update the service, then copy the <mark style="color:purple;">endpoint URL</mark> that will be created for you.

<figure><img src="/files/ckrAKNLn3wrwBcHcYt9X" alt=""><figcaption></figcaption></figure>

### Create your Webhook Integration in Datadog

Next, you need to create a webhook integration.

* **Navigate to Integrations:** On the Datadog navigation bar, click on `Integrations`.
* **Add a Webhook:** Search for Webhook integration and click on it.
* **Configure Webhook:** On the W*ebhooks* section, click on `+ New`. You'll need to add the <mark style="color:purple;">endpoint URL</mark> provided by StatusPal. *This URL is specific to your StatusPal service configuration and is essential for the integration to work correctly*. Paste this URL into the appropriate field.
* **Payload Configuration:** On the notification message, you can configure the payload that will be send to StatusPal. You'll need to add one more property to the default template. If you need to configure it because you will use this weebhook somewhere else, you must keep the property we requiere on the json object: `"alert_type": "$ALERT_TYPE",`

```
{
    "alert_type": "$ALERT_TYPE",
    "id": "$ID",
    "last_updated": "$LAST_UPDATED",
    "event_type": "$EVENT_TYPE",
    "title": "$EVENT_TITLE",
    "date": "$DATE",
    "org": {
        "id": "$ORG_ID",
        "name": "$ORG_NAME"
    },
    "body": "$EVENT_MSG"
}
```

<figure><img src="/files/7zTUMQUgVVU95UXcgbyW" alt=""><figcaption></figcaption></figure>

### Create your Synthetic Monitor Test in Datadog

Next, you need to configure your synthetic monitor in Datadog and link it to the webhook you just created.

* **Navigate to Synthetics:** On the Datadog navigation bar, click on `Digital Experience`.
* **Create Uptime Monitor Test:** Click on `New Test` and create a new monitor for the synthetic you want to track using the **`API Test`** template. Configure the monitor according to your needs (e.g., check frequency, target URL).
* **Add Webhook:** On the settings configuration, add `@webhook-your-webhook-name` in the body of the message. (e.g., in the image below, my webhook's name is webhook-test)

<figure><img src="/files/6DIhEPyCpc4WRZbgMwXy" alt=""><figcaption></figcaption></figure>

That's it! Once you have completed these steps, Datadog will send notifications about your uptime checks to StatusPal, allowing you to monitor and manage your service availability from a centralized platform.


# BetterUptime

This guide outlines the steps to integrate StatusPal's monitoring service with BetterUptime's synthetic checks. This integration allows you to receive alerts in StatusPal via webhook

To automate the reporting and closing of incidents on your status page based on the status reported by BetterUptime synthetic checks, follow these steps.

### Create your Webhook Integration in StatusPal

First, you need to create an <mark style="color:purple;">endpoint URL</mark> within StatusPal. This URL will act as the bridge between BetterUptime and StatusPal, receiving notifications from BetterUptime about uptime check results via webhook.

* **Navigate to Services:** On your Status Page, create a new service or edit an existing service.
* **Add Webhook:** On *Monitoring and incident automation section*, check on `Webhook` and select BetterUptime.
* **Finish and Save:** Create or update the service, then copy the <mark style="color:purple;">endpoint URL</mark> that will be created for you.

<figure><img src="/files/xVU1pFnzEADC1P2watLZ" alt=""><figcaption></figcaption></figure>

### Create your Webhook Integration in BetterUptime

Next, you need to create a webhook integration.

* **Navigate to Integrations:** On the BetterUptime navigation bar, click on `Integrations`.
* **Add a Webhook:** Navigate to *Exporting data* option and choose `Webhooks`. Then choose do add a `Monitor webhook`.
* **Configure Webhook:** On the Webhooks configuration, you'll need to add the <mark style="color:purple;">endpoint URL</mark> provided by StatusPal. *This URL is specific to your StatusPal service configuration and is essential for the integration to work correctly*. Paste this URL into the appropriate field.
* **Payload Configuration:** On the *Advance settings section*, you need to make sure the HTTP Method is set to POST. On the *Request body section*, please make sure the properties and their values are added and set as we shown here: `"type": "incident"` and `"status": "$STATUS"`.
* **Attention:** If you have to configure the body to accommodate other uses, please make sure to keep the same structure as the default template where the data is read as <mark style="color:yellow;">**`data -> id, type, status...`**</mark>

```
{
  "data": {
    "id": "$INCIDENT_ID",
    "type": "incident",
    "status": "$STATUS",
    "attributes": {
      "name": "$NAME",
      "url": "$URL",
      "http_method": "$HTTP_METHOD",
      "cause": "$CAUSE",
      "started_at": "$STARTED_AT",
      "acknowledged_at": "$ACKNOWLEDGED_AT",
      "resolved_at": "$RESOLVED_AT",
      "response_content": "$RESPONSE_CONTENT",
      "response_url": "$RESPONSE_URL",
      "screenshot_url": "$SCREENSHOT_URL"
    }
  }
}
```

<figure><img src="/files/VSvXf6GD8YG8lvURyXwz" alt=""><figcaption></figcaption></figure>

### Create your Synthetic Monitor Test in BetterUptime

Next, you need to configure your synthetic monitor in BetterUptime and link it to the webhook you just created.

* **Navigate to Synthetics:** On the BetterUptime navigation bar, click on `Monitors`.
* **Create Uptime Monitor:** Click on `Create monitor` and create a new monitor for the synthetic you want to track. Configure the monitor according to your needs (e.g., check frequency, target URL).
* **Add Escalation:** On the settings configuration, make sure that on the *On-call escalation section*, the `Critical alert` is selected.

That's it! Once you have completed these steps, BetterUptime will send notifications about your uptime checks to StatusPal, allowing you to monitor and manage your service availability from a centralized platform.


# Mandrill (Mailchimp Transactional)

Follow these steps to connect StatusPal with Mandrill (Mailchimp Transactional) and get notifications working:

### Get Your Mailchimp API Key

* Log in to [Mandrill](https://mandrillapp.com/settings)
* Go to **Settings → SMTP & API Info**.
* Add a **+ New API Key** and copy the generated key — you will need it in StatusPal.

<figure><img src="/files/A8gavky5AVqkVCiJbRVu" alt=""><figcaption></figcaption></figure>

> 💡 **Tip:** Label your API key clearly in Mandrill (e.g. “StatusPal Integration”) so you can revoke it later if needed.

### Review Mandrill Sending Defaults

Before enabling the integration, verify that your **Mandrill Sending Defaults** match your organization’s privacy policy.

* Log in to [Mandrill](https://mandrillapp.com/settings/sending-options).
* Go to **Settings → Sending Defaults**.
* Review the available options, paying close attention to:
  * **Expose the List of Recipients When Sending to Multiple Addresses**
    * If checked, all recipients will see the full list of other recipients in the email.

<figure><img src="/files/x3OoTaLpG5SGXC2fIbrg" alt=""><figcaption></figcaption></figure>

Configure this setting according to your desired privacy behavior **before using the integration**.

### Configure the Integration in StatusPal

* Log in to your **StatusPal Dashboard**.
* Open the status page where you need to create the integration.
* Go to **Integrations** and install the **Mailchimp Transactional (Mandrill)** integration.
* Paste your **API Key**
* Enter your "Email from address" based on your authenticated [sending domain](https://mandrillapp.com/settings/sending-domains), then click Create.

<figure><img src="/files/ziBn2qihiLth9hZOzauG" alt=""><figcaption></figcaption></figure>

Once configured, your Mandrill integration will be active. Notifications from StatusPal will be sent using your authenticated domain and according to your Mandrill sending defaults.

> 💡 **Tip:** Test the integration with a sample incident to make sure everything is working as expected before going live.


# OpsGenie

Automatically create and resolve Statuspal incidents from OpsGenie alerts.

Integrate OpsGenie with Statuspal to keep your status page in sync with your alerting workflow:

* Statuspal incidents are created automatically when OpsGenie incidents are triggered.
* Statuspal incidents are resolved automatically when OpsGenie incidents are resolved.
* Configure rules to control which OpsGenie severities and services map to which Statuspal services.

## How it works

Statuspal registers a webhook in OpsGenie. When an OpsGenie incident event occurs, OpsGenie notifies Statuspal, which then creates or resolves a status page incident according to your configured rules.

## Requirements

* **OpsGenie**: Admin role (required to create an API key).
* **Statuspal**: Admin or Owner role (required to configure the integration).

## Setup

### In OpsGenie

1. Go to **Integrations > Add Integration** and select **API**.
2. Ensure **Read Access**, **Create and Update Access**, and **Enabled** are all checked.
3. Click **Save Integration** and copy the **API Key**.\
   \
   ![OpsGenie API integration](/files/iUbgy5eCwAsvwCUoaePC)

### In Statuspal

1. From your status page's dashboard, click **Integrations** in the sidebar.
2. Click **New integration** and select **OpsGenie**.
3. Enter your OpsGenie API key and click **Create**.\
   \
   ![Statuspal OpsGenie integration — empty rules](/files/q6TiFs2DV2ZF4a93QjUb)

## Configuring rules

Rules determine which OpsGenie incidents trigger Statuspal status updates and how they map to your services. For each rule, configure:

* **OpsGenie severity** to match on.
* **Statuspal service(s)** to affect.
* **Incident type** to create in Statuspal.

![OpsGenie rule configuration](/files/fJ4GgQlx3GLnqsy3JUos)

Once one or more rules are saved, incidents will be automatically created and resolved based on your OpsGenie activity.

![Configured OpsGenie rule](/files/xQU96jguHQq6NhxOdHaw)

## Uninstalling

In your Statuspal admin, click **Integrations**, find the OpsGenie integration, click **Delete**, and confirm. The integration and its webhook in OpsGenie will be permanently removed.


# Intercom Messenger

Display your Statuspal status page directly inside your Intercom Messenger widget.

With the Statuspal Intercom app, your customers can see current incidents and maintenance directly inside your Intercom live-chat widget — before they write in asking about it.

## 1. Install the Statuspal app from the Intercom App Store

Open the [Statuspal app in the Intercom App Store](https://www.intercom.com/app-store/?app_package_code=statuspal-urkv) and click **Install now**.

{% hint style="info" %}
Nothing will appear in your messenger until you complete all steps below.
{% endhint %}

## 2. Authorize Statuspal to your Intercom workspace

You'll be prompted to sign in to both Intercom and Statuspal to authorize the connection. Once authorized, you'll be taken back to the App Store.

![Statuspal Intercom OAuth authorization](/files/KUtJ76ZeIHuze0nLxk5U)

## 3. Add Statuspal to your Intercom Messenger

1. In your Intercom dashboard, click the **Messenger** icon in the sidebar (bottom left).
2. Expand the **Add apps to your Messenger** section.
3. Click **Add an app** and select **Statuspal**.
4. Choose the status page you want to display from the dropdown.\
   \
   ![Adding Statuspal app to Intercom Messenger](/files/kTO9dGyIRHkQljGf5Fgf)

## 4. Save and go live

Click **Save and set live**. Your status page will now appear inside your Intercom messenger, keeping customers informed about any active incidents or maintenance.

## Permissions and data handling

When you authorize the app, Intercom shows a list of permissions that includes **Read conversations**. That looks broader than it is, and it's worth explaining why it appears.

The Statuspal app is built with [Canvas Kit](https://developers.intercom.com/docs/canvas-kit), the framework Intercom provides for apps that render inside the Messenger. Intercom requires a fixed set of permissions from every Canvas Kit app — read and list users and companies, read conversations, read admins, and gather app data. Those permissions are locked in the Intercom Developer Hub and cannot be deselected by the app developer. You can verify the requirement in [Intercom's own documentation](https://developers.intercom.com/docs/build-an-integration/learn-more/authentication/oauth-scopes).

The permission list is therefore defined by Intercom, not chosen by Statuspal.

What Statuspal actually does with your workspace:

* **We do not read your conversations**, contacts, or companies.
* The integration makes a single call to Intercom, when you install it, to identify which teammate is authorizing the app.
* After that, all traffic runs the other way: Intercom asks Statuspal for your current status, and Statuspal returns the card to display.
* We store your Intercom teammate ID, so the authorization can be linked to your Statuspal account. **We do not store your Intercom access token.**


# Custom SMTP

Send Statuspal email notifications through your own SMTP server.

Statuspal supports integration with third-party SMTP servers, allowing you to send email notifications through your own mail infrastructure.

## Setup

1. In your status page's admin sidebar, click **Integrations**, then **New integration**.
2. Select **SMTP** from the service dropdown.\
   \
   ![New SMTP integration](/files/RtQzSclNOeP45TcagTmE)
3. Fill in your SMTP server details:
   * **Relay** — Your SMTP hostname (e.g. `smtp.gmail.com` or `smtp.yourcompany.com`).
   * Username, password, port, and any other required fields.
4. Click **Create**.

## Verify the integration

Once created, go to **Subscriptions** and click **Send test email**. Send yourself a test — if it arrives correctly, your SMTP integration is working. You can also check your SMTP server logs to confirm traffic is routing through it.

{% hint style="info" %}
Make sure you have an email subscription configured before sending a test email.
{% endhint %}


# Slack Notifications

Allow your status page subscribers to receive incident and maintenance notifications directly in their Slack workspace.

{% hint style="info" %}
As a status page admin, enable Slack subscriptions under <mark style="background-color:green;">Subscriptions > Sub. Settings</mark> before your customers can subscribe.
{% endhint %}

## Enable Slack subscriptions (admin)

1. In your status page admin sidebar, click **Subscriptions**, then **Sub. Settings**.
2. Check **Enable Slack subscriptions** and click **Update**.\
   \
   ![Enable Slack subscriptions setting](/files/TdxN6r0XWni7K38ZB30d)

## How subscribers connect Slack

Once enabled, subscribers will see an **Add to Slack** button in the **Subscribe to Updates** modal on your status page.

![Add to Slack button in subscribe modal](/files/s3JGqCYHKOzsHRsE15K7)

Clicking it takes them through a short OAuth flow to connect their Slack workspace:

![Slack workspace connection screen](/files/7hnEBqwvQFUiohaTMKmm)

Statuspal only requests the minimum permissions necessary and does not store personal information.

![Slack OAuth permissions](/files/AQCI9uAPUHI7JqEtAO4g)

After authorising, subscribers choose the Slack channel where they'd like to receive updates. They can revisit the link at any time to change the channel or cancel their subscription.

![Slack channel selection](/files/LmXSeKA7FnAA6KyyT5KQ)

## Sending notifications

When creating or updating an incident, check **Notify Slack subscribers** to send the update to all Slack subscribers.

![Notify Slack subscribers checkbox](/files/xkpsdcJdvhBJTInjpa22)


# Microsoft Teams Notifications

Allow your status page subscribers to receive incident and maintenance notifications directly in their Microsoft Teams channels.

{% hint style="info" %}
As a status page admin, enable Microsoft Teams notifications under <mark style="background-color:green;">Subscriptions > Sub. Settings</mark> before your customers can subscribe.
{% endhint %}

## Enable Teams notifications (admin)

1. In your status page admin sidebar, click **Subscriptions**, then **Sub. Settings**.
2. Check **Enable Microsoft Teams notification** and click **Submit**.\
   \
   ![Enable Microsoft Teams notifications setting](/files/eWK8TR6NOYnAdkvIZmoU)

## How subscribers connect Teams

Once enabled, subscribers will see a Microsoft Teams option in the **Subscribe to Updates** modal on your status page.

![Microsoft Teams option in subscribe modal](/files/ypqxYyy1sTSclGVbgiW5)

To subscribe, they need an **Incoming Webhook URL** from Microsoft Teams:

1. In Microsoft Teams, click **Apps** and search for **Incoming Webhook**.
2. Click **Add to a team**, select the team/channel, and click **Set up a connector**.
3. Enter a name (e.g. "Acme Status") and click **Create**.\
   \
   ![Microsoft Teams Incoming Webhook setup](/files/xSnPh3L4bXrs8SAsxwqW)
4. Copy the generated webhook URL.\
   \
   ![Copy Teams webhook URL](/files/AJcqmIGRLadHwAwIQt9P)
5. Paste the URL into the **Microsoft Teams webhook URL** field in the subscribe modal and click **Subscribe**.\
   \
   ![Subscribe with Teams webhook URL](/files/Mx2KaqaljrXk4B98qunO)

A confirmation message will appear in the Teams channel immediately upon subscribing.


# Google Chat Notifications

Allow your status page subscribers to receive incident and maintenance notifications in Google Chat Spaces.

{% hint style="info" %}
As a status page admin, enable Google Chat notifications under <mark style="background-color:green;">Subscriptions > Sub. Settings</mark> before your customers can subscribe.
{% endhint %}

## Enable Google Chat notifications (admin)

1. In your status page admin sidebar, click **Subscriptions**, then **Sub. Settings**.
2. Check **Enable Google Chat notifications** and click **Submit**.\
   \
   ![Enable Google Chat notifications setting](/files/8qFgmc4BGw8XPb306hiI)

## How subscribers connect Google Chat

Once enabled, subscribers can subscribe to receive Google Chat notifications from your status page. They'll need to provide an **Incoming Webhook URL** from their Google Chat Space.

![Google Chat subscribe modal](/files/nAzUKzwzhO7xwtw6PyS2)

To get a webhook URL, refer to the [official Google Chat documentation on incoming webhooks](https://developers.google.com/chat/how-tos/webhooks#setting_up_an_incoming_webhook).


# Mattermost Notifications

Allow your status page subscribers to receive incident and maintenance notifications in Mattermost channels.

{% hint style="info" %}
As a status page admin, enable Mattermost notifications under <mark style="background-color:green;">Subscriptions > Sub. Settings</mark> before your customers can subscribe.
{% endhint %}

## Enable Mattermost notifications (admin)

1. In your status page admin sidebar, click **Subscriptions**, then **Sub. Settings**.
2. Check **Enable Mattermost Notifications** and click **Submit**.\
   \
   ![Enable Mattermost notifications setting](/files/Dd7Lm3AMRHsMmLRPZlp8)

## How subscribers connect Mattermost

Once enabled, subscribers can subscribe to receive Mattermost notifications from your status page. They'll need to provide an **Incoming Webhook URL** from their Mattermost instance.

![Mattermost subscribe modal](/files/dDLgNbNlftXTjHcKFeD2)

To create a webhook URL, refer to the [official Mattermost incoming webhook documentation](https://docs.mattermost.com/developer/webhooks-incoming.html#simple-incoming-webhook).


# Webhooks

Receive real-time POST notifications from Statuspal to your own endpoints when incidents or service status changes occur.

Statuspal supports outbound webhooks so you can receive events from your status page and monitoring system in real time. When a selected event occurs, Statuspal sends a `POST` request to your endpoint with a JSON payload in the body.

## Setup

1. Click **Webhooks** in the admin sidebar, then click **New Webhook**.\
   \
   ![New Webhook button](/files/tOWWkNnR7nuXzzLUh14x)
2. Enter your **endpoint URL**.
3. Select one or more **events** to subscribe to.
4. Click **Create**.

Once created, click **Send test request** to verify that your endpoint receives payloads correctly. The latest response from your server will appear inline.

![Webhook test request result](/files/EAfzL1mksteaxiJlGlz6)

## Webhook events

### `service.monitored_status.updated`

Triggered when a service configured with Statuspal's internal monitoring changes status (up/down).

```json
{
  "event": "service.monitored_status.updated",
  "data": {
    "object": {
      "type": "service",
      "parent_id": null,
      "name": "API",
      "id": 123,
      "display_response_time_chart": false,
      "current_incident_type": null
    },
    "monitored_status": "up"
  }
}
```

### `incident.created`, `incident.updated`, `incident.deleted`

Triggered during the lifecycle of an incident. All three events share the same payload shape.

```json
{
  "event": "incident.updated",
  "data": {
    "object": {
      "type": "incident",
      "starts_at": "2020-03-11T12:47:17",
      "ends_at": null,
      "service_ids": [1, 2],
      "l_title": [{ "lang": "en", "text": "Incident title" }],
      "id": 123
    }
  }
}
```


# API Reference


# Introduction

Here you'll learn how to leverage the power of StatusPal through its API to query your status page's status, create and update incidents, push custom metrics and more.

#### Servers

* `https://statuspal.io/api/v2` (US servers)
* `https://statuspal.eu/api/v2` (EU servers)

If you need some assistance please email us at <support@statuspal.io>.

#### Example request

```bash
curl https://statuspal.io/api/v2/hello \
  -H 'Accept: application/json' \
  -H 'Content-Type: application/json'
```

#### Datetimes

All datetime fields are stored in UTC and follow ISO 8601 standard (`2022-01-01T00:00:00`).


# Authentication

Some endpoints require authentication in order to be used, you'll need to pass your API key in the `Authorization` header, you can find your API key in your [User Account page](https://statuspal.io/admin/profile) or under your organization's "Security > API" Keys page.

**Example authenticated request:**

```bash
curl -X POST \
  https://statuspal.io/api/v2/status_pages/:subdomain/incidents \
  -H 'Accept: application/json' \
  -H 'Content-Type: application/json' \
  -H 'Authorization: <your-api-key>' \
  -d '{
   "incident": {
      "type": "major",
      "title": "DB connection issues",
      "service_ids": [1],
      "updates": [{ "type": "issue", "description": "We are investigating" }]
    }
  }'
```


# Rate Limits

Our API has the following rate limits:

#### EU Region

300 requests per 10 seconds

#### US Region

100 requests per 10 seconds

#### What happens when the rate limit is exceeded?

If the rate limit is exceeded, the API will return a `429` status code.

#### Need a custom rate limit?

Please contact us at <support@statuspal.io> and we'll be happy to help you.

***


# Test

Test endpoints

## GET /hello

> Says hello

```json
{"openapi":"3.0.1","info":{"title":"StatusPal API Reference","version":"2.0.0"},"tags":[{"name":"Test","description":"Test endpoints"}],"servers":[{"url":"https://statuspal.io/api/v2"},{"url":"https://statuspal.eu/api/v2"}],"security":[],"paths":{"/hello":{"get":{"tags":["Test"],"summary":"Says hello","operationId":"sayHello","responses":{"200":{"description":"A hello message","content":{"application/json":{"schema":{"type":"object","properties":{"message":{"type":"string","description":"A string \"hello\""}}}}}},"429":{"description":"Too many requests — the rate limit has been exceeded."}}}}}}
```


# Status

Status endpoints

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

> Get the status reported on a status page

```json
{"openapi":"3.0.1","info":{"title":"StatusPal API Reference","version":"2.0.0"},"tags":[{"name":"Status","description":"Status endpoints"}],"servers":[{"url":"https://statuspal.io/api/v2"},{"url":"https://statuspal.eu/api/v2"}],"security":[],"paths":{"/status_pages/{subdomain}/status":{"get":{"tags":["Status"],"summary":"Get the status reported on a status page","operationId":"getStatusPageStatus","parameters":[{"$ref":"#/components/parameters/StatusPageSubdomain"}],"responses":{"200":{"description":"A status page's status","content":{"application/json":{"schema":{"$ref":"#/components/schemas/StatusPageStatus"}}}},"403":{"$ref":"#/components/responses/ForbiddenError"},"404":{"$ref":"#/components/responses/NotFoundError"},"500":{"$ref":"#/components/responses/ServerError"}}}}},"components":{"parameters":{"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":{"StatusPageStatus":{"description":"Represents the status summary of a status page","type":"object","properties":{"status_page":{"type":"object","properties":{"url":{"type":"string","description":"The URL of the website the status page is about"},"time_zone":{"type":"string","description":"The primary timezone the status page uses to display incidents"},"subdomain":{"type":"string","description":"The `subdomain` that identified the status page"},"name":{"type":"string","description":"The name of the company or service the status page is about"},"current_incident_type":{"$ref":"#/components/schemas/IncidentType"}}}}},"IncidentType":{"type":"string","description":"The type of the (current) incident:\n * `minor` - A minor incident is currently taking place.\n * `major` - A major incident is currently taking place.\n * `scheduled` - A scheduled maintenance is currently taking place.\n","enum":["major","minor","scheduled"]},"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":{"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"}}}}}}}
```

## GET /status\_pages/{subdomain}/services/{serviceId}/status

> Get the status reported on a status page service

```json
{"openapi":"3.0.1","info":{"title":"StatusPal API Reference","version":"2.0.0"},"tags":[{"name":"Status","description":"Status endpoints"}],"servers":[{"url":"https://statuspal.io/api/v2"},{"url":"https://statuspal.eu/api/v2"}],"security":[],"paths":{"/status_pages/{subdomain}/services/{serviceId}/status":{"get":{"tags":["Status"],"summary":"Get the status reported on a status page service","operationId":"getServiceStatus","parameters":[{"$ref":"#/components/parameters/StatusPageSubdomain"},{"$ref":"#/components/parameters/ServiceId"}],"responses":{"200":{"description":"A service's status","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServiceStatus"}}}},"403":{"$ref":"#/components/responses/ForbiddenError"},"404":{"$ref":"#/components/responses/NotFoundError"},"500":{"$ref":"#/components/responses/ServerError"}}}}},"components":{"parameters":{"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"}},"ServiceId":{"name":"serviceId","in":"path","description":"The ID of a service","required":true,"schema":{"type":"integer"}}},"schemas":{"ServiceStatus":{"type":"object","properties":{"service":{"$ref":"#/components/schemas/StatusService"}}},"StatusService":{"description":"Represents the status of a service","type":"object","properties":{"name":{"type":"string"},"id":{"type":"integer"},"current_incident_type":{"$ref":"#/components/schemas/IncidentType"},"children":{"type":"array","description":"Nested ServiceSummary children","items":{"$ref":"#/components/schemas/StatusService"}}}},"IncidentType":{"type":"string","description":"The type of the (current) incident:\n * `minor` - A minor incident is currently taking place.\n * `major` - A major incident is currently taking place.\n * `scheduled` - A scheduled maintenance is currently taking place.\n","enum":["major","minor","scheduled"]},"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":{"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"}}}}}}}
```


# Summary

Summary endpoints

## GET /status\_pages/{subdomain}/summary

> Get the summary of a status page (status, services and active incidents and maintenances)

````json
{"openapi":"3.0.1","info":{"title":"StatusPal API Reference","version":"2.0.0"},"tags":[{"name":"Summary","description":"Summary endpoints"}],"servers":[{"url":"https://statuspal.io/api/v2"},{"url":"https://statuspal.eu/api/v2"}],"security":[],"paths":{"/status_pages/{subdomain}/summary":{"get":{"tags":["Summary"],"summary":"Get the summary of a status page (status, services and active incidents and maintenances)","operationId":"getStatusPageSummary","parameters":[{"$ref":"#/components/parameters/StatusPageSubdomain"}],"responses":{"200":{"description":"A status page's status","content":{"application/json":{"schema":{"$ref":"#/components/schemas/StatusPageSummary"}}}},"403":{"$ref":"#/components/responses/ForbiddenError"},"404":{"$ref":"#/components/responses/NotFoundError"},"500":{"$ref":"#/components/responses/ServerError"}}}}},"components":{"parameters":{"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":{"StatusPageSummary":{"description":"Represents the status summary of a status page","allOf":[{"$ref":"#/components/schemas/StatusPageStatus"},{"type":"object","properties":{"services":{"type":"array","items":{"$ref":"#/components/schemas/StatusService"}},"incidents":{"type":"array","description":"Active incidents","items":{"$ref":"#/components/schemas/Incident"}},"maintenances":{"type":"array","description":"Active maintenances","items":{"$ref":"#/components/schemas/Maintenance"}},"upcoming_maintenances":{"type":"array","description":"Upcoming maintenances","items":{"$ref":"#/components/schemas/Maintenance"}},"info_notices":{"type":"array","description":"Featured information notices","items":{"$ref":"#/components/schemas/InfoNotice"}},"current_status_type":{"type":"string","nullable":true,"enum":[null,"major","scheduled","minor"],"description":"The current status type of the status page"}}}]},"StatusPageStatus":{"description":"Represents the status summary of a status page","type":"object","properties":{"status_page":{"type":"object","properties":{"url":{"type":"string","description":"The URL of the website the status page is about"},"time_zone":{"type":"string","description":"The primary timezone the status page uses to display incidents"},"subdomain":{"type":"string","description":"The `subdomain` that identified the status page"},"name":{"type":"string","description":"The name of the company or service the status page is about"},"current_incident_type":{"$ref":"#/components/schemas/IncidentType"}}}}},"IncidentType":{"type":"string","description":"The type of the (current) incident:\n * `minor` - A minor incident is currently taking place.\n * `major` - A major incident is currently taking place.\n * `scheduled` - A scheduled maintenance is currently taking place.\n","enum":["major","minor","scheduled"]},"StatusService":{"description":"Represents the status of a service","type":"object","properties":{"name":{"type":"string"},"id":{"type":"integer"},"current_incident_type":{"$ref":"#/components/schemas/IncidentType"},"children":{"type":"array","description":"Nested ServiceSummary children","items":{"$ref":"#/components/schemas/StatusService"}}}},"Incident":{"type":"object","description":"An incident, either major, minor or a scheduled maintenance","required":["service_ids","type","updates","title"],"properties":{"id":{"type":"integer","description":"ID of the record","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},"title":{"type":"string","description":"The title of the incident"},"starts_at":{"type":"string","description":"The time at which the incident/maintenance started/will start.","format":"date-time"},"ends_at":{"type":"string","description":"The time at which the incident/maintenance ended/will end.","format":"date-time"},"type":{"$ref":"#/components/schemas/IncidentType"},"service_ids":{"type":"array","description":"An array of service Ids, at least 1 must be included","items":{"type":"integer"}},"updates":{"type":"array","description":"The incident's updates. On incident creation you must pass exactly one update object in the array, if the incident is of type minor/major the update type `issue` is recommended, if a scheduled maintenance then use `scheduled`.","items":{"$ref":"#/components/schemas/IncidentActivity"}},"url":{"readOnly":true,"type":"string","description":"URL to the incident"},"translations":{"description":"A translations object. For example:\n```json\n{\n  \"en\": { \"title\": \"English Title\" },\n  \"es\": { \"title\": \"Spanish Title\" }\n}\n```\n","type":"object","additionalProperties":true,"properties":{"[lang]":{"description":"e.g. `en`.","type":"object","properties":{"title":{"type":"string"}}}}},"notify":{"type":"boolean","description":"Notify subscribers when creating an incident with `type` `major` or `minor`."},"maintenance_notify":{"type":"boolean","description":"Notify subscribers when creating an incident (maintenance) with `type` `scheduled`."},"maintenance_notify_settings":{"$ref":"#/components/schemas/MaintenanceNotifySettings"},"affects_uptime":{"readOnly":true,"description":"It's a boolean if the incident affects uptime.","type":"boolean"}}},"IncidentActivity":{"type":"object","description":"Communicates an update of an incident, the special type `resolved` will close an incident.","required":["type","description"],"properties":{"id":{"type":"integer","description":"ID of the record","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},"posted_at":{"type":"string","description":"Editable datetime at which the record was posted","format":"date-time"},"type":{"type":"string","description":"The type of an incident update:\n * `investigating` - Investigating.\n * `issue` - Issue.\n * `monitoring` - Monitoring.\n * `resolved` - Resolved will close the associated incident by settings its `ends_at` to the current time.\n * `scheduled` - Scheduled Maintenance's first update shall have this type.\n * `essential` - Essential Maintenance's first update shall have this type.\n * `retroactive` - Retroactive.\n * `update` - Standard update on an incident.\n * `escalate` - Escalate will switch the incident type from `minor` to `major`.\n * `deescalate` - De-escalate will switch the incident type from `major` to `minor`.\n * `postmortem` - A Post-mortem update.\n"},"description":{"type":"string","description":"The provided update description (accepts Markdown format)"},"description_html":{"type":"string","readOnly":true,"description":"The provided update description rendered in HTML"},"translations":{"description":"A translations object. For example:\n```json\n{\n  \"en\": { \"description\": \"English description\" },\n  \"es\": { \"description\": \"Spanish description\" }\n}\n```\n","type":"object","additionalProperties":true,"properties":{"[lang]":{"description":"e.g. `en`.","type":"object","properties":{"description":{"type":"string"}}}}},"notify":{"type":"boolean","description":"Should your subscribers be notified about this update?","writeOnly":true},"subscribers_notified_at":{"type":"string","description":"Datetime at which subscribers were notified for this update","format":"date-time","readOnly":true},"tweet":{"type":"boolean","description":"Tweet this update with your configured Twitter account?"}}},"MaintenanceNotifySettings":{"type":"object","description":"> ### Configure this field only if the `type` is set to `scheduled`. To take effect, the `maintenance_notify` must be set to `true`.\nOverrides the status page auto maintenance notification settings for this specific maintenance.\n","properties":{"before_notice_minutes":{"type":"integer","description":"The number of minutes to notify the subscribers before the maintenance start.\n* `-1` - Immediately\n* `0` - Never\n* Positive integer (`4320`, `5760`, `10080`, ...) - Before the maintenance start minutes\n"},"second_before_notice_minutes":{"type":"integer","description":"The number of minutes to notify the subscribers the second time before the maintenance start. It needs to be after the first \"before maintenance start\" notice.\n* `0` - Never\n* Positive integer (`720`, `1440`, `2880`, ...) - Before the maintenance start minutes\n"},"on_start":{"type":"boolean","description":"Notify subscribers when the maintenance starts."},"on_end":{"type":"boolean","description":"Notify subscribers when the maintenance ends."}}},"Maintenance":{"allOf":[{"$ref":"#/components/schemas/Incident"},{"type":"object","properties":{"type":{"$ref":"#/components/schemas/MaintenanceType"}}}]},"MaintenanceType":{"type":"string","description":"The type of the incident:\n * `scheduled` - Should be used for maintenances.\n","enum":["scheduled"]},"InfoNotice":{"type":"object","description":"An information notice","required":["updates","title"],"properties":{"id":{"type":"integer","description":"ID of the record","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},"title":{"type":"string","description":"The title of the information notice"},"featured_from":{"type":"string","description":"The time at which the information notice will display on the status page.","format":"date-time"},"featured_until":{"type":"string","description":"The time at which the information notice will not display on the status page.","format":"date-time"},"service_ids":{"type":"array","description":"An array of service Ids, at least 1 must be included","items":{"type":"integer"}},"updates":{"type":"array","description":"The information notice's updates. On information notice creation you must pass exactly one update object in the array.","items":{"$ref":"#/components/schemas/IncidentActivity"}},"url":{"readOnly":true,"type":"string","description":"URL to the information notice"},"translations":{"description":"A translations object. For example:\n```json\n{\n  \"en\": { \"title\": \"English Title\" },\n  \"es\": { \"title\": \"Spanish Title\" }\n}\n```\n","type":"object","additionalProperties":true,"properties":{"[lang]":{"description":"e.g. `en`.","type":"object","properties":{"title":{"type":"string"}}}}}}},"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":{"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"}}}}}}}
````

## GET /status\_pages/{subdomain}/services/{serviceId}/summary

> Get the summary of a service (status, services and active incidents and maintenances)

````json
{"openapi":"3.0.1","info":{"title":"StatusPal API Reference","version":"2.0.0"},"tags":[{"name":"Summary","description":"Summary endpoints"}],"servers":[{"url":"https://statuspal.io/api/v2"},{"url":"https://statuspal.eu/api/v2"}],"security":[],"paths":{"/status_pages/{subdomain}/services/{serviceId}/summary":{"get":{"tags":["Summary"],"summary":"Get the summary of a service (status, services and active incidents and maintenances)","operationId":"getServiceSummary","parameters":[{"$ref":"#/components/parameters/StatusPageSubdomain"},{"$ref":"#/components/parameters/ServiceId"}],"responses":{"200":{"description":"A service's status","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServiceSummary"}}}},"403":{"$ref":"#/components/responses/ForbiddenError"},"404":{"$ref":"#/components/responses/NotFoundError"},"500":{"$ref":"#/components/responses/ServerError"}}}}},"components":{"parameters":{"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"}},"ServiceId":{"name":"serviceId","in":"path","description":"The ID of a service","required":true,"schema":{"type":"integer"}}},"schemas":{"ServiceSummary":{"allOf":[{"$ref":"#/components/schemas/ServiceStatus"},{"type":"object","properties":{"incidents":{"type":"array","description":"Active incidents","items":{"$ref":"#/components/schemas/Incident"}},"maintenances":{"type":"array","description":"Active maintenances","items":{"$ref":"#/components/schemas/Maintenance"}},"upcoming_maintenances":{"type":"array","description":"Upcoming maintenances","items":{"$ref":"#/components/schemas/Maintenance"}},"info_notices":{"type":"array","description":"Featured information notices","items":{"$ref":"#/components/schemas/InfoNotice"}},"current_status_type":{"type":"string","nullable":true,"enum":[null,"major","scheduled","minor"],"description":"The current status type of the status page"}}}]},"ServiceStatus":{"type":"object","properties":{"service":{"$ref":"#/components/schemas/StatusService"}}},"StatusService":{"description":"Represents the status of a service","type":"object","properties":{"name":{"type":"string"},"id":{"type":"integer"},"current_incident_type":{"$ref":"#/components/schemas/IncidentType"},"children":{"type":"array","description":"Nested ServiceSummary children","items":{"$ref":"#/components/schemas/StatusService"}}}},"IncidentType":{"type":"string","description":"The type of the (current) incident:\n * `minor` - A minor incident is currently taking place.\n * `major` - A major incident is currently taking place.\n * `scheduled` - A scheduled maintenance is currently taking place.\n","enum":["major","minor","scheduled"]},"Incident":{"type":"object","description":"An incident, either major, minor or a scheduled maintenance","required":["service_ids","type","updates","title"],"properties":{"id":{"type":"integer","description":"ID of the record","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},"title":{"type":"string","description":"The title of the incident"},"starts_at":{"type":"string","description":"The time at which the incident/maintenance started/will start.","format":"date-time"},"ends_at":{"type":"string","description":"The time at which the incident/maintenance ended/will end.","format":"date-time"},"type":{"$ref":"#/components/schemas/IncidentType"},"service_ids":{"type":"array","description":"An array of service Ids, at least 1 must be included","items":{"type":"integer"}},"updates":{"type":"array","description":"The incident's updates. On incident creation you must pass exactly one update object in the array, if the incident is of type minor/major the update type `issue` is recommended, if a scheduled maintenance then use `scheduled`.","items":{"$ref":"#/components/schemas/IncidentActivity"}},"url":{"readOnly":true,"type":"string","description":"URL to the incident"},"translations":{"description":"A translations object. For example:\n```json\n{\n  \"en\": { \"title\": \"English Title\" },\n  \"es\": { \"title\": \"Spanish Title\" }\n}\n```\n","type":"object","additionalProperties":true,"properties":{"[lang]":{"description":"e.g. `en`.","type":"object","properties":{"title":{"type":"string"}}}}},"notify":{"type":"boolean","description":"Notify subscribers when creating an incident with `type` `major` or `minor`."},"maintenance_notify":{"type":"boolean","description":"Notify subscribers when creating an incident (maintenance) with `type` `scheduled`."},"maintenance_notify_settings":{"$ref":"#/components/schemas/MaintenanceNotifySettings"},"affects_uptime":{"readOnly":true,"description":"It's a boolean if the incident affects uptime.","type":"boolean"}}},"IncidentActivity":{"type":"object","description":"Communicates an update of an incident, the special type `resolved` will close an incident.","required":["type","description"],"properties":{"id":{"type":"integer","description":"ID of the record","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},"posted_at":{"type":"string","description":"Editable datetime at which the record was posted","format":"date-time"},"type":{"type":"string","description":"The type of an incident update:\n * `investigating` - Investigating.\n * `issue` - Issue.\n * `monitoring` - Monitoring.\n * `resolved` - Resolved will close the associated incident by settings its `ends_at` to the current time.\n * `scheduled` - Scheduled Maintenance's first update shall have this type.\n * `essential` - Essential Maintenance's first update shall have this type.\n * `retroactive` - Retroactive.\n * `update` - Standard update on an incident.\n * `escalate` - Escalate will switch the incident type from `minor` to `major`.\n * `deescalate` - De-escalate will switch the incident type from `major` to `minor`.\n * `postmortem` - A Post-mortem update.\n"},"description":{"type":"string","description":"The provided update description (accepts Markdown format)"},"description_html":{"type":"string","readOnly":true,"description":"The provided update description rendered in HTML"},"translations":{"description":"A translations object. For example:\n```json\n{\n  \"en\": { \"description\": \"English description\" },\n  \"es\": { \"description\": \"Spanish description\" }\n}\n```\n","type":"object","additionalProperties":true,"properties":{"[lang]":{"description":"e.g. `en`.","type":"object","properties":{"description":{"type":"string"}}}}},"notify":{"type":"boolean","description":"Should your subscribers be notified about this update?","writeOnly":true},"subscribers_notified_at":{"type":"string","description":"Datetime at which subscribers were notified for this update","format":"date-time","readOnly":true},"tweet":{"type":"boolean","description":"Tweet this update with your configured Twitter account?"}}},"MaintenanceNotifySettings":{"type":"object","description":"> ### Configure this field only if the `type` is set to `scheduled`. To take effect, the `maintenance_notify` must be set to `true`.\nOverrides the status page auto maintenance notification settings for this specific maintenance.\n","properties":{"before_notice_minutes":{"type":"integer","description":"The number of minutes to notify the subscribers before the maintenance start.\n* `-1` - Immediately\n* `0` - Never\n* Positive integer (`4320`, `5760`, `10080`, ...) - Before the maintenance start minutes\n"},"second_before_notice_minutes":{"type":"integer","description":"The number of minutes to notify the subscribers the second time before the maintenance start. It needs to be after the first \"before maintenance start\" notice.\n* `0` - Never\n* Positive integer (`720`, `1440`, `2880`, ...) - Before the maintenance start minutes\n"},"on_start":{"type":"boolean","description":"Notify subscribers when the maintenance starts."},"on_end":{"type":"boolean","description":"Notify subscribers when the maintenance ends."}}},"Maintenance":{"allOf":[{"$ref":"#/components/schemas/Incident"},{"type":"object","properties":{"type":{"$ref":"#/components/schemas/MaintenanceType"}}}]},"MaintenanceType":{"type":"string","description":"The type of the incident:\n * `scheduled` - Should be used for maintenances.\n","enum":["scheduled"]},"InfoNotice":{"type":"object","description":"An information notice","required":["updates","title"],"properties":{"id":{"type":"integer","description":"ID of the record","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},"title":{"type":"string","description":"The title of the information notice"},"featured_from":{"type":"string","description":"The time at which the information notice will display on the status page.","format":"date-time"},"featured_until":{"type":"string","description":"The time at which the information notice will not display on the status page.","format":"date-time"},"service_ids":{"type":"array","description":"An array of service Ids, at least 1 must be included","items":{"type":"integer"}},"updates":{"type":"array","description":"The information notice's updates. On information notice creation you must pass exactly one update object in the array.","items":{"$ref":"#/components/schemas/IncidentActivity"}},"url":{"readOnly":true,"type":"string","description":"URL to the information notice"},"translations":{"description":"A translations object. For example:\n```json\n{\n  \"en\": { \"title\": \"English Title\" },\n  \"es\": { \"title\": \"Spanish Title\" }\n}\n```\n","type":"object","additionalProperties":true,"properties":{"[lang]":{"description":"e.g. `en`.","type":"object","properties":{"title":{"type":"string"}}}}}}},"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":{"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"}}}}}}}
````


# Incidents

Incidents endpoints

## GET /status\_pages/{subdomain}/incidents

> Get the list of incidents of a status page

````json
{"openapi":"3.0.1","info":{"title":"StatusPal API Reference","version":"2.0.0"},"tags":[{"name":"Incidents","description":"Incidents endpoints"}],"servers":[{"url":"https://statuspal.io/api/v2"},{"url":"https://statuspal.eu/api/v2"}],"security":[],"paths":{"/status_pages/{subdomain}/incidents":{"get":{"tags":["Incidents"],"summary":"Get the list of incidents of a status page","operationId":"getIncidents","parameters":[{"$ref":"#/components/parameters/StatusPageSubdomain"},{"name":"before","in":"query","description":"Used as a cursor for pagination.","schema":{"type":"string"}},{"name":"after","in":"query","description":"Used as a cursor for pagination.","schema":{"type":"string"}},{"name":"limit","in":"query","description":"Set the number of incidents to return in the response.\nThis defaults to 20 items, and can be a maximum of 100.\n","schema":{"type":"integer"}},{"name":"type","in":"query","description":"Filter incidents by incident type key.","schema":{"type":"string"}}],"responses":{"200":{"description":"The list of incidents","content":{"application/json":{"schema":{"type":"object","properties":{"incidents":{"type":"array","items":{"$ref":"#/components/schemas/Incident"}},"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 incidents."}}}}}}}},"403":{"$ref":"#/components/responses/ForbiddenError"},"404":{"$ref":"#/components/responses/NotFoundError"},"500":{"$ref":"#/components/responses/ServerError"}}}}},"components":{"parameters":{"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":{"Incident":{"type":"object","description":"An incident, either major, minor or a scheduled maintenance","required":["service_ids","type","updates","title"],"properties":{"id":{"type":"integer","description":"ID of the record","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},"title":{"type":"string","description":"The title of the incident"},"starts_at":{"type":"string","description":"The time at which the incident/maintenance started/will start.","format":"date-time"},"ends_at":{"type":"string","description":"The time at which the incident/maintenance ended/will end.","format":"date-time"},"type":{"$ref":"#/components/schemas/IncidentType"},"service_ids":{"type":"array","description":"An array of service Ids, at least 1 must be included","items":{"type":"integer"}},"updates":{"type":"array","description":"The incident's updates. On incident creation you must pass exactly one update object in the array, if the incident is of type minor/major the update type `issue` is recommended, if a scheduled maintenance then use `scheduled`.","items":{"$ref":"#/components/schemas/IncidentActivity"}},"url":{"readOnly":true,"type":"string","description":"URL to the incident"},"translations":{"description":"A translations object. For example:\n```json\n{\n  \"en\": { \"title\": \"English Title\" },\n  \"es\": { \"title\": \"Spanish Title\" }\n}\n```\n","type":"object","additionalProperties":true,"properties":{"[lang]":{"description":"e.g. `en`.","type":"object","properties":{"title":{"type":"string"}}}}},"notify":{"type":"boolean","description":"Notify subscribers when creating an incident with `type` `major` or `minor`."},"maintenance_notify":{"type":"boolean","description":"Notify subscribers when creating an incident (maintenance) with `type` `scheduled`."},"maintenance_notify_settings":{"$ref":"#/components/schemas/MaintenanceNotifySettings"},"affects_uptime":{"readOnly":true,"description":"It's a boolean if the incident affects uptime.","type":"boolean"}}},"IncidentType":{"type":"string","description":"The type of the (current) incident:\n * `minor` - A minor incident is currently taking place.\n * `major` - A major incident is currently taking place.\n * `scheduled` - A scheduled maintenance is currently taking place.\n","enum":["major","minor","scheduled"]},"IncidentActivity":{"type":"object","description":"Communicates an update of an incident, the special type `resolved` will close an incident.","required":["type","description"],"properties":{"id":{"type":"integer","description":"ID of the record","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},"posted_at":{"type":"string","description":"Editable datetime at which the record was posted","format":"date-time"},"type":{"type":"string","description":"The type of an incident update:\n * `investigating` - Investigating.\n * `issue` - Issue.\n * `monitoring` - Monitoring.\n * `resolved` - Resolved will close the associated incident by settings its `ends_at` to the current time.\n * `scheduled` - Scheduled Maintenance's first update shall have this type.\n * `essential` - Essential Maintenance's first update shall have this type.\n * `retroactive` - Retroactive.\n * `update` - Standard update on an incident.\n * `escalate` - Escalate will switch the incident type from `minor` to `major`.\n * `deescalate` - De-escalate will switch the incident type from `major` to `minor`.\n * `postmortem` - A Post-mortem update.\n"},"description":{"type":"string","description":"The provided update description (accepts Markdown format)"},"description_html":{"type":"string","readOnly":true,"description":"The provided update description rendered in HTML"},"translations":{"description":"A translations object. For example:\n```json\n{\n  \"en\": { \"description\": \"English description\" },\n  \"es\": { \"description\": \"Spanish description\" }\n}\n```\n","type":"object","additionalProperties":true,"properties":{"[lang]":{"description":"e.g. `en`.","type":"object","properties":{"description":{"type":"string"}}}}},"notify":{"type":"boolean","description":"Should your subscribers be notified about this update?","writeOnly":true},"subscribers_notified_at":{"type":"string","description":"Datetime at which subscribers were notified for this update","format":"date-time","readOnly":true},"tweet":{"type":"boolean","description":"Tweet this update with your configured Twitter account?"}}},"MaintenanceNotifySettings":{"type":"object","description":"> ### Configure this field only if the `type` is set to `scheduled`. To take effect, the `maintenance_notify` must be set to `true`.\nOverrides the status page auto maintenance notification settings for this specific maintenance.\n","properties":{"before_notice_minutes":{"type":"integer","description":"The number of minutes to notify the subscribers before the maintenance start.\n* `-1` - Immediately\n* `0` - Never\n* Positive integer (`4320`, `5760`, `10080`, ...) - Before the maintenance start minutes\n"},"second_before_notice_minutes":{"type":"integer","description":"The number of minutes to notify the subscribers the second time before the maintenance start. It needs to be after the first \"before maintenance start\" notice.\n* `0` - Never\n* Positive integer (`720`, `1440`, `2880`, ...) - Before the maintenance start minutes\n"},"on_start":{"type":"boolean","description":"Notify subscribers when the maintenance starts."},"on_end":{"type":"boolean","description":"Notify subscribers when the maintenance ends."}}},"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":{"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"}}}}}}}
````

## POST /status\_pages/{subdomain}/incidents

> Adds a new incident associated to one or more services

````json
{"openapi":"3.0.1","info":{"title":"StatusPal API Reference","version":"2.0.0"},"tags":[{"name":"Incidents","description":"Incidents endpoints"}],"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":{"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":{"IncidentObj":{"type":"object","properties":{"incident":{"$ref":"#/components/schemas/Incident"}}},"Incident":{"type":"object","description":"An incident, either major, minor or a scheduled maintenance","required":["service_ids","type","updates","title"],"properties":{"id":{"type":"integer","description":"ID of the record","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},"title":{"type":"string","description":"The title of the incident"},"starts_at":{"type":"string","description":"The time at which the incident/maintenance started/will start.","format":"date-time"},"ends_at":{"type":"string","description":"The time at which the incident/maintenance ended/will end.","format":"date-time"},"type":{"$ref":"#/components/schemas/IncidentType"},"service_ids":{"type":"array","description":"An array of service Ids, at least 1 must be included","items":{"type":"integer"}},"updates":{"type":"array","description":"The incident's updates. On incident creation you must pass exactly one update object in the array, if the incident is of type minor/major the update type `issue` is recommended, if a scheduled maintenance then use `scheduled`.","items":{"$ref":"#/components/schemas/IncidentActivity"}},"url":{"readOnly":true,"type":"string","description":"URL to the incident"},"translations":{"description":"A translations object. For example:\n```json\n{\n  \"en\": { \"title\": \"English Title\" },\n  \"es\": { \"title\": \"Spanish Title\" }\n}\n```\n","type":"object","additionalProperties":true,"properties":{"[lang]":{"description":"e.g. `en`.","type":"object","properties":{"title":{"type":"string"}}}}},"notify":{"type":"boolean","description":"Notify subscribers when creating an incident with `type` `major` or `minor`."},"maintenance_notify":{"type":"boolean","description":"Notify subscribers when creating an incident (maintenance) with `type` `scheduled`."},"maintenance_notify_settings":{"$ref":"#/components/schemas/MaintenanceNotifySettings"},"affects_uptime":{"readOnly":true,"description":"It's a boolean if the incident affects uptime.","type":"boolean"}}},"IncidentType":{"type":"string","description":"The type of the (current) incident:\n * `minor` - A minor incident is currently taking place.\n * `major` - A major incident is currently taking place.\n * `scheduled` - A scheduled maintenance is currently taking place.\n","enum":["major","minor","scheduled"]},"IncidentActivity":{"type":"object","description":"Communicates an update of an incident, the special type `resolved` will close an incident.","required":["type","description"],"properties":{"id":{"type":"integer","description":"ID of the record","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},"posted_at":{"type":"string","description":"Editable datetime at which the record was posted","format":"date-time"},"type":{"type":"string","description":"The type of an incident update:\n * `investigating` - Investigating.\n * `issue` - Issue.\n * `monitoring` - Monitoring.\n * `resolved` - Resolved will close the associated incident by settings its `ends_at` to the current time.\n * `scheduled` - Scheduled Maintenance's first update shall have this type.\n * `essential` - Essential Maintenance's first update shall have this type.\n * `retroactive` - Retroactive.\n * `update` - Standard update on an incident.\n * `escalate` - Escalate will switch the incident type from `minor` to `major`.\n * `deescalate` - De-escalate will switch the incident type from `major` to `minor`.\n * `postmortem` - A Post-mortem update.\n"},"description":{"type":"string","description":"The provided update description (accepts Markdown format)"},"description_html":{"type":"string","readOnly":true,"description":"The provided update description rendered in HTML"},"translations":{"description":"A translations object. For example:\n```json\n{\n  \"en\": { \"description\": \"English description\" },\n  \"es\": { \"description\": \"Spanish description\" }\n}\n```\n","type":"object","additionalProperties":true,"properties":{"[lang]":{"description":"e.g. `en`.","type":"object","properties":{"description":{"type":"string"}}}}},"notify":{"type":"boolean","description":"Should your subscribers be notified about this update?","writeOnly":true},"subscribers_notified_at":{"type":"string","description":"Datetime at which subscribers were notified for this update","format":"date-time","readOnly":true},"tweet":{"type":"boolean","description":"Tweet this update with your configured Twitter account?"}}},"MaintenanceNotifySettings":{"type":"object","description":"> ### Configure this field only if the `type` is set to `scheduled`. To take effect, the `maintenance_notify` must be set to `true`.\nOverrides the status page auto maintenance notification settings for this specific maintenance.\n","properties":{"before_notice_minutes":{"type":"integer","description":"The number of minutes to notify the subscribers before the maintenance start.\n* `-1` - Immediately\n* `0` - Never\n* Positive integer (`4320`, `5760`, `10080`, ...) - Before the maintenance start minutes\n"},"second_before_notice_minutes":{"type":"integer","description":"The number of minutes to notify the subscribers the second time before the maintenance start. It needs to be after the first \"before maintenance start\" notice.\n* `0` - Never\n* Positive integer (`720`, `1440`, `2880`, ...) - Before the maintenance start minutes\n"},"on_start":{"type":"boolean","description":"Notify subscribers when the maintenance starts."},"on_end":{"type":"boolean","description":"Notify subscribers when the maintenance ends."}}},"BadRequestError":{"type":"object","properties":{"error":{"type":"string","description":"Bad request!"}}},"UnauthorizedError":{"type":"object","properties":{"error":{"type":"integer","description":"Unauthorized"}}},"ValidationError":{"type":"object","properties":{"errors":{"type":"object","description":"A dictionary where each key contains the name of a field with a validation error and the value an array with the validation errors"}}},"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"}}}},"ValidationError":{"description":"There was a validation error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ValidationError"}}}},"ServerError":{"description":"Unexpected error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerError"}}}}}},"paths":{"/status_pages/{subdomain}/incidents":{"post":{"tags":["Incidents"],"summary":"Adds a new incident associated to one or more services","operationId":"addIncident","parameters":[{"$ref":"#/components/parameters/StatusPageSubdomain"}],"requestBody":{"description":"The incident","content":{"application/json":{"schema":{"$ref":"#/components/schemas/IncidentObj"}}},"required":true},"responses":{"200":{"description":"The incident was created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/IncidentObj"}}}},"400":{"$ref":"#/components/responses/BadRequestError"},"401":{"$ref":"#/components/responses/UnauthorizedError"},"422":{"$ref":"#/components/responses/ValidationError"},"500":{"$ref":"#/components/responses/ServerError"}}}}}}
````

## GET /status\_pages/{subdomain}/incidents/{incidentId}

> Get an incident

````json
{"openapi":"3.0.1","info":{"title":"StatusPal API Reference","version":"2.0.0"},"tags":[{"name":"Incidents","description":"Incidents endpoints"}],"servers":[{"url":"https://statuspal.io/api/v2"},{"url":"https://statuspal.eu/api/v2"}],"security":[],"paths":{"/status_pages/{subdomain}/incidents/{incidentId}":{"get":{"tags":["Incidents"],"summary":"Get an incident","operationId":"getIncident","parameters":[{"$ref":"#/components/parameters/StatusPageSubdomain"},{"$ref":"#/components/parameters/IncidentId"}],"responses":{"200":{"description":"Incident object","content":{"application/json":{"schema":{"$ref":"#/components/schemas/IncidentObj"}}}},"403":{"$ref":"#/components/responses/ForbiddenError"},"404":{"$ref":"#/components/responses/NotFoundError"},"500":{"$ref":"#/components/responses/ServerError"}}}}},"components":{"parameters":{"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"}},"IncidentId":{"name":"incidentId","in":"path","description":"The ID of an incident/maintenance","required":true,"schema":{"type":"integer"}}},"schemas":{"IncidentObj":{"type":"object","properties":{"incident":{"$ref":"#/components/schemas/Incident"}}},"Incident":{"type":"object","description":"An incident, either major, minor or a scheduled maintenance","required":["service_ids","type","updates","title"],"properties":{"id":{"type":"integer","description":"ID of the record","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},"title":{"type":"string","description":"The title of the incident"},"starts_at":{"type":"string","description":"The time at which the incident/maintenance started/will start.","format":"date-time"},"ends_at":{"type":"string","description":"The time at which the incident/maintenance ended/will end.","format":"date-time"},"type":{"$ref":"#/components/schemas/IncidentType"},"service_ids":{"type":"array","description":"An array of service Ids, at least 1 must be included","items":{"type":"integer"}},"updates":{"type":"array","description":"The incident's updates. On incident creation you must pass exactly one update object in the array, if the incident is of type minor/major the update type `issue` is recommended, if a scheduled maintenance then use `scheduled`.","items":{"$ref":"#/components/schemas/IncidentActivity"}},"url":{"readOnly":true,"type":"string","description":"URL to the incident"},"translations":{"description":"A translations object. For example:\n```json\n{\n  \"en\": { \"title\": \"English Title\" },\n  \"es\": { \"title\": \"Spanish Title\" }\n}\n```\n","type":"object","additionalProperties":true,"properties":{"[lang]":{"description":"e.g. `en`.","type":"object","properties":{"title":{"type":"string"}}}}},"notify":{"type":"boolean","description":"Notify subscribers when creating an incident with `type` `major` or `minor`."},"maintenance_notify":{"type":"boolean","description":"Notify subscribers when creating an incident (maintenance) with `type` `scheduled`."},"maintenance_notify_settings":{"$ref":"#/components/schemas/MaintenanceNotifySettings"},"affects_uptime":{"readOnly":true,"description":"It's a boolean if the incident affects uptime.","type":"boolean"}}},"IncidentType":{"type":"string","description":"The type of the (current) incident:\n * `minor` - A minor incident is currently taking place.\n * `major` - A major incident is currently taking place.\n * `scheduled` - A scheduled maintenance is currently taking place.\n","enum":["major","minor","scheduled"]},"IncidentActivity":{"type":"object","description":"Communicates an update of an incident, the special type `resolved` will close an incident.","required":["type","description"],"properties":{"id":{"type":"integer","description":"ID of the record","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},"posted_at":{"type":"string","description":"Editable datetime at which the record was posted","format":"date-time"},"type":{"type":"string","description":"The type of an incident update:\n * `investigating` - Investigating.\n * `issue` - Issue.\n * `monitoring` - Monitoring.\n * `resolved` - Resolved will close the associated incident by settings its `ends_at` to the current time.\n * `scheduled` - Scheduled Maintenance's first update shall have this type.\n * `essential` - Essential Maintenance's first update shall have this type.\n * `retroactive` - Retroactive.\n * `update` - Standard update on an incident.\n * `escalate` - Escalate will switch the incident type from `minor` to `major`.\n * `deescalate` - De-escalate will switch the incident type from `major` to `minor`.\n * `postmortem` - A Post-mortem update.\n"},"description":{"type":"string","description":"The provided update description (accepts Markdown format)"},"description_html":{"type":"string","readOnly":true,"description":"The provided update description rendered in HTML"},"translations":{"description":"A translations object. For example:\n```json\n{\n  \"en\": { \"description\": \"English description\" },\n  \"es\": { \"description\": \"Spanish description\" }\n}\n```\n","type":"object","additionalProperties":true,"properties":{"[lang]":{"description":"e.g. `en`.","type":"object","properties":{"description":{"type":"string"}}}}},"notify":{"type":"boolean","description":"Should your subscribers be notified about this update?","writeOnly":true},"subscribers_notified_at":{"type":"string","description":"Datetime at which subscribers were notified for this update","format":"date-time","readOnly":true},"tweet":{"type":"boolean","description":"Tweet this update with your configured Twitter account?"}}},"MaintenanceNotifySettings":{"type":"object","description":"> ### Configure this field only if the `type` is set to `scheduled`. To take effect, the `maintenance_notify` must be set to `true`.\nOverrides the status page auto maintenance notification settings for this specific maintenance.\n","properties":{"before_notice_minutes":{"type":"integer","description":"The number of minutes to notify the subscribers before the maintenance start.\n* `-1` - Immediately\n* `0` - Never\n* Positive integer (`4320`, `5760`, `10080`, ...) - Before the maintenance start minutes\n"},"second_before_notice_minutes":{"type":"integer","description":"The number of minutes to notify the subscribers the second time before the maintenance start. It needs to be after the first \"before maintenance start\" notice.\n* `0` - Never\n* Positive integer (`720`, `1440`, `2880`, ...) - Before the maintenance start minutes\n"},"on_start":{"type":"boolean","description":"Notify subscribers when the maintenance starts."},"on_end":{"type":"boolean","description":"Notify subscribers when the maintenance ends."}}},"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":{"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"}}}}}}}
````

## PUT /status\_pages/{subdomain}/incidents/{incidentId}

> Updates existing incident

````json
{"openapi":"3.0.1","info":{"title":"StatusPal API Reference","version":"2.0.0"},"tags":[{"name":"Incidents","description":"Incidents endpoints"}],"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":{"IncidentId":{"name":"incidentId","in":"path","description":"The ID of an incident/maintenance","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":{"IncidentObj":{"type":"object","properties":{"incident":{"$ref":"#/components/schemas/Incident"}}},"Incident":{"type":"object","description":"An incident, either major, minor or a scheduled maintenance","required":["service_ids","type","updates","title"],"properties":{"id":{"type":"integer","description":"ID of the record","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},"title":{"type":"string","description":"The title of the incident"},"starts_at":{"type":"string","description":"The time at which the incident/maintenance started/will start.","format":"date-time"},"ends_at":{"type":"string","description":"The time at which the incident/maintenance ended/will end.","format":"date-time"},"type":{"$ref":"#/components/schemas/IncidentType"},"service_ids":{"type":"array","description":"An array of service Ids, at least 1 must be included","items":{"type":"integer"}},"updates":{"type":"array","description":"The incident's updates. On incident creation you must pass exactly one update object in the array, if the incident is of type minor/major the update type `issue` is recommended, if a scheduled maintenance then use `scheduled`.","items":{"$ref":"#/components/schemas/IncidentActivity"}},"url":{"readOnly":true,"type":"string","description":"URL to the incident"},"translations":{"description":"A translations object. For example:\n```json\n{\n  \"en\": { \"title\": \"English Title\" },\n  \"es\": { \"title\": \"Spanish Title\" }\n}\n```\n","type":"object","additionalProperties":true,"properties":{"[lang]":{"description":"e.g. `en`.","type":"object","properties":{"title":{"type":"string"}}}}},"notify":{"type":"boolean","description":"Notify subscribers when creating an incident with `type` `major` or `minor`."},"maintenance_notify":{"type":"boolean","description":"Notify subscribers when creating an incident (maintenance) with `type` `scheduled`."},"maintenance_notify_settings":{"$ref":"#/components/schemas/MaintenanceNotifySettings"},"affects_uptime":{"readOnly":true,"description":"It's a boolean if the incident affects uptime.","type":"boolean"}}},"IncidentType":{"type":"string","description":"The type of the (current) incident:\n * `minor` - A minor incident is currently taking place.\n * `major` - A major incident is currently taking place.\n * `scheduled` - A scheduled maintenance is currently taking place.\n","enum":["major","minor","scheduled"]},"IncidentActivity":{"type":"object","description":"Communicates an update of an incident, the special type `resolved` will close an incident.","required":["type","description"],"properties":{"id":{"type":"integer","description":"ID of the record","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},"posted_at":{"type":"string","description":"Editable datetime at which the record was posted","format":"date-time"},"type":{"type":"string","description":"The type of an incident update:\n * `investigating` - Investigating.\n * `issue` - Issue.\n * `monitoring` - Monitoring.\n * `resolved` - Resolved will close the associated incident by settings its `ends_at` to the current time.\n * `scheduled` - Scheduled Maintenance's first update shall have this type.\n * `essential` - Essential Maintenance's first update shall have this type.\n * `retroactive` - Retroactive.\n * `update` - Standard update on an incident.\n * `escalate` - Escalate will switch the incident type from `minor` to `major`.\n * `deescalate` - De-escalate will switch the incident type from `major` to `minor`.\n * `postmortem` - A Post-mortem update.\n"},"description":{"type":"string","description":"The provided update description (accepts Markdown format)"},"description_html":{"type":"string","readOnly":true,"description":"The provided update description rendered in HTML"},"translations":{"description":"A translations object. For example:\n```json\n{\n  \"en\": { \"description\": \"English description\" },\n  \"es\": { \"description\": \"Spanish description\" }\n}\n```\n","type":"object","additionalProperties":true,"properties":{"[lang]":{"description":"e.g. `en`.","type":"object","properties":{"description":{"type":"string"}}}}},"notify":{"type":"boolean","description":"Should your subscribers be notified about this update?","writeOnly":true},"subscribers_notified_at":{"type":"string","description":"Datetime at which subscribers were notified for this update","format":"date-time","readOnly":true},"tweet":{"type":"boolean","description":"Tweet this update with your configured Twitter account?"}}},"MaintenanceNotifySettings":{"type":"object","description":"> ### Configure this field only if the `type` is set to `scheduled`. To take effect, the `maintenance_notify` must be set to `true`.\nOverrides the status page auto maintenance notification settings for this specific maintenance.\n","properties":{"before_notice_minutes":{"type":"integer","description":"The number of minutes to notify the subscribers before the maintenance start.\n* `-1` - Immediately\n* `0` - Never\n* Positive integer (`4320`, `5760`, `10080`, ...) - Before the maintenance start minutes\n"},"second_before_notice_minutes":{"type":"integer","description":"The number of minutes to notify the subscribers the second time before the maintenance start. It needs to be after the first \"before maintenance start\" notice.\n* `0` - Never\n* Positive integer (`720`, `1440`, `2880`, ...) - Before the maintenance start minutes\n"},"on_start":{"type":"boolean","description":"Notify subscribers when the maintenance starts."},"on_end":{"type":"boolean","description":"Notify subscribers when the maintenance ends."}}},"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!"}}},"ValidationError":{"type":"object","properties":{"errors":{"type":"object","description":"A dictionary where each key contains the name of a field with a validation error and the value an array with the validation errors"}}},"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"}}}},"ValidationError":{"description":"There was a validation error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ValidationError"}}}},"ServerError":{"description":"Unexpected error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerError"}}}}}},"paths":{"/status_pages/{subdomain}/incidents/{incidentId}":{"put":{"tags":["Incidents"],"summary":"Updates existing incident","operationId":"updateIncident","parameters":[{"$ref":"#/components/parameters/IncidentId"},{"$ref":"#/components/parameters/StatusPageSubdomain"}],"requestBody":{"description":"The incident","content":{"application/json":{"schema":{"$ref":"#/components/schemas/IncidentObj"}}},"required":true},"responses":{"200":{"description":"The incident was updated","content":{"application/json":{"schema":{"$ref":"#/components/schemas/IncidentObj"}}}},"400":{"$ref":"#/components/responses/BadRequestError"},"401":{"$ref":"#/components/responses/UnauthorizedError"},"403":{"$ref":"#/components/responses/ForbiddenError"},"404":{"$ref":"#/components/responses/NotFoundError"},"422":{"$ref":"#/components/responses/ValidationError"},"500":{"$ref":"#/components/responses/ServerError"}}}}}}
````

## DELETE /status\_pages/{subdomain}/incidents/{incidentId}

> Deletes incident permanently

```json
{"openapi":"3.0.1","info":{"title":"StatusPal API Reference","version":"2.0.0"},"tags":[{"name":"Incidents","description":"Incidents endpoints"}],"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":{"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"}},"IncidentId":{"name":"incidentId","in":"path","description":"The ID of an incident/maintenance","required":true,"schema":{"type":"integer"}}},"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":{"/status_pages/{subdomain}/incidents/{incidentId}":{"delete":{"tags":["Incidents"],"summary":"Deletes incident permanently","operationId":"deleteIncident","parameters":[{"$ref":"#/components/parameters/StatusPageSubdomain"},{"$ref":"#/components/parameters/IncidentId"}],"responses":{"200":{"description":"Incident deleted successfully","content":{}},"401":{"$ref":"#/components/responses/UnauthorizedError"},"403":{"$ref":"#/components/responses/ForbiddenError"},"404":{"$ref":"#/components/responses/NotFoundError"},"500":{"$ref":"#/components/responses/ServerError"}}}}}}
```


# Incident Updates

Incident Updates endpoints

## POST /status\_pages/{subdomain}/incidents/{incidentId}/updates

> Adds a new update to the given incident

````json
{"openapi":"3.0.1","info":{"title":"StatusPal API Reference","version":"2.0.0"},"tags":[{"name":"Incident Updates","description":"Incident Updates endpoints"}],"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":{"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"}},"IncidentId":{"name":"incidentId","in":"path","description":"The ID of an incident/maintenance","required":true,"schema":{"type":"integer"}}},"schemas":{"IncidentActivityObj":{"type":"object","properties":{"update":{"$ref":"#/components/schemas/IncidentActivity"}}},"IncidentActivity":{"type":"object","description":"Communicates an update of an incident, the special type `resolved` will close an incident.","required":["type","description"],"properties":{"id":{"type":"integer","description":"ID of the record","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},"posted_at":{"type":"string","description":"Editable datetime at which the record was posted","format":"date-time"},"type":{"type":"string","description":"The type of an incident update:\n * `investigating` - Investigating.\n * `issue` - Issue.\n * `monitoring` - Monitoring.\n * `resolved` - Resolved will close the associated incident by settings its `ends_at` to the current time.\n * `scheduled` - Scheduled Maintenance's first update shall have this type.\n * `essential` - Essential Maintenance's first update shall have this type.\n * `retroactive` - Retroactive.\n * `update` - Standard update on an incident.\n * `escalate` - Escalate will switch the incident type from `minor` to `major`.\n * `deescalate` - De-escalate will switch the incident type from `major` to `minor`.\n * `postmortem` - A Post-mortem update.\n"},"description":{"type":"string","description":"The provided update description (accepts Markdown format)"},"description_html":{"type":"string","readOnly":true,"description":"The provided update description rendered in HTML"},"translations":{"description":"A translations object. For example:\n```json\n{\n  \"en\": { \"description\": \"English description\" },\n  \"es\": { \"description\": \"Spanish description\" }\n}\n```\n","type":"object","additionalProperties":true,"properties":{"[lang]":{"description":"e.g. `en`.","type":"object","properties":{"description":{"type":"string"}}}}},"notify":{"type":"boolean","description":"Should your subscribers be notified about this update?","writeOnly":true},"subscribers_notified_at":{"type":"string","description":"Datetime at which subscribers were notified for this update","format":"date-time","readOnly":true},"tweet":{"type":"boolean","description":"Tweet this update with your configured Twitter account?"}}},"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!"}}},"ValidationError":{"type":"object","properties":{"errors":{"type":"object","description":"A dictionary where each key contains the name of a field with a validation error and the value an array with the validation errors"}}},"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"}}}},"ValidationError":{"description":"There was a validation error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ValidationError"}}}},"ServerError":{"description":"Unexpected error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerError"}}}}}},"paths":{"/status_pages/{subdomain}/incidents/{incidentId}/updates":{"post":{"tags":["Incident Updates"],"summary":"Adds a new update to the given incident","operationId":"addActivity","parameters":[{"$ref":"#/components/parameters/StatusPageSubdomain"},{"$ref":"#/components/parameters/IncidentId"}],"requestBody":{"description":"The update","content":{"application/json":{"schema":{"$ref":"#/components/schemas/IncidentActivityObj"}}},"required":true},"responses":{"200":{"description":"The update was created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/IncidentActivityObj"}}}},"400":{"$ref":"#/components/responses/BadRequestError"},"401":{"$ref":"#/components/responses/UnauthorizedError"},"403":{"$ref":"#/components/responses/ForbiddenError"},"404":{"$ref":"#/components/responses/NotFoundError"},"422":{"$ref":"#/components/responses/ValidationError"},"500":{"$ref":"#/components/responses/ServerError"}}}}}}
````

## PUT /status\_pages/{subdomain}/incidents/{incidentId}/updates/{updateId}

> Updates an incident update

````json
{"openapi":"3.0.1","info":{"title":"StatusPal API Reference","version":"2.0.0"},"tags":[{"name":"Incident Updates","description":"Incident Updates endpoints"}],"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":{"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"}},"IncidentId":{"name":"incidentId","in":"path","description":"The ID of an incident/maintenance","required":true,"schema":{"type":"integer"}},"IncidentActivityId":{"name":"updateId","in":"path","required":true,"schema":{"type":"integer"}}},"schemas":{"IncidentActivityObj":{"type":"object","properties":{"update":{"$ref":"#/components/schemas/IncidentActivity"}}},"IncidentActivity":{"type":"object","description":"Communicates an update of an incident, the special type `resolved` will close an incident.","required":["type","description"],"properties":{"id":{"type":"integer","description":"ID of the record","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},"posted_at":{"type":"string","description":"Editable datetime at which the record was posted","format":"date-time"},"type":{"type":"string","description":"The type of an incident update:\n * `investigating` - Investigating.\n * `issue` - Issue.\n * `monitoring` - Monitoring.\n * `resolved` - Resolved will close the associated incident by settings its `ends_at` to the current time.\n * `scheduled` - Scheduled Maintenance's first update shall have this type.\n * `essential` - Essential Maintenance's first update shall have this type.\n * `retroactive` - Retroactive.\n * `update` - Standard update on an incident.\n * `escalate` - Escalate will switch the incident type from `minor` to `major`.\n * `deescalate` - De-escalate will switch the incident type from `major` to `minor`.\n * `postmortem` - A Post-mortem update.\n"},"description":{"type":"string","description":"The provided update description (accepts Markdown format)"},"description_html":{"type":"string","readOnly":true,"description":"The provided update description rendered in HTML"},"translations":{"description":"A translations object. For example:\n```json\n{\n  \"en\": { \"description\": \"English description\" },\n  \"es\": { \"description\": \"Spanish description\" }\n}\n```\n","type":"object","additionalProperties":true,"properties":{"[lang]":{"description":"e.g. `en`.","type":"object","properties":{"description":{"type":"string"}}}}},"notify":{"type":"boolean","description":"Should your subscribers be notified about this update?","writeOnly":true},"subscribers_notified_at":{"type":"string","description":"Datetime at which subscribers were notified for this update","format":"date-time","readOnly":true},"tweet":{"type":"boolean","description":"Tweet this update with your configured Twitter account?"}}},"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!"}}},"ValidationError":{"type":"object","properties":{"errors":{"type":"object","description":"A dictionary where each key contains the name of a field with a validation error and the value an array with the validation errors"}}},"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"}}}},"ValidationError":{"description":"There was a validation error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ValidationError"}}}},"ServerError":{"description":"Unexpected error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerError"}}}}}},"paths":{"/status_pages/{subdomain}/incidents/{incidentId}/updates/{updateId}":{"put":{"tags":["Incident Updates"],"summary":"Updates an incident update","operationId":"updateActivity","parameters":[{"$ref":"#/components/parameters/StatusPageSubdomain"},{"$ref":"#/components/parameters/IncidentId"},{"$ref":"#/components/parameters/IncidentActivityId"}],"requestBody":{"description":"The update","content":{"application/json":{"schema":{"$ref":"#/components/schemas/IncidentActivityObj"}}},"required":true},"responses":{"200":{"description":"The incident update was updated","content":{"application/json":{"schema":{"$ref":"#/components/schemas/IncidentActivityObj"}}}},"400":{"$ref":"#/components/responses/BadRequestError"},"401":{"$ref":"#/components/responses/UnauthorizedError"},"403":{"$ref":"#/components/responses/ForbiddenError"},"404":{"$ref":"#/components/responses/NotFoundError"},"422":{"$ref":"#/components/responses/ValidationError"},"500":{"$ref":"#/components/responses/ServerError"}}}}}}
````

## DELETE /status\_pages/{subdomain}/incidents/{incidentId}/updates/{updateId}

> Deletes incident update permanently

```json
{"openapi":"3.0.1","info":{"title":"StatusPal API Reference","version":"2.0.0"},"tags":[{"name":"Incident Updates","description":"Incident Updates endpoints"}],"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":{"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"}},"IncidentId":{"name":"incidentId","in":"path","description":"The ID of an incident/maintenance","required":true,"schema":{"type":"integer"}},"IncidentActivityId":{"name":"updateId","in":"path","required":true,"schema":{"type":"integer"}}},"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":{"/status_pages/{subdomain}/incidents/{incidentId}/updates/{updateId}":{"delete":{"tags":["Incident Updates"],"summary":"Deletes incident update permanently","operationId":"deleteIncidentActivity","parameters":[{"$ref":"#/components/parameters/StatusPageSubdomain"},{"$ref":"#/components/parameters/IncidentId"},{"$ref":"#/components/parameters/IncidentActivityId"}],"responses":{"200":{"description":"Activity deleted successfully","content":{}},"401":{"$ref":"#/components/responses/UnauthorizedError"},"403":{"$ref":"#/components/responses/ForbiddenError"},"404":{"$ref":"#/components/responses/NotFoundError"},"500":{"$ref":"#/components/responses/ServerError"}}}}}}
```


# Incident Templates

Incident Templates endpoints

## GET /status\_pages/{subdomain}/incident\_templates

> Get the incident templates

````json
{"openapi":"3.0.1","info":{"title":"StatusPal API Reference","version":"2.0.0"},"tags":[{"name":"Incident Templates","description":"Incident Templates endpoints"}],"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":{"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":{"IncidentTemplate":{"description":"Represents the incident template.","type":"object","required":["title","description"],"properties":{"id":{"type":"integer","readOnly":true,"description":"The ID of the incident template."},"name":{"type":"string","nullable":true,"description":"The template's own name/label as shown in the dashboard. This is separate from `title`, which is the incident title the template produces when applied. Blank or whitespace-only values are stored as null."},"title":{"type":"string","description":"The title of the incident template."},"description":{"type":"string","description":"The description of the incident template."},"service_ids":{"type":"array","description":"An array of service Ids.","items":{"type":"integer"}},"incident_types":{"type":"array","description":"An array of incident type keys. If set, the incident template will only work with the given incident types.","items":{"type":"string"}},"translations":{"description":"A translations object. For example:\n```json\n{\n  \"en\": { \"title\": \"English title\", \"description\": \"English description\" },\n  \"es\": { \"title\": \"Spanish title\", \"description\": \"Spanish description\" }\n}\n```\n","type":"object","additionalProperties":true,"properties":{"[lang]":{"description":"e.g. `en`.","type":"object","properties":{"title":{"type":"string"},"description":{"type":"string"}}}}}}},"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":{"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":{"/status_pages/{subdomain}/incident_templates":{"get":{"tags":["Incident Templates"],"summary":"Get the incident templates","operationId":"getIncidentTemplates","parameters":[{"$ref":"#/components/parameters/StatusPageSubdomain"}],"responses":{"200":{"description":"A status page's incident templates","content":{"application/json":{"schema":{"type":"object","properties":{"incident_templates":{"type":"array","items":{"$ref":"#/components/schemas/IncidentTemplate"}}}}}}},"401":{"$ref":"#/components/responses/UnauthorizedError"},"403":{"$ref":"#/components/responses/ForbiddenError"},"404":{"$ref":"#/components/responses/NotFoundError"},"500":{"$ref":"#/components/responses/ServerError"}}}}}}
````

## POST /status\_pages/{subdomain}/incident\_templates

> Adds a new incident template

````json
{"openapi":"3.0.1","info":{"title":"StatusPal API Reference","version":"2.0.0"},"tags":[{"name":"Incident Templates","description":"Incident Templates endpoints"}],"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":{"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":{"IncidentTemplateObj":{"type":"object","properties":{"incident_template":{"$ref":"#/components/schemas/IncidentTemplate"}}},"IncidentTemplate":{"description":"Represents the incident template.","type":"object","required":["title","description"],"properties":{"id":{"type":"integer","readOnly":true,"description":"The ID of the incident template."},"name":{"type":"string","nullable":true,"description":"The template's own name/label as shown in the dashboard. This is separate from `title`, which is the incident title the template produces when applied. Blank or whitespace-only values are stored as null."},"title":{"type":"string","description":"The title of the incident template."},"description":{"type":"string","description":"The description of the incident template."},"service_ids":{"type":"array","description":"An array of service Ids.","items":{"type":"integer"}},"incident_types":{"type":"array","description":"An array of incident type keys. If set, the incident template will only work with the given incident types.","items":{"type":"string"}},"translations":{"description":"A translations object. For example:\n```json\n{\n  \"en\": { \"title\": \"English title\", \"description\": \"English description\" },\n  \"es\": { \"title\": \"Spanish title\", \"description\": \"Spanish description\" }\n}\n```\n","type":"object","additionalProperties":true,"properties":{"[lang]":{"description":"e.g. `en`.","type":"object","properties":{"title":{"type":"string"},"description":{"type":"string"}}}}}}},"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!"}}},"ValidationError":{"type":"object","properties":{"errors":{"type":"object","description":"A dictionary where each key contains the name of a field with a validation error and the value an array with the validation errors"}}},"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"}}}},"ValidationError":{"description":"There was a validation error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ValidationError"}}}},"ServerError":{"description":"Unexpected error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerError"}}}}}},"paths":{"/status_pages/{subdomain}/incident_templates":{"post":{"tags":["Incident Templates"],"summary":"Adds a new incident template","operationId":"addIncidentTemplate","parameters":[{"$ref":"#/components/parameters/StatusPageSubdomain"}],"requestBody":{"description":"The incident template","content":{"application/json":{"schema":{"$ref":"#/components/schemas/IncidentTemplateObj"}}},"required":true},"responses":{"201":{"description":"The incident template created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/IncidentTemplateObj"}}}},"400":{"$ref":"#/components/responses/BadRequestError"},"401":{"$ref":"#/components/responses/UnauthorizedError"},"403":{"$ref":"#/components/responses/ForbiddenError"},"404":{"$ref":"#/components/responses/NotFoundError"},"422":{"$ref":"#/components/responses/ValidationError"},"500":{"$ref":"#/components/responses/ServerError"}}}}}}
````

## GET /status\_pages/{subdomain}/incident\_templates/{incidentTemplateId}

> Get incident template against given incident template id

````json
{"openapi":"3.0.1","info":{"title":"StatusPal API Reference","version":"2.0.0"},"tags":[{"name":"Incident Templates","description":"Incident Templates endpoints"}],"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":{"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"}},"IncidentTemplateId":{"name":"incidentTemplateId","in":"path","description":"The ID of an incident template","required":true,"schema":{"type":"integer"}}},"schemas":{"IncidentTemplateObj":{"type":"object","properties":{"incident_template":{"$ref":"#/components/schemas/IncidentTemplate"}}},"IncidentTemplate":{"description":"Represents the incident template.","type":"object","required":["title","description"],"properties":{"id":{"type":"integer","readOnly":true,"description":"The ID of the incident template."},"name":{"type":"string","nullable":true,"description":"The template's own name/label as shown in the dashboard. This is separate from `title`, which is the incident title the template produces when applied. Blank or whitespace-only values are stored as null."},"title":{"type":"string","description":"The title of the incident template."},"description":{"type":"string","description":"The description of the incident template."},"service_ids":{"type":"array","description":"An array of service Ids.","items":{"type":"integer"}},"incident_types":{"type":"array","description":"An array of incident type keys. If set, the incident template will only work with the given incident types.","items":{"type":"string"}},"translations":{"description":"A translations object. For example:\n```json\n{\n  \"en\": { \"title\": \"English title\", \"description\": \"English description\" },\n  \"es\": { \"title\": \"Spanish title\", \"description\": \"Spanish description\" }\n}\n```\n","type":"object","additionalProperties":true,"properties":{"[lang]":{"description":"e.g. `en`.","type":"object","properties":{"title":{"type":"string"},"description":{"type":"string"}}}}}}},"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":{"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":{"/status_pages/{subdomain}/incident_templates/{incidentTemplateId}":{"get":{"operationId":"getIncidentTemplate","summary":"Get incident template against given incident template id","tags":["Incident Templates"],"parameters":[{"$ref":"#/components/parameters/StatusPageSubdomain"},{"$ref":"#/components/parameters/IncidentTemplateId"}],"responses":{"200":{"description":"The incident template details","content":{"application/json":{"schema":{"$ref":"#/components/schemas/IncidentTemplateObj"}}}},"401":{"$ref":"#/components/responses/UnauthorizedError"},"403":{"$ref":"#/components/responses/ForbiddenError"},"404":{"$ref":"#/components/responses/NotFoundError"},"500":{"$ref":"#/components/responses/ServerError"}}}}}}
````

## PUT /status\_pages/{subdomain}/incident\_templates/{incidentTemplateId}

> Updates existing incident template

````json
{"openapi":"3.0.1","info":{"title":"StatusPal API Reference","version":"2.0.0"},"tags":[{"name":"Incident Templates","description":"Incident Templates endpoints"}],"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":{"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"}},"IncidentTemplateId":{"name":"incidentTemplateId","in":"path","description":"The ID of an incident template","required":true,"schema":{"type":"integer"}}},"schemas":{"IncidentTemplateObj":{"type":"object","properties":{"incident_template":{"$ref":"#/components/schemas/IncidentTemplate"}}},"IncidentTemplate":{"description":"Represents the incident template.","type":"object","required":["title","description"],"properties":{"id":{"type":"integer","readOnly":true,"description":"The ID of the incident template."},"name":{"type":"string","nullable":true,"description":"The template's own name/label as shown in the dashboard. This is separate from `title`, which is the incident title the template produces when applied. Blank or whitespace-only values are stored as null."},"title":{"type":"string","description":"The title of the incident template."},"description":{"type":"string","description":"The description of the incident template."},"service_ids":{"type":"array","description":"An array of service Ids.","items":{"type":"integer"}},"incident_types":{"type":"array","description":"An array of incident type keys. If set, the incident template will only work with the given incident types.","items":{"type":"string"}},"translations":{"description":"A translations object. For example:\n```json\n{\n  \"en\": { \"title\": \"English title\", \"description\": \"English description\" },\n  \"es\": { \"title\": \"Spanish title\", \"description\": \"Spanish description\" }\n}\n```\n","type":"object","additionalProperties":true,"properties":{"[lang]":{"description":"e.g. `en`.","type":"object","properties":{"title":{"type":"string"},"description":{"type":"string"}}}}}}},"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!"}}},"ValidationError":{"type":"object","properties":{"errors":{"type":"object","description":"A dictionary where each key contains the name of a field with a validation error and the value an array with the validation errors"}}},"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"}}}},"ValidationError":{"description":"There was a validation error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ValidationError"}}}},"ServerError":{"description":"Unexpected error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerError"}}}}}},"paths":{"/status_pages/{subdomain}/incident_templates/{incidentTemplateId}":{"put":{"tags":["Incident Templates"],"summary":"Updates existing incident template","operationId":"updateIncidentTemplate","parameters":[{"$ref":"#/components/parameters/StatusPageSubdomain"},{"$ref":"#/components/parameters/IncidentTemplateId"}],"requestBody":{"description":"The incident template","content":{"application/json":{"schema":{"$ref":"#/components/schemas/IncidentTemplateObj"}}},"required":true},"responses":{"200":{"description":"The incident template updated","content":{"application/json":{"schema":{"$ref":"#/components/schemas/IncidentTemplateObj"}}}},"400":{"$ref":"#/components/responses/BadRequestError"},"401":{"$ref":"#/components/responses/UnauthorizedError"},"403":{"$ref":"#/components/responses/ForbiddenError"},"404":{"$ref":"#/components/responses/NotFoundError"},"422":{"$ref":"#/components/responses/ValidationError"},"500":{"$ref":"#/components/responses/ServerError"}}}}}}
````

## DELETE /status\_pages/{subdomain}/incident\_templates/{incidentTemplateId}

> Deletes incident template permanently

```json
{"openapi":"3.0.1","info":{"title":"StatusPal API Reference","version":"2.0.0"},"tags":[{"name":"Incident Templates","description":"Incident Templates endpoints"}],"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":{"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"}},"IncidentTemplateId":{"name":"incidentTemplateId","in":"path","description":"The ID of an incident template","required":true,"schema":{"type":"integer"}}},"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":{"/status_pages/{subdomain}/incident_templates/{incidentTemplateId}":{"delete":{"operationId":"deleteIncidentTemplate","summary":"Deletes incident template permanently","tags":["Incident Templates"],"parameters":[{"$ref":"#/components/parameters/StatusPageSubdomain"},{"$ref":"#/components/parameters/IncidentTemplateId"}],"responses":{"200":{"description":"Incident template deleted successfully","content":{}},"401":{"$ref":"#/components/responses/UnauthorizedError"},"403":{"$ref":"#/components/responses/ForbiddenError"},"404":{"$ref":"#/components/responses/NotFoundError"},"500":{"$ref":"#/components/responses/ServerError"}}}}}}
```


# Information Notices

Information Notices endpoints

### Information Notice Updates

These endpoints are the same as Incident Updates endpoints, but it doesn't support the `type` attribute.

## GET /status\_pages/{subdomain}/info\_notices

> Get the list of information notices of a status page

````json
{"openapi":"3.0.1","info":{"title":"StatusPal API Reference","version":"2.0.0"},"tags":[{"name":"Information Notices","description":"Information Notices endpoints\n\n## Information Notice Updates\n\nThese endpoints are the same as [Incident Updates endpoints](/platform/api-reference/incident-updates), but it doesn't support the `type` attribute.\n"}],"servers":[{"url":"https://statuspal.io/api/v2"},{"url":"https://statuspal.eu/api/v2"}],"security":[],"paths":{"/status_pages/{subdomain}/info_notices":{"get":{"tags":["Information Notices"],"summary":"Get the list of information notices of a status page","operationId":"getInfoNotices","parameters":[{"$ref":"#/components/parameters/StatusPageSubdomain"},{"name":"before","in":"query","description":"Used as a cursor for pagination.","schema":{"type":"string"}},{"name":"after","in":"query","description":"Used as a cursor for pagination.","schema":{"type":"string"}},{"name":"limit","in":"query","description":"Set the number of information notices to return in the response.\nThis defaults to 20 items, and can be a maximum of 100.\n","schema":{"type":"integer"}}],"responses":{"200":{"description":"The list of information notices","content":{"application/json":{"schema":{"type":"object","properties":{"info_notices":{"type":"array","items":{"$ref":"#/components/schemas/InfoNotice"}},"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 information notices."}}}}}}}},"403":{"$ref":"#/components/responses/ForbiddenError"},"404":{"$ref":"#/components/responses/NotFoundError"},"500":{"$ref":"#/components/responses/ServerError"}}}}},"components":{"parameters":{"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":{"InfoNotice":{"type":"object","description":"An information notice","required":["updates","title"],"properties":{"id":{"type":"integer","description":"ID of the record","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},"title":{"type":"string","description":"The title of the information notice"},"featured_from":{"type":"string","description":"The time at which the information notice will display on the status page.","format":"date-time"},"featured_until":{"type":"string","description":"The time at which the information notice will not display on the status page.","format":"date-time"},"service_ids":{"type":"array","description":"An array of service Ids, at least 1 must be included","items":{"type":"integer"}},"updates":{"type":"array","description":"The information notice's updates. On information notice creation you must pass exactly one update object in the array.","items":{"$ref":"#/components/schemas/IncidentActivity"}},"url":{"readOnly":true,"type":"string","description":"URL to the information notice"},"translations":{"description":"A translations object. For example:\n```json\n{\n  \"en\": { \"title\": \"English Title\" },\n  \"es\": { \"title\": \"Spanish Title\" }\n}\n```\n","type":"object","additionalProperties":true,"properties":{"[lang]":{"description":"e.g. `en`.","type":"object","properties":{"title":{"type":"string"}}}}}}},"IncidentActivity":{"type":"object","description":"Communicates an update of an incident, the special type `resolved` will close an incident.","required":["type","description"],"properties":{"id":{"type":"integer","description":"ID of the record","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},"posted_at":{"type":"string","description":"Editable datetime at which the record was posted","format":"date-time"},"type":{"type":"string","description":"The type of an incident update:\n * `investigating` - Investigating.\n * `issue` - Issue.\n * `monitoring` - Monitoring.\n * `resolved` - Resolved will close the associated incident by settings its `ends_at` to the current time.\n * `scheduled` - Scheduled Maintenance's first update shall have this type.\n * `essential` - Essential Maintenance's first update shall have this type.\n * `retroactive` - Retroactive.\n * `update` - Standard update on an incident.\n * `escalate` - Escalate will switch the incident type from `minor` to `major`.\n * `deescalate` - De-escalate will switch the incident type from `major` to `minor`.\n * `postmortem` - A Post-mortem update.\n"},"description":{"type":"string","description":"The provided update description (accepts Markdown format)"},"description_html":{"type":"string","readOnly":true,"description":"The provided update description rendered in HTML"},"translations":{"description":"A translations object. For example:\n```json\n{\n  \"en\": { \"description\": \"English description\" },\n  \"es\": { \"description\": \"Spanish description\" }\n}\n```\n","type":"object","additionalProperties":true,"properties":{"[lang]":{"description":"e.g. `en`.","type":"object","properties":{"description":{"type":"string"}}}}},"notify":{"type":"boolean","description":"Should your subscribers be notified about this update?","writeOnly":true},"subscribers_notified_at":{"type":"string","description":"Datetime at which subscribers were notified for this update","format":"date-time","readOnly":true},"tweet":{"type":"boolean","description":"Tweet this update with your configured Twitter account?"}}},"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":{"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"}}}}}}}
````

## POST /status\_pages/{subdomain}/info\_notices

> Adds a new information notice associated to one or more services

````json
{"openapi":"3.0.1","info":{"title":"StatusPal API Reference","version":"2.0.0"},"tags":[{"name":"Information Notices","description":"Information Notices endpoints\n\n## Information Notice Updates\n\nThese endpoints are the same as [Incident Updates endpoints](/platform/api-reference/incident-updates), but it doesn't support the `type` attribute.\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":{"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":{"InfoNoticeObj":{"type":"object","properties":{"info_notice":{"$ref":"#/components/schemas/InfoNotice"}}},"InfoNotice":{"type":"object","description":"An information notice","required":["updates","title"],"properties":{"id":{"type":"integer","description":"ID of the record","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},"title":{"type":"string","description":"The title of the information notice"},"featured_from":{"type":"string","description":"The time at which the information notice will display on the status page.","format":"date-time"},"featured_until":{"type":"string","description":"The time at which the information notice will not display on the status page.","format":"date-time"},"service_ids":{"type":"array","description":"An array of service Ids, at least 1 must be included","items":{"type":"integer"}},"updates":{"type":"array","description":"The information notice's updates. On information notice creation you must pass exactly one update object in the array.","items":{"$ref":"#/components/schemas/IncidentActivity"}},"url":{"readOnly":true,"type":"string","description":"URL to the information notice"},"translations":{"description":"A translations object. For example:\n```json\n{\n  \"en\": { \"title\": \"English Title\" },\n  \"es\": { \"title\": \"Spanish Title\" }\n}\n```\n","type":"object","additionalProperties":true,"properties":{"[lang]":{"description":"e.g. `en`.","type":"object","properties":{"title":{"type":"string"}}}}}}},"IncidentActivity":{"type":"object","description":"Communicates an update of an incident, the special type `resolved` will close an incident.","required":["type","description"],"properties":{"id":{"type":"integer","description":"ID of the record","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},"posted_at":{"type":"string","description":"Editable datetime at which the record was posted","format":"date-time"},"type":{"type":"string","description":"The type of an incident update:\n * `investigating` - Investigating.\n * `issue` - Issue.\n * `monitoring` - Monitoring.\n * `resolved` - Resolved will close the associated incident by settings its `ends_at` to the current time.\n * `scheduled` - Scheduled Maintenance's first update shall have this type.\n * `essential` - Essential Maintenance's first update shall have this type.\n * `retroactive` - Retroactive.\n * `update` - Standard update on an incident.\n * `escalate` - Escalate will switch the incident type from `minor` to `major`.\n * `deescalate` - De-escalate will switch the incident type from `major` to `minor`.\n * `postmortem` - A Post-mortem update.\n"},"description":{"type":"string","description":"The provided update description (accepts Markdown format)"},"description_html":{"type":"string","readOnly":true,"description":"The provided update description rendered in HTML"},"translations":{"description":"A translations object. For example:\n```json\n{\n  \"en\": { \"description\": \"English description\" },\n  \"es\": { \"description\": \"Spanish description\" }\n}\n```\n","type":"object","additionalProperties":true,"properties":{"[lang]":{"description":"e.g. `en`.","type":"object","properties":{"description":{"type":"string"}}}}},"notify":{"type":"boolean","description":"Should your subscribers be notified about this update?","writeOnly":true},"subscribers_notified_at":{"type":"string","description":"Datetime at which subscribers were notified for this update","format":"date-time","readOnly":true},"tweet":{"type":"boolean","description":"Tweet this update with your configured Twitter account?"}}},"BadRequestError":{"type":"object","properties":{"error":{"type":"string","description":"Bad request!"}}},"UnauthorizedError":{"type":"object","properties":{"error":{"type":"integer","description":"Unauthorized"}}},"ValidationError":{"type":"object","properties":{"errors":{"type":"object","description":"A dictionary where each key contains the name of a field with a validation error and the value an array with the validation errors"}}},"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"}}}},"ValidationError":{"description":"There was a validation error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ValidationError"}}}},"ServerError":{"description":"Unexpected error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerError"}}}}}},"paths":{"/status_pages/{subdomain}/info_notices":{"post":{"tags":["Information Notices"],"summary":"Adds a new information notice associated to one or more services","operationId":"addInfoNotice","parameters":[{"$ref":"#/components/parameters/StatusPageSubdomain"}],"requestBody":{"description":"The information notice","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InfoNoticeObj"}}},"required":true},"responses":{"200":{"description":"The information notice was created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InfoNoticeObj"}}}},"400":{"$ref":"#/components/responses/BadRequestError"},"401":{"$ref":"#/components/responses/UnauthorizedError"},"422":{"$ref":"#/components/responses/ValidationError"},"500":{"$ref":"#/components/responses/ServerError"}}}}}}
````

## GET /status\_pages/{subdomain}/info\_notices/{infoNoticeId}

> Get an information notice

````json
{"openapi":"3.0.1","info":{"title":"StatusPal API Reference","version":"2.0.0"},"tags":[{"name":"Information Notices","description":"Information Notices endpoints\n\n## Information Notice Updates\n\nThese endpoints are the same as [Incident Updates endpoints](/platform/api-reference/incident-updates), but it doesn't support the `type` attribute.\n"}],"servers":[{"url":"https://statuspal.io/api/v2"},{"url":"https://statuspal.eu/api/v2"}],"security":[],"paths":{"/status_pages/{subdomain}/info_notices/{infoNoticeId}":{"get":{"tags":["Information Notices"],"summary":"Get an information notice","operationId":"getInfoNotice","parameters":[{"$ref":"#/components/parameters/StatusPageSubdomain"},{"$ref":"#/components/parameters/InfoNoticeId"}],"responses":{"200":{"description":"information notice object","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InfoNoticeObj"}}}},"403":{"$ref":"#/components/responses/ForbiddenError"},"404":{"$ref":"#/components/responses/NotFoundError"},"500":{"$ref":"#/components/responses/ServerError"}}}}},"components":{"parameters":{"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"}},"InfoNoticeId":{"name":"infoNoticeId","in":"path","description":"The ID of an information notice","required":true,"schema":{"type":"integer"}}},"schemas":{"InfoNoticeObj":{"type":"object","properties":{"info_notice":{"$ref":"#/components/schemas/InfoNotice"}}},"InfoNotice":{"type":"object","description":"An information notice","required":["updates","title"],"properties":{"id":{"type":"integer","description":"ID of the record","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},"title":{"type":"string","description":"The title of the information notice"},"featured_from":{"type":"string","description":"The time at which the information notice will display on the status page.","format":"date-time"},"featured_until":{"type":"string","description":"The time at which the information notice will not display on the status page.","format":"date-time"},"service_ids":{"type":"array","description":"An array of service Ids, at least 1 must be included","items":{"type":"integer"}},"updates":{"type":"array","description":"The information notice's updates. On information notice creation you must pass exactly one update object in the array.","items":{"$ref":"#/components/schemas/IncidentActivity"}},"url":{"readOnly":true,"type":"string","description":"URL to the information notice"},"translations":{"description":"A translations object. For example:\n```json\n{\n  \"en\": { \"title\": \"English Title\" },\n  \"es\": { \"title\": \"Spanish Title\" }\n}\n```\n","type":"object","additionalProperties":true,"properties":{"[lang]":{"description":"e.g. `en`.","type":"object","properties":{"title":{"type":"string"}}}}}}},"IncidentActivity":{"type":"object","description":"Communicates an update of an incident, the special type `resolved` will close an incident.","required":["type","description"],"properties":{"id":{"type":"integer","description":"ID of the record","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},"posted_at":{"type":"string","description":"Editable datetime at which the record was posted","format":"date-time"},"type":{"type":"string","description":"The type of an incident update:\n * `investigating` - Investigating.\n * `issue` - Issue.\n * `monitoring` - Monitoring.\n * `resolved` - Resolved will close the associated incident by settings its `ends_at` to the current time.\n * `scheduled` - Scheduled Maintenance's first update shall have this type.\n * `essential` - Essential Maintenance's first update shall have this type.\n * `retroactive` - Retroactive.\n * `update` - Standard update on an incident.\n * `escalate` - Escalate will switch the incident type from `minor` to `major`.\n * `deescalate` - De-escalate will switch the incident type from `major` to `minor`.\n * `postmortem` - A Post-mortem update.\n"},"description":{"type":"string","description":"The provided update description (accepts Markdown format)"},"description_html":{"type":"string","readOnly":true,"description":"The provided update description rendered in HTML"},"translations":{"description":"A translations object. For example:\n```json\n{\n  \"en\": { \"description\": \"English description\" },\n  \"es\": { \"description\": \"Spanish description\" }\n}\n```\n","type":"object","additionalProperties":true,"properties":{"[lang]":{"description":"e.g. `en`.","type":"object","properties":{"description":{"type":"string"}}}}},"notify":{"type":"boolean","description":"Should your subscribers be notified about this update?","writeOnly":true},"subscribers_notified_at":{"type":"string","description":"Datetime at which subscribers were notified for this update","format":"date-time","readOnly":true},"tweet":{"type":"boolean","description":"Tweet this update with your configured Twitter account?"}}},"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":{"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"}}}}}}}
````

## PUT /status\_pages/{subdomain}/info\_notices/{infoNoticeId}

> Updates existing information notice

````json
{"openapi":"3.0.1","info":{"title":"StatusPal API Reference","version":"2.0.0"},"tags":[{"name":"Information Notices","description":"Information Notices endpoints\n\n## Information Notice Updates\n\nThese endpoints are the same as [Incident Updates endpoints](/platform/api-reference/incident-updates), but it doesn't support the `type` attribute.\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":{"InfoNoticeId":{"name":"infoNoticeId","in":"path","description":"The ID of an information notice","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":{"InfoNoticeObj":{"type":"object","properties":{"info_notice":{"$ref":"#/components/schemas/InfoNotice"}}},"InfoNotice":{"type":"object","description":"An information notice","required":["updates","title"],"properties":{"id":{"type":"integer","description":"ID of the record","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},"title":{"type":"string","description":"The title of the information notice"},"featured_from":{"type":"string","description":"The time at which the information notice will display on the status page.","format":"date-time"},"featured_until":{"type":"string","description":"The time at which the information notice will not display on the status page.","format":"date-time"},"service_ids":{"type":"array","description":"An array of service Ids, at least 1 must be included","items":{"type":"integer"}},"updates":{"type":"array","description":"The information notice's updates. On information notice creation you must pass exactly one update object in the array.","items":{"$ref":"#/components/schemas/IncidentActivity"}},"url":{"readOnly":true,"type":"string","description":"URL to the information notice"},"translations":{"description":"A translations object. For example:\n```json\n{\n  \"en\": { \"title\": \"English Title\" },\n  \"es\": { \"title\": \"Spanish Title\" }\n}\n```\n","type":"object","additionalProperties":true,"properties":{"[lang]":{"description":"e.g. `en`.","type":"object","properties":{"title":{"type":"string"}}}}}}},"IncidentActivity":{"type":"object","description":"Communicates an update of an incident, the special type `resolved` will close an incident.","required":["type","description"],"properties":{"id":{"type":"integer","description":"ID of the record","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},"posted_at":{"type":"string","description":"Editable datetime at which the record was posted","format":"date-time"},"type":{"type":"string","description":"The type of an incident update:\n * `investigating` - Investigating.\n * `issue` - Issue.\n * `monitoring` - Monitoring.\n * `resolved` - Resolved will close the associated incident by settings its `ends_at` to the current time.\n * `scheduled` - Scheduled Maintenance's first update shall have this type.\n * `essential` - Essential Maintenance's first update shall have this type.\n * `retroactive` - Retroactive.\n * `update` - Standard update on an incident.\n * `escalate` - Escalate will switch the incident type from `minor` to `major`.\n * `deescalate` - De-escalate will switch the incident type from `major` to `minor`.\n * `postmortem` - A Post-mortem update.\n"},"description":{"type":"string","description":"The provided update description (accepts Markdown format)"},"description_html":{"type":"string","readOnly":true,"description":"The provided update description rendered in HTML"},"translations":{"description":"A translations object. For example:\n```json\n{\n  \"en\": { \"description\": \"English description\" },\n  \"es\": { \"description\": \"Spanish description\" }\n}\n```\n","type":"object","additionalProperties":true,"properties":{"[lang]":{"description":"e.g. `en`.","type":"object","properties":{"description":{"type":"string"}}}}},"notify":{"type":"boolean","description":"Should your subscribers be notified about this update?","writeOnly":true},"subscribers_notified_at":{"type":"string","description":"Datetime at which subscribers were notified for this update","format":"date-time","readOnly":true},"tweet":{"type":"boolean","description":"Tweet this update with your configured Twitter account?"}}},"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!"}}},"ValidationError":{"type":"object","properties":{"errors":{"type":"object","description":"A dictionary where each key contains the name of a field with a validation error and the value an array with the validation errors"}}},"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"}}}},"ValidationError":{"description":"There was a validation error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ValidationError"}}}},"ServerError":{"description":"Unexpected error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerError"}}}}}},"paths":{"/status_pages/{subdomain}/info_notices/{infoNoticeId}":{"put":{"tags":["Information Notices"],"summary":"Updates existing information notice","operationId":"updateInfoNotice","parameters":[{"$ref":"#/components/parameters/InfoNoticeId"},{"$ref":"#/components/parameters/StatusPageSubdomain"}],"requestBody":{"description":"The information notice","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InfoNoticeObj"}}},"required":true},"responses":{"200":{"description":"The information notice was updated","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InfoNoticeObj"}}}},"400":{"$ref":"#/components/responses/BadRequestError"},"401":{"$ref":"#/components/responses/UnauthorizedError"},"403":{"$ref":"#/components/responses/ForbiddenError"},"404":{"$ref":"#/components/responses/NotFoundError"},"422":{"$ref":"#/components/responses/ValidationError"},"500":{"$ref":"#/components/responses/ServerError"}}}}}}
````

## DELETE /status\_pages/{subdomain}/info\_notices/{infoNoticeId}

> Deletes information notice permanently

```json
{"openapi":"3.0.1","info":{"title":"StatusPal API Reference","version":"2.0.0"},"tags":[{"name":"Information Notices","description":"Information Notices endpoints\n\n## Information Notice Updates\n\nThese endpoints are the same as [Incident Updates endpoints](/platform/api-reference/incident-updates), but it doesn't support the `type` attribute.\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":{"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"}},"InfoNoticeId":{"name":"infoNoticeId","in":"path","description":"The ID of an information notice","required":true,"schema":{"type":"integer"}}},"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":{"/status_pages/{subdomain}/info_notices/{infoNoticeId}":{"delete":{"tags":["Information Notices"],"summary":"Deletes information notice permanently","operationId":"deleteInfoNotice","parameters":[{"$ref":"#/components/parameters/StatusPageSubdomain"},{"$ref":"#/components/parameters/InfoNoticeId"}],"responses":{"200":{"description":"Information notice deleted successfully","content":{}},"401":{"$ref":"#/components/responses/UnauthorizedError"},"403":{"$ref":"#/components/responses/ForbiddenError"},"404":{"$ref":"#/components/responses/NotFoundError"},"500":{"$ref":"#/components/responses/ServerError"}}}}}}
```


# Metrics

Metrics endpoints

## GET /status\_pages/{subdomain}/metrics

> Get the metrics

```json
{"openapi":"3.0.1","info":{"title":"StatusPal API Reference","version":"2.0.0"},"tags":[{"name":"Metrics","description":"Metrics endpoints"}],"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":{"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":{"Metric":{"description":"Represents a metric object.","type":"object","required":["title","type","unit"],"properties":{"id":{"type":"integer","readOnly":true,"description":"The ID of the metric."},"title":{"type":"string","description":"The title or name of the metric, used to describe what the metric is measuring."},"unit":{"type":"string","description":"The unit of measurement for the metric. For example, this could be \"ms\" for milliseconds or \"requests/sec\"."},"type":{"$ref":"#/components/schemas/MetricType"},"enabled":{"type":"boolean","description":"Indicates whether the metric is currently enabled. When `true` system will actually pull data for this metric; when `false`, it does not."},"visible":{"type":"boolean","description":"Determines whether the metric is visible on the status page. If `true`, the metric's data is displayed; if `false`, it is hidden."},"remote_id":{"type":"string","description":"The identifier of the metric on the remote site. This is used to map the metric in the system to its counterpart on an external service or integration."},"remote_name":{"type":"string","description":"The name of the metric on the remote site. This is used to display the metric name as it appears on the external service."},"status":{"type":"string","readOnly":true,"description":"The current status of the metric, often represented as an HTTP status code or a descriptive string. This field indicates the latest state or response of the metric."},"latest_entry_time":{"type":"integer","readOnly":true,"description":"The Unix timestamp of the most recent entry recorded for this metric. This indicates the last time data was updated for the metric."},"threshold":{"type":"integer","description":"The threshold value for the metric. This is used to set limits or bounds, such as a threshold for triggering alerts or visual indicators in graphs."},"featured_number":{"$ref":"#/components/schemas/FeaturedNumber"},"order":{"type":"integer","readOnly":true,"description":"The order in which the metric appears on the status page or within a list. This helps determine the sorting and display sequence."},"integration_id":{"type":"string","description":"The identifier of the integration associated with this metric. This ties the metric to a specific integration."}}},"MetricType":{"type":"string","description":"The type of the metric. It can be one of the following:\n * `up` (Uptime): Represents the amount of time a service or system is operational and available.\n * `rt` (ResponseTime): Represents the time taken to respond to a request or query.\n","enum":["up","rt"]},"FeaturedNumber":{"type":"string","description":"Specifies the type of number to be featured prominently in the metric's display. Options might include \"average\", \"maximum\", or \"current/last\".\n","enum":["avg","max","last"]},"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":{"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":{"/status_pages/{subdomain}/metrics":{"get":{"tags":["Metrics"],"summary":"Get the metrics","operationId":"getStatusPageMetrics","parameters":[{"$ref":"#/components/parameters/StatusPageSubdomain"},{"name":"before","in":"query","description":"Used as a cursor for pagination.","schema":{"type":"string"}},{"name":"after","in":"query","description":"Used as a cursor for pagination.","schema":{"type":"string"}},{"name":"limit","in":"query","description":"Set the number of metrics to return in the response.\nThis defaults to 20 items, and can be a maximum of 100.\n","schema":{"type":"integer"}}],"responses":{"200":{"description":"A status page's metrics","content":{"application/json":{"schema":{"type":"object","properties":{"metrics":{"type":"array","items":{"$ref":"#/components/schemas/Metric"}},"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 metrics."}}}}}}}},"401":{"$ref":"#/components/responses/UnauthorizedError"},"403":{"$ref":"#/components/responses/ForbiddenError"},"404":{"$ref":"#/components/responses/NotFoundError"},"500":{"$ref":"#/components/responses/ServerError"}}}}}}
```

## POST /status\_pages/{subdomain}/metrics

> Adds a new metric

```json
{"openapi":"3.0.1","info":{"title":"StatusPal API Reference","version":"2.0.0"},"tags":[{"name":"Metrics","description":"Metrics endpoints"}],"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":{"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":{"MetricObj":{"type":"object","properties":{"metric":{"$ref":"#/components/schemas/Metric"}}},"Metric":{"description":"Represents a metric object.","type":"object","required":["title","type","unit"],"properties":{"id":{"type":"integer","readOnly":true,"description":"The ID of the metric."},"title":{"type":"string","description":"The title or name of the metric, used to describe what the metric is measuring."},"unit":{"type":"string","description":"The unit of measurement for the metric. For example, this could be \"ms\" for milliseconds or \"requests/sec\"."},"type":{"$ref":"#/components/schemas/MetricType"},"enabled":{"type":"boolean","description":"Indicates whether the metric is currently enabled. When `true` system will actually pull data for this metric; when `false`, it does not."},"visible":{"type":"boolean","description":"Determines whether the metric is visible on the status page. If `true`, the metric's data is displayed; if `false`, it is hidden."},"remote_id":{"type":"string","description":"The identifier of the metric on the remote site. This is used to map the metric in the system to its counterpart on an external service or integration."},"remote_name":{"type":"string","description":"The name of the metric on the remote site. This is used to display the metric name as it appears on the external service."},"status":{"type":"string","readOnly":true,"description":"The current status of the metric, often represented as an HTTP status code or a descriptive string. This field indicates the latest state or response of the metric."},"latest_entry_time":{"type":"integer","readOnly":true,"description":"The Unix timestamp of the most recent entry recorded for this metric. This indicates the last time data was updated for the metric."},"threshold":{"type":"integer","description":"The threshold value for the metric. This is used to set limits or bounds, such as a threshold for triggering alerts or visual indicators in graphs."},"featured_number":{"$ref":"#/components/schemas/FeaturedNumber"},"order":{"type":"integer","readOnly":true,"description":"The order in which the metric appears on the status page or within a list. This helps determine the sorting and display sequence."},"integration_id":{"type":"string","description":"The identifier of the integration associated with this metric. This ties the metric to a specific integration."}}},"MetricType":{"type":"string","description":"The type of the metric. It can be one of the following:\n * `up` (Uptime): Represents the amount of time a service or system is operational and available.\n * `rt` (ResponseTime): Represents the time taken to respond to a request or query.\n","enum":["up","rt"]},"FeaturedNumber":{"type":"string","description":"Specifies the type of number to be featured prominently in the metric's display. Options might include \"average\", \"maximum\", or \"current/last\".\n","enum":["avg","max","last"]},"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!"}}},"ValidationError":{"type":"object","properties":{"errors":{"type":"object","description":"A dictionary where each key contains the name of a field with a validation error and the value an array with the validation errors"}}},"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"}}}},"ValidationError":{"description":"There was a validation error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ValidationError"}}}},"ServerError":{"description":"Unexpected error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerError"}}}}}},"paths":{"/status_pages/{subdomain}/metrics":{"post":{"tags":["Metrics"],"summary":"Adds a new metric","operationId":"addMetric","parameters":[{"$ref":"#/components/parameters/StatusPageSubdomain"}],"requestBody":{"description":"The metric","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MetricObj"}}},"required":true},"responses":{"201":{"description":"The metric created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MetricObj"}}}},"400":{"$ref":"#/components/responses/BadRequestError"},"401":{"$ref":"#/components/responses/UnauthorizedError"},"403":{"$ref":"#/components/responses/ForbiddenError"},"404":{"$ref":"#/components/responses/NotFoundError"},"422":{"$ref":"#/components/responses/ValidationError"},"500":{"$ref":"#/components/responses/ServerError"}}}}}}
```

## GET /status\_pages/{subdomain}/metrics/{metricId}

> Get metric against given metric id

```json
{"openapi":"3.0.1","info":{"title":"StatusPal API Reference","version":"2.0.0"},"tags":[{"name":"Metrics","description":"Metrics endpoints"}],"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":{"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"}},"MetricId":{"name":"metricId","in":"path","description":"The ID of a custom metric","required":true,"schema":{"type":"integer"}}},"schemas":{"MetricObj":{"type":"object","properties":{"metric":{"$ref":"#/components/schemas/Metric"}}},"Metric":{"description":"Represents a metric object.","type":"object","required":["title","type","unit"],"properties":{"id":{"type":"integer","readOnly":true,"description":"The ID of the metric."},"title":{"type":"string","description":"The title or name of the metric, used to describe what the metric is measuring."},"unit":{"type":"string","description":"The unit of measurement for the metric. For example, this could be \"ms\" for milliseconds or \"requests/sec\"."},"type":{"$ref":"#/components/schemas/MetricType"},"enabled":{"type":"boolean","description":"Indicates whether the metric is currently enabled. When `true` system will actually pull data for this metric; when `false`, it does not."},"visible":{"type":"boolean","description":"Determines whether the metric is visible on the status page. If `true`, the metric's data is displayed; if `false`, it is hidden."},"remote_id":{"type":"string","description":"The identifier of the metric on the remote site. This is used to map the metric in the system to its counterpart on an external service or integration."},"remote_name":{"type":"string","description":"The name of the metric on the remote site. This is used to display the metric name as it appears on the external service."},"status":{"type":"string","readOnly":true,"description":"The current status of the metric, often represented as an HTTP status code or a descriptive string. This field indicates the latest state or response of the metric."},"latest_entry_time":{"type":"integer","readOnly":true,"description":"The Unix timestamp of the most recent entry recorded for this metric. This indicates the last time data was updated for the metric."},"threshold":{"type":"integer","description":"The threshold value for the metric. This is used to set limits or bounds, such as a threshold for triggering alerts or visual indicators in graphs."},"featured_number":{"$ref":"#/components/schemas/FeaturedNumber"},"order":{"type":"integer","readOnly":true,"description":"The order in which the metric appears on the status page or within a list. This helps determine the sorting and display sequence."},"integration_id":{"type":"string","description":"The identifier of the integration associated with this metric. This ties the metric to a specific integration."}}},"MetricType":{"type":"string","description":"The type of the metric. It can be one of the following:\n * `up` (Uptime): Represents the amount of time a service or system is operational and available.\n * `rt` (ResponseTime): Represents the time taken to respond to a request or query.\n","enum":["up","rt"]},"FeaturedNumber":{"type":"string","description":"Specifies the type of number to be featured prominently in the metric's display. Options might include \"average\", \"maximum\", or \"current/last\".\n","enum":["avg","max","last"]},"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":{"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":{"/status_pages/{subdomain}/metrics/{metricId}":{"get":{"operationId":"getMetric","summary":"Get metric against given metric id","tags":["Metrics"],"parameters":[{"$ref":"#/components/parameters/StatusPageSubdomain"},{"$ref":"#/components/parameters/MetricId"}],"responses":{"200":{"description":"The metric","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MetricObj"}}}},"401":{"$ref":"#/components/responses/UnauthorizedError"},"403":{"$ref":"#/components/responses/ForbiddenError"},"404":{"$ref":"#/components/responses/NotFoundError"},"500":{"$ref":"#/components/responses/ServerError"}}}}}}
```

## PUT /status\_pages/{subdomain}/metrics/{metricId}

> Updates existing metric

```json
{"openapi":"3.0.1","info":{"title":"StatusPal API Reference","version":"2.0.0"},"tags":[{"name":"Metrics","description":"Metrics endpoints"}],"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":{"MetricId":{"name":"metricId","in":"path","description":"The ID of a custom metric","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":{"MetricObj":{"type":"object","properties":{"metric":{"$ref":"#/components/schemas/Metric"}}},"Metric":{"description":"Represents a metric object.","type":"object","required":["title","type","unit"],"properties":{"id":{"type":"integer","readOnly":true,"description":"The ID of the metric."},"title":{"type":"string","description":"The title or name of the metric, used to describe what the metric is measuring."},"unit":{"type":"string","description":"The unit of measurement for the metric. For example, this could be \"ms\" for milliseconds or \"requests/sec\"."},"type":{"$ref":"#/components/schemas/MetricType"},"enabled":{"type":"boolean","description":"Indicates whether the metric is currently enabled. When `true` system will actually pull data for this metric; when `false`, it does not."},"visible":{"type":"boolean","description":"Determines whether the metric is visible on the status page. If `true`, the metric's data is displayed; if `false`, it is hidden."},"remote_id":{"type":"string","description":"The identifier of the metric on the remote site. This is used to map the metric in the system to its counterpart on an external service or integration."},"remote_name":{"type":"string","description":"The name of the metric on the remote site. This is used to display the metric name as it appears on the external service."},"status":{"type":"string","readOnly":true,"description":"The current status of the metric, often represented as an HTTP status code or a descriptive string. This field indicates the latest state or response of the metric."},"latest_entry_time":{"type":"integer","readOnly":true,"description":"The Unix timestamp of the most recent entry recorded for this metric. This indicates the last time data was updated for the metric."},"threshold":{"type":"integer","description":"The threshold value for the metric. This is used to set limits or bounds, such as a threshold for triggering alerts or visual indicators in graphs."},"featured_number":{"$ref":"#/components/schemas/FeaturedNumber"},"order":{"type":"integer","readOnly":true,"description":"The order in which the metric appears on the status page or within a list. This helps determine the sorting and display sequence."},"integration_id":{"type":"string","description":"The identifier of the integration associated with this metric. This ties the metric to a specific integration."}}},"MetricType":{"type":"string","description":"The type of the metric. It can be one of the following:\n * `up` (Uptime): Represents the amount of time a service or system is operational and available.\n * `rt` (ResponseTime): Represents the time taken to respond to a request or query.\n","enum":["up","rt"]},"FeaturedNumber":{"type":"string","description":"Specifies the type of number to be featured prominently in the metric's display. Options might include \"average\", \"maximum\", or \"current/last\".\n","enum":["avg","max","last"]},"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!"}}},"ValidationError":{"type":"object","properties":{"errors":{"type":"object","description":"A dictionary where each key contains the name of a field with a validation error and the value an array with the validation errors"}}},"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"}}}},"ValidationError":{"description":"There was a validation error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ValidationError"}}}},"ServerError":{"description":"Unexpected error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerError"}}}}}},"paths":{"/status_pages/{subdomain}/metrics/{metricId}":{"put":{"tags":["Metrics"],"summary":"Updates existing metric","operationId":"updateMetric","parameters":[{"$ref":"#/components/parameters/MetricId"},{"$ref":"#/components/parameters/StatusPageSubdomain"}],"requestBody":{"description":"The metric","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MetricObj"}}},"required":true},"responses":{"200":{"description":"The metric updated","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MetricObj"}}}},"400":{"$ref":"#/components/responses/BadRequestError"},"401":{"$ref":"#/components/responses/UnauthorizedError"},"403":{"$ref":"#/components/responses/ForbiddenError"},"404":{"$ref":"#/components/responses/NotFoundError"},"422":{"$ref":"#/components/responses/ValidationError"},"500":{"$ref":"#/components/responses/ServerError"}}}}}}
```

## DELETE /status\_pages/{subdomain}/metrics/{metricId}

> Deletes metric permanently

```json
{"openapi":"3.0.1","info":{"title":"StatusPal API Reference","version":"2.0.0"},"tags":[{"name":"Metrics","description":"Metrics endpoints"}],"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":{"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"}},"MetricId":{"name":"metricId","in":"path","description":"The ID of a custom metric","required":true,"schema":{"type":"integer"}}},"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":{"/status_pages/{subdomain}/metrics/{metricId}":{"delete":{"operationId":"deleteMetric","summary":"Deletes metric permanently","tags":["Metrics"],"parameters":[{"$ref":"#/components/parameters/StatusPageSubdomain"},{"$ref":"#/components/parameters/MetricId"}],"responses":{"200":{"description":"Metric deleted successfully","content":{}},"401":{"$ref":"#/components/responses/UnauthorizedError"},"403":{"$ref":"#/components/responses/ForbiddenError"},"404":{"$ref":"#/components/responses/NotFoundError"},"500":{"$ref":"#/components/responses/ServerError"}}}}}}
```

## POST /status\_pages/{subdomain}/metrics/{metricId}/entries

> Adds a metric data point to a custom metric

```json
{"openapi":"3.0.1","info":{"title":"StatusPal API Reference","version":"2.0.0"},"tags":[{"name":"Metrics","description":"Metrics endpoints"}],"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":{"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"}},"MetricId":{"name":"metricId","in":"path","description":"The ID of a custom metric","required":true,"schema":{"type":"integer"}}},"schemas":{"MetricEntryObj":{"type":"object","properties":{"entry":{"$ref":"#/components/schemas/MetricEntry"}}},"MetricEntry":{"required":["time","value"],"type":"object","properties":{"time":{"type":"integer","description":"Unix timestamp"},"value":{"type":"number","format":"double"}}},"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!"}}},"ValidationError":{"type":"object","properties":{"errors":{"type":"object","description":"A dictionary where each key contains the name of a field with a validation error and the value an array with the validation errors"}}},"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"}}}},"ValidationError":{"description":"There was a validation error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ValidationError"}}}},"ServerError":{"description":"Unexpected error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerError"}}}}}},"paths":{"/status_pages/{subdomain}/metrics/{metricId}/entries":{"post":{"tags":["Metrics"],"summary":"Adds a metric data point to a custom metric","operationId":"addCustomMetricDataPoint","parameters":[{"$ref":"#/components/parameters/StatusPageSubdomain"},{"$ref":"#/components/parameters/MetricId"}],"requestBody":{"description":"The metric entry","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MetricEntryObj"}}},"required":true},"responses":{"200":{"description":"The metric data point was created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MetricEntryObj"}}}},"400":{"$ref":"#/components/responses/BadRequestError"},"401":{"$ref":"#/components/responses/UnauthorizedError"},"403":{"$ref":"#/components/responses/ForbiddenError"},"404":{"$ref":"#/components/responses/NotFoundError"},"422":{"$ref":"#/components/responses/ValidationError"},"500":{"$ref":"#/components/responses/ServerError"}}}}}}
```


# Integrations

Integrations endpoints

## GET /status\_pages/{subdomain}/integrations

> Get the integrations

```json
{"openapi":"3.0.1","info":{"title":"StatusPal API Reference","version":"2.0.0"},"tags":[{"name":"Integrations","description":"Integrations endpoints"}],"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":{"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":{"Integration":{"description":"Represents an integration service.","type":"object","required":["name","settings"],"properties":{"id":{"type":"integer","readOnly":true,"description":"The ID of the integration."},"name":{"type":"string","description":"The integration type identifier. Must be one of the supported integration types.","enum":["pingdom","datadog","newrelic","twilio","mailgun","sendgrid","mandrill","smtp","zabbix"]},"user":{"type":"string","description":"Username or Account ID for the integration. Required for New Relic integrations."},"phone_number":{"type":"string","description":"Phone number for SMS notifications. Required for Twilio integration."},"domain":{"type":"string","description":"Domain name for the integration. Required for Mailgun and Zabbix integrations."},"email_from_address":{"type":"string","description":"Email address used as sender. Required for Mailgun, SendGrid, Mandrill, and SMTP integrations."},"key":{"type":"string","description":"API key or Service ID for the integration. Required for Pingdom, Twilio, Mailgun, Datadog, Zabbix, SendGrid, and Mandrill integrations."},"password":{"type":"string","writeOnly":true,"description":"Password or Auth Token for the integration. Required for Datadog, Twilio, and SMTP integrations."},"relay":{"type":"string","description":"SMTP relay server hostname or IP address. Required for SMTP integration."},"username":{"type":"string","description":"Username for SMTP authentication. Required for SMTP integration."},"port":{"type":"integer","description":"Port number for the integration connection. Required for SMTP integration."},"region":{"type":"string","description":"Region for the integration service:\n- New Relic & Mailgun: 'us' or 'eu'\n- Datadog: 'us' (East), 'us3' (West), 'us5' (Central), 'us-gov' (FedRamp), 'eu' (Europe)\n","enum":["us","eu","us3","us5","us-gov"]},"settings":{"type":"object","description":"Additional configuration settings specific to the integration type.","properties":{"__type__":{"type":"string","writeOnly":true,"description":"Configuration type identifier. Can be \"common\" for most integrations or \"mailgun\" for Mailgun-specific settings."},"enabled":{"type":"boolean","description":"Whether the integration is enabled and active. Required for all integrations."},"api_key_type":{"type":"string","description":"Type of API key for Mailgun integration. Determines the level of access and functionality.","enum":["private","sending"]}}}}},"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":{"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":{"/status_pages/{subdomain}/integrations":{"get":{"tags":["Integrations"],"summary":"Get the integrations","operationId":"getStatusPageIntegrations","parameters":[{"$ref":"#/components/parameters/StatusPageSubdomain"}],"responses":{"200":{"description":"A status page's integrations","content":{"application/json":{"schema":{"type":"object","properties":{"integrations":{"type":"array","items":{"$ref":"#/components/schemas/Integration"}}}}}}},"401":{"$ref":"#/components/responses/UnauthorizedError"},"403":{"$ref":"#/components/responses/ForbiddenError"},"404":{"$ref":"#/components/responses/NotFoundError"},"500":{"$ref":"#/components/responses/ServerError"}}}}}}
```

## POST /status\_pages/{subdomain}/integrations

> Adds a new integration

```json
{"openapi":"3.0.1","info":{"title":"StatusPal API Reference","version":"2.0.0"},"tags":[{"name":"Integrations","description":"Integrations endpoints"}],"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":{"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":{"IntegrationObj":{"type":"object","properties":{"integration":{"$ref":"#/components/schemas/Integration"}}},"Integration":{"description":"Represents an integration service.","type":"object","required":["name","settings"],"properties":{"id":{"type":"integer","readOnly":true,"description":"The ID of the integration."},"name":{"type":"string","description":"The integration type identifier. Must be one of the supported integration types.","enum":["pingdom","datadog","newrelic","twilio","mailgun","sendgrid","mandrill","smtp","zabbix"]},"user":{"type":"string","description":"Username or Account ID for the integration. Required for New Relic integrations."},"phone_number":{"type":"string","description":"Phone number for SMS notifications. Required for Twilio integration."},"domain":{"type":"string","description":"Domain name for the integration. Required for Mailgun and Zabbix integrations."},"email_from_address":{"type":"string","description":"Email address used as sender. Required for Mailgun, SendGrid, Mandrill, and SMTP integrations."},"key":{"type":"string","description":"API key or Service ID for the integration. Required for Pingdom, Twilio, Mailgun, Datadog, Zabbix, SendGrid, and Mandrill integrations."},"password":{"type":"string","writeOnly":true,"description":"Password or Auth Token for the integration. Required for Datadog, Twilio, and SMTP integrations."},"relay":{"type":"string","description":"SMTP relay server hostname or IP address. Required for SMTP integration."},"username":{"type":"string","description":"Username for SMTP authentication. Required for SMTP integration."},"port":{"type":"integer","description":"Port number for the integration connection. Required for SMTP integration."},"region":{"type":"string","description":"Region for the integration service:\n- New Relic & Mailgun: 'us' or 'eu'\n- Datadog: 'us' (East), 'us3' (West), 'us5' (Central), 'us-gov' (FedRamp), 'eu' (Europe)\n","enum":["us","eu","us3","us5","us-gov"]},"settings":{"type":"object","description":"Additional configuration settings specific to the integration type.","properties":{"__type__":{"type":"string","writeOnly":true,"description":"Configuration type identifier. Can be \"common\" for most integrations or \"mailgun\" for Mailgun-specific settings."},"enabled":{"type":"boolean","description":"Whether the integration is enabled and active. Required for all integrations."},"api_key_type":{"type":"string","description":"Type of API key for Mailgun integration. Determines the level of access and functionality.","enum":["private","sending"]}}}}},"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!"}}},"ValidationError":{"type":"object","properties":{"errors":{"type":"object","description":"A dictionary where each key contains the name of a field with a validation error and the value an array with the validation errors"}}},"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"}}}},"ValidationError":{"description":"There was a validation error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ValidationError"}}}},"ServerError":{"description":"Unexpected error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerError"}}}}}},"paths":{"/status_pages/{subdomain}/integrations":{"post":{"tags":["Integrations"],"summary":"Adds a new integration","operationId":"addIntegration","parameters":[{"$ref":"#/components/parameters/StatusPageSubdomain"}],"requestBody":{"description":"The integration","content":{"application/json":{"schema":{"$ref":"#/components/schemas/IntegrationObj"}}},"required":true},"responses":{"201":{"description":"The integration created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/IntegrationObj"}}}},"400":{"$ref":"#/components/responses/BadRequestError"},"401":{"$ref":"#/components/responses/UnauthorizedError"},"403":{"$ref":"#/components/responses/ForbiddenError"},"404":{"$ref":"#/components/responses/NotFoundError"},"422":{"$ref":"#/components/responses/ValidationError"},"500":{"$ref":"#/components/responses/ServerError"}}}}}}
```

## GET /status\_pages/{subdomain}/integrations/{integrationId}

> Get integration against given integration id

```json
{"openapi":"3.0.1","info":{"title":"StatusPal API Reference","version":"2.0.0"},"tags":[{"name":"Integrations","description":"Integrations endpoints"}],"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":{"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"}},"IntegrationId":{"name":"integrationId","in":"path","description":"The ID of integration","required":true,"schema":{"type":"integer"}}},"schemas":{"IntegrationObj":{"type":"object","properties":{"integration":{"$ref":"#/components/schemas/Integration"}}},"Integration":{"description":"Represents an integration service.","type":"object","required":["name","settings"],"properties":{"id":{"type":"integer","readOnly":true,"description":"The ID of the integration."},"name":{"type":"string","description":"The integration type identifier. Must be one of the supported integration types.","enum":["pingdom","datadog","newrelic","twilio","mailgun","sendgrid","mandrill","smtp","zabbix"]},"user":{"type":"string","description":"Username or Account ID for the integration. Required for New Relic integrations."},"phone_number":{"type":"string","description":"Phone number for SMS notifications. Required for Twilio integration."},"domain":{"type":"string","description":"Domain name for the integration. Required for Mailgun and Zabbix integrations."},"email_from_address":{"type":"string","description":"Email address used as sender. Required for Mailgun, SendGrid, Mandrill, and SMTP integrations."},"key":{"type":"string","description":"API key or Service ID for the integration. Required for Pingdom, Twilio, Mailgun, Datadog, Zabbix, SendGrid, and Mandrill integrations."},"password":{"type":"string","writeOnly":true,"description":"Password or Auth Token for the integration. Required for Datadog, Twilio, and SMTP integrations."},"relay":{"type":"string","description":"SMTP relay server hostname or IP address. Required for SMTP integration."},"username":{"type":"string","description":"Username for SMTP authentication. Required for SMTP integration."},"port":{"type":"integer","description":"Port number for the integration connection. Required for SMTP integration."},"region":{"type":"string","description":"Region for the integration service:\n- New Relic & Mailgun: 'us' or 'eu'\n- Datadog: 'us' (East), 'us3' (West), 'us5' (Central), 'us-gov' (FedRamp), 'eu' (Europe)\n","enum":["us","eu","us3","us5","us-gov"]},"settings":{"type":"object","description":"Additional configuration settings specific to the integration type.","properties":{"__type__":{"type":"string","writeOnly":true,"description":"Configuration type identifier. Can be \"common\" for most integrations or \"mailgun\" for Mailgun-specific settings."},"enabled":{"type":"boolean","description":"Whether the integration is enabled and active. Required for all integrations."},"api_key_type":{"type":"string","description":"Type of API key for Mailgun integration. Determines the level of access and functionality.","enum":["private","sending"]}}}}},"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":{"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":{"/status_pages/{subdomain}/integrations/{integrationId}":{"get":{"operationId":"getIntegration","summary":"Get integration against given integration id","tags":["Integrations"],"parameters":[{"$ref":"#/components/parameters/StatusPageSubdomain"},{"$ref":"#/components/parameters/IntegrationId"}],"responses":{"200":{"description":"The integration details","content":{"application/json":{"schema":{"$ref":"#/components/schemas/IntegrationObj"}}}},"401":{"$ref":"#/components/responses/UnauthorizedError"},"403":{"$ref":"#/components/responses/ForbiddenError"},"404":{"$ref":"#/components/responses/NotFoundError"},"500":{"$ref":"#/components/responses/ServerError"}}}}}}
```

## PUT /status\_pages/{subdomain}/integrations/{integrationId}

> Updates existing integration

```json
{"openapi":"3.0.1","info":{"title":"StatusPal API Reference","version":"2.0.0"},"tags":[{"name":"Integrations","description":"Integrations endpoints"}],"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":{"IntegrationId":{"name":"integrationId","in":"path","description":"The ID of integration","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":{"IntegrationObj":{"type":"object","properties":{"integration":{"$ref":"#/components/schemas/Integration"}}},"Integration":{"description":"Represents an integration service.","type":"object","required":["name","settings"],"properties":{"id":{"type":"integer","readOnly":true,"description":"The ID of the integration."},"name":{"type":"string","description":"The integration type identifier. Must be one of the supported integration types.","enum":["pingdom","datadog","newrelic","twilio","mailgun","sendgrid","mandrill","smtp","zabbix"]},"user":{"type":"string","description":"Username or Account ID for the integration. Required for New Relic integrations."},"phone_number":{"type":"string","description":"Phone number for SMS notifications. Required for Twilio integration."},"domain":{"type":"string","description":"Domain name for the integration. Required for Mailgun and Zabbix integrations."},"email_from_address":{"type":"string","description":"Email address used as sender. Required for Mailgun, SendGrid, Mandrill, and SMTP integrations."},"key":{"type":"string","description":"API key or Service ID for the integration. Required for Pingdom, Twilio, Mailgun, Datadog, Zabbix, SendGrid, and Mandrill integrations."},"password":{"type":"string","writeOnly":true,"description":"Password or Auth Token for the integration. Required for Datadog, Twilio, and SMTP integrations."},"relay":{"type":"string","description":"SMTP relay server hostname or IP address. Required for SMTP integration."},"username":{"type":"string","description":"Username for SMTP authentication. Required for SMTP integration."},"port":{"type":"integer","description":"Port number for the integration connection. Required for SMTP integration."},"region":{"type":"string","description":"Region for the integration service:\n- New Relic & Mailgun: 'us' or 'eu'\n- Datadog: 'us' (East), 'us3' (West), 'us5' (Central), 'us-gov' (FedRamp), 'eu' (Europe)\n","enum":["us","eu","us3","us5","us-gov"]},"settings":{"type":"object","description":"Additional configuration settings specific to the integration type.","properties":{"__type__":{"type":"string","writeOnly":true,"description":"Configuration type identifier. Can be \"common\" for most integrations or \"mailgun\" for Mailgun-specific settings."},"enabled":{"type":"boolean","description":"Whether the integration is enabled and active. Required for all integrations."},"api_key_type":{"type":"string","description":"Type of API key for Mailgun integration. Determines the level of access and functionality.","enum":["private","sending"]}}}}},"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!"}}},"ValidationError":{"type":"object","properties":{"errors":{"type":"object","description":"A dictionary where each key contains the name of a field with a validation error and the value an array with the validation errors"}}},"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"}}}},"ValidationError":{"description":"There was a validation error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ValidationError"}}}},"ServerError":{"description":"Unexpected error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerError"}}}}}},"paths":{"/status_pages/{subdomain}/integrations/{integrationId}":{"put":{"tags":["Integrations"],"summary":"Updates existing integration","operationId":"updateIntegration","parameters":[{"$ref":"#/components/parameters/IntegrationId"},{"$ref":"#/components/parameters/StatusPageSubdomain"}],"requestBody":{"description":"The integration","content":{"application/json":{"schema":{"$ref":"#/components/schemas/IntegrationObj"}}},"required":true},"responses":{"200":{"description":"The integration updated","content":{"application/json":{"schema":{"$ref":"#/components/schemas/IntegrationObj"}}}},"400":{"$ref":"#/components/responses/BadRequestError"},"401":{"$ref":"#/components/responses/UnauthorizedError"},"403":{"$ref":"#/components/responses/ForbiddenError"},"404":{"$ref":"#/components/responses/NotFoundError"},"422":{"$ref":"#/components/responses/ValidationError"},"500":{"$ref":"#/components/responses/ServerError"}}}}}}
```

## DELETE /status\_pages/{subdomain}/integrations/{integrationId}

> Deletes integration permanently

```json
{"openapi":"3.0.1","info":{"title":"StatusPal API Reference","version":"2.0.0"},"tags":[{"name":"Integrations","description":"Integrations endpoints"}],"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":{"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"}},"IntegrationId":{"name":"integrationId","in":"path","description":"The ID of integration","required":true,"schema":{"type":"integer"}}},"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":{"/status_pages/{subdomain}/integrations/{integrationId}":{"delete":{"operationId":"deleteIntegration","summary":"Deletes integration permanently","tags":["Integrations"],"parameters":[{"$ref":"#/components/parameters/StatusPageSubdomain"},{"$ref":"#/components/parameters/IntegrationId"}],"responses":{"200":{"description":"Integration deleted successfully","content":{}},"401":{"$ref":"#/components/responses/UnauthorizedError"},"403":{"$ref":"#/components/responses/ForbiddenError"},"404":{"$ref":"#/components/responses/NotFoundError"},"500":{"$ref":"#/components/responses/ServerError"}}}}}}
```


# 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"}}}}}}
````


# Subscriptions

Subscriptions endpoints

## GET /status\_pages/{subdomain}/subscriptions

> List subscriptions

```json
{"openapi":"3.0.1","info":{"title":"StatusPal API Reference","version":"2.0.0"},"tags":[{"name":"Subscriptions","description":"Subscriptions endpoints"}],"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":{"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":{"Subscription":{"required":["filter","service_ids","type"],"type":"object","properties":{"type":{"type":"string","description":"The type of Subscription (`email`, `slack`, `sms`, `discord`)."},"filter":{"type":"string","description":"Filter the notifications to subscribe to (`all`, `services`, `incident`)."},"service_ids":{"type":"array","description":"An array of service IDs to subscribe to, required if filter is `services`.","items":{"type":"integer"}},"incident_types":{"type":"array","description":"An array of incident type keys. If set, the subscriber will be notified only about this type of incidents/maintenance.","items":{"type":"string"}},"incident_id":{"type":"integer","description":"An incident ID to subscribe to, required if filter is `incident`."},"email":{"type":"string","description":"The email to send the notifications to, required if type is `email`."},"confirm":{"type":"boolean","description":"Set to false to skip sending confirmation email for email subscriptions."},"country_dial_code":{"type":"string","description":"The country code of the phone number to send the notifications to, required if type is `sms`."},"phone_number":{"type":"string","description":"The phone number to send the notifications to, required if type is `sms`."},"webhook_url":{"type":"string","description":"The Discord webhook URL, required if type is `discord`."},"locale":{"type":"string","description":"The subscriber's locale."},"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},"metadata":{"type":"object","description":"Additional metadata associated with the subscription."},"subscription_group_ids":{"type":"array","items":{"type":"integer"},"description":"IDs of the subscription groups this subscription belongs to. On update, the provided list replaces the previous one (not additive). Send `[]` to remove from all groups.\n"}}},"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":{"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":{"/status_pages/{subdomain}/subscriptions":{"get":{"tags":["Subscriptions"],"summary":"List subscriptions","operationId":"getSubscriptions","parameters":[{"$ref":"#/components/parameters/StatusPageSubdomain"},{"name":"filter","in":"query","description":"Filters by email address or phone number.\n\nIn order to search by phone number, the following is supported:\n\n1. Full phone number. Ensure the country code is prefixed by a + sign and\n  include a space between the country code and phone number (e.g. `+49 000000000` or `+49 000 000 000`)\n2. Country code (e.g. `+49`)\n3. Phone number without country code  (e.g. `000000000`)\n","schema":{"type":"string"}},{"name":"before","in":"query","description":"Used as a cursor for pagination.","schema":{"type":"string"}},{"name":"after","in":"query","description":"Used as a cursor for pagination.","schema":{"type":"string"}},{"name":"limit","in":"query","description":"Set the number of subscriptions to return in the response.\nThis defaults to 20 items, and can be a maximum of 100.\n","schema":{"type":"integer"}}],"responses":{"200":{"description":"The list of subscriptions","content":{"application/json":{"schema":{"type":"object","properties":{"subscriptions":{"type":"array","items":{"$ref":"#/components/schemas/Subscription"}},"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 subscriptions."}}}}}}}},"401":{"$ref":"#/components/responses/UnauthorizedError"},"403":{"$ref":"#/components/responses/ForbiddenError"},"404":{"$ref":"#/components/responses/NotFoundError"},"500":{"$ref":"#/components/responses/ServerError"}}}}}}
```

## POST /status\_pages/{subdomain}/subscriptions

> Adds a new subscription email, SMS or discord subscription

```json
{"openapi":"3.0.1","info":{"title":"StatusPal API Reference","version":"2.0.0"},"tags":[{"name":"Subscriptions","description":"Subscriptions endpoints"}],"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":{"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":{"SubscriptionObj":{"type":"object","properties":{"subscription":{"$ref":"#/components/schemas/Subscription"}}},"Subscription":{"required":["filter","service_ids","type"],"type":"object","properties":{"type":{"type":"string","description":"The type of Subscription (`email`, `slack`, `sms`, `discord`)."},"filter":{"type":"string","description":"Filter the notifications to subscribe to (`all`, `services`, `incident`)."},"service_ids":{"type":"array","description":"An array of service IDs to subscribe to, required if filter is `services`.","items":{"type":"integer"}},"incident_types":{"type":"array","description":"An array of incident type keys. If set, the subscriber will be notified only about this type of incidents/maintenance.","items":{"type":"string"}},"incident_id":{"type":"integer","description":"An incident ID to subscribe to, required if filter is `incident`."},"email":{"type":"string","description":"The email to send the notifications to, required if type is `email`."},"confirm":{"type":"boolean","description":"Set to false to skip sending confirmation email for email subscriptions."},"country_dial_code":{"type":"string","description":"The country code of the phone number to send the notifications to, required if type is `sms`."},"phone_number":{"type":"string","description":"The phone number to send the notifications to, required if type is `sms`."},"webhook_url":{"type":"string","description":"The Discord webhook URL, required if type is `discord`."},"locale":{"type":"string","description":"The subscriber's locale."},"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},"metadata":{"type":"object","description":"Additional metadata associated with the subscription."},"subscription_group_ids":{"type":"array","items":{"type":"integer"},"description":"IDs of the subscription groups this subscription belongs to. On update, the provided list replaces the previous one (not additive). Send `[]` to remove from all groups.\n"}}},"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!"}}},"ValidationError":{"type":"object","properties":{"errors":{"type":"object","description":"A dictionary where each key contains the name of a field with a validation error and the value an array with the validation errors"}}},"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"}}}},"ValidationError":{"description":"There was a validation error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ValidationError"}}}},"ServerError":{"description":"Unexpected error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerError"}}}}}},"paths":{"/status_pages/{subdomain}/subscriptions":{"post":{"tags":["Subscriptions"],"summary":"Adds a new subscription email, SMS or discord subscription","operationId":"addSubscription","parameters":[{"$ref":"#/components/parameters/StatusPageSubdomain"}],"requestBody":{"description":"The subscription","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SubscriptionObj"}}},"required":true},"responses":{"200":{"description":"The subscription was created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SubscriptionObj"}}}},"400":{"$ref":"#/components/responses/BadRequestError"},"401":{"$ref":"#/components/responses/UnauthorizedError"},"403":{"$ref":"#/components/responses/ForbiddenError"},"404":{"$ref":"#/components/responses/NotFoundError"},"422":{"$ref":"#/components/responses/ValidationError"},"500":{"$ref":"#/components/responses/ServerError"}}}}}}
```

## GET /status\_pages/{subdomain}/subscriptions/{subscriptionId}

> Get a subscription

```json
{"openapi":"3.0.1","info":{"title":"StatusPal API Reference","version":"2.0.0"},"tags":[{"name":"Subscriptions","description":"Subscriptions endpoints"}],"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":{"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"}},"SubscriptionId":{"name":"subscriptionId","in":"path","description":"The ID of a subscription","required":true,"schema":{"type":"string"}}},"schemas":{"SubscriptionObj":{"type":"object","properties":{"subscription":{"$ref":"#/components/schemas/Subscription"}}},"Subscription":{"required":["filter","service_ids","type"],"type":"object","properties":{"type":{"type":"string","description":"The type of Subscription (`email`, `slack`, `sms`, `discord`)."},"filter":{"type":"string","description":"Filter the notifications to subscribe to (`all`, `services`, `incident`)."},"service_ids":{"type":"array","description":"An array of service IDs to subscribe to, required if filter is `services`.","items":{"type":"integer"}},"incident_types":{"type":"array","description":"An array of incident type keys. If set, the subscriber will be notified only about this type of incidents/maintenance.","items":{"type":"string"}},"incident_id":{"type":"integer","description":"An incident ID to subscribe to, required if filter is `incident`."},"email":{"type":"string","description":"The email to send the notifications to, required if type is `email`."},"confirm":{"type":"boolean","description":"Set to false to skip sending confirmation email for email subscriptions."},"country_dial_code":{"type":"string","description":"The country code of the phone number to send the notifications to, required if type is `sms`."},"phone_number":{"type":"string","description":"The phone number to send the notifications to, required if type is `sms`."},"webhook_url":{"type":"string","description":"The Discord webhook URL, required if type is `discord`."},"locale":{"type":"string","description":"The subscriber's locale."},"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},"metadata":{"type":"object","description":"Additional metadata associated with the subscription."},"subscription_group_ids":{"type":"array","items":{"type":"integer"},"description":"IDs of the subscription groups this subscription belongs to. On update, the provided list replaces the previous one (not additive). Send `[]` to remove from all groups.\n"}}},"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":{"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":{"/status_pages/{subdomain}/subscriptions/{subscriptionId}":{"get":{"tags":["Subscriptions"],"summary":"Get a subscription","operationId":"getSubscription","parameters":[{"$ref":"#/components/parameters/StatusPageSubdomain"},{"$ref":"#/components/parameters/SubscriptionId"}],"responses":{"200":{"description":"The subscription","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SubscriptionObj"}}}},"401":{"$ref":"#/components/responses/UnauthorizedError"},"403":{"$ref":"#/components/responses/ForbiddenError"},"404":{"$ref":"#/components/responses/NotFoundError"},"500":{"$ref":"#/components/responses/ServerError"}}}}}}
```

## PUT /status\_pages/{subdomain}/subscriptions/{subscriptionId}

> Update the subscription

```json
{"openapi":"3.0.1","info":{"title":"StatusPal API Reference","version":"2.0.0"},"tags":[{"name":"Subscriptions","description":"Subscriptions endpoints"}],"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":{"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"}},"SubscriptionId":{"name":"subscriptionId","in":"path","description":"The ID of a subscription","required":true,"schema":{"type":"string"}}},"schemas":{"SubscriptionObj":{"type":"object","properties":{"subscription":{"$ref":"#/components/schemas/Subscription"}}},"Subscription":{"required":["filter","service_ids","type"],"type":"object","properties":{"type":{"type":"string","description":"The type of Subscription (`email`, `slack`, `sms`, `discord`)."},"filter":{"type":"string","description":"Filter the notifications to subscribe to (`all`, `services`, `incident`)."},"service_ids":{"type":"array","description":"An array of service IDs to subscribe to, required if filter is `services`.","items":{"type":"integer"}},"incident_types":{"type":"array","description":"An array of incident type keys. If set, the subscriber will be notified only about this type of incidents/maintenance.","items":{"type":"string"}},"incident_id":{"type":"integer","description":"An incident ID to subscribe to, required if filter is `incident`."},"email":{"type":"string","description":"The email to send the notifications to, required if type is `email`."},"confirm":{"type":"boolean","description":"Set to false to skip sending confirmation email for email subscriptions."},"country_dial_code":{"type":"string","description":"The country code of the phone number to send the notifications to, required if type is `sms`."},"phone_number":{"type":"string","description":"The phone number to send the notifications to, required if type is `sms`."},"webhook_url":{"type":"string","description":"The Discord webhook URL, required if type is `discord`."},"locale":{"type":"string","description":"The subscriber's locale."},"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},"metadata":{"type":"object","description":"Additional metadata associated with the subscription."},"subscription_group_ids":{"type":"array","items":{"type":"integer"},"description":"IDs of the subscription groups this subscription belongs to. On update, the provided list replaces the previous one (not additive). Send `[]` to remove from all groups.\n"}}},"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!"}}},"ValidationError":{"type":"object","properties":{"errors":{"type":"object","description":"A dictionary where each key contains the name of a field with a validation error and the value an array with the validation errors"}}},"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"}}}},"ValidationError":{"description":"There was a validation error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ValidationError"}}}},"ServerError":{"description":"Unexpected error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerError"}}}}}},"paths":{"/status_pages/{subdomain}/subscriptions/{subscriptionId}":{"put":{"tags":["Subscriptions"],"summary":"Update the subscription","operationId":"updateSubscription","parameters":[{"$ref":"#/components/parameters/StatusPageSubdomain"},{"$ref":"#/components/parameters/SubscriptionId"}],"requestBody":{"description":"The subscription","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SubscriptionObj"}}},"required":true},"responses":{"200":{"description":"The subscription was updated","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SubscriptionObj"}}}},"400":{"$ref":"#/components/responses/BadRequestError"},"401":{"$ref":"#/components/responses/UnauthorizedError"},"403":{"$ref":"#/components/responses/ForbiddenError"},"404":{"$ref":"#/components/responses/NotFoundError"},"422":{"$ref":"#/components/responses/ValidationError"},"500":{"$ref":"#/components/responses/ServerError"}}}}}}
```

## DELETE /status\_pages/{subdomain}/subscriptions/{subscriptionId}

> Deletes the subscription

```json
{"openapi":"3.0.1","info":{"title":"StatusPal API Reference","version":"2.0.0"},"tags":[{"name":"Subscriptions","description":"Subscriptions endpoints"}],"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":{"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"}},"SubscriptionId":{"name":"subscriptionId","in":"path","description":"The ID of a subscription","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":{"/status_pages/{subdomain}/subscriptions/{subscriptionId}":{"delete":{"tags":["Subscriptions"],"summary":"Deletes the subscription","operationId":"deleteSubscription","parameters":[{"$ref":"#/components/parameters/StatusPageSubdomain"},{"$ref":"#/components/parameters/SubscriptionId"}],"responses":{"204":{"description":"Subscription deleted successfully","content":{}},"401":{"$ref":"#/components/responses/UnauthorizedError"},"403":{"$ref":"#/components/responses/ForbiddenError"},"404":{"$ref":"#/components/responses/NotFoundError"},"500":{"$ref":"#/components/responses/ServerError"}}}}}}
```


# Services

Services endpoints

## GET /status\_pages/{subdomain}/services

> List services

````json
{"openapi":"3.0.1","info":{"title":"StatusPal API Reference","version":"2.0.0"},"tags":[{"name":"Services","description":"Services endpoints"}],"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":{"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":{"Service":{"description":"Represents the service.","type":"object","required":["name"],"properties":{"id":{"type":"integer","readOnly":true,"description":"The ID of the service."},"name":{"type":"string","description":"The name of the service."},"description":{"type":"string","description":"The description of the service."},"private_description":{"type":"string","description":"The private description of the service."},"parent_id":{"type":"integer","description":"The service parent ID."},"current_incident_type":{"description":"The service's current incident type.","$ref":"#/components/schemas/IncidentType","readOnly":true},"monitoring":{"$ref":"#/components/schemas/MonitoringType"},"webhook_monitoring_service":{"$ref":"#/components/schemas/WebhookMonitoringService"},"webhook_custom_jsonpath_settings":{"$ref":"#/components/schemas/WebhookCustomJsonpathSettings"},"inbound_email_address":{"type":"string","description":"This is field is populated from `inbound_email_id`, if the `monitoring` is set to `3rd_party`.","readOnly":true},"incoming_webhook_url":{"type":"string","description":"This is field is populated from `inbound_email_id`, if the `monitoring` is set to `webhook` and the `webhook_monitoring_service` is set.","readOnly":true},"ping_url":{"type":"string","description":"We will send HTTP requests to this URL for monitoring every minute."},"incident_type":{"description":"Sets the incident type to this value when an incident is created via monitoring.","$ref":"#/components/schemas/MonitoringIncidentType"},"parent_incident_type":{"description":"Sets the parent's service incident type to this value when an incident is created via monitoring.","$ref":"#/components/schemas/MonitoringIncidentType"},"is_up":{"type":"boolean","readOnly":true,"description":"Is the monitored service up?"},"pause_monitoring_during_maintenances":{"type":"boolean","description":"Pause the service monitoring during maintenances?"},"inbound_email_id":{"type":"string","readOnly":true,"description":"The inbound email ID."},"auto_incident":{"type":"boolean","description":"Create an incident automatically when this service is down and close it if/when it comes back up."},"auto_notify":{"type":"boolean","description":"Automatically notify all your subscribers about automatically created and closed incidents."},"children_ids":{"readOnly":true,"type":"array","description":"IDs of the service's children.","items":{"type":"integer"}},"translations":{"description":"A translations object. For example:\n```json\n{\n  \"en\": {\n    \"name\": \"Your service\",\n    \"description\": \"This is your service's description...\"\n  },\n  \"fr\": {\n    \"name\": \"Votre service\",\n    \"description\": \"Voici la description de votre service...\"\n  }\n}\n```\n","type":"object","additionalProperties":true,"properties":{"[lang]":{"description":"e.g. `en`.","type":"object","properties":{"name":{"type":"string"},"description":{"type":"string"}}}}},"private":{"type":"boolean","description":"Private service?"},"display_uptime_graph":{"type":"boolean","description":"Display uptime graph?"},"display_response_time_chart":{"type":"boolean","description":"Display response time chart?"},"order":{"type":"integer","description":"Service's position in the service list."},"notification_recipients":{"description":"Array of notification recipients:\n- In request: Array of recipient IDs (write-only).\n- In response: Array of recipient objects with `id` and `email` (read-only).\n","type":"array","items":{"oneOf":[{"type":"integer","description":"Recipient ID (write-only for request).","writeOnly":true},{"type":"object","description":"Recipient object (read-only for response).","readOnly":true,"properties":{"id":{"type":"integer","description":"The ID of the recipient."},"email":{"type":"string","description":"The email of the recipient."}}}]}},"monitoring_options":{"description":"Configuration options for monitoring the service. The options vary depending on whether\nthe monitoring type is `internal` or `3rd_party`.\n","$ref":"#/components/schemas/MonitoringOptions"}}},"IncidentType":{"type":"string","description":"The type of the (current) incident:\n * `minor` - A minor incident is currently taking place.\n * `major` - A major incident is currently taking place.\n * `scheduled` - A scheduled maintenance is currently taking place.\n","enum":["major","minor","scheduled"]},"MonitoringType":{"type":"string","nullable":true,"description":"Monitoring types:\n * `null` - No monitoring\n * `internal` - StatusPal monitoring\n * `3rd_party` - 3rd Party monitoring\n * `webhook` - Incoming webhook monitoring\n","enum":[null,"internal","3rd_party","webhook"]},"WebhookMonitoringService":{"type":"string","description":"> ### Configure this field only if the `monitoring` is set to `webhook`.\n\nWebhook monitoring services:\n* `status-cake` - StatusCake monitoring service\n* `uptime-robot` - UptimeRobot monitoring service\n* `zabbix` - Zabbix monitoring service\n* `custom-jsonpath` - Custom JSONPath\n","enum":["status-cake","uptime-robot","zabbix","custom-jsonpath"]},"WebhookCustomJsonpathSettings":{"type":"object","description":"> ### Configure this field only if the `webhook_monitoring_service` is set to `custom-jsonpath`.","properties":{"jsonpath":{"type":"string","description":"The path in the JSON, e.g. `$.status`."},"expected_result":{"type":"string","description":"The expected result in the JSON, e.g. `\"up\"`."}}},"MonitoringIncidentType":{"type":"string","description":"The type of the (current) incident:\n * `minor` - A minor incident is currently taking place.\n * `major` - A major incident is currently taking place.\n","enum":["major","minor"]},"MonitoringOptions":{"type":"object","description":"Options for configuring monitoring behavior for services.","properties":{"method":{"type":"string","description":"The HTTP method to be used when sending requests for monitoring.\nThis should be set to a valid HTTP method (e.g. `GET` or `HEAD`)\nwhen monitoring type is `internal`.\nEnsure it aligns with the service's requirements for health checks.\n"},"headers":{"type":"array","description":"Custom headers to be included in the monitoring request.\nThis should be set when the monitoring type is `internal`\nto specify any necessary header fields for the request.\n","items":{"type":"object","properties":{"key":{"type":"string","description":"The name of the header field."},"value":{"type":"string","description":"The value for the header field."}}}},"keyword_down":{"type":"string","description":"A custom keyword that indicates a 'down' status when\nmonitoring a third-party service. This keyword is used\nto parse and understand service responses.\n"},"keyword_up":{"type":"string","description":"A custom keyword that indicates an 'up' status when\nmonitoring a third-party service. This keyword is used\nto parse and understand service responses.\n"}}},"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":{"/status_pages/{subdomain}/services":{"get":{"tags":["Services"],"summary":"List services","operationId":"getServices","parameters":[{"$ref":"#/components/parameters/StatusPageSubdomain"}],"responses":{"200":{"description":"The list of Services","content":{"application/json":{"schema":{"properties":{"services":{"type":"array","items":{"$ref":"#/components/schemas/Service"}},"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 services."}}}}}}}},"401":{"$ref":"#/components/responses/UnauthorizedError"},"500":{"$ref":"#/components/responses/ServerError"}}}}}}
````

## POST /status\_pages/{subdomain}/services

> Adds a new service

````json
{"openapi":"3.0.1","info":{"title":"StatusPal API Reference","version":"2.0.0"},"tags":[{"name":"Services","description":"Services endpoints"}],"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":{"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":{"ServiceObj":{"type":"object","properties":{"service":{"$ref":"#/components/schemas/Service"}}},"Service":{"description":"Represents the service.","type":"object","required":["name"],"properties":{"id":{"type":"integer","readOnly":true,"description":"The ID of the service."},"name":{"type":"string","description":"The name of the service."},"description":{"type":"string","description":"The description of the service."},"private_description":{"type":"string","description":"The private description of the service."},"parent_id":{"type":"integer","description":"The service parent ID."},"current_incident_type":{"description":"The service's current incident type.","$ref":"#/components/schemas/IncidentType","readOnly":true},"monitoring":{"$ref":"#/components/schemas/MonitoringType"},"webhook_monitoring_service":{"$ref":"#/components/schemas/WebhookMonitoringService"},"webhook_custom_jsonpath_settings":{"$ref":"#/components/schemas/WebhookCustomJsonpathSettings"},"inbound_email_address":{"type":"string","description":"This is field is populated from `inbound_email_id`, if the `monitoring` is set to `3rd_party`.","readOnly":true},"incoming_webhook_url":{"type":"string","description":"This is field is populated from `inbound_email_id`, if the `monitoring` is set to `webhook` and the `webhook_monitoring_service` is set.","readOnly":true},"ping_url":{"type":"string","description":"We will send HTTP requests to this URL for monitoring every minute."},"incident_type":{"description":"Sets the incident type to this value when an incident is created via monitoring.","$ref":"#/components/schemas/MonitoringIncidentType"},"parent_incident_type":{"description":"Sets the parent's service incident type to this value when an incident is created via monitoring.","$ref":"#/components/schemas/MonitoringIncidentType"},"is_up":{"type":"boolean","readOnly":true,"description":"Is the monitored service up?"},"pause_monitoring_during_maintenances":{"type":"boolean","description":"Pause the service monitoring during maintenances?"},"inbound_email_id":{"type":"string","readOnly":true,"description":"The inbound email ID."},"auto_incident":{"type":"boolean","description":"Create an incident automatically when this service is down and close it if/when it comes back up."},"auto_notify":{"type":"boolean","description":"Automatically notify all your subscribers about automatically created and closed incidents."},"children_ids":{"readOnly":true,"type":"array","description":"IDs of the service's children.","items":{"type":"integer"}},"translations":{"description":"A translations object. For example:\n```json\n{\n  \"en\": {\n    \"name\": \"Your service\",\n    \"description\": \"This is your service's description...\"\n  },\n  \"fr\": {\n    \"name\": \"Votre service\",\n    \"description\": \"Voici la description de votre service...\"\n  }\n}\n```\n","type":"object","additionalProperties":true,"properties":{"[lang]":{"description":"e.g. `en`.","type":"object","properties":{"name":{"type":"string"},"description":{"type":"string"}}}}},"private":{"type":"boolean","description":"Private service?"},"display_uptime_graph":{"type":"boolean","description":"Display uptime graph?"},"display_response_time_chart":{"type":"boolean","description":"Display response time chart?"},"order":{"type":"integer","description":"Service's position in the service list."},"notification_recipients":{"description":"Array of notification recipients:\n- In request: Array of recipient IDs (write-only).\n- In response: Array of recipient objects with `id` and `email` (read-only).\n","type":"array","items":{"oneOf":[{"type":"integer","description":"Recipient ID (write-only for request).","writeOnly":true},{"type":"object","description":"Recipient object (read-only for response).","readOnly":true,"properties":{"id":{"type":"integer","description":"The ID of the recipient."},"email":{"type":"string","description":"The email of the recipient."}}}]}},"monitoring_options":{"description":"Configuration options for monitoring the service. The options vary depending on whether\nthe monitoring type is `internal` or `3rd_party`.\n","$ref":"#/components/schemas/MonitoringOptions"}}},"IncidentType":{"type":"string","description":"The type of the (current) incident:\n * `minor` - A minor incident is currently taking place.\n * `major` - A major incident is currently taking place.\n * `scheduled` - A scheduled maintenance is currently taking place.\n","enum":["major","minor","scheduled"]},"MonitoringType":{"type":"string","nullable":true,"description":"Monitoring types:\n * `null` - No monitoring\n * `internal` - StatusPal monitoring\n * `3rd_party` - 3rd Party monitoring\n * `webhook` - Incoming webhook monitoring\n","enum":[null,"internal","3rd_party","webhook"]},"WebhookMonitoringService":{"type":"string","description":"> ### Configure this field only if the `monitoring` is set to `webhook`.\n\nWebhook monitoring services:\n* `status-cake` - StatusCake monitoring service\n* `uptime-robot` - UptimeRobot monitoring service\n* `zabbix` - Zabbix monitoring service\n* `custom-jsonpath` - Custom JSONPath\n","enum":["status-cake","uptime-robot","zabbix","custom-jsonpath"]},"WebhookCustomJsonpathSettings":{"type":"object","description":"> ### Configure this field only if the `webhook_monitoring_service` is set to `custom-jsonpath`.","properties":{"jsonpath":{"type":"string","description":"The path in the JSON, e.g. `$.status`."},"expected_result":{"type":"string","description":"The expected result in the JSON, e.g. `\"up\"`."}}},"MonitoringIncidentType":{"type":"string","description":"The type of the (current) incident:\n * `minor` - A minor incident is currently taking place.\n * `major` - A major incident is currently taking place.\n","enum":["major","minor"]},"MonitoringOptions":{"type":"object","description":"Options for configuring monitoring behavior for services.","properties":{"method":{"type":"string","description":"The HTTP method to be used when sending requests for monitoring.\nThis should be set to a valid HTTP method (e.g. `GET` or `HEAD`)\nwhen monitoring type is `internal`.\nEnsure it aligns with the service's requirements for health checks.\n"},"headers":{"type":"array","description":"Custom headers to be included in the monitoring request.\nThis should be set when the monitoring type is `internal`\nto specify any necessary header fields for the request.\n","items":{"type":"object","properties":{"key":{"type":"string","description":"The name of the header field."},"value":{"type":"string","description":"The value for the header field."}}}},"keyword_down":{"type":"string","description":"A custom keyword that indicates a 'down' status when\nmonitoring a third-party service. This keyword is used\nto parse and understand service responses.\n"},"keyword_up":{"type":"string","description":"A custom keyword that indicates an 'up' status when\nmonitoring a third-party service. This keyword is used\nto parse and understand service responses.\n"}}},"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!"}}},"ValidationError":{"type":"object","properties":{"errors":{"type":"object","description":"A dictionary where each key contains the name of a field with a validation error and the value an array with the validation errors"}}},"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"}}}},"ValidationError":{"description":"There was a validation error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ValidationError"}}}},"ServerError":{"description":"Unexpected error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerError"}}}}}},"paths":{"/status_pages/{subdomain}/services":{"post":{"tags":["Services"],"summary":"Adds a new service","operationId":"addService","parameters":[{"$ref":"#/components/parameters/StatusPageSubdomain"}],"requestBody":{"description":"The service","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServiceObj"}}},"required":true},"responses":{"201":{"description":"The service was created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServiceObj"}}}},"400":{"$ref":"#/components/responses/BadRequestError"},"401":{"$ref":"#/components/responses/UnauthorizedError"},"403":{"$ref":"#/components/responses/ForbiddenError"},"404":{"$ref":"#/components/responses/NotFoundError"},"422":{"$ref":"#/components/responses/ValidationError"},"500":{"$ref":"#/components/responses/ServerError"}}}}}}
````

## GET /status\_pages/{subdomain}/services/{serviceId}

> Get a service

````json
{"openapi":"3.0.1","info":{"title":"StatusPal API Reference","version":"2.0.0"},"tags":[{"name":"Services","description":"Services endpoints"}],"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":{"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"}},"ServiceId":{"name":"serviceId","in":"path","description":"The ID of a service","required":true,"schema":{"type":"integer"}}},"schemas":{"ServiceObj":{"type":"object","properties":{"service":{"$ref":"#/components/schemas/Service"}}},"Service":{"description":"Represents the service.","type":"object","required":["name"],"properties":{"id":{"type":"integer","readOnly":true,"description":"The ID of the service."},"name":{"type":"string","description":"The name of the service."},"description":{"type":"string","description":"The description of the service."},"private_description":{"type":"string","description":"The private description of the service."},"parent_id":{"type":"integer","description":"The service parent ID."},"current_incident_type":{"description":"The service's current incident type.","$ref":"#/components/schemas/IncidentType","readOnly":true},"monitoring":{"$ref":"#/components/schemas/MonitoringType"},"webhook_monitoring_service":{"$ref":"#/components/schemas/WebhookMonitoringService"},"webhook_custom_jsonpath_settings":{"$ref":"#/components/schemas/WebhookCustomJsonpathSettings"},"inbound_email_address":{"type":"string","description":"This is field is populated from `inbound_email_id`, if the `monitoring` is set to `3rd_party`.","readOnly":true},"incoming_webhook_url":{"type":"string","description":"This is field is populated from `inbound_email_id`, if the `monitoring` is set to `webhook` and the `webhook_monitoring_service` is set.","readOnly":true},"ping_url":{"type":"string","description":"We will send HTTP requests to this URL for monitoring every minute."},"incident_type":{"description":"Sets the incident type to this value when an incident is created via monitoring.","$ref":"#/components/schemas/MonitoringIncidentType"},"parent_incident_type":{"description":"Sets the parent's service incident type to this value when an incident is created via monitoring.","$ref":"#/components/schemas/MonitoringIncidentType"},"is_up":{"type":"boolean","readOnly":true,"description":"Is the monitored service up?"},"pause_monitoring_during_maintenances":{"type":"boolean","description":"Pause the service monitoring during maintenances?"},"inbound_email_id":{"type":"string","readOnly":true,"description":"The inbound email ID."},"auto_incident":{"type":"boolean","description":"Create an incident automatically when this service is down and close it if/when it comes back up."},"auto_notify":{"type":"boolean","description":"Automatically notify all your subscribers about automatically created and closed incidents."},"children_ids":{"readOnly":true,"type":"array","description":"IDs of the service's children.","items":{"type":"integer"}},"translations":{"description":"A translations object. For example:\n```json\n{\n  \"en\": {\n    \"name\": \"Your service\",\n    \"description\": \"This is your service's description...\"\n  },\n  \"fr\": {\n    \"name\": \"Votre service\",\n    \"description\": \"Voici la description de votre service...\"\n  }\n}\n```\n","type":"object","additionalProperties":true,"properties":{"[lang]":{"description":"e.g. `en`.","type":"object","properties":{"name":{"type":"string"},"description":{"type":"string"}}}}},"private":{"type":"boolean","description":"Private service?"},"display_uptime_graph":{"type":"boolean","description":"Display uptime graph?"},"display_response_time_chart":{"type":"boolean","description":"Display response time chart?"},"order":{"type":"integer","description":"Service's position in the service list."},"notification_recipients":{"description":"Array of notification recipients:\n- In request: Array of recipient IDs (write-only).\n- In response: Array of recipient objects with `id` and `email` (read-only).\n","type":"array","items":{"oneOf":[{"type":"integer","description":"Recipient ID (write-only for request).","writeOnly":true},{"type":"object","description":"Recipient object (read-only for response).","readOnly":true,"properties":{"id":{"type":"integer","description":"The ID of the recipient."},"email":{"type":"string","description":"The email of the recipient."}}}]}},"monitoring_options":{"description":"Configuration options for monitoring the service. The options vary depending on whether\nthe monitoring type is `internal` or `3rd_party`.\n","$ref":"#/components/schemas/MonitoringOptions"}}},"IncidentType":{"type":"string","description":"The type of the (current) incident:\n * `minor` - A minor incident is currently taking place.\n * `major` - A major incident is currently taking place.\n * `scheduled` - A scheduled maintenance is currently taking place.\n","enum":["major","minor","scheduled"]},"MonitoringType":{"type":"string","nullable":true,"description":"Monitoring types:\n * `null` - No monitoring\n * `internal` - StatusPal monitoring\n * `3rd_party` - 3rd Party monitoring\n * `webhook` - Incoming webhook monitoring\n","enum":[null,"internal","3rd_party","webhook"]},"WebhookMonitoringService":{"type":"string","description":"> ### Configure this field only if the `monitoring` is set to `webhook`.\n\nWebhook monitoring services:\n* `status-cake` - StatusCake monitoring service\n* `uptime-robot` - UptimeRobot monitoring service\n* `zabbix` - Zabbix monitoring service\n* `custom-jsonpath` - Custom JSONPath\n","enum":["status-cake","uptime-robot","zabbix","custom-jsonpath"]},"WebhookCustomJsonpathSettings":{"type":"object","description":"> ### Configure this field only if the `webhook_monitoring_service` is set to `custom-jsonpath`.","properties":{"jsonpath":{"type":"string","description":"The path in the JSON, e.g. `$.status`."},"expected_result":{"type":"string","description":"The expected result in the JSON, e.g. `\"up\"`."}}},"MonitoringIncidentType":{"type":"string","description":"The type of the (current) incident:\n * `minor` - A minor incident is currently taking place.\n * `major` - A major incident is currently taking place.\n","enum":["major","minor"]},"MonitoringOptions":{"type":"object","description":"Options for configuring monitoring behavior for services.","properties":{"method":{"type":"string","description":"The HTTP method to be used when sending requests for monitoring.\nThis should be set to a valid HTTP method (e.g. `GET` or `HEAD`)\nwhen monitoring type is `internal`.\nEnsure it aligns with the service's requirements for health checks.\n"},"headers":{"type":"array","description":"Custom headers to be included in the monitoring request.\nThis should be set when the monitoring type is `internal`\nto specify any necessary header fields for the request.\n","items":{"type":"object","properties":{"key":{"type":"string","description":"The name of the header field."},"value":{"type":"string","description":"The value for the header field."}}}},"keyword_down":{"type":"string","description":"A custom keyword that indicates a 'down' status when\nmonitoring a third-party service. This keyword is used\nto parse and understand service responses.\n"},"keyword_up":{"type":"string","description":"A custom keyword that indicates an 'up' status when\nmonitoring a third-party service. This keyword is used\nto parse and understand service responses.\n"}}},"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":{"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":{"/status_pages/{subdomain}/services/{serviceId}":{"get":{"operationId":"getService","summary":"Get a service","tags":["Services"],"parameters":[{"$ref":"#/components/parameters/StatusPageSubdomain"},{"$ref":"#/components/parameters/ServiceId"}],"responses":{"200":{"description":"The service","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServiceObj"}}}},"401":{"$ref":"#/components/responses/UnauthorizedError"},"403":{"$ref":"#/components/responses/ForbiddenError"},"404":{"$ref":"#/components/responses/NotFoundError"},"500":{"$ref":"#/components/responses/ServerError"}}}}}}
````

## PUT /status\_pages/{subdomain}/services/{serviceId}

> Updates existing service

````json
{"openapi":"3.0.1","info":{"title":"StatusPal API Reference","version":"2.0.0"},"tags":[{"name":"Services","description":"Services endpoints"}],"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":{"ServiceId":{"name":"serviceId","in":"path","description":"The ID of a service","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":{"ServiceObj":{"type":"object","properties":{"service":{"$ref":"#/components/schemas/Service"}}},"Service":{"description":"Represents the service.","type":"object","required":["name"],"properties":{"id":{"type":"integer","readOnly":true,"description":"The ID of the service."},"name":{"type":"string","description":"The name of the service."},"description":{"type":"string","description":"The description of the service."},"private_description":{"type":"string","description":"The private description of the service."},"parent_id":{"type":"integer","description":"The service parent ID."},"current_incident_type":{"description":"The service's current incident type.","$ref":"#/components/schemas/IncidentType","readOnly":true},"monitoring":{"$ref":"#/components/schemas/MonitoringType"},"webhook_monitoring_service":{"$ref":"#/components/schemas/WebhookMonitoringService"},"webhook_custom_jsonpath_settings":{"$ref":"#/components/schemas/WebhookCustomJsonpathSettings"},"inbound_email_address":{"type":"string","description":"This is field is populated from `inbound_email_id`, if the `monitoring` is set to `3rd_party`.","readOnly":true},"incoming_webhook_url":{"type":"string","description":"This is field is populated from `inbound_email_id`, if the `monitoring` is set to `webhook` and the `webhook_monitoring_service` is set.","readOnly":true},"ping_url":{"type":"string","description":"We will send HTTP requests to this URL for monitoring every minute."},"incident_type":{"description":"Sets the incident type to this value when an incident is created via monitoring.","$ref":"#/components/schemas/MonitoringIncidentType"},"parent_incident_type":{"description":"Sets the parent's service incident type to this value when an incident is created via monitoring.","$ref":"#/components/schemas/MonitoringIncidentType"},"is_up":{"type":"boolean","readOnly":true,"description":"Is the monitored service up?"},"pause_monitoring_during_maintenances":{"type":"boolean","description":"Pause the service monitoring during maintenances?"},"inbound_email_id":{"type":"string","readOnly":true,"description":"The inbound email ID."},"auto_incident":{"type":"boolean","description":"Create an incident automatically when this service is down and close it if/when it comes back up."},"auto_notify":{"type":"boolean","description":"Automatically notify all your subscribers about automatically created and closed incidents."},"children_ids":{"readOnly":true,"type":"array","description":"IDs of the service's children.","items":{"type":"integer"}},"translations":{"description":"A translations object. For example:\n```json\n{\n  \"en\": {\n    \"name\": \"Your service\",\n    \"description\": \"This is your service's description...\"\n  },\n  \"fr\": {\n    \"name\": \"Votre service\",\n    \"description\": \"Voici la description de votre service...\"\n  }\n}\n```\n","type":"object","additionalProperties":true,"properties":{"[lang]":{"description":"e.g. `en`.","type":"object","properties":{"name":{"type":"string"},"description":{"type":"string"}}}}},"private":{"type":"boolean","description":"Private service?"},"display_uptime_graph":{"type":"boolean","description":"Display uptime graph?"},"display_response_time_chart":{"type":"boolean","description":"Display response time chart?"},"order":{"type":"integer","description":"Service's position in the service list."},"notification_recipients":{"description":"Array of notification recipients:\n- In request: Array of recipient IDs (write-only).\n- In response: Array of recipient objects with `id` and `email` (read-only).\n","type":"array","items":{"oneOf":[{"type":"integer","description":"Recipient ID (write-only for request).","writeOnly":true},{"type":"object","description":"Recipient object (read-only for response).","readOnly":true,"properties":{"id":{"type":"integer","description":"The ID of the recipient."},"email":{"type":"string","description":"The email of the recipient."}}}]}},"monitoring_options":{"description":"Configuration options for monitoring the service. The options vary depending on whether\nthe monitoring type is `internal` or `3rd_party`.\n","$ref":"#/components/schemas/MonitoringOptions"}}},"IncidentType":{"type":"string","description":"The type of the (current) incident:\n * `minor` - A minor incident is currently taking place.\n * `major` - A major incident is currently taking place.\n * `scheduled` - A scheduled maintenance is currently taking place.\n","enum":["major","minor","scheduled"]},"MonitoringType":{"type":"string","nullable":true,"description":"Monitoring types:\n * `null` - No monitoring\n * `internal` - StatusPal monitoring\n * `3rd_party` - 3rd Party monitoring\n * `webhook` - Incoming webhook monitoring\n","enum":[null,"internal","3rd_party","webhook"]},"WebhookMonitoringService":{"type":"string","description":"> ### Configure this field only if the `monitoring` is set to `webhook`.\n\nWebhook monitoring services:\n* `status-cake` - StatusCake monitoring service\n* `uptime-robot` - UptimeRobot monitoring service\n* `zabbix` - Zabbix monitoring service\n* `custom-jsonpath` - Custom JSONPath\n","enum":["status-cake","uptime-robot","zabbix","custom-jsonpath"]},"WebhookCustomJsonpathSettings":{"type":"object","description":"> ### Configure this field only if the `webhook_monitoring_service` is set to `custom-jsonpath`.","properties":{"jsonpath":{"type":"string","description":"The path in the JSON, e.g. `$.status`."},"expected_result":{"type":"string","description":"The expected result in the JSON, e.g. `\"up\"`."}}},"MonitoringIncidentType":{"type":"string","description":"The type of the (current) incident:\n * `minor` - A minor incident is currently taking place.\n * `major` - A major incident is currently taking place.\n","enum":["major","minor"]},"MonitoringOptions":{"type":"object","description":"Options for configuring monitoring behavior for services.","properties":{"method":{"type":"string","description":"The HTTP method to be used when sending requests for monitoring.\nThis should be set to a valid HTTP method (e.g. `GET` or `HEAD`)\nwhen monitoring type is `internal`.\nEnsure it aligns with the service's requirements for health checks.\n"},"headers":{"type":"array","description":"Custom headers to be included in the monitoring request.\nThis should be set when the monitoring type is `internal`\nto specify any necessary header fields for the request.\n","items":{"type":"object","properties":{"key":{"type":"string","description":"The name of the header field."},"value":{"type":"string","description":"The value for the header field."}}}},"keyword_down":{"type":"string","description":"A custom keyword that indicates a 'down' status when\nmonitoring a third-party service. This keyword is used\nto parse and understand service responses.\n"},"keyword_up":{"type":"string","description":"A custom keyword that indicates an 'up' status when\nmonitoring a third-party service. This keyword is used\nto parse and understand service responses.\n"}}},"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!"}}},"ValidationError":{"type":"object","properties":{"errors":{"type":"object","description":"A dictionary where each key contains the name of a field with a validation error and the value an array with the validation errors"}}},"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"}}}},"ValidationError":{"description":"There was a validation error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ValidationError"}}}},"ServerError":{"description":"Unexpected error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerError"}}}}}},"paths":{"/status_pages/{subdomain}/services/{serviceId}":{"put":{"tags":["Services"],"summary":"Updates existing service","operationId":"updateService","parameters":[{"$ref":"#/components/parameters/ServiceId"},{"$ref":"#/components/parameters/StatusPageSubdomain"}],"requestBody":{"description":"The service","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServiceObj"}}},"required":true},"responses":{"200":{"description":"The service was updated","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServiceObj"}}}},"400":{"$ref":"#/components/responses/BadRequestError"},"401":{"$ref":"#/components/responses/UnauthorizedError"},"403":{"$ref":"#/components/responses/ForbiddenError"},"404":{"$ref":"#/components/responses/NotFoundError"},"422":{"$ref":"#/components/responses/ValidationError"},"500":{"$ref":"#/components/responses/ServerError"}}}}}}
````

## DELETE /status\_pages/{subdomain}/services/{serviceId}

> Deletes service permanently

```json
{"openapi":"3.0.1","info":{"title":"StatusPal API Reference","version":"2.0.0"},"tags":[{"name":"Services","description":"Services endpoints"}],"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":{"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"}},"ServiceId":{"name":"serviceId","in":"path","description":"The ID of a service","required":true,"schema":{"type":"integer"}}},"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":{"/status_pages/{subdomain}/services/{serviceId}":{"delete":{"operationId":"deleteService","summary":"Deletes service permanently","tags":["Services"],"parameters":[{"$ref":"#/components/parameters/StatusPageSubdomain"},{"$ref":"#/components/parameters/ServiceId"}],"responses":{"200":{"description":"Service deleted successfully","content":{}},"401":{"$ref":"#/components/responses/UnauthorizedError"},"403":{"$ref":"#/components/responses/ForbiddenError"},"404":{"$ref":"#/components/responses/NotFoundError"},"500":{"$ref":"#/components/responses/ServerError"}}}}}}
```


# Webhooks

Webhooks endpoints

## GET /status\_pages/{subdomain}/webhooks

> List all webhooks

```json
{"openapi":"3.0.1","info":{"title":"StatusPal API Reference","version":"2.0.0"},"tags":[{"name":"Webhooks","description":"Webhooks endpoints"}],"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":{"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":{"Webhook":{"required":["enabled","events","url"],"type":"object","properties":{"url":{"type":"string","description":"The endpoint URL of the webhook to send the POST request to when the specified events occur."},"events":{"type":"array","description":"Available events:\n* `service.monitored_status.updated` - Triggered when a service configured with our internal monitoring goes up/down.\n* `incident.created`, `incident.updated`, `incident.deleted` - Triggered during the lifecycle of an incident, they all send the same payload.\n","items":{"type":"string"}},"enabled":{"type":"boolean","description":"Toggles the webhook's state."}}},"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":{"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":{"/status_pages/{subdomain}/webhooks":{"get":{"tags":["Webhooks"],"summary":"List all webhooks","operationId":"getWebhooks","parameters":[{"$ref":"#/components/parameters/StatusPageSubdomain"}],"responses":{"200":{"description":"The list of webhooks","content":{"application/json":{"schema":{"type":"object","properties":{"webhooks":{"type":"array","items":{"$ref":"#/components/schemas/Webhook"}}}}}}},"401":{"$ref":"#/components/responses/UnauthorizedError"},"403":{"$ref":"#/components/responses/ForbiddenError"},"404":{"$ref":"#/components/responses/NotFoundError"},"500":{"$ref":"#/components/responses/ServerError"}}}}}}
```

## POST /status\_pages/{subdomain}/webhooks

> Adds a new webhook

```json
{"openapi":"3.0.1","info":{"title":"StatusPal API Reference","version":"2.0.0"},"tags":[{"name":"Webhooks","description":"Webhooks endpoints"}],"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":{"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":{"WebhookObj":{"type":"object","properties":{"webhook":{"$ref":"#/components/schemas/Webhook"}}},"Webhook":{"required":["enabled","events","url"],"type":"object","properties":{"url":{"type":"string","description":"The endpoint URL of the webhook to send the POST request to when the specified events occur."},"events":{"type":"array","description":"Available events:\n* `service.monitored_status.updated` - Triggered when a service configured with our internal monitoring goes up/down.\n* `incident.created`, `incident.updated`, `incident.deleted` - Triggered during the lifecycle of an incident, they all send the same payload.\n","items":{"type":"string"}},"enabled":{"type":"boolean","description":"Toggles the webhook's state."}}},"BadRequestError":{"type":"object","properties":{"error":{"type":"string","description":"Bad request!"}}},"UnauthorizedError":{"type":"object","properties":{"error":{"type":"integer","description":"Unauthorized"}}},"ValidationError":{"type":"object","properties":{"errors":{"type":"object","description":"A dictionary where each key contains the name of a field with a validation error and the value an array with the validation errors"}}},"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"}}}},"ValidationError":{"description":"There was a validation error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ValidationError"}}}},"ServerError":{"description":"Unexpected error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerError"}}}}}},"paths":{"/status_pages/{subdomain}/webhooks":{"post":{"tags":["Webhooks"],"summary":"Adds a new webhook","operationId":"addWebhook","parameters":[{"$ref":"#/components/parameters/StatusPageSubdomain"}],"requestBody":{"description":"The webhook","content":{"application/json":{"schema":{"$ref":"#/components/schemas/WebhookObj"}}},"required":true},"responses":{"200":{"description":"The webhook was created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/WebhookObj"}}}},"400":{"$ref":"#/components/responses/BadRequestError"},"401":{"$ref":"#/components/responses/UnauthorizedError"},"422":{"$ref":"#/components/responses/ValidationError"},"500":{"$ref":"#/components/responses/ServerError"}}}}}}
```

## GET /status\_pages/{subdomain}/webhooks/{webhookId}

> Get a webhook

```json
{"openapi":"3.0.1","info":{"title":"StatusPal API Reference","version":"2.0.0"},"tags":[{"name":"Webhooks","description":"Webhooks endpoints"}],"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":{"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"}},"WebhookId":{"name":"webhookId","in":"path","description":"The ID of a webhook","required":true,"schema":{"type":"integer"}}},"schemas":{"WebhookObj":{"type":"object","properties":{"webhook":{"$ref":"#/components/schemas/Webhook"}}},"Webhook":{"required":["enabled","events","url"],"type":"object","properties":{"url":{"type":"string","description":"The endpoint URL of the webhook to send the POST request to when the specified events occur."},"events":{"type":"array","description":"Available events:\n* `service.monitored_status.updated` - Triggered when a service configured with our internal monitoring goes up/down.\n* `incident.created`, `incident.updated`, `incident.deleted` - Triggered during the lifecycle of an incident, they all send the same payload.\n","items":{"type":"string"}},"enabled":{"type":"boolean","description":"Toggles the webhook's state."}}},"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":{"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":{"/status_pages/{subdomain}/webhooks/{webhookId}":{"get":{"tags":["Webhooks"],"summary":"Get a webhook","operationId":"getWebhook","parameters":[{"$ref":"#/components/parameters/StatusPageSubdomain"},{"$ref":"#/components/parameters/WebhookId"}],"responses":{"200":{"description":"The webhook","content":{"application/json":{"schema":{"$ref":"#/components/schemas/WebhookObj"}}}},"401":{"$ref":"#/components/responses/UnauthorizedError"},"403":{"$ref":"#/components/responses/ForbiddenError"},"404":{"$ref":"#/components/responses/NotFoundError"},"500":{"$ref":"#/components/responses/ServerError"}}}}}}
```

## PUT /status\_pages/{subdomain}/webhooks/{webhookId}

> Update the webhook

```json
{"openapi":"3.0.1","info":{"title":"StatusPal API Reference","version":"2.0.0"},"tags":[{"name":"Webhooks","description":"Webhooks endpoints"}],"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":{"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"}},"WebhookId":{"name":"webhookId","in":"path","description":"The ID of a webhook","required":true,"schema":{"type":"integer"}}},"schemas":{"WebhookObj":{"type":"object","properties":{"webhook":{"$ref":"#/components/schemas/Webhook"}}},"Webhook":{"required":["enabled","events","url"],"type":"object","properties":{"url":{"type":"string","description":"The endpoint URL of the webhook to send the POST request to when the specified events occur."},"events":{"type":"array","description":"Available events:\n* `service.monitored_status.updated` - Triggered when a service configured with our internal monitoring goes up/down.\n* `incident.created`, `incident.updated`, `incident.deleted` - Triggered during the lifecycle of an incident, they all send the same payload.\n","items":{"type":"string"}},"enabled":{"type":"boolean","description":"Toggles the webhook's state."}}},"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!"}}},"ValidationError":{"type":"object","properties":{"errors":{"type":"object","description":"A dictionary where each key contains the name of a field with a validation error and the value an array with the validation errors"}}},"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"}}}},"ValidationError":{"description":"There was a validation error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ValidationError"}}}},"ServerError":{"description":"Unexpected error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerError"}}}}}},"paths":{"/status_pages/{subdomain}/webhooks/{webhookId}":{"put":{"tags":["Webhooks"],"summary":"Update the webhook","operationId":"updateWebhook","parameters":[{"$ref":"#/components/parameters/StatusPageSubdomain"},{"$ref":"#/components/parameters/WebhookId"}],"requestBody":{"description":"The webhook","content":{"application/json":{"schema":{"$ref":"#/components/schemas/WebhookObj"}}},"required":true},"responses":{"200":{"description":"The webhook was updated","content":{"application/json":{"schema":{"$ref":"#/components/schemas/WebhookObj"}}}},"400":{"$ref":"#/components/responses/BadRequestError"},"401":{"$ref":"#/components/responses/UnauthorizedError"},"403":{"$ref":"#/components/responses/ForbiddenError"},"404":{"$ref":"#/components/responses/NotFoundError"},"422":{"$ref":"#/components/responses/ValidationError"},"500":{"$ref":"#/components/responses/ServerError"}}}}}}
```

## DELETE /status\_pages/{subdomain}/webhooks/{webhookId}

> Deletes the webhook

```json
{"openapi":"3.0.1","info":{"title":"StatusPal API Reference","version":"2.0.0"},"tags":[{"name":"Webhooks","description":"Webhooks endpoints"}],"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":{"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"}},"WebhookId":{"name":"webhookId","in":"path","description":"The ID of a webhook","required":true,"schema":{"type":"integer"}}},"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":{"/status_pages/{subdomain}/webhooks/{webhookId}":{"delete":{"tags":["Webhooks"],"summary":"Deletes the webhook","operationId":"deleteWebhook","parameters":[{"$ref":"#/components/parameters/StatusPageSubdomain"},{"$ref":"#/components/parameters/WebhookId"}],"responses":{"204":{"description":"Webhook deleted successfully","content":{}},"401":{"$ref":"#/components/responses/UnauthorizedError"},"403":{"$ref":"#/components/responses/ForbiddenError"},"404":{"$ref":"#/components/responses/NotFoundError"},"500":{"$ref":"#/components/responses/ServerError"}}}}}}
```


# Access Groups

Access Groups endpoints

## GET /status\_pages/{subdomain}/access\_groups

> List all access groups

```json
{"openapi":"3.0.1","info":{"title":"StatusPal API Reference","version":"2.0.0"},"tags":[{"name":"Access Groups","description":"Access Groups endpoints"}],"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":{"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":{"AccessGroup":{"required":["name","service_ids"],"type":"object","properties":{"id":{"type":"integer","description":"The access group's id.","readOnly":true},"name":{"type":"string","description":"The name of the access group."},"service_ids":{"type":"array","items":{"type":"integer"},"description":"An array of service Ids, at least 1 must be included"},"users_status_pages":{"type":"array","items":{"type":"integer"},"description":"An array of status page member Ids"}}},"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":{"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":{"/status_pages/{subdomain}/access_groups":{"get":{"tags":["Access Groups"],"summary":"List all access groups","operationId":"getAccessGroups","parameters":[{"$ref":"#/components/parameters/StatusPageSubdomain"}],"responses":{"200":{"description":"The list of access groups","content":{"application/json":{"schema":{"type":"object","properties":{"access_groups":{"type":"array","items":{"$ref":"#/components/schemas/AccessGroup"}}}}}}},"401":{"$ref":"#/components/responses/UnauthorizedError"},"403":{"$ref":"#/components/responses/ForbiddenError"},"404":{"$ref":"#/components/responses/NotFoundError"},"500":{"$ref":"#/components/responses/ServerError"}}}}}}
```

## POST /status\_pages/{subdomain}/access\_groups

> Adds a new access group

```json
{"openapi":"3.0.1","info":{"title":"StatusPal API Reference","version":"2.0.0"},"tags":[{"name":"Access Groups","description":"Access Groups endpoints"}],"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":{"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":{"AccessGroupObj":{"type":"object","properties":{"access_group":{"$ref":"#/components/schemas/AccessGroup"}}},"AccessGroup":{"required":["name","service_ids"],"type":"object","properties":{"id":{"type":"integer","description":"The access group's id.","readOnly":true},"name":{"type":"string","description":"The name of the access group."},"service_ids":{"type":"array","items":{"type":"integer"},"description":"An array of service Ids, at least 1 must be included"},"users_status_pages":{"type":"array","items":{"type":"integer"},"description":"An array of status page member Ids"}}},"BadRequestError":{"type":"object","properties":{"error":{"type":"string","description":"Bad request!"}}},"UnauthorizedError":{"type":"object","properties":{"error":{"type":"integer","description":"Unauthorized"}}},"ValidationError":{"type":"object","properties":{"errors":{"type":"object","description":"A dictionary where each key contains the name of a field with a validation error and the value an array with the validation errors"}}},"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"}}}},"ValidationError":{"description":"There was a validation error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ValidationError"}}}},"ServerError":{"description":"Unexpected error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerError"}}}}}},"paths":{"/status_pages/{subdomain}/access_groups":{"post":{"tags":["Access Groups"],"summary":"Adds a new access group","operationId":"addAccessGroup","parameters":[{"$ref":"#/components/parameters/StatusPageSubdomain"}],"requestBody":{"description":"The access group","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AccessGroupObj"}}},"required":true},"responses":{"200":{"description":"The access group was created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AccessGroupObj"}}}},"400":{"$ref":"#/components/responses/BadRequestError"},"401":{"$ref":"#/components/responses/UnauthorizedError"},"422":{"$ref":"#/components/responses/ValidationError"},"500":{"$ref":"#/components/responses/ServerError"}}}}}}
```

## GET /status\_pages/{subdomain}/access\_groups/{accessGroupId}

> Get an access group

```json
{"openapi":"3.0.1","info":{"title":"StatusPal API Reference","version":"2.0.0"},"tags":[{"name":"Access Groups","description":"Access Groups endpoints"}],"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":{"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"}},"AccessGroupId":{"name":"accessGroupId","in":"path","description":"The ID of an access group","required":true,"schema":{"type":"integer"}}},"schemas":{"AccessGroupObj":{"type":"object","properties":{"access_group":{"$ref":"#/components/schemas/AccessGroup"}}},"AccessGroup":{"required":["name","service_ids"],"type":"object","properties":{"id":{"type":"integer","description":"The access group's id.","readOnly":true},"name":{"type":"string","description":"The name of the access group."},"service_ids":{"type":"array","items":{"type":"integer"},"description":"An array of service Ids, at least 1 must be included"},"users_status_pages":{"type":"array","items":{"type":"integer"},"description":"An array of status page member Ids"}}},"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":{"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":{"/status_pages/{subdomain}/access_groups/{accessGroupId}":{"get":{"tags":["Access Groups"],"summary":"Get an access group","operationId":"getAccessGroup","parameters":[{"$ref":"#/components/parameters/StatusPageSubdomain"},{"$ref":"#/components/parameters/AccessGroupId"}],"responses":{"200":{"description":"The access group","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AccessGroupObj"}}}},"401":{"$ref":"#/components/responses/UnauthorizedError"},"403":{"$ref":"#/components/responses/ForbiddenError"},"404":{"$ref":"#/components/responses/NotFoundError"},"500":{"$ref":"#/components/responses/ServerError"}}}}}}
```

## PUT /status\_pages/{subdomain}/access\_groups/{accessGroupId}

> Update the access group

```json
{"openapi":"3.0.1","info":{"title":"StatusPal API Reference","version":"2.0.0"},"tags":[{"name":"Access Groups","description":"Access Groups endpoints"}],"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":{"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"}},"AccessGroupId":{"name":"accessGroupId","in":"path","description":"The ID of an access group","required":true,"schema":{"type":"integer"}}},"schemas":{"AccessGroupObj":{"type":"object","properties":{"access_group":{"$ref":"#/components/schemas/AccessGroup"}}},"AccessGroup":{"required":["name","service_ids"],"type":"object","properties":{"id":{"type":"integer","description":"The access group's id.","readOnly":true},"name":{"type":"string","description":"The name of the access group."},"service_ids":{"type":"array","items":{"type":"integer"},"description":"An array of service Ids, at least 1 must be included"},"users_status_pages":{"type":"array","items":{"type":"integer"},"description":"An array of status page member Ids"}}},"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!"}}},"ValidationError":{"type":"object","properties":{"errors":{"type":"object","description":"A dictionary where each key contains the name of a field with a validation error and the value an array with the validation errors"}}},"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"}}}},"ValidationError":{"description":"There was a validation error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ValidationError"}}}},"ServerError":{"description":"Unexpected error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerError"}}}}}},"paths":{"/status_pages/{subdomain}/access_groups/{accessGroupId}":{"put":{"tags":["Access Groups"],"summary":"Update the access group","operationId":"updateAccessGroup","parameters":[{"$ref":"#/components/parameters/StatusPageSubdomain"},{"$ref":"#/components/parameters/AccessGroupId"}],"requestBody":{"description":"The access group","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AccessGroupObj"}}},"required":true},"responses":{"200":{"description":"The access group was updated","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AccessGroupObj"}}}},"400":{"$ref":"#/components/responses/BadRequestError"},"401":{"$ref":"#/components/responses/UnauthorizedError"},"403":{"$ref":"#/components/responses/ForbiddenError"},"404":{"$ref":"#/components/responses/NotFoundError"},"422":{"$ref":"#/components/responses/ValidationError"},"500":{"$ref":"#/components/responses/ServerError"}}}}}}
```

## DELETE /status\_pages/{subdomain}/access\_groups/{accessGroupId}

> Deletes the access group

```json
{"openapi":"3.0.1","info":{"title":"StatusPal API Reference","version":"2.0.0"},"tags":[{"name":"Access Groups","description":"Access Groups endpoints"}],"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":{"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"}},"AccessGroupId":{"name":"accessGroupId","in":"path","description":"The ID of an access group","required":true,"schema":{"type":"integer"}}},"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":{"/status_pages/{subdomain}/access_groups/{accessGroupId}":{"delete":{"tags":["Access Groups"],"summary":"Deletes the access group","operationId":"deleteAccessGroup","parameters":[{"$ref":"#/components/parameters/StatusPageSubdomain"},{"$ref":"#/components/parameters/AccessGroupId"}],"responses":{"204":{"description":"Access group deleted successfully","content":{}},"401":{"$ref":"#/components/responses/UnauthorizedError"},"403":{"$ref":"#/components/responses/ForbiddenError"},"404":{"$ref":"#/components/responses/NotFoundError"},"500":{"$ref":"#/components/responses/ServerError"}}}}}}
```


# Status Page Members

Status Page Members endpoints

## GET /status\_pages/{subdomain}/members

> List all members

```json
{"openapi":"3.0.1","info":{"title":"StatusPal API Reference","version":"2.0.0"},"tags":[{"name":"Status Page Members","description":"Status Page Members endpoints"}],"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":{"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":{"StatusPageMember":{"type":"object","properties":{"id":{"type":"integer","description":"The member's id.","readOnly":true},"email":{"type":"string","description":"The member's email address.","readOnly":true},"role":{"type":"string","description":"The membership role.\nAvailable roles:\n* `c` - Editor\n* `v` - Viewer\n* `a` - Admin\n"},"enabled":{"type":"boolean","description":"Toggles the membership's state."},"user":{"type":"object","properties":{"id":{"type":"integer","description":"The user's id.","readOnly":true},"last_sign_in_at":{"type":"string","description":"The date and time the user signed in before their current session","format":"date-time","readOnly":true},"current_sign_in_at":{"type":"string","description":"The date and time the user signed in for their current session","format":"date-time","readOnly":true}},"description":"The related User object (if there is one).","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}}},"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":{"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":{"/status_pages/{subdomain}/members":{"get":{"tags":["Status Page Members"],"summary":"List all members","operationId":"getStatusPageMembers","parameters":[{"$ref":"#/components/parameters/StatusPageSubdomain"},{"name":"before","in":"query","description":"Used as a cursor for pagination.","schema":{"type":"string"}},{"name":"after","in":"query","description":"Used as a cursor for pagination.","schema":{"type":"string"}},{"name":"limit","in":"query","description":"Set the number of subscriptions to return in the response.\nThis defaults to 20 items, and can be a maximum of 100.\n","schema":{"type":"integer"}},{"name":"email","in":"query","description":"Filter the members by email.","schema":{"type":"string"}}],"responses":{"200":{"description":"The list of members","content":{"application/json":{"schema":{"type":"object","properties":{"members":{"type":"array","items":{"$ref":"#/components/schemas/StatusPageMember"}},"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 members."}}}}}}}},"401":{"$ref":"#/components/responses/UnauthorizedError"},"403":{"$ref":"#/components/responses/ForbiddenError"},"404":{"$ref":"#/components/responses/NotFoundError"},"500":{"$ref":"#/components/responses/ServerError"}}}}}}
```

## POST /status\_pages/{subdomain}/members

> Adds a new membership

```json
{"openapi":"3.0.1","info":{"title":"StatusPal API Reference","version":"2.0.0"},"tags":[{"name":"Status Page Members","description":"Status Page Members endpoints"}],"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":{"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":{"StatusPageMemberObj":{"type":"object","properties":{"member":{"$ref":"#/components/schemas/StatusPageMember"}}},"StatusPageMember":{"type":"object","properties":{"id":{"type":"integer","description":"The member's id.","readOnly":true},"email":{"type":"string","description":"The member's email address.","readOnly":true},"role":{"type":"string","description":"The membership role.\nAvailable roles:\n* `c` - Editor\n* `v` - Viewer\n* `a` - Admin\n"},"enabled":{"type":"boolean","description":"Toggles the membership's state."},"user":{"type":"object","properties":{"id":{"type":"integer","description":"The user's id.","readOnly":true},"last_sign_in_at":{"type":"string","description":"The date and time the user signed in before their current session","format":"date-time","readOnly":true},"current_sign_in_at":{"type":"string","description":"The date and time the user signed in for their current session","format":"date-time","readOnly":true}},"description":"The related User object (if there is one).","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}}},"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"}}},"ValidationError":{"type":"object","properties":{"errors":{"type":"object","description":"A dictionary where each key contains the name of a field with a validation error and the value an array with the validation errors"}}},"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"}}}},"ValidationError":{"description":"There was a validation error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ValidationError"}}}},"ServerError":{"description":"Unexpected error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerError"}}}}}},"paths":{"/status_pages/{subdomain}/members":{"post":{"tags":["Status Page Members"],"summary":"Adds a new membership","operationId":"addStatusPageMembers","parameters":[{"$ref":"#/components/parameters/StatusPageSubdomain"}],"requestBody":{"description":"The membership","content":{"application/json":{"schema":{"type":"object","properties":{"member":{"type":"object","properties":{"email":{"type":"string","description":"The member's email address."},"role":{"type":"string","description":"The membership role.\nAvailable roles:\n* `c` - Editor\n* `v` - Viewer\n* `a` - Admin\n"},"enabled":{"type":"boolean","description":"Toggles the membership's state."},"lang":{"type":"string","description":"Used to set the language of the invitation email. Available values depend on the languages supported by the status page. If omitted, the status page's default language is used."}}}}}}},"required":true},"responses":{"200":{"description":"The membership was created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/StatusPageMemberObj"}}}},"400":{"$ref":"#/components/responses/BadRequestError"},"401":{"$ref":"#/components/responses/UnauthorizedError"},"403":{"$ref":"#/components/responses/ForbiddenError"},"422":{"$ref":"#/components/responses/ValidationError"},"500":{"$ref":"#/components/responses/ServerError"}}}}}}
```

## PUT /status\_pages/{subdomain}/members/{memberId}

> Update the membership

```json
{"openapi":"3.0.1","info":{"title":"StatusPal API Reference","version":"2.0.0"},"tags":[{"name":"Status Page Members","description":"Status Page Members endpoints"}],"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":{"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"}},"MemberId":{"name":"memberId","in":"path","description":"The ID of a membership","required":true,"schema":{"type":"integer"}}},"schemas":{"StatusPageMemberObj":{"type":"object","properties":{"member":{"$ref":"#/components/schemas/StatusPageMember"}}},"StatusPageMember":{"type":"object","properties":{"id":{"type":"integer","description":"The member's id.","readOnly":true},"email":{"type":"string","description":"The member's email address.","readOnly":true},"role":{"type":"string","description":"The membership role.\nAvailable roles:\n* `c` - Editor\n* `v` - Viewer\n* `a` - Admin\n"},"enabled":{"type":"boolean","description":"Toggles the membership's state."},"user":{"type":"object","properties":{"id":{"type":"integer","description":"The user's id.","readOnly":true},"last_sign_in_at":{"type":"string","description":"The date and time the user signed in before their current session","format":"date-time","readOnly":true},"current_sign_in_at":{"type":"string","description":"The date and time the user signed in for their current session","format":"date-time","readOnly":true}},"description":"The related User object (if there is one).","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}}},"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!"}}},"ValidationError":{"type":"object","properties":{"errors":{"type":"object","description":"A dictionary where each key contains the name of a field with a validation error and the value an array with the validation errors"}}},"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"}}}},"ValidationError":{"description":"There was a validation error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ValidationError"}}}},"ServerError":{"description":"Unexpected error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerError"}}}}}},"paths":{"/status_pages/{subdomain}/members/{memberId}":{"put":{"tags":["Status Page Members"],"summary":"Update the membership","operationId":"updateStatusPageMember","parameters":[{"$ref":"#/components/parameters/StatusPageSubdomain"},{"$ref":"#/components/parameters/MemberId"}],"requestBody":{"description":"The membership","content":{"application/json":{"schema":{"$ref":"#/components/schemas/StatusPageMemberObj"}}},"required":true},"responses":{"200":{"description":"The membership was updated","content":{"application/json":{"schema":{"$ref":"#/components/schemas/StatusPageMemberObj"}}}},"400":{"$ref":"#/components/responses/BadRequestError"},"401":{"$ref":"#/components/responses/UnauthorizedError"},"403":{"$ref":"#/components/responses/ForbiddenError"},"404":{"$ref":"#/components/responses/NotFoundError"},"422":{"$ref":"#/components/responses/ValidationError"},"500":{"$ref":"#/components/responses/ServerError"}}}}}}
```

## DELETE /status\_pages/{subdomain}/members/{memberId}

> Deletes the membership

```json
{"openapi":"3.0.1","info":{"title":"StatusPal API Reference","version":"2.0.0"},"tags":[{"name":"Status Page Members","description":"Status Page Members endpoints"}],"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":{"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"}},"MemberId":{"name":"memberId","in":"path","description":"The ID of a membership","required":true,"schema":{"type":"integer"}}},"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":{"/status_pages/{subdomain}/members/{memberId}":{"delete":{"tags":["Status Page Members"],"summary":"Deletes the membership","operationId":"deleteStatusPageMember","parameters":[{"$ref":"#/components/parameters/StatusPageSubdomain"},{"$ref":"#/components/parameters/MemberId"}],"responses":{"204":{"description":"Member deleted successfully","content":{}},"401":{"$ref":"#/components/responses/UnauthorizedError"},"403":{"$ref":"#/components/responses/ForbiddenError"},"404":{"$ref":"#/components/responses/NotFoundError"},"500":{"$ref":"#/components/responses/ServerError"}}}}}}
```


# Organization Members

Organization Members endpoints

## GET /orgs/{organizationId}/members

> List all members

```json
{"openapi":"3.0.1","info":{"title":"StatusPal API Reference","version":"2.0.0"},"tags":[{"name":"Organization Members","description":"Organization Members endpoints"}],"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":{"OrganizationMember":{"type":"object","properties":{"id":{"type":"integer","description":"The member's id.","readOnly":true},"email":{"type":"string","description":"The member's email address.","readOnly":true},"role":{"type":"string","description":"The membership role.\nAvailable roles:\n* `c` - Editor\n* `v` - Viewer\n* `a` - Admin\n* `o` - Owner\n"},"user":{"type":"object","properties":{"id":{"type":"integer","description":"The user's id.","readOnly":true},"last_sign_in_at":{"type":"string","description":"The date and time the user signed in before their current session","format":"date-time","readOnly":true},"current_sign_in_at":{"type":"string","description":"The date and time the user signed in for their current session","format":"date-time","readOnly":true}},"description":"The related User object (if there is one).","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}}},"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":{"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}/members":{"get":{"tags":["Organization Members"],"summary":"List all members","operationId":"getMembers","parameters":[{"$ref":"#/components/parameters/OrganizationId"},{"name":"before","in":"query","description":"Used as a cursor for pagination.","schema":{"type":"string"}},{"name":"after","in":"query","description":"Used as a cursor for pagination.","schema":{"type":"string"}},{"name":"limit","in":"query","description":"Set the number of subscriptions to return in the response.\nThis defaults to 20 items, and can be a maximum of 100.\n","schema":{"type":"integer"}},{"name":"email","in":"query","description":"Filter the members by email.","schema":{"type":"string"}}],"responses":{"200":{"description":"The list of members","content":{"application/json":{"schema":{"type":"object","properties":{"members":{"type":"array","items":{"$ref":"#/components/schemas/OrganizationMember"}},"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 members."}}}}}}}},"401":{"$ref":"#/components/responses/UnauthorizedError"},"403":{"$ref":"#/components/responses/ForbiddenError"},"404":{"$ref":"#/components/responses/NotFoundError"},"500":{"$ref":"#/components/responses/ServerError"}}}}}}
```

## POST /orgs/{organizationId}/members

> Adds a new membership

```json
{"openapi":"3.0.1","info":{"title":"StatusPal API Reference","version":"2.0.0"},"tags":[{"name":"Organization Members","description":"Organization Members endpoints"}],"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":{"OrganizationMemberObj":{"type":"object","properties":{"member":{"$ref":"#/components/schemas/OrganizationMember"}}},"OrganizationMember":{"type":"object","properties":{"id":{"type":"integer","description":"The member's id.","readOnly":true},"email":{"type":"string","description":"The member's email address.","readOnly":true},"role":{"type":"string","description":"The membership role.\nAvailable roles:\n* `c` - Editor\n* `v` - Viewer\n* `a` - Admin\n* `o` - Owner\n"},"user":{"type":"object","properties":{"id":{"type":"integer","description":"The user's id.","readOnly":true},"last_sign_in_at":{"type":"string","description":"The date and time the user signed in before their current session","format":"date-time","readOnly":true},"current_sign_in_at":{"type":"string","description":"The date and time the user signed in for their current session","format":"date-time","readOnly":true}},"description":"The related User object (if there is one).","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}}},"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"}}},"ValidationError":{"type":"object","properties":{"errors":{"type":"object","description":"A dictionary where each key contains the name of a field with a validation error and the value an array with the validation errors"}}},"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"}}}},"ValidationError":{"description":"There was a validation error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ValidationError"}}}},"ServerError":{"description":"Unexpected error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerError"}}}}}},"paths":{"/orgs/{organizationId}/members":{"post":{"tags":["Organization Members"],"summary":"Adds a new membership","operationId":"addMember","parameters":[{"$ref":"#/components/parameters/OrganizationId"}],"requestBody":{"description":"The membership","content":{"application/json":{"schema":{"type":"object","properties":{"member":{"type":"object","properties":{"email":{"type":"string","description":"The member's email address."},"role":{"type":"string","description":"The membership role.\nAvailable roles:\n* `c` - Editor\n* `v` - Viewer\n* `a` - Admin\n* `o` - Owner\n"}}}}}}},"required":true},"responses":{"200":{"description":"The membership was created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/OrganizationMemberObj"}}}},"400":{"$ref":"#/components/responses/BadRequestError"},"401":{"$ref":"#/components/responses/UnauthorizedError"},"403":{"$ref":"#/components/responses/ForbiddenError"},"422":{"$ref":"#/components/responses/ValidationError"},"500":{"$ref":"#/components/responses/ServerError"}}}}}}
```

## PUT /orgs/{organizationId}/members/{memberId}

> Update the membership

```json
{"openapi":"3.0.1","info":{"title":"StatusPal API Reference","version":"2.0.0"},"tags":[{"name":"Organization Members","description":"Organization Members endpoints"}],"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"}},"MemberId":{"name":"memberId","in":"path","description":"The ID of a membership","required":true,"schema":{"type":"integer"}}},"schemas":{"OrganizationMemberObj":{"type":"object","properties":{"member":{"$ref":"#/components/schemas/OrganizationMember"}}},"OrganizationMember":{"type":"object","properties":{"id":{"type":"integer","description":"The member's id.","readOnly":true},"email":{"type":"string","description":"The member's email address.","readOnly":true},"role":{"type":"string","description":"The membership role.\nAvailable roles:\n* `c` - Editor\n* `v` - Viewer\n* `a` - Admin\n* `o` - Owner\n"},"user":{"type":"object","properties":{"id":{"type":"integer","description":"The user's id.","readOnly":true},"last_sign_in_at":{"type":"string","description":"The date and time the user signed in before their current session","format":"date-time","readOnly":true},"current_sign_in_at":{"type":"string","description":"The date and time the user signed in for their current session","format":"date-time","readOnly":true}},"description":"The related User object (if there is one).","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}}},"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!"}}},"ValidationError":{"type":"object","properties":{"errors":{"type":"object","description":"A dictionary where each key contains the name of a field with a validation error and the value an array with the validation errors"}}},"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"}}}},"ValidationError":{"description":"There was a validation error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ValidationError"}}}},"ServerError":{"description":"Unexpected error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerError"}}}}}},"paths":{"/orgs/{organizationId}/members/{memberId}":{"put":{"tags":["Organization Members"],"summary":"Update the membership","operationId":"updateMember","parameters":[{"$ref":"#/components/parameters/OrganizationId"},{"$ref":"#/components/parameters/MemberId"}],"requestBody":{"description":"The membership","content":{"application/json":{"schema":{"$ref":"#/components/schemas/OrganizationMemberObj"}}},"required":true},"responses":{"200":{"description":"The membership was updated","content":{"application/json":{"schema":{"$ref":"#/components/schemas/OrganizationMemberObj"}}}},"400":{"$ref":"#/components/responses/BadRequestError"},"401":{"$ref":"#/components/responses/UnauthorizedError"},"403":{"$ref":"#/components/responses/ForbiddenError"},"404":{"$ref":"#/components/responses/NotFoundError"},"422":{"$ref":"#/components/responses/ValidationError"},"500":{"$ref":"#/components/responses/ServerError"}}}}}}
```

## DELETE /orgs/{organizationId}/members/{memberId}

> Deletes the membership

```json
{"openapi":"3.0.1","info":{"title":"StatusPal API Reference","version":"2.0.0"},"tags":[{"name":"Organization Members","description":"Organization Members endpoints"}],"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"}},"MemberId":{"name":"memberId","in":"path","description":"The ID of a membership","required":true,"schema":{"type":"integer"}}},"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}/members/{memberId}":{"delete":{"tags":["Organization Members"],"summary":"Deletes the membership","operationId":"deleteMember","parameters":[{"$ref":"#/components/parameters/OrganizationId"},{"$ref":"#/components/parameters/MemberId"}],"responses":{"204":{"description":"Member deleted successfully","content":{}},"401":{"$ref":"#/components/responses/UnauthorizedError"},"403":{"$ref":"#/components/responses/ForbiddenError"},"404":{"$ref":"#/components/responses/NotFoundError"},"500":{"$ref":"#/components/responses/ServerError"}}}}}}
```


# Models

## The OrganizationStatusPage object

````json
{"openapi":"3.0.1","info":{"title":"StatusPal API Reference","version":"2.0.0"},"components":{"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."}}}}}}
````

## The StatusPageStatus object

```json
{"openapi":"3.0.1","info":{"title":"StatusPal API Reference","version":"2.0.0"},"components":{"schemas":{"StatusPageStatus":{"description":"Represents the status summary of a status page","type":"object","properties":{"status_page":{"type":"object","properties":{"url":{"type":"string","description":"The URL of the website the status page is about"},"time_zone":{"type":"string","description":"The primary timezone the status page uses to display incidents"},"subdomain":{"type":"string","description":"The `subdomain` that identified the status page"},"name":{"type":"string","description":"The name of the company or service the status page is about"},"current_incident_type":{"$ref":"#/components/schemas/IncidentType"}}}}},"IncidentType":{"type":"string","description":"The type of the (current) incident:\n * `minor` - A minor incident is currently taking place.\n * `major` - A major incident is currently taking place.\n * `scheduled` - A scheduled maintenance is currently taking place.\n","enum":["major","minor","scheduled"]}}}}
```

## The StatusPageSummary object

````json
{"openapi":"3.0.1","info":{"title":"StatusPal API Reference","version":"2.0.0"},"components":{"schemas":{"StatusPageSummary":{"description":"Represents the status summary of a status page","allOf":[{"$ref":"#/components/schemas/StatusPageStatus"},{"type":"object","properties":{"services":{"type":"array","items":{"$ref":"#/components/schemas/StatusService"}},"incidents":{"type":"array","description":"Active incidents","items":{"$ref":"#/components/schemas/Incident"}},"maintenances":{"type":"array","description":"Active maintenances","items":{"$ref":"#/components/schemas/Maintenance"}},"upcoming_maintenances":{"type":"array","description":"Upcoming maintenances","items":{"$ref":"#/components/schemas/Maintenance"}},"info_notices":{"type":"array","description":"Featured information notices","items":{"$ref":"#/components/schemas/InfoNotice"}},"current_status_type":{"type":"string","nullable":true,"enum":[null,"major","scheduled","minor"],"description":"The current status type of the status page"}}}]},"StatusPageStatus":{"description":"Represents the status summary of a status page","type":"object","properties":{"status_page":{"type":"object","properties":{"url":{"type":"string","description":"The URL of the website the status page is about"},"time_zone":{"type":"string","description":"The primary timezone the status page uses to display incidents"},"subdomain":{"type":"string","description":"The `subdomain` that identified the status page"},"name":{"type":"string","description":"The name of the company or service the status page is about"},"current_incident_type":{"$ref":"#/components/schemas/IncidentType"}}}}},"IncidentType":{"type":"string","description":"The type of the (current) incident:\n * `minor` - A minor incident is currently taking place.\n * `major` - A major incident is currently taking place.\n * `scheduled` - A scheduled maintenance is currently taking place.\n","enum":["major","minor","scheduled"]},"StatusService":{"description":"Represents the status of a service","type":"object","properties":{"name":{"type":"string"},"id":{"type":"integer"},"current_incident_type":{"$ref":"#/components/schemas/IncidentType"},"children":{"type":"array","description":"Nested ServiceSummary children","items":{"$ref":"#/components/schemas/StatusService"}}}},"Incident":{"type":"object","description":"An incident, either major, minor or a scheduled maintenance","required":["service_ids","type","updates","title"],"properties":{"id":{"type":"integer","description":"ID of the record","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},"title":{"type":"string","description":"The title of the incident"},"starts_at":{"type":"string","description":"The time at which the incident/maintenance started/will start.","format":"date-time"},"ends_at":{"type":"string","description":"The time at which the incident/maintenance ended/will end.","format":"date-time"},"type":{"$ref":"#/components/schemas/IncidentType"},"service_ids":{"type":"array","description":"An array of service Ids, at least 1 must be included","items":{"type":"integer"}},"updates":{"type":"array","description":"The incident's updates. On incident creation you must pass exactly one update object in the array, if the incident is of type minor/major the update type `issue` is recommended, if a scheduled maintenance then use `scheduled`.","items":{"$ref":"#/components/schemas/IncidentActivity"}},"url":{"readOnly":true,"type":"string","description":"URL to the incident"},"translations":{"description":"A translations object. For example:\n```json\n{\n  \"en\": { \"title\": \"English Title\" },\n  \"es\": { \"title\": \"Spanish Title\" }\n}\n```\n","type":"object","additionalProperties":true,"properties":{"[lang]":{"description":"e.g. `en`.","type":"object","properties":{"title":{"type":"string"}}}}},"notify":{"type":"boolean","description":"Notify subscribers when creating an incident with `type` `major` or `minor`."},"maintenance_notify":{"type":"boolean","description":"Notify subscribers when creating an incident (maintenance) with `type` `scheduled`."},"maintenance_notify_settings":{"$ref":"#/components/schemas/MaintenanceNotifySettings"},"affects_uptime":{"readOnly":true,"description":"It's a boolean if the incident affects uptime.","type":"boolean"}}},"IncidentActivity":{"type":"object","description":"Communicates an update of an incident, the special type `resolved` will close an incident.","required":["type","description"],"properties":{"id":{"type":"integer","description":"ID of the record","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},"posted_at":{"type":"string","description":"Editable datetime at which the record was posted","format":"date-time"},"type":{"type":"string","description":"The type of an incident update:\n * `investigating` - Investigating.\n * `issue` - Issue.\n * `monitoring` - Monitoring.\n * `resolved` - Resolved will close the associated incident by settings its `ends_at` to the current time.\n * `scheduled` - Scheduled Maintenance's first update shall have this type.\n * `essential` - Essential Maintenance's first update shall have this type.\n * `retroactive` - Retroactive.\n * `update` - Standard update on an incident.\n * `escalate` - Escalate will switch the incident type from `minor` to `major`.\n * `deescalate` - De-escalate will switch the incident type from `major` to `minor`.\n * `postmortem` - A Post-mortem update.\n"},"description":{"type":"string","description":"The provided update description (accepts Markdown format)"},"description_html":{"type":"string","readOnly":true,"description":"The provided update description rendered in HTML"},"translations":{"description":"A translations object. For example:\n```json\n{\n  \"en\": { \"description\": \"English description\" },\n  \"es\": { \"description\": \"Spanish description\" }\n}\n```\n","type":"object","additionalProperties":true,"properties":{"[lang]":{"description":"e.g. `en`.","type":"object","properties":{"description":{"type":"string"}}}}},"notify":{"type":"boolean","description":"Should your subscribers be notified about this update?","writeOnly":true},"subscribers_notified_at":{"type":"string","description":"Datetime at which subscribers were notified for this update","format":"date-time","readOnly":true},"tweet":{"type":"boolean","description":"Tweet this update with your configured Twitter account?"}}},"MaintenanceNotifySettings":{"type":"object","description":"> ### Configure this field only if the `type` is set to `scheduled`. To take effect, the `maintenance_notify` must be set to `true`.\nOverrides the status page auto maintenance notification settings for this specific maintenance.\n","properties":{"before_notice_minutes":{"type":"integer","description":"The number of minutes to notify the subscribers before the maintenance start.\n* `-1` - Immediately\n* `0` - Never\n* Positive integer (`4320`, `5760`, `10080`, ...) - Before the maintenance start minutes\n"},"second_before_notice_minutes":{"type":"integer","description":"The number of minutes to notify the subscribers the second time before the maintenance start. It needs to be after the first \"before maintenance start\" notice.\n* `0` - Never\n* Positive integer (`720`, `1440`, `2880`, ...) - Before the maintenance start minutes\n"},"on_start":{"type":"boolean","description":"Notify subscribers when the maintenance starts."},"on_end":{"type":"boolean","description":"Notify subscribers when the maintenance ends."}}},"Maintenance":{"allOf":[{"$ref":"#/components/schemas/Incident"},{"type":"object","properties":{"type":{"$ref":"#/components/schemas/MaintenanceType"}}}]},"MaintenanceType":{"type":"string","description":"The type of the incident:\n * `scheduled` - Should be used for maintenances.\n","enum":["scheduled"]},"InfoNotice":{"type":"object","description":"An information notice","required":["updates","title"],"properties":{"id":{"type":"integer","description":"ID of the record","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},"title":{"type":"string","description":"The title of the information notice"},"featured_from":{"type":"string","description":"The time at which the information notice will display on the status page.","format":"date-time"},"featured_until":{"type":"string","description":"The time at which the information notice will not display on the status page.","format":"date-time"},"service_ids":{"type":"array","description":"An array of service Ids, at least 1 must be included","items":{"type":"integer"}},"updates":{"type":"array","description":"The information notice's updates. On information notice creation you must pass exactly one update object in the array.","items":{"$ref":"#/components/schemas/IncidentActivity"}},"url":{"readOnly":true,"type":"string","description":"URL to the information notice"},"translations":{"description":"A translations object. For example:\n```json\n{\n  \"en\": { \"title\": \"English Title\" },\n  \"es\": { \"title\": \"Spanish Title\" }\n}\n```\n","type":"object","additionalProperties":true,"properties":{"[lang]":{"description":"e.g. `en`.","type":"object","properties":{"title":{"type":"string"}}}}}}}}}}
````

## The ServiceStatus object

```json
{"openapi":"3.0.1","info":{"title":"StatusPal API Reference","version":"2.0.0"},"components":{"schemas":{"ServiceStatus":{"type":"object","properties":{"service":{"$ref":"#/components/schemas/StatusService"}}},"StatusService":{"description":"Represents the status of a service","type":"object","properties":{"name":{"type":"string"},"id":{"type":"integer"},"current_incident_type":{"$ref":"#/components/schemas/IncidentType"},"children":{"type":"array","description":"Nested ServiceSummary children","items":{"$ref":"#/components/schemas/StatusService"}}}},"IncidentType":{"type":"string","description":"The type of the (current) incident:\n * `minor` - A minor incident is currently taking place.\n * `major` - A major incident is currently taking place.\n * `scheduled` - A scheduled maintenance is currently taking place.\n","enum":["major","minor","scheduled"]}}}}
```

## The ServiceSummary object

````json
{"openapi":"3.0.1","info":{"title":"StatusPal API Reference","version":"2.0.0"},"components":{"schemas":{"ServiceSummary":{"allOf":[{"$ref":"#/components/schemas/ServiceStatus"},{"type":"object","properties":{"incidents":{"type":"array","description":"Active incidents","items":{"$ref":"#/components/schemas/Incident"}},"maintenances":{"type":"array","description":"Active maintenances","items":{"$ref":"#/components/schemas/Maintenance"}},"upcoming_maintenances":{"type":"array","description":"Upcoming maintenances","items":{"$ref":"#/components/schemas/Maintenance"}},"info_notices":{"type":"array","description":"Featured information notices","items":{"$ref":"#/components/schemas/InfoNotice"}},"current_status_type":{"type":"string","nullable":true,"enum":[null,"major","scheduled","minor"],"description":"The current status type of the status page"}}}]},"ServiceStatus":{"type":"object","properties":{"service":{"$ref":"#/components/schemas/StatusService"}}},"StatusService":{"description":"Represents the status of a service","type":"object","properties":{"name":{"type":"string"},"id":{"type":"integer"},"current_incident_type":{"$ref":"#/components/schemas/IncidentType"},"children":{"type":"array","description":"Nested ServiceSummary children","items":{"$ref":"#/components/schemas/StatusService"}}}},"IncidentType":{"type":"string","description":"The type of the (current) incident:\n * `minor` - A minor incident is currently taking place.\n * `major` - A major incident is currently taking place.\n * `scheduled` - A scheduled maintenance is currently taking place.\n","enum":["major","minor","scheduled"]},"Incident":{"type":"object","description":"An incident, either major, minor or a scheduled maintenance","required":["service_ids","type","updates","title"],"properties":{"id":{"type":"integer","description":"ID of the record","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},"title":{"type":"string","description":"The title of the incident"},"starts_at":{"type":"string","description":"The time at which the incident/maintenance started/will start.","format":"date-time"},"ends_at":{"type":"string","description":"The time at which the incident/maintenance ended/will end.","format":"date-time"},"type":{"$ref":"#/components/schemas/IncidentType"},"service_ids":{"type":"array","description":"An array of service Ids, at least 1 must be included","items":{"type":"integer"}},"updates":{"type":"array","description":"The incident's updates. On incident creation you must pass exactly one update object in the array, if the incident is of type minor/major the update type `issue` is recommended, if a scheduled maintenance then use `scheduled`.","items":{"$ref":"#/components/schemas/IncidentActivity"}},"url":{"readOnly":true,"type":"string","description":"URL to the incident"},"translations":{"description":"A translations object. For example:\n```json\n{\n  \"en\": { \"title\": \"English Title\" },\n  \"es\": { \"title\": \"Spanish Title\" }\n}\n```\n","type":"object","additionalProperties":true,"properties":{"[lang]":{"description":"e.g. `en`.","type":"object","properties":{"title":{"type":"string"}}}}},"notify":{"type":"boolean","description":"Notify subscribers when creating an incident with `type` `major` or `minor`."},"maintenance_notify":{"type":"boolean","description":"Notify subscribers when creating an incident (maintenance) with `type` `scheduled`."},"maintenance_notify_settings":{"$ref":"#/components/schemas/MaintenanceNotifySettings"},"affects_uptime":{"readOnly":true,"description":"It's a boolean if the incident affects uptime.","type":"boolean"}}},"IncidentActivity":{"type":"object","description":"Communicates an update of an incident, the special type `resolved` will close an incident.","required":["type","description"],"properties":{"id":{"type":"integer","description":"ID of the record","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},"posted_at":{"type":"string","description":"Editable datetime at which the record was posted","format":"date-time"},"type":{"type":"string","description":"The type of an incident update:\n * `investigating` - Investigating.\n * `issue` - Issue.\n * `monitoring` - Monitoring.\n * `resolved` - Resolved will close the associated incident by settings its `ends_at` to the current time.\n * `scheduled` - Scheduled Maintenance's first update shall have this type.\n * `essential` - Essential Maintenance's first update shall have this type.\n * `retroactive` - Retroactive.\n * `update` - Standard update on an incident.\n * `escalate` - Escalate will switch the incident type from `minor` to `major`.\n * `deescalate` - De-escalate will switch the incident type from `major` to `minor`.\n * `postmortem` - A Post-mortem update.\n"},"description":{"type":"string","description":"The provided update description (accepts Markdown format)"},"description_html":{"type":"string","readOnly":true,"description":"The provided update description rendered in HTML"},"translations":{"description":"A translations object. For example:\n```json\n{\n  \"en\": { \"description\": \"English description\" },\n  \"es\": { \"description\": \"Spanish description\" }\n}\n```\n","type":"object","additionalProperties":true,"properties":{"[lang]":{"description":"e.g. `en`.","type":"object","properties":{"description":{"type":"string"}}}}},"notify":{"type":"boolean","description":"Should your subscribers be notified about this update?","writeOnly":true},"subscribers_notified_at":{"type":"string","description":"Datetime at which subscribers were notified for this update","format":"date-time","readOnly":true},"tweet":{"type":"boolean","description":"Tweet this update with your configured Twitter account?"}}},"MaintenanceNotifySettings":{"type":"object","description":"> ### Configure this field only if the `type` is set to `scheduled`. To take effect, the `maintenance_notify` must be set to `true`.\nOverrides the status page auto maintenance notification settings for this specific maintenance.\n","properties":{"before_notice_minutes":{"type":"integer","description":"The number of minutes to notify the subscribers before the maintenance start.\n* `-1` - Immediately\n* `0` - Never\n* Positive integer (`4320`, `5760`, `10080`, ...) - Before the maintenance start minutes\n"},"second_before_notice_minutes":{"type":"integer","description":"The number of minutes to notify the subscribers the second time before the maintenance start. It needs to be after the first \"before maintenance start\" notice.\n* `0` - Never\n* Positive integer (`720`, `1440`, `2880`, ...) - Before the maintenance start minutes\n"},"on_start":{"type":"boolean","description":"Notify subscribers when the maintenance starts."},"on_end":{"type":"boolean","description":"Notify subscribers when the maintenance ends."}}},"Maintenance":{"allOf":[{"$ref":"#/components/schemas/Incident"},{"type":"object","properties":{"type":{"$ref":"#/components/schemas/MaintenanceType"}}}]},"MaintenanceType":{"type":"string","description":"The type of the incident:\n * `scheduled` - Should be used for maintenances.\n","enum":["scheduled"]},"InfoNotice":{"type":"object","description":"An information notice","required":["updates","title"],"properties":{"id":{"type":"integer","description":"ID of the record","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},"title":{"type":"string","description":"The title of the information notice"},"featured_from":{"type":"string","description":"The time at which the information notice will display on the status page.","format":"date-time"},"featured_until":{"type":"string","description":"The time at which the information notice will not display on the status page.","format":"date-time"},"service_ids":{"type":"array","description":"An array of service Ids, at least 1 must be included","items":{"type":"integer"}},"updates":{"type":"array","description":"The information notice's updates. On information notice creation you must pass exactly one update object in the array.","items":{"$ref":"#/components/schemas/IncidentActivity"}},"url":{"readOnly":true,"type":"string","description":"URL to the information notice"},"translations":{"description":"A translations object. For example:\n```json\n{\n  \"en\": { \"title\": \"English Title\" },\n  \"es\": { \"title\": \"Spanish Title\" }\n}\n```\n","type":"object","additionalProperties":true,"properties":{"[lang]":{"description":"e.g. `en`.","type":"object","properties":{"title":{"type":"string"}}}}}}}}}}
````

## The Incident object

````json
{"openapi":"3.0.1","info":{"title":"StatusPal API Reference","version":"2.0.0"},"components":{"schemas":{"Incident":{"type":"object","description":"An incident, either major, minor or a scheduled maintenance","required":["service_ids","type","updates","title"],"properties":{"id":{"type":"integer","description":"ID of the record","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},"title":{"type":"string","description":"The title of the incident"},"starts_at":{"type":"string","description":"The time at which the incident/maintenance started/will start.","format":"date-time"},"ends_at":{"type":"string","description":"The time at which the incident/maintenance ended/will end.","format":"date-time"},"type":{"$ref":"#/components/schemas/IncidentType"},"service_ids":{"type":"array","description":"An array of service Ids, at least 1 must be included","items":{"type":"integer"}},"updates":{"type":"array","description":"The incident's updates. On incident creation you must pass exactly one update object in the array, if the incident is of type minor/major the update type `issue` is recommended, if a scheduled maintenance then use `scheduled`.","items":{"$ref":"#/components/schemas/IncidentActivity"}},"url":{"readOnly":true,"type":"string","description":"URL to the incident"},"translations":{"description":"A translations object. For example:\n```json\n{\n  \"en\": { \"title\": \"English Title\" },\n  \"es\": { \"title\": \"Spanish Title\" }\n}\n```\n","type":"object","additionalProperties":true,"properties":{"[lang]":{"description":"e.g. `en`.","type":"object","properties":{"title":{"type":"string"}}}}},"notify":{"type":"boolean","description":"Notify subscribers when creating an incident with `type` `major` or `minor`."},"maintenance_notify":{"type":"boolean","description":"Notify subscribers when creating an incident (maintenance) with `type` `scheduled`."},"maintenance_notify_settings":{"$ref":"#/components/schemas/MaintenanceNotifySettings"},"affects_uptime":{"readOnly":true,"description":"It's a boolean if the incident affects uptime.","type":"boolean"}}},"IncidentType":{"type":"string","description":"The type of the (current) incident:\n * `minor` - A minor incident is currently taking place.\n * `major` - A major incident is currently taking place.\n * `scheduled` - A scheduled maintenance is currently taking place.\n","enum":["major","minor","scheduled"]},"IncidentActivity":{"type":"object","description":"Communicates an update of an incident, the special type `resolved` will close an incident.","required":["type","description"],"properties":{"id":{"type":"integer","description":"ID of the record","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},"posted_at":{"type":"string","description":"Editable datetime at which the record was posted","format":"date-time"},"type":{"type":"string","description":"The type of an incident update:\n * `investigating` - Investigating.\n * `issue` - Issue.\n * `monitoring` - Monitoring.\n * `resolved` - Resolved will close the associated incident by settings its `ends_at` to the current time.\n * `scheduled` - Scheduled Maintenance's first update shall have this type.\n * `essential` - Essential Maintenance's first update shall have this type.\n * `retroactive` - Retroactive.\n * `update` - Standard update on an incident.\n * `escalate` - Escalate will switch the incident type from `minor` to `major`.\n * `deescalate` - De-escalate will switch the incident type from `major` to `minor`.\n * `postmortem` - A Post-mortem update.\n"},"description":{"type":"string","description":"The provided update description (accepts Markdown format)"},"description_html":{"type":"string","readOnly":true,"description":"The provided update description rendered in HTML"},"translations":{"description":"A translations object. For example:\n```json\n{\n  \"en\": { \"description\": \"English description\" },\n  \"es\": { \"description\": \"Spanish description\" }\n}\n```\n","type":"object","additionalProperties":true,"properties":{"[lang]":{"description":"e.g. `en`.","type":"object","properties":{"description":{"type":"string"}}}}},"notify":{"type":"boolean","description":"Should your subscribers be notified about this update?","writeOnly":true},"subscribers_notified_at":{"type":"string","description":"Datetime at which subscribers were notified for this update","format":"date-time","readOnly":true},"tweet":{"type":"boolean","description":"Tweet this update with your configured Twitter account?"}}},"MaintenanceNotifySettings":{"type":"object","description":"> ### Configure this field only if the `type` is set to `scheduled`. To take effect, the `maintenance_notify` must be set to `true`.\nOverrides the status page auto maintenance notification settings for this specific maintenance.\n","properties":{"before_notice_minutes":{"type":"integer","description":"The number of minutes to notify the subscribers before the maintenance start.\n* `-1` - Immediately\n* `0` - Never\n* Positive integer (`4320`, `5760`, `10080`, ...) - Before the maintenance start minutes\n"},"second_before_notice_minutes":{"type":"integer","description":"The number of minutes to notify the subscribers the second time before the maintenance start. It needs to be after the first \"before maintenance start\" notice.\n* `0` - Never\n* Positive integer (`720`, `1440`, `2880`, ...) - Before the maintenance start minutes\n"},"on_start":{"type":"boolean","description":"Notify subscribers when the maintenance starts."},"on_end":{"type":"boolean","description":"Notify subscribers when the maintenance ends."}}}}}}
````

## The IncidentObj object

````json
{"openapi":"3.0.1","info":{"title":"StatusPal API Reference","version":"2.0.0"},"components":{"schemas":{"IncidentObj":{"type":"object","properties":{"incident":{"$ref":"#/components/schemas/Incident"}}},"Incident":{"type":"object","description":"An incident, either major, minor or a scheduled maintenance","required":["service_ids","type","updates","title"],"properties":{"id":{"type":"integer","description":"ID of the record","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},"title":{"type":"string","description":"The title of the incident"},"starts_at":{"type":"string","description":"The time at which the incident/maintenance started/will start.","format":"date-time"},"ends_at":{"type":"string","description":"The time at which the incident/maintenance ended/will end.","format":"date-time"},"type":{"$ref":"#/components/schemas/IncidentType"},"service_ids":{"type":"array","description":"An array of service Ids, at least 1 must be included","items":{"type":"integer"}},"updates":{"type":"array","description":"The incident's updates. On incident creation you must pass exactly one update object in the array, if the incident is of type minor/major the update type `issue` is recommended, if a scheduled maintenance then use `scheduled`.","items":{"$ref":"#/components/schemas/IncidentActivity"}},"url":{"readOnly":true,"type":"string","description":"URL to the incident"},"translations":{"description":"A translations object. For example:\n```json\n{\n  \"en\": { \"title\": \"English Title\" },\n  \"es\": { \"title\": \"Spanish Title\" }\n}\n```\n","type":"object","additionalProperties":true,"properties":{"[lang]":{"description":"e.g. `en`.","type":"object","properties":{"title":{"type":"string"}}}}},"notify":{"type":"boolean","description":"Notify subscribers when creating an incident with `type` `major` or `minor`."},"maintenance_notify":{"type":"boolean","description":"Notify subscribers when creating an incident (maintenance) with `type` `scheduled`."},"maintenance_notify_settings":{"$ref":"#/components/schemas/MaintenanceNotifySettings"},"affects_uptime":{"readOnly":true,"description":"It's a boolean if the incident affects uptime.","type":"boolean"}}},"IncidentType":{"type":"string","description":"The type of the (current) incident:\n * `minor` - A minor incident is currently taking place.\n * `major` - A major incident is currently taking place.\n * `scheduled` - A scheduled maintenance is currently taking place.\n","enum":["major","minor","scheduled"]},"IncidentActivity":{"type":"object","description":"Communicates an update of an incident, the special type `resolved` will close an incident.","required":["type","description"],"properties":{"id":{"type":"integer","description":"ID of the record","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},"posted_at":{"type":"string","description":"Editable datetime at which the record was posted","format":"date-time"},"type":{"type":"string","description":"The type of an incident update:\n * `investigating` - Investigating.\n * `issue` - Issue.\n * `monitoring` - Monitoring.\n * `resolved` - Resolved will close the associated incident by settings its `ends_at` to the current time.\n * `scheduled` - Scheduled Maintenance's first update shall have this type.\n * `essential` - Essential Maintenance's first update shall have this type.\n * `retroactive` - Retroactive.\n * `update` - Standard update on an incident.\n * `escalate` - Escalate will switch the incident type from `minor` to `major`.\n * `deescalate` - De-escalate will switch the incident type from `major` to `minor`.\n * `postmortem` - A Post-mortem update.\n"},"description":{"type":"string","description":"The provided update description (accepts Markdown format)"},"description_html":{"type":"string","readOnly":true,"description":"The provided update description rendered in HTML"},"translations":{"description":"A translations object. For example:\n```json\n{\n  \"en\": { \"description\": \"English description\" },\n  \"es\": { \"description\": \"Spanish description\" }\n}\n```\n","type":"object","additionalProperties":true,"properties":{"[lang]":{"description":"e.g. `en`.","type":"object","properties":{"description":{"type":"string"}}}}},"notify":{"type":"boolean","description":"Should your subscribers be notified about this update?","writeOnly":true},"subscribers_notified_at":{"type":"string","description":"Datetime at which subscribers were notified for this update","format":"date-time","readOnly":true},"tweet":{"type":"boolean","description":"Tweet this update with your configured Twitter account?"}}},"MaintenanceNotifySettings":{"type":"object","description":"> ### Configure this field only if the `type` is set to `scheduled`. To take effect, the `maintenance_notify` must be set to `true`.\nOverrides the status page auto maintenance notification settings for this specific maintenance.\n","properties":{"before_notice_minutes":{"type":"integer","description":"The number of minutes to notify the subscribers before the maintenance start.\n* `-1` - Immediately\n* `0` - Never\n* Positive integer (`4320`, `5760`, `10080`, ...) - Before the maintenance start minutes\n"},"second_before_notice_minutes":{"type":"integer","description":"The number of minutes to notify the subscribers the second time before the maintenance start. It needs to be after the first \"before maintenance start\" notice.\n* `0` - Never\n* Positive integer (`720`, `1440`, `2880`, ...) - Before the maintenance start minutes\n"},"on_start":{"type":"boolean","description":"Notify subscribers when the maintenance starts."},"on_end":{"type":"boolean","description":"Notify subscribers when the maintenance ends."}}}}}}
````

## The Maintenance object

````json
{"openapi":"3.0.1","info":{"title":"StatusPal API Reference","version":"2.0.0"},"components":{"schemas":{"Maintenance":{"allOf":[{"$ref":"#/components/schemas/Incident"},{"type":"object","properties":{"type":{"$ref":"#/components/schemas/MaintenanceType"}}}]},"Incident":{"type":"object","description":"An incident, either major, minor or a scheduled maintenance","required":["service_ids","type","updates","title"],"properties":{"id":{"type":"integer","description":"ID of the record","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},"title":{"type":"string","description":"The title of the incident"},"starts_at":{"type":"string","description":"The time at which the incident/maintenance started/will start.","format":"date-time"},"ends_at":{"type":"string","description":"The time at which the incident/maintenance ended/will end.","format":"date-time"},"type":{"$ref":"#/components/schemas/IncidentType"},"service_ids":{"type":"array","description":"An array of service Ids, at least 1 must be included","items":{"type":"integer"}},"updates":{"type":"array","description":"The incident's updates. On incident creation you must pass exactly one update object in the array, if the incident is of type minor/major the update type `issue` is recommended, if a scheduled maintenance then use `scheduled`.","items":{"$ref":"#/components/schemas/IncidentActivity"}},"url":{"readOnly":true,"type":"string","description":"URL to the incident"},"translations":{"description":"A translations object. For example:\n```json\n{\n  \"en\": { \"title\": \"English Title\" },\n  \"es\": { \"title\": \"Spanish Title\" }\n}\n```\n","type":"object","additionalProperties":true,"properties":{"[lang]":{"description":"e.g. `en`.","type":"object","properties":{"title":{"type":"string"}}}}},"notify":{"type":"boolean","description":"Notify subscribers when creating an incident with `type` `major` or `minor`."},"maintenance_notify":{"type":"boolean","description":"Notify subscribers when creating an incident (maintenance) with `type` `scheduled`."},"maintenance_notify_settings":{"$ref":"#/components/schemas/MaintenanceNotifySettings"},"affects_uptime":{"readOnly":true,"description":"It's a boolean if the incident affects uptime.","type":"boolean"}}},"IncidentType":{"type":"string","description":"The type of the (current) incident:\n * `minor` - A minor incident is currently taking place.\n * `major` - A major incident is currently taking place.\n * `scheduled` - A scheduled maintenance is currently taking place.\n","enum":["major","minor","scheduled"]},"IncidentActivity":{"type":"object","description":"Communicates an update of an incident, the special type `resolved` will close an incident.","required":["type","description"],"properties":{"id":{"type":"integer","description":"ID of the record","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},"posted_at":{"type":"string","description":"Editable datetime at which the record was posted","format":"date-time"},"type":{"type":"string","description":"The type of an incident update:\n * `investigating` - Investigating.\n * `issue` - Issue.\n * `monitoring` - Monitoring.\n * `resolved` - Resolved will close the associated incident by settings its `ends_at` to the current time.\n * `scheduled` - Scheduled Maintenance's first update shall have this type.\n * `essential` - Essential Maintenance's first update shall have this type.\n * `retroactive` - Retroactive.\n * `update` - Standard update on an incident.\n * `escalate` - Escalate will switch the incident type from `minor` to `major`.\n * `deescalate` - De-escalate will switch the incident type from `major` to `minor`.\n * `postmortem` - A Post-mortem update.\n"},"description":{"type":"string","description":"The provided update description (accepts Markdown format)"},"description_html":{"type":"string","readOnly":true,"description":"The provided update description rendered in HTML"},"translations":{"description":"A translations object. For example:\n```json\n{\n  \"en\": { \"description\": \"English description\" },\n  \"es\": { \"description\": \"Spanish description\" }\n}\n```\n","type":"object","additionalProperties":true,"properties":{"[lang]":{"description":"e.g. `en`.","type":"object","properties":{"description":{"type":"string"}}}}},"notify":{"type":"boolean","description":"Should your subscribers be notified about this update?","writeOnly":true},"subscribers_notified_at":{"type":"string","description":"Datetime at which subscribers were notified for this update","format":"date-time","readOnly":true},"tweet":{"type":"boolean","description":"Tweet this update with your configured Twitter account?"}}},"MaintenanceNotifySettings":{"type":"object","description":"> ### Configure this field only if the `type` is set to `scheduled`. To take effect, the `maintenance_notify` must be set to `true`.\nOverrides the status page auto maintenance notification settings for this specific maintenance.\n","properties":{"before_notice_minutes":{"type":"integer","description":"The number of minutes to notify the subscribers before the maintenance start.\n* `-1` - Immediately\n* `0` - Never\n* Positive integer (`4320`, `5760`, `10080`, ...) - Before the maintenance start minutes\n"},"second_before_notice_minutes":{"type":"integer","description":"The number of minutes to notify the subscribers the second time before the maintenance start. It needs to be after the first \"before maintenance start\" notice.\n* `0` - Never\n* Positive integer (`720`, `1440`, `2880`, ...) - Before the maintenance start minutes\n"},"on_start":{"type":"boolean","description":"Notify subscribers when the maintenance starts."},"on_end":{"type":"boolean","description":"Notify subscribers when the maintenance ends."}}},"MaintenanceType":{"type":"string","description":"The type of the incident:\n * `scheduled` - Should be used for maintenances.\n","enum":["scheduled"]}}}}
````

## The InfoNotice object

````json
{"openapi":"3.0.1","info":{"title":"StatusPal API Reference","version":"2.0.0"},"components":{"schemas":{"InfoNotice":{"type":"object","description":"An information notice","required":["updates","title"],"properties":{"id":{"type":"integer","description":"ID of the record","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},"title":{"type":"string","description":"The title of the information notice"},"featured_from":{"type":"string","description":"The time at which the information notice will display on the status page.","format":"date-time"},"featured_until":{"type":"string","description":"The time at which the information notice will not display on the status page.","format":"date-time"},"service_ids":{"type":"array","description":"An array of service Ids, at least 1 must be included","items":{"type":"integer"}},"updates":{"type":"array","description":"The information notice's updates. On information notice creation you must pass exactly one update object in the array.","items":{"$ref":"#/components/schemas/IncidentActivity"}},"url":{"readOnly":true,"type":"string","description":"URL to the information notice"},"translations":{"description":"A translations object. For example:\n```json\n{\n  \"en\": { \"title\": \"English Title\" },\n  \"es\": { \"title\": \"Spanish Title\" }\n}\n```\n","type":"object","additionalProperties":true,"properties":{"[lang]":{"description":"e.g. `en`.","type":"object","properties":{"title":{"type":"string"}}}}}}},"IncidentActivity":{"type":"object","description":"Communicates an update of an incident, the special type `resolved` will close an incident.","required":["type","description"],"properties":{"id":{"type":"integer","description":"ID of the record","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},"posted_at":{"type":"string","description":"Editable datetime at which the record was posted","format":"date-time"},"type":{"type":"string","description":"The type of an incident update:\n * `investigating` - Investigating.\n * `issue` - Issue.\n * `monitoring` - Monitoring.\n * `resolved` - Resolved will close the associated incident by settings its `ends_at` to the current time.\n * `scheduled` - Scheduled Maintenance's first update shall have this type.\n * `essential` - Essential Maintenance's first update shall have this type.\n * `retroactive` - Retroactive.\n * `update` - Standard update on an incident.\n * `escalate` - Escalate will switch the incident type from `minor` to `major`.\n * `deescalate` - De-escalate will switch the incident type from `major` to `minor`.\n * `postmortem` - A Post-mortem update.\n"},"description":{"type":"string","description":"The provided update description (accepts Markdown format)"},"description_html":{"type":"string","readOnly":true,"description":"The provided update description rendered in HTML"},"translations":{"description":"A translations object. For example:\n```json\n{\n  \"en\": { \"description\": \"English description\" },\n  \"es\": { \"description\": \"Spanish description\" }\n}\n```\n","type":"object","additionalProperties":true,"properties":{"[lang]":{"description":"e.g. `en`.","type":"object","properties":{"description":{"type":"string"}}}}},"notify":{"type":"boolean","description":"Should your subscribers be notified about this update?","writeOnly":true},"subscribers_notified_at":{"type":"string","description":"Datetime at which subscribers were notified for this update","format":"date-time","readOnly":true},"tweet":{"type":"boolean","description":"Tweet this update with your configured Twitter account?"}}}}}}
````

## The InfoNoticeObj object

````json
{"openapi":"3.0.1","info":{"title":"StatusPal API Reference","version":"2.0.0"},"components":{"schemas":{"InfoNoticeObj":{"type":"object","properties":{"info_notice":{"$ref":"#/components/schemas/InfoNotice"}}},"InfoNotice":{"type":"object","description":"An information notice","required":["updates","title"],"properties":{"id":{"type":"integer","description":"ID of the record","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},"title":{"type":"string","description":"The title of the information notice"},"featured_from":{"type":"string","description":"The time at which the information notice will display on the status page.","format":"date-time"},"featured_until":{"type":"string","description":"The time at which the information notice will not display on the status page.","format":"date-time"},"service_ids":{"type":"array","description":"An array of service Ids, at least 1 must be included","items":{"type":"integer"}},"updates":{"type":"array","description":"The information notice's updates. On information notice creation you must pass exactly one update object in the array.","items":{"$ref":"#/components/schemas/IncidentActivity"}},"url":{"readOnly":true,"type":"string","description":"URL to the information notice"},"translations":{"description":"A translations object. For example:\n```json\n{\n  \"en\": { \"title\": \"English Title\" },\n  \"es\": { \"title\": \"Spanish Title\" }\n}\n```\n","type":"object","additionalProperties":true,"properties":{"[lang]":{"description":"e.g. `en`.","type":"object","properties":{"title":{"type":"string"}}}}}}},"IncidentActivity":{"type":"object","description":"Communicates an update of an incident, the special type `resolved` will close an incident.","required":["type","description"],"properties":{"id":{"type":"integer","description":"ID of the record","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},"posted_at":{"type":"string","description":"Editable datetime at which the record was posted","format":"date-time"},"type":{"type":"string","description":"The type of an incident update:\n * `investigating` - Investigating.\n * `issue` - Issue.\n * `monitoring` - Monitoring.\n * `resolved` - Resolved will close the associated incident by settings its `ends_at` to the current time.\n * `scheduled` - Scheduled Maintenance's first update shall have this type.\n * `essential` - Essential Maintenance's first update shall have this type.\n * `retroactive` - Retroactive.\n * `update` - Standard update on an incident.\n * `escalate` - Escalate will switch the incident type from `minor` to `major`.\n * `deescalate` - De-escalate will switch the incident type from `major` to `minor`.\n * `postmortem` - A Post-mortem update.\n"},"description":{"type":"string","description":"The provided update description (accepts Markdown format)"},"description_html":{"type":"string","readOnly":true,"description":"The provided update description rendered in HTML"},"translations":{"description":"A translations object. For example:\n```json\n{\n  \"en\": { \"description\": \"English description\" },\n  \"es\": { \"description\": \"Spanish description\" }\n}\n```\n","type":"object","additionalProperties":true,"properties":{"[lang]":{"description":"e.g. `en`.","type":"object","properties":{"description":{"type":"string"}}}}},"notify":{"type":"boolean","description":"Should your subscribers be notified about this update?","writeOnly":true},"subscribers_notified_at":{"type":"string","description":"Datetime at which subscribers were notified for this update","format":"date-time","readOnly":true},"tweet":{"type":"boolean","description":"Tweet this update with your configured Twitter account?"}}}}}}
````

## The Subscription object

```json
{"openapi":"3.0.1","info":{"title":"StatusPal API Reference","version":"2.0.0"},"components":{"schemas":{"Subscription":{"required":["filter","service_ids","type"],"type":"object","properties":{"type":{"type":"string","description":"The type of Subscription (`email`, `slack`, `sms`, `discord`)."},"filter":{"type":"string","description":"Filter the notifications to subscribe to (`all`, `services`, `incident`)."},"service_ids":{"type":"array","description":"An array of service IDs to subscribe to, required if filter is `services`.","items":{"type":"integer"}},"incident_types":{"type":"array","description":"An array of incident type keys. If set, the subscriber will be notified only about this type of incidents/maintenance.","items":{"type":"string"}},"incident_id":{"type":"integer","description":"An incident ID to subscribe to, required if filter is `incident`."},"email":{"type":"string","description":"The email to send the notifications to, required if type is `email`."},"confirm":{"type":"boolean","description":"Set to false to skip sending confirmation email for email subscriptions."},"country_dial_code":{"type":"string","description":"The country code of the phone number to send the notifications to, required if type is `sms`."},"phone_number":{"type":"string","description":"The phone number to send the notifications to, required if type is `sms`."},"webhook_url":{"type":"string","description":"The Discord webhook URL, required if type is `discord`."},"locale":{"type":"string","description":"The subscriber's locale."},"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},"metadata":{"type":"object","description":"Additional metadata associated with the subscription."},"subscription_group_ids":{"type":"array","items":{"type":"integer"},"description":"IDs of the subscription groups this subscription belongs to. On update, the provided list replaces the previous one (not additive). Send `[]` to remove from all groups.\n"}}}}}}
```

## The SubscriptionObj object

```json
{"openapi":"3.0.1","info":{"title":"StatusPal API Reference","version":"2.0.0"},"components":{"schemas":{"SubscriptionObj":{"type":"object","properties":{"subscription":{"$ref":"#/components/schemas/Subscription"}}},"Subscription":{"required":["filter","service_ids","type"],"type":"object","properties":{"type":{"type":"string","description":"The type of Subscription (`email`, `slack`, `sms`, `discord`)."},"filter":{"type":"string","description":"Filter the notifications to subscribe to (`all`, `services`, `incident`)."},"service_ids":{"type":"array","description":"An array of service IDs to subscribe to, required if filter is `services`.","items":{"type":"integer"}},"incident_types":{"type":"array","description":"An array of incident type keys. If set, the subscriber will be notified only about this type of incidents/maintenance.","items":{"type":"string"}},"incident_id":{"type":"integer","description":"An incident ID to subscribe to, required if filter is `incident`."},"email":{"type":"string","description":"The email to send the notifications to, required if type is `email`."},"confirm":{"type":"boolean","description":"Set to false to skip sending confirmation email for email subscriptions."},"country_dial_code":{"type":"string","description":"The country code of the phone number to send the notifications to, required if type is `sms`."},"phone_number":{"type":"string","description":"The phone number to send the notifications to, required if type is `sms`."},"webhook_url":{"type":"string","description":"The Discord webhook URL, required if type is `discord`."},"locale":{"type":"string","description":"The subscriber's locale."},"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},"metadata":{"type":"object","description":"Additional metadata associated with the subscription."},"subscription_group_ids":{"type":"array","items":{"type":"integer"},"description":"IDs of the subscription groups this subscription belongs to. On update, the provided list replaces the previous one (not additive). Send `[]` to remove from all groups.\n"}}}}}}
```

## The MetricEntry object

```json
{"openapi":"3.0.1","info":{"title":"StatusPal API Reference","version":"2.0.0"},"components":{"schemas":{"MetricEntry":{"required":["time","value"],"type":"object","properties":{"time":{"type":"integer","description":"Unix timestamp"},"value":{"type":"number","format":"double"}}}}}}
```

## The MetricEntryObj object

```json
{"openapi":"3.0.1","info":{"title":"StatusPal API Reference","version":"2.0.0"},"components":{"schemas":{"MetricEntryObj":{"type":"object","properties":{"entry":{"$ref":"#/components/schemas/MetricEntry"}}},"MetricEntry":{"required":["time","value"],"type":"object","properties":{"time":{"type":"integer","description":"Unix timestamp"},"value":{"type":"number","format":"double"}}}}}}
```

## The Metric object

```json
{"openapi":"3.0.1","info":{"title":"StatusPal API Reference","version":"2.0.0"},"components":{"schemas":{"Metric":{"description":"Represents a metric object.","type":"object","required":["title","type","unit"],"properties":{"id":{"type":"integer","readOnly":true,"description":"The ID of the metric."},"title":{"type":"string","description":"The title or name of the metric, used to describe what the metric is measuring."},"unit":{"type":"string","description":"The unit of measurement for the metric. For example, this could be \"ms\" for milliseconds or \"requests/sec\"."},"type":{"$ref":"#/components/schemas/MetricType"},"enabled":{"type":"boolean","description":"Indicates whether the metric is currently enabled. When `true` system will actually pull data for this metric; when `false`, it does not."},"visible":{"type":"boolean","description":"Determines whether the metric is visible on the status page. If `true`, the metric's data is displayed; if `false`, it is hidden."},"remote_id":{"type":"string","description":"The identifier of the metric on the remote site. This is used to map the metric in the system to its counterpart on an external service or integration."},"remote_name":{"type":"string","description":"The name of the metric on the remote site. This is used to display the metric name as it appears on the external service."},"status":{"type":"string","readOnly":true,"description":"The current status of the metric, often represented as an HTTP status code or a descriptive string. This field indicates the latest state or response of the metric."},"latest_entry_time":{"type":"integer","readOnly":true,"description":"The Unix timestamp of the most recent entry recorded for this metric. This indicates the last time data was updated for the metric."},"threshold":{"type":"integer","description":"The threshold value for the metric. This is used to set limits or bounds, such as a threshold for triggering alerts or visual indicators in graphs."},"featured_number":{"$ref":"#/components/schemas/FeaturedNumber"},"order":{"type":"integer","readOnly":true,"description":"The order in which the metric appears on the status page or within a list. This helps determine the sorting and display sequence."},"integration_id":{"type":"string","description":"The identifier of the integration associated with this metric. This ties the metric to a specific integration."}}},"MetricType":{"type":"string","description":"The type of the metric. It can be one of the following:\n * `up` (Uptime): Represents the amount of time a service or system is operational and available.\n * `rt` (ResponseTime): Represents the time taken to respond to a request or query.\n","enum":["up","rt"]},"FeaturedNumber":{"type":"string","description":"Specifies the type of number to be featured prominently in the metric's display. Options might include \"average\", \"maximum\", or \"current/last\".\n","enum":["avg","max","last"]}}}}
```

## The StatusService object

```json
{"openapi":"3.0.1","info":{"title":"StatusPal API Reference","version":"2.0.0"},"components":{"schemas":{"StatusService":{"description":"Represents the status of a service","type":"object","properties":{"name":{"type":"string"},"id":{"type":"integer"},"current_incident_type":{"$ref":"#/components/schemas/IncidentType"},"children":{"type":"array","description":"Nested ServiceSummary children","items":{"$ref":"#/components/schemas/StatusService"}}}},"IncidentType":{"type":"string","description":"The type of the (current) incident:\n * `minor` - A minor incident is currently taking place.\n * `major` - A major incident is currently taking place.\n * `scheduled` - A scheduled maintenance is currently taking place.\n","enum":["major","minor","scheduled"]}}}}
```

## The MonitoringOptions object

```json
{"openapi":"3.0.1","info":{"title":"StatusPal API Reference","version":"2.0.0"},"components":{"schemas":{"MonitoringOptions":{"type":"object","description":"Options for configuring monitoring behavior for services.","properties":{"method":{"type":"string","description":"The HTTP method to be used when sending requests for monitoring.\nThis should be set to a valid HTTP method (e.g. `GET` or `HEAD`)\nwhen monitoring type is `internal`.\nEnsure it aligns with the service's requirements for health checks.\n"},"headers":{"type":"array","description":"Custom headers to be included in the monitoring request.\nThis should be set when the monitoring type is `internal`\nto specify any necessary header fields for the request.\n","items":{"type":"object","properties":{"key":{"type":"string","description":"The name of the header field."},"value":{"type":"string","description":"The value for the header field."}}}},"keyword_down":{"type":"string","description":"A custom keyword that indicates a 'down' status when\nmonitoring a third-party service. This keyword is used\nto parse and understand service responses.\n"},"keyword_up":{"type":"string","description":"A custom keyword that indicates an 'up' status when\nmonitoring a third-party service. This keyword is used\nto parse and understand service responses.\n"}}}}}}
```

## The Service object

````json
{"openapi":"3.0.1","info":{"title":"StatusPal API Reference","version":"2.0.0"},"components":{"schemas":{"Service":{"description":"Represents the service.","type":"object","required":["name"],"properties":{"id":{"type":"integer","readOnly":true,"description":"The ID of the service."},"name":{"type":"string","description":"The name of the service."},"description":{"type":"string","description":"The description of the service."},"private_description":{"type":"string","description":"The private description of the service."},"parent_id":{"type":"integer","description":"The service parent ID."},"current_incident_type":{"description":"The service's current incident type.","$ref":"#/components/schemas/IncidentType","readOnly":true},"monitoring":{"$ref":"#/components/schemas/MonitoringType"},"webhook_monitoring_service":{"$ref":"#/components/schemas/WebhookMonitoringService"},"webhook_custom_jsonpath_settings":{"$ref":"#/components/schemas/WebhookCustomJsonpathSettings"},"inbound_email_address":{"type":"string","description":"This is field is populated from `inbound_email_id`, if the `monitoring` is set to `3rd_party`.","readOnly":true},"incoming_webhook_url":{"type":"string","description":"This is field is populated from `inbound_email_id`, if the `monitoring` is set to `webhook` and the `webhook_monitoring_service` is set.","readOnly":true},"ping_url":{"type":"string","description":"We will send HTTP requests to this URL for monitoring every minute."},"incident_type":{"description":"Sets the incident type to this value when an incident is created via monitoring.","$ref":"#/components/schemas/MonitoringIncidentType"},"parent_incident_type":{"description":"Sets the parent's service incident type to this value when an incident is created via monitoring.","$ref":"#/components/schemas/MonitoringIncidentType"},"is_up":{"type":"boolean","readOnly":true,"description":"Is the monitored service up?"},"pause_monitoring_during_maintenances":{"type":"boolean","description":"Pause the service monitoring during maintenances?"},"inbound_email_id":{"type":"string","readOnly":true,"description":"The inbound email ID."},"auto_incident":{"type":"boolean","description":"Create an incident automatically when this service is down and close it if/when it comes back up."},"auto_notify":{"type":"boolean","description":"Automatically notify all your subscribers about automatically created and closed incidents."},"children_ids":{"readOnly":true,"type":"array","description":"IDs of the service's children.","items":{"type":"integer"}},"translations":{"description":"A translations object. For example:\n```json\n{\n  \"en\": {\n    \"name\": \"Your service\",\n    \"description\": \"This is your service's description...\"\n  },\n  \"fr\": {\n    \"name\": \"Votre service\",\n    \"description\": \"Voici la description de votre service...\"\n  }\n}\n```\n","type":"object","additionalProperties":true,"properties":{"[lang]":{"description":"e.g. `en`.","type":"object","properties":{"name":{"type":"string"},"description":{"type":"string"}}}}},"private":{"type":"boolean","description":"Private service?"},"display_uptime_graph":{"type":"boolean","description":"Display uptime graph?"},"display_response_time_chart":{"type":"boolean","description":"Display response time chart?"},"order":{"type":"integer","description":"Service's position in the service list."},"notification_recipients":{"description":"Array of notification recipients:\n- In request: Array of recipient IDs (write-only).\n- In response: Array of recipient objects with `id` and `email` (read-only).\n","type":"array","items":{"oneOf":[{"type":"integer","description":"Recipient ID (write-only for request).","writeOnly":true},{"type":"object","description":"Recipient object (read-only for response).","readOnly":true,"properties":{"id":{"type":"integer","description":"The ID of the recipient."},"email":{"type":"string","description":"The email of the recipient."}}}]}},"monitoring_options":{"description":"Configuration options for monitoring the service. The options vary depending on whether\nthe monitoring type is `internal` or `3rd_party`.\n","$ref":"#/components/schemas/MonitoringOptions"}}},"IncidentType":{"type":"string","description":"The type of the (current) incident:\n * `minor` - A minor incident is currently taking place.\n * `major` - A major incident is currently taking place.\n * `scheduled` - A scheduled maintenance is currently taking place.\n","enum":["major","minor","scheduled"]},"MonitoringType":{"type":"string","nullable":true,"description":"Monitoring types:\n * `null` - No monitoring\n * `internal` - StatusPal monitoring\n * `3rd_party` - 3rd Party monitoring\n * `webhook` - Incoming webhook monitoring\n","enum":[null,"internal","3rd_party","webhook"]},"WebhookMonitoringService":{"type":"string","description":"> ### Configure this field only if the `monitoring` is set to `webhook`.\n\nWebhook monitoring services:\n* `status-cake` - StatusCake monitoring service\n* `uptime-robot` - UptimeRobot monitoring service\n* `zabbix` - Zabbix monitoring service\n* `custom-jsonpath` - Custom JSONPath\n","enum":["status-cake","uptime-robot","zabbix","custom-jsonpath"]},"WebhookCustomJsonpathSettings":{"type":"object","description":"> ### Configure this field only if the `webhook_monitoring_service` is set to `custom-jsonpath`.","properties":{"jsonpath":{"type":"string","description":"The path in the JSON, e.g. `$.status`."},"expected_result":{"type":"string","description":"The expected result in the JSON, e.g. `\"up\"`."}}},"MonitoringIncidentType":{"type":"string","description":"The type of the (current) incident:\n * `minor` - A minor incident is currently taking place.\n * `major` - A major incident is currently taking place.\n","enum":["major","minor"]},"MonitoringOptions":{"type":"object","description":"Options for configuring monitoring behavior for services.","properties":{"method":{"type":"string","description":"The HTTP method to be used when sending requests for monitoring.\nThis should be set to a valid HTTP method (e.g. `GET` or `HEAD`)\nwhen monitoring type is `internal`.\nEnsure it aligns with the service's requirements for health checks.\n"},"headers":{"type":"array","description":"Custom headers to be included in the monitoring request.\nThis should be set when the monitoring type is `internal`\nto specify any necessary header fields for the request.\n","items":{"type":"object","properties":{"key":{"type":"string","description":"The name of the header field."},"value":{"type":"string","description":"The value for the header field."}}}},"keyword_down":{"type":"string","description":"A custom keyword that indicates a 'down' status when\nmonitoring a third-party service. This keyword is used\nto parse and understand service responses.\n"},"keyword_up":{"type":"string","description":"A custom keyword that indicates an 'up' status when\nmonitoring a third-party service. This keyword is used\nto parse and understand service responses.\n"}}}}}}
````

## The ServiceObj object

````json
{"openapi":"3.0.1","info":{"title":"StatusPal API Reference","version":"2.0.0"},"components":{"schemas":{"ServiceObj":{"type":"object","properties":{"service":{"$ref":"#/components/schemas/Service"}}},"Service":{"description":"Represents the service.","type":"object","required":["name"],"properties":{"id":{"type":"integer","readOnly":true,"description":"The ID of the service."},"name":{"type":"string","description":"The name of the service."},"description":{"type":"string","description":"The description of the service."},"private_description":{"type":"string","description":"The private description of the service."},"parent_id":{"type":"integer","description":"The service parent ID."},"current_incident_type":{"description":"The service's current incident type.","$ref":"#/components/schemas/IncidentType","readOnly":true},"monitoring":{"$ref":"#/components/schemas/MonitoringType"},"webhook_monitoring_service":{"$ref":"#/components/schemas/WebhookMonitoringService"},"webhook_custom_jsonpath_settings":{"$ref":"#/components/schemas/WebhookCustomJsonpathSettings"},"inbound_email_address":{"type":"string","description":"This is field is populated from `inbound_email_id`, if the `monitoring` is set to `3rd_party`.","readOnly":true},"incoming_webhook_url":{"type":"string","description":"This is field is populated from `inbound_email_id`, if the `monitoring` is set to `webhook` and the `webhook_monitoring_service` is set.","readOnly":true},"ping_url":{"type":"string","description":"We will send HTTP requests to this URL for monitoring every minute."},"incident_type":{"description":"Sets the incident type to this value when an incident is created via monitoring.","$ref":"#/components/schemas/MonitoringIncidentType"},"parent_incident_type":{"description":"Sets the parent's service incident type to this value when an incident is created via monitoring.","$ref":"#/components/schemas/MonitoringIncidentType"},"is_up":{"type":"boolean","readOnly":true,"description":"Is the monitored service up?"},"pause_monitoring_during_maintenances":{"type":"boolean","description":"Pause the service monitoring during maintenances?"},"inbound_email_id":{"type":"string","readOnly":true,"description":"The inbound email ID."},"auto_incident":{"type":"boolean","description":"Create an incident automatically when this service is down and close it if/when it comes back up."},"auto_notify":{"type":"boolean","description":"Automatically notify all your subscribers about automatically created and closed incidents."},"children_ids":{"readOnly":true,"type":"array","description":"IDs of the service's children.","items":{"type":"integer"}},"translations":{"description":"A translations object. For example:\n```json\n{\n  \"en\": {\n    \"name\": \"Your service\",\n    \"description\": \"This is your service's description...\"\n  },\n  \"fr\": {\n    \"name\": \"Votre service\",\n    \"description\": \"Voici la description de votre service...\"\n  }\n}\n```\n","type":"object","additionalProperties":true,"properties":{"[lang]":{"description":"e.g. `en`.","type":"object","properties":{"name":{"type":"string"},"description":{"type":"string"}}}}},"private":{"type":"boolean","description":"Private service?"},"display_uptime_graph":{"type":"boolean","description":"Display uptime graph?"},"display_response_time_chart":{"type":"boolean","description":"Display response time chart?"},"order":{"type":"integer","description":"Service's position in the service list."},"notification_recipients":{"description":"Array of notification recipients:\n- In request: Array of recipient IDs (write-only).\n- In response: Array of recipient objects with `id` and `email` (read-only).\n","type":"array","items":{"oneOf":[{"type":"integer","description":"Recipient ID (write-only for request).","writeOnly":true},{"type":"object","description":"Recipient object (read-only for response).","readOnly":true,"properties":{"id":{"type":"integer","description":"The ID of the recipient."},"email":{"type":"string","description":"The email of the recipient."}}}]}},"monitoring_options":{"description":"Configuration options for monitoring the service. The options vary depending on whether\nthe monitoring type is `internal` or `3rd_party`.\n","$ref":"#/components/schemas/MonitoringOptions"}}},"IncidentType":{"type":"string","description":"The type of the (current) incident:\n * `minor` - A minor incident is currently taking place.\n * `major` - A major incident is currently taking place.\n * `scheduled` - A scheduled maintenance is currently taking place.\n","enum":["major","minor","scheduled"]},"MonitoringType":{"type":"string","nullable":true,"description":"Monitoring types:\n * `null` - No monitoring\n * `internal` - StatusPal monitoring\n * `3rd_party` - 3rd Party monitoring\n * `webhook` - Incoming webhook monitoring\n","enum":[null,"internal","3rd_party","webhook"]},"WebhookMonitoringService":{"type":"string","description":"> ### Configure this field only if the `monitoring` is set to `webhook`.\n\nWebhook monitoring services:\n* `status-cake` - StatusCake monitoring service\n* `uptime-robot` - UptimeRobot monitoring service\n* `zabbix` - Zabbix monitoring service\n* `custom-jsonpath` - Custom JSONPath\n","enum":["status-cake","uptime-robot","zabbix","custom-jsonpath"]},"WebhookCustomJsonpathSettings":{"type":"object","description":"> ### Configure this field only if the `webhook_monitoring_service` is set to `custom-jsonpath`.","properties":{"jsonpath":{"type":"string","description":"The path in the JSON, e.g. `$.status`."},"expected_result":{"type":"string","description":"The expected result in the JSON, e.g. `\"up\"`."}}},"MonitoringIncidentType":{"type":"string","description":"The type of the (current) incident:\n * `minor` - A minor incident is currently taking place.\n * `major` - A major incident is currently taking place.\n","enum":["major","minor"]},"MonitoringOptions":{"type":"object","description":"Options for configuring monitoring behavior for services.","properties":{"method":{"type":"string","description":"The HTTP method to be used when sending requests for monitoring.\nThis should be set to a valid HTTP method (e.g. `GET` or `HEAD`)\nwhen monitoring type is `internal`.\nEnsure it aligns with the service's requirements for health checks.\n"},"headers":{"type":"array","description":"Custom headers to be included in the monitoring request.\nThis should be set when the monitoring type is `internal`\nto specify any necessary header fields for the request.\n","items":{"type":"object","properties":{"key":{"type":"string","description":"The name of the header field."},"value":{"type":"string","description":"The value for the header field."}}}},"keyword_down":{"type":"string","description":"A custom keyword that indicates a 'down' status when\nmonitoring a third-party service. This keyword is used\nto parse and understand service responses.\n"},"keyword_up":{"type":"string","description":"A custom keyword that indicates an 'up' status when\nmonitoring a third-party service. This keyword is used\nto parse and understand service responses.\n"}}}}}}
````

## The MetricObj object

```json
{"openapi":"3.0.1","info":{"title":"StatusPal API Reference","version":"2.0.0"},"components":{"schemas":{"MetricObj":{"type":"object","properties":{"metric":{"$ref":"#/components/schemas/Metric"}}},"Metric":{"description":"Represents a metric object.","type":"object","required":["title","type","unit"],"properties":{"id":{"type":"integer","readOnly":true,"description":"The ID of the metric."},"title":{"type":"string","description":"The title or name of the metric, used to describe what the metric is measuring."},"unit":{"type":"string","description":"The unit of measurement for the metric. For example, this could be \"ms\" for milliseconds or \"requests/sec\"."},"type":{"$ref":"#/components/schemas/MetricType"},"enabled":{"type":"boolean","description":"Indicates whether the metric is currently enabled. When `true` system will actually pull data for this metric; when `false`, it does not."},"visible":{"type":"boolean","description":"Determines whether the metric is visible on the status page. If `true`, the metric's data is displayed; if `false`, it is hidden."},"remote_id":{"type":"string","description":"The identifier of the metric on the remote site. This is used to map the metric in the system to its counterpart on an external service or integration."},"remote_name":{"type":"string","description":"The name of the metric on the remote site. This is used to display the metric name as it appears on the external service."},"status":{"type":"string","readOnly":true,"description":"The current status of the metric, often represented as an HTTP status code or a descriptive string. This field indicates the latest state or response of the metric."},"latest_entry_time":{"type":"integer","readOnly":true,"description":"The Unix timestamp of the most recent entry recorded for this metric. This indicates the last time data was updated for the metric."},"threshold":{"type":"integer","description":"The threshold value for the metric. This is used to set limits or bounds, such as a threshold for triggering alerts or visual indicators in graphs."},"featured_number":{"$ref":"#/components/schemas/FeaturedNumber"},"order":{"type":"integer","readOnly":true,"description":"The order in which the metric appears on the status page or within a list. This helps determine the sorting and display sequence."},"integration_id":{"type":"string","description":"The identifier of the integration associated with this metric. This ties the metric to a specific integration."}}},"MetricType":{"type":"string","description":"The type of the metric. It can be one of the following:\n * `up` (Uptime): Represents the amount of time a service or system is operational and available.\n * `rt` (ResponseTime): Represents the time taken to respond to a request or query.\n","enum":["up","rt"]},"FeaturedNumber":{"type":"string","description":"Specifies the type of number to be featured prominently in the metric's display. Options might include \"average\", \"maximum\", or \"current/last\".\n","enum":["avg","max","last"]}}}}
```

## The Integration object

```json
{"openapi":"3.0.1","info":{"title":"StatusPal API Reference","version":"2.0.0"},"components":{"schemas":{"Integration":{"description":"Represents an integration service.","type":"object","required":["name","settings"],"properties":{"id":{"type":"integer","readOnly":true,"description":"The ID of the integration."},"name":{"type":"string","description":"The integration type identifier. Must be one of the supported integration types.","enum":["pingdom","datadog","newrelic","twilio","mailgun","sendgrid","mandrill","smtp","zabbix"]},"user":{"type":"string","description":"Username or Account ID for the integration. Required for New Relic integrations."},"phone_number":{"type":"string","description":"Phone number for SMS notifications. Required for Twilio integration."},"domain":{"type":"string","description":"Domain name for the integration. Required for Mailgun and Zabbix integrations."},"email_from_address":{"type":"string","description":"Email address used as sender. Required for Mailgun, SendGrid, Mandrill, and SMTP integrations."},"key":{"type":"string","description":"API key or Service ID for the integration. Required for Pingdom, Twilio, Mailgun, Datadog, Zabbix, SendGrid, and Mandrill integrations."},"password":{"type":"string","writeOnly":true,"description":"Password or Auth Token for the integration. Required for Datadog, Twilio, and SMTP integrations."},"relay":{"type":"string","description":"SMTP relay server hostname or IP address. Required for SMTP integration."},"username":{"type":"string","description":"Username for SMTP authentication. Required for SMTP integration."},"port":{"type":"integer","description":"Port number for the integration connection. Required for SMTP integration."},"region":{"type":"string","description":"Region for the integration service:\n- New Relic & Mailgun: 'us' or 'eu'\n- Datadog: 'us' (East), 'us3' (West), 'us5' (Central), 'us-gov' (FedRamp), 'eu' (Europe)\n","enum":["us","eu","us3","us5","us-gov"]},"settings":{"type":"object","description":"Additional configuration settings specific to the integration type.","properties":{"__type__":{"type":"string","writeOnly":true,"description":"Configuration type identifier. Can be \"common\" for most integrations or \"mailgun\" for Mailgun-specific settings."},"enabled":{"type":"boolean","description":"Whether the integration is enabled and active. Required for all integrations."},"api_key_type":{"type":"string","description":"Type of API key for Mailgun integration. Determines the level of access and functionality.","enum":["private","sending"]}}}}}}}}
```

## The IntegrationObj object

```json
{"openapi":"3.0.1","info":{"title":"StatusPal API Reference","version":"2.0.0"},"components":{"schemas":{"IntegrationObj":{"type":"object","properties":{"integration":{"$ref":"#/components/schemas/Integration"}}},"Integration":{"description":"Represents an integration service.","type":"object","required":["name","settings"],"properties":{"id":{"type":"integer","readOnly":true,"description":"The ID of the integration."},"name":{"type":"string","description":"The integration type identifier. Must be one of the supported integration types.","enum":["pingdom","datadog","newrelic","twilio","mailgun","sendgrid","mandrill","smtp","zabbix"]},"user":{"type":"string","description":"Username or Account ID for the integration. Required for New Relic integrations."},"phone_number":{"type":"string","description":"Phone number for SMS notifications. Required for Twilio integration."},"domain":{"type":"string","description":"Domain name for the integration. Required for Mailgun and Zabbix integrations."},"email_from_address":{"type":"string","description":"Email address used as sender. Required for Mailgun, SendGrid, Mandrill, and SMTP integrations."},"key":{"type":"string","description":"API key or Service ID for the integration. Required for Pingdom, Twilio, Mailgun, Datadog, Zabbix, SendGrid, and Mandrill integrations."},"password":{"type":"string","writeOnly":true,"description":"Password or Auth Token for the integration. Required for Datadog, Twilio, and SMTP integrations."},"relay":{"type":"string","description":"SMTP relay server hostname or IP address. Required for SMTP integration."},"username":{"type":"string","description":"Username for SMTP authentication. Required for SMTP integration."},"port":{"type":"integer","description":"Port number for the integration connection. Required for SMTP integration."},"region":{"type":"string","description":"Region for the integration service:\n- New Relic & Mailgun: 'us' or 'eu'\n- Datadog: 'us' (East), 'us3' (West), 'us5' (Central), 'us-gov' (FedRamp), 'eu' (Europe)\n","enum":["us","eu","us3","us5","us-gov"]},"settings":{"type":"object","description":"Additional configuration settings specific to the integration type.","properties":{"__type__":{"type":"string","writeOnly":true,"description":"Configuration type identifier. Can be \"common\" for most integrations or \"mailgun\" for Mailgun-specific settings."},"enabled":{"type":"boolean","description":"Whether the integration is enabled and active. Required for all integrations."},"api_key_type":{"type":"string","description":"Type of API key for Mailgun integration. Determines the level of access and functionality.","enum":["private","sending"]}}}}}}}}
```

## The Webhook object

```json
{"openapi":"3.0.1","info":{"title":"StatusPal API Reference","version":"2.0.0"},"components":{"schemas":{"Webhook":{"required":["enabled","events","url"],"type":"object","properties":{"url":{"type":"string","description":"The endpoint URL of the webhook to send the POST request to when the specified events occur."},"events":{"type":"array","description":"Available events:\n* `service.monitored_status.updated` - Triggered when a service configured with our internal monitoring goes up/down.\n* `incident.created`, `incident.updated`, `incident.deleted` - Triggered during the lifecycle of an incident, they all send the same payload.\n","items":{"type":"string"}},"enabled":{"type":"boolean","description":"Toggles the webhook's state."}}}}}}
```

## The WebhookObj object

```json
{"openapi":"3.0.1","info":{"title":"StatusPal API Reference","version":"2.0.0"},"components":{"schemas":{"WebhookObj":{"type":"object","properties":{"webhook":{"$ref":"#/components/schemas/Webhook"}}},"Webhook":{"required":["enabled","events","url"],"type":"object","properties":{"url":{"type":"string","description":"The endpoint URL of the webhook to send the POST request to when the specified events occur."},"events":{"type":"array","description":"Available events:\n* `service.monitored_status.updated` - Triggered when a service configured with our internal monitoring goes up/down.\n* `incident.created`, `incident.updated`, `incident.deleted` - Triggered during the lifecycle of an incident, they all send the same payload.\n","items":{"type":"string"}},"enabled":{"type":"boolean","description":"Toggles the webhook's state."}}}}}}
```

## The AccessGroup object

```json
{"openapi":"3.0.1","info":{"title":"StatusPal API Reference","version":"2.0.0"},"components":{"schemas":{"AccessGroup":{"required":["name","service_ids"],"type":"object","properties":{"id":{"type":"integer","description":"The access group's id.","readOnly":true},"name":{"type":"string","description":"The name of the access group."},"service_ids":{"type":"array","items":{"type":"integer"},"description":"An array of service Ids, at least 1 must be included"},"users_status_pages":{"type":"array","items":{"type":"integer"},"description":"An array of status page member Ids"}}}}}}
```

## The AccessGroupObj object

```json
{"openapi":"3.0.1","info":{"title":"StatusPal API Reference","version":"2.0.0"},"components":{"schemas":{"AccessGroupObj":{"type":"object","properties":{"access_group":{"$ref":"#/components/schemas/AccessGroup"}}},"AccessGroup":{"required":["name","service_ids"],"type":"object","properties":{"id":{"type":"integer","description":"The access group's id.","readOnly":true},"name":{"type":"string","description":"The name of the access group."},"service_ids":{"type":"array","items":{"type":"integer"},"description":"An array of service Ids, at least 1 must be included"},"users_status_pages":{"type":"array","items":{"type":"integer"},"description":"An array of status page member Ids"}}}}}}
```

## The StatusPageMember object

```json
{"openapi":"3.0.1","info":{"title":"StatusPal API Reference","version":"2.0.0"},"components":{"schemas":{"StatusPageMember":{"type":"object","properties":{"id":{"type":"integer","description":"The member's id.","readOnly":true},"email":{"type":"string","description":"The member's email address.","readOnly":true},"role":{"type":"string","description":"The membership role.\nAvailable roles:\n* `c` - Editor\n* `v` - Viewer\n* `a` - Admin\n"},"enabled":{"type":"boolean","description":"Toggles the membership's state."},"user":{"type":"object","properties":{"id":{"type":"integer","description":"The user's id.","readOnly":true},"last_sign_in_at":{"type":"string","description":"The date and time the user signed in before their current session","format":"date-time","readOnly":true},"current_sign_in_at":{"type":"string","description":"The date and time the user signed in for their current session","format":"date-time","readOnly":true}},"description":"The related User object (if there is one).","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}}}}}}
```

## The StatusPageMemberObj object

```json
{"openapi":"3.0.1","info":{"title":"StatusPal API Reference","version":"2.0.0"},"components":{"schemas":{"StatusPageMemberObj":{"type":"object","properties":{"member":{"$ref":"#/components/schemas/StatusPageMember"}}},"StatusPageMember":{"type":"object","properties":{"id":{"type":"integer","description":"The member's id.","readOnly":true},"email":{"type":"string","description":"The member's email address.","readOnly":true},"role":{"type":"string","description":"The membership role.\nAvailable roles:\n* `c` - Editor\n* `v` - Viewer\n* `a` - Admin\n"},"enabled":{"type":"boolean","description":"Toggles the membership's state."},"user":{"type":"object","properties":{"id":{"type":"integer","description":"The user's id.","readOnly":true},"last_sign_in_at":{"type":"string","description":"The date and time the user signed in before their current session","format":"date-time","readOnly":true},"current_sign_in_at":{"type":"string","description":"The date and time the user signed in for their current session","format":"date-time","readOnly":true}},"description":"The related User object (if there is one).","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}}}}}}
```

## The OrganizationMember object

```json
{"openapi":"3.0.1","info":{"title":"StatusPal API Reference","version":"2.0.0"},"components":{"schemas":{"OrganizationMember":{"type":"object","properties":{"id":{"type":"integer","description":"The member's id.","readOnly":true},"email":{"type":"string","description":"The member's email address.","readOnly":true},"role":{"type":"string","description":"The membership role.\nAvailable roles:\n* `c` - Editor\n* `v` - Viewer\n* `a` - Admin\n* `o` - Owner\n"},"user":{"type":"object","properties":{"id":{"type":"integer","description":"The user's id.","readOnly":true},"last_sign_in_at":{"type":"string","description":"The date and time the user signed in before their current session","format":"date-time","readOnly":true},"current_sign_in_at":{"type":"string","description":"The date and time the user signed in for their current session","format":"date-time","readOnly":true}},"description":"The related User object (if there is one).","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}}}}}}
```

## The OrganizationMemberObj object

```json
{"openapi":"3.0.1","info":{"title":"StatusPal API Reference","version":"2.0.0"},"components":{"schemas":{"OrganizationMemberObj":{"type":"object","properties":{"member":{"$ref":"#/components/schemas/OrganizationMember"}}},"OrganizationMember":{"type":"object","properties":{"id":{"type":"integer","description":"The member's id.","readOnly":true},"email":{"type":"string","description":"The member's email address.","readOnly":true},"role":{"type":"string","description":"The membership role.\nAvailable roles:\n* `c` - Editor\n* `v` - Viewer\n* `a` - Admin\n* `o` - Owner\n"},"user":{"type":"object","properties":{"id":{"type":"integer","description":"The user's id.","readOnly":true},"last_sign_in_at":{"type":"string","description":"The date and time the user signed in before their current session","format":"date-time","readOnly":true},"current_sign_in_at":{"type":"string","description":"The date and time the user signed in for their current session","format":"date-time","readOnly":true}},"description":"The related User object (if there is one).","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}}}}}}
```

## The MaintenanceType object

```json
{"openapi":"3.0.1","info":{"title":"StatusPal API Reference","version":"2.0.0"},"components":{"schemas":{"MaintenanceType":{"type":"string","description":"The type of the incident:\n * `scheduled` - Should be used for maintenances.\n","enum":["scheduled"]}}}}
```

## The IncidentType object

```json
{"openapi":"3.0.1","info":{"title":"StatusPal API Reference","version":"2.0.0"},"components":{"schemas":{"IncidentType":{"type":"string","description":"The type of the (current) incident:\n * `minor` - A minor incident is currently taking place.\n * `major` - A major incident is currently taking place.\n * `scheduled` - A scheduled maintenance is currently taking place.\n","enum":["major","minor","scheduled"]}}}}
```

## The IncidentTemplate object

````json
{"openapi":"3.0.1","info":{"title":"StatusPal API Reference","version":"2.0.0"},"components":{"schemas":{"IncidentTemplate":{"description":"Represents the incident template.","type":"object","required":["title","description"],"properties":{"id":{"type":"integer","readOnly":true,"description":"The ID of the incident template."},"name":{"type":"string","nullable":true,"description":"The template's own name/label as shown in the dashboard. This is separate from `title`, which is the incident title the template produces when applied. Blank or whitespace-only values are stored as null."},"title":{"type":"string","description":"The title of the incident template."},"description":{"type":"string","description":"The description of the incident template."},"service_ids":{"type":"array","description":"An array of service Ids.","items":{"type":"integer"}},"incident_types":{"type":"array","description":"An array of incident type keys. If set, the incident template will only work with the given incident types.","items":{"type":"string"}},"translations":{"description":"A translations object. For example:\n```json\n{\n  \"en\": { \"title\": \"English title\", \"description\": \"English description\" },\n  \"es\": { \"title\": \"Spanish title\", \"description\": \"Spanish description\" }\n}\n```\n","type":"object","additionalProperties":true,"properties":{"[lang]":{"description":"e.g. `en`.","type":"object","properties":{"title":{"type":"string"},"description":{"type":"string"}}}}}}}}}}
````

## The IncidentTemplateObj object

````json
{"openapi":"3.0.1","info":{"title":"StatusPal API Reference","version":"2.0.0"},"components":{"schemas":{"IncidentTemplateObj":{"type":"object","properties":{"incident_template":{"$ref":"#/components/schemas/IncidentTemplate"}}},"IncidentTemplate":{"description":"Represents the incident template.","type":"object","required":["title","description"],"properties":{"id":{"type":"integer","readOnly":true,"description":"The ID of the incident template."},"name":{"type":"string","nullable":true,"description":"The template's own name/label as shown in the dashboard. This is separate from `title`, which is the incident title the template produces when applied. Blank or whitespace-only values are stored as null."},"title":{"type":"string","description":"The title of the incident template."},"description":{"type":"string","description":"The description of the incident template."},"service_ids":{"type":"array","description":"An array of service Ids.","items":{"type":"integer"}},"incident_types":{"type":"array","description":"An array of incident type keys. If set, the incident template will only work with the given incident types.","items":{"type":"string"}},"translations":{"description":"A translations object. For example:\n```json\n{\n  \"en\": { \"title\": \"English title\", \"description\": \"English description\" },\n  \"es\": { \"title\": \"Spanish title\", \"description\": \"Spanish description\" }\n}\n```\n","type":"object","additionalProperties":true,"properties":{"[lang]":{"description":"e.g. `en`.","type":"object","properties":{"title":{"type":"string"},"description":{"type":"string"}}}}}}}}}}
````

## The MetricType object

```json
{"openapi":"3.0.1","info":{"title":"StatusPal API Reference","version":"2.0.0"},"components":{"schemas":{"MetricType":{"type":"string","description":"The type of the metric. It can be one of the following:\n * `up` (Uptime): Represents the amount of time a service or system is operational and available.\n * `rt` (ResponseTime): Represents the time taken to respond to a request or query.\n","enum":["up","rt"]}}}}
```

## The FeaturedNumber object

```json
{"openapi":"3.0.1","info":{"title":"StatusPal API Reference","version":"2.0.0"},"components":{"schemas":{"FeaturedNumber":{"type":"string","description":"Specifies the type of number to be featured prominently in the metric's display. Options might include \"average\", \"maximum\", or \"current/last\".\n","enum":["avg","max","last"]}}}}
```

## The IncidentActivity object

````json
{"openapi":"3.0.1","info":{"title":"StatusPal API Reference","version":"2.0.0"},"components":{"schemas":{"IncidentActivity":{"type":"object","description":"Communicates an update of an incident, the special type `resolved` will close an incident.","required":["type","description"],"properties":{"id":{"type":"integer","description":"ID of the record","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},"posted_at":{"type":"string","description":"Editable datetime at which the record was posted","format":"date-time"},"type":{"type":"string","description":"The type of an incident update:\n * `investigating` - Investigating.\n * `issue` - Issue.\n * `monitoring` - Monitoring.\n * `resolved` - Resolved will close the associated incident by settings its `ends_at` to the current time.\n * `scheduled` - Scheduled Maintenance's first update shall have this type.\n * `essential` - Essential Maintenance's first update shall have this type.\n * `retroactive` - Retroactive.\n * `update` - Standard update on an incident.\n * `escalate` - Escalate will switch the incident type from `minor` to `major`.\n * `deescalate` - De-escalate will switch the incident type from `major` to `minor`.\n * `postmortem` - A Post-mortem update.\n"},"description":{"type":"string","description":"The provided update description (accepts Markdown format)"},"description_html":{"type":"string","readOnly":true,"description":"The provided update description rendered in HTML"},"translations":{"description":"A translations object. For example:\n```json\n{\n  \"en\": { \"description\": \"English description\" },\n  \"es\": { \"description\": \"Spanish description\" }\n}\n```\n","type":"object","additionalProperties":true,"properties":{"[lang]":{"description":"e.g. `en`.","type":"object","properties":{"description":{"type":"string"}}}}},"notify":{"type":"boolean","description":"Should your subscribers be notified about this update?","writeOnly":true},"subscribers_notified_at":{"type":"string","description":"Datetime at which subscribers were notified for this update","format":"date-time","readOnly":true},"tweet":{"type":"boolean","description":"Tweet this update with your configured Twitter account?"}}}}}}
````

## The IncidentActivityObj object

````json
{"openapi":"3.0.1","info":{"title":"StatusPal API Reference","version":"2.0.0"},"components":{"schemas":{"IncidentActivityObj":{"type":"object","properties":{"update":{"$ref":"#/components/schemas/IncidentActivity"}}},"IncidentActivity":{"type":"object","description":"Communicates an update of an incident, the special type `resolved` will close an incident.","required":["type","description"],"properties":{"id":{"type":"integer","description":"ID of the record","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},"posted_at":{"type":"string","description":"Editable datetime at which the record was posted","format":"date-time"},"type":{"type":"string","description":"The type of an incident update:\n * `investigating` - Investigating.\n * `issue` - Issue.\n * `monitoring` - Monitoring.\n * `resolved` - Resolved will close the associated incident by settings its `ends_at` to the current time.\n * `scheduled` - Scheduled Maintenance's first update shall have this type.\n * `essential` - Essential Maintenance's first update shall have this type.\n * `retroactive` - Retroactive.\n * `update` - Standard update on an incident.\n * `escalate` - Escalate will switch the incident type from `minor` to `major`.\n * `deescalate` - De-escalate will switch the incident type from `major` to `minor`.\n * `postmortem` - A Post-mortem update.\n"},"description":{"type":"string","description":"The provided update description (accepts Markdown format)"},"description_html":{"type":"string","readOnly":true,"description":"The provided update description rendered in HTML"},"translations":{"description":"A translations object. For example:\n```json\n{\n  \"en\": { \"description\": \"English description\" },\n  \"es\": { \"description\": \"Spanish description\" }\n}\n```\n","type":"object","additionalProperties":true,"properties":{"[lang]":{"description":"e.g. `en`.","type":"object","properties":{"description":{"type":"string"}}}}},"notify":{"type":"boolean","description":"Should your subscribers be notified about this update?","writeOnly":true},"subscribers_notified_at":{"type":"string","description":"Datetime at which subscribers were notified for this update","format":"date-time","readOnly":true},"tweet":{"type":"boolean","description":"Tweet this update with your configured Twitter account?"}}}}}}
````

## The MonitoringIncidentType object

```json
{"openapi":"3.0.1","info":{"title":"StatusPal API Reference","version":"2.0.0"},"components":{"schemas":{"MonitoringIncidentType":{"type":"string","description":"The type of the (current) incident:\n * `minor` - A minor incident is currently taking place.\n * `major` - A major incident is currently taking place.\n","enum":["major","minor"]}}}}
```

## The MonitoringType object

```json
{"openapi":"3.0.1","info":{"title":"StatusPal API Reference","version":"2.0.0"},"components":{"schemas":{"MonitoringType":{"type":"string","nullable":true,"description":"Monitoring types:\n * `null` - No monitoring\n * `internal` - StatusPal monitoring\n * `3rd_party` - 3rd Party monitoring\n * `webhook` - Incoming webhook monitoring\n","enum":[null,"internal","3rd_party","webhook"]}}}}
```

## The WebhookMonitoringService object

```json
{"openapi":"3.0.1","info":{"title":"StatusPal API Reference","version":"2.0.0"},"components":{"schemas":{"WebhookMonitoringService":{"type":"string","description":"> ### Configure this field only if the `monitoring` is set to `webhook`.\n\nWebhook monitoring services:\n* `status-cake` - StatusCake monitoring service\n* `uptime-robot` - UptimeRobot monitoring service\n* `zabbix` - Zabbix monitoring service\n* `custom-jsonpath` - Custom JSONPath\n","enum":["status-cake","uptime-robot","zabbix","custom-jsonpath"]}}}}
```

## The WebhookCustomJsonpathSettings object

```json
{"openapi":"3.0.1","info":{"title":"StatusPal API Reference","version":"2.0.0"},"components":{"schemas":{"WebhookCustomJsonpathSettings":{"type":"object","description":"> ### Configure this field only if the `webhook_monitoring_service` is set to `custom-jsonpath`.","properties":{"jsonpath":{"type":"string","description":"The path in the JSON, e.g. `$.status`."},"expected_result":{"type":"string","description":"The expected result in the JSON, e.g. `\"up\"`."}}}}}}
```

## The MaintenanceNotifySettings object

```json
{"openapi":"3.0.1","info":{"title":"StatusPal API Reference","version":"2.0.0"},"components":{"schemas":{"MaintenanceNotifySettings":{"type":"object","description":"> ### Configure this field only if the `type` is set to `scheduled`. To take effect, the `maintenance_notify` must be set to `true`.\nOverrides the status page auto maintenance notification settings for this specific maintenance.\n","properties":{"before_notice_minutes":{"type":"integer","description":"The number of minutes to notify the subscribers before the maintenance start.\n* `-1` - Immediately\n* `0` - Never\n* Positive integer (`4320`, `5760`, `10080`, ...) - Before the maintenance start minutes\n"},"second_before_notice_minutes":{"type":"integer","description":"The number of minutes to notify the subscribers the second time before the maintenance start. It needs to be after the first \"before maintenance start\" notice.\n* `0` - Never\n* Positive integer (`720`, `1440`, `2880`, ...) - Before the maintenance start minutes\n"},"on_start":{"type":"boolean","description":"Notify subscribers when the maintenance starts."},"on_end":{"type":"boolean","description":"Notify subscribers when the maintenance ends."}}}}}}
```

## The ValidationError object

```json
{"openapi":"3.0.1","info":{"title":"StatusPal API Reference","version":"2.0.0"},"components":{"schemas":{"ValidationError":{"type":"object","properties":{"errors":{"type":"object","description":"A dictionary where each key contains the name of a field with a validation error and the value an array with the validation errors"}}}}}}
```

## The UnauthorizedError object

```json
{"openapi":"3.0.1","info":{"title":"StatusPal API Reference","version":"2.0.0"},"components":{"schemas":{"UnauthorizedError":{"type":"object","properties":{"error":{"type":"integer","description":"Unauthorized"}}}}}}
```

## The ServerError object

```json
{"openapi":"3.0.1","info":{"title":"StatusPal API Reference","version":"2.0.0"},"components":{"schemas":{"ServerError":{"type":"object","properties":{"error":{"type":"string","description":"Internal server error :("}}}}}}
```

## The BadRequestError object

```json
{"openapi":"3.0.1","info":{"title":"StatusPal API Reference","version":"2.0.0"},"components":{"schemas":{"BadRequestError":{"type":"object","properties":{"error":{"type":"string","description":"Bad request!"}}}}}}
```

## The NotFoundError object

```json
{"openapi":"3.0.1","info":{"title":"StatusPal API Reference","version":"2.0.0"},"components":{"schemas":{"NotFoundError":{"type":"object","properties":{"error":{"type":"string","description":"Resource not found!"}}}}}}
```

## The ForbiddenError object

```json
{"openapi":"3.0.1","info":{"title":"StatusPal API Reference","version":"2.0.0"},"components":{"schemas":{"ForbiddenError":{"type":"object","properties":{"error":{"type":"string","description":"Forbidden"}}}}}}
```


# Out-of-the-box monitoring

We can monitor your websites, applications, servers, and APIs out-of-the-box and automate incident reporting on your status page.

Enable StatusPal monitoring on any service in your StatusPal status page by editing or creating a new service, then select <mark style="background-color:green;">StatusPal monitoring</mark> under the "Monitoring and incident automation" section.

<figure><img src="/files/WeuysRacpng8SEhMx8Xs" alt="status page integrated monitoring - incident automation"><figcaption></figcaption></figure>

Once you enable "StatusPal monitoring" on a service, we'll ping the provided URL once per minute. If it goes down (returns a status different than `2xx`) for more than 5 minutes, we'll notify somebody on your team (according to the "Notification recipients" setting).

### Automatically create incident

If you check the "automatically create incident" checkbox, we'll create an incident affecting this service automatically and close it once the service is up again for at least two minutes.

### Monitoring settings

* **HTTP method** allows you to select what HTTP method should be used when our monitoring agent makes an HTTP request to your services once every minute.
* **Ping URL** is the URL our monitoring agent will ping periodically to determine if this service is down or up.
* **HTTP headers** allow you to customize the header that should be sent together with the periodic HTTP request to your service's ping URL.

### Display response time chart

If you check this option, we'll automatically generate a "response time chart" based on your monitoring check and display it on your status page below your list of services.

<figure><img src="/files/vDYSprwfNNN7jNDCeEMg" alt="Response time chart as featured in your status page"><figcaption><p>Response time chart as featured in your status page</p></figcaption></figure>

### Pause monitoring during maintenance

You can check this option to make your monitoring check aware of your scheduled maintenance windows on the status page. If a monitoring check starts failing during a planned maintenance window, we'll ignore the failing check.

## Testing your monitoring setup

A common mistake when testing monitoring is to configure a URL that's already down, or to swap the ping URL after setup — both reset the check state and won't trigger notifications or auto-incidents.

The correct approach is to set the **Ping URL** once to a URL that starts **up** (returning `2xx`), then make it go **down** (`5xx`, `4xx`, or timeout) without changing the URL itself.

You can do this easily using [webhook.site](https://webhook.site):

1. Open [webhook.site](https://webhook.site) in one tab and keep Statuspal open in another. Copy **Your unique URL** and paste it into your service's **Ping URL** field. Save the service.\
   \
   ![webhook.site unique URL](/files/g9l9t9fdX9jBjhtIi1Pk)
2. Wait until the service status indicator in Statuspal turns **green** (confirming the first successful ping).
3. In webhook.site, click **Edit**, change the response status to `500`, and click **Save**.\
   \
   ![webhook.site change status to 500](/files/SQPenGzXLgKoarPfGTvF)
4. Wait up to **5 minutes** — Statuspal will detect the failure and create the auto-incident, and your notification recipients will receive an alert.

{% hint style="info" %}
Statuspal only triggers notifications and auto-incidents after a service has been confirmed **up** first. Starting with a down URL won't trigger anything.
{% endhint %}




---

[Next Page](/llms-full.txt/1)

