Skip to main content
POST
/
uptime
/
monitors
Create a monitor
curl --request POST \
  --url https://api.phare.io/uptime/monitors \
  --header 'Authorization: Bearer <token>' \
  --header 'Content-Type: application/json' \
  --data '
{
  "name": "Website",
  "request": {
    "url": "https://docs.phare.io/introduction",
    "tls_skip_verify": false,
    "body": "Hello, World!",
    "follow_redirects": true,
    "user_agent_secret": "definitely-not-a-bot",
    "headers": [
      {
        "name": "X-Phare-Says",
        "value": "Hello world!"
      }
    ]
  },
  "regions": [],
  "interval": 60,
  "timeout": 20000,
  "success_assertions": [
    {
      "type": "status_code",
      "operator": "in",
      "value": "2xx,30x,418"
    }
  ],
  "incident_confirmations": 1,
  "recovery_confirmations": 1,
  "region_threshold": 1
}
'
import requests

url = "https://api.phare.io/uptime/monitors"

payload = {
"name": "Website",
"request": {
"url": "https://docs.phare.io/introduction",
"tls_skip_verify": False,
"body": "Hello, World!",
"follow_redirects": True,
"user_agent_secret": "definitely-not-a-bot",
"headers": [
{
"name": "X-Phare-Says",
"value": "Hello world!"
}
]
},
"regions": [],
"interval": 60,
"timeout": 20000,
"success_assertions": [
{
"type": "status_code",
"operator": "in",
"value": "2xx,30x,418"
}
],
"incident_confirmations": 1,
"recovery_confirmations": 1,
"region_threshold": 1
}
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}

response = requests.post(url, json=payload, headers=headers)

print(response.text)
const options = {
method: 'POST',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({
name: 'Website',
request: {
url: 'https://docs.phare.io/introduction',
tls_skip_verify: false,
body: JSON.stringify('Hello, World!'),
follow_redirects: true,
user_agent_secret: 'definitely-not-a-bot',
headers: [{name: 'X-Phare-Says', value: 'Hello world!'}]
},
regions: [],
interval: 60,
timeout: 20000,
success_assertions: [{type: 'status_code', operator: 'in', value: '2xx,30x,418'}],
incident_confirmations: 1,
recovery_confirmations: 1,
region_threshold: 1
})
};

fetch('https://api.phare.io/uptime/monitors', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));
<?php

$curl = curl_init();

curl_setopt_array($curl, [
CURLOPT_URL => "https://api.phare.io/uptime/monitors",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => json_encode([
'name' => 'Website',
'request' => [
'url' => 'https://docs.phare.io/introduction',
'tls_skip_verify' => false,
'body' => 'Hello, World!',
'follow_redirects' => true,
'user_agent_secret' => 'definitely-not-a-bot',
'headers' => [
[
'name' => 'X-Phare-Says',
'value' => 'Hello world!'
]
]
],
'regions' => [

],
'interval' => 60,
'timeout' => 20000,
'success_assertions' => [
[
'type' => 'status_code',
'operator' => 'in',
'value' => '2xx,30x,418'
]
],
'incident_confirmations' => 1,
'recovery_confirmations' => 1,
'region_threshold' => 1
]),
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>",
"Content-Type: application/json"
],
]);

$response = curl_exec($curl);
$err = curl_error($curl);

curl_close($curl);

if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}
package main

import (
"fmt"
"strings"
"net/http"
"io"
)

func main() {

url := "https://api.phare.io/uptime/monitors"

payload := strings.NewReader("{\n \"name\": \"Website\",\n \"request\": {\n \"url\": \"https://docs.phare.io/introduction\",\n \"tls_skip_verify\": false,\n \"body\": \"Hello, World!\",\n \"follow_redirects\": true,\n \"user_agent_secret\": \"definitely-not-a-bot\",\n \"headers\": [\n {\n \"name\": \"X-Phare-Says\",\n \"value\": \"Hello world!\"\n }\n ]\n },\n \"regions\": [],\n \"interval\": 60,\n \"timeout\": 20000,\n \"success_assertions\": [\n {\n \"type\": \"status_code\",\n \"operator\": \"in\",\n \"value\": \"2xx,30x,418\"\n }\n ],\n \"incident_confirmations\": 1,\n \"recovery_confirmations\": 1,\n \"region_threshold\": 1\n}")

req, _ := http.NewRequest("POST", url, payload)

req.Header.Add("Authorization", "Bearer <token>")
req.Header.Add("Content-Type", "application/json")

res, _ := http.DefaultClient.Do(req)

defer res.Body.Close()
body, _ := io.ReadAll(res.Body)

fmt.Println(string(body))

}
HttpResponse<String> response = Unirest.post("https://api.phare.io/uptime/monitors")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"name\": \"Website\",\n \"request\": {\n \"url\": \"https://docs.phare.io/introduction\",\n \"tls_skip_verify\": false,\n \"body\": \"Hello, World!\",\n \"follow_redirects\": true,\n \"user_agent_secret\": \"definitely-not-a-bot\",\n \"headers\": [\n {\n \"name\": \"X-Phare-Says\",\n \"value\": \"Hello world!\"\n }\n ]\n },\n \"regions\": [],\n \"interval\": 60,\n \"timeout\": 20000,\n \"success_assertions\": [\n {\n \"type\": \"status_code\",\n \"operator\": \"in\",\n \"value\": \"2xx,30x,418\"\n }\n ],\n \"incident_confirmations\": 1,\n \"recovery_confirmations\": 1,\n \"region_threshold\": 1\n}")
.asString();
require 'uri'
require 'net/http'

url = URI("https://api.phare.io/uptime/monitors")

http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true

request = Net::HTTP::Post.new(url)
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"name\": \"Website\",\n \"request\": {\n \"url\": \"https://docs.phare.io/introduction\",\n \"tls_skip_verify\": false,\n \"body\": \"Hello, World!\",\n \"follow_redirects\": true,\n \"user_agent_secret\": \"definitely-not-a-bot\",\n \"headers\": [\n {\n \"name\": \"X-Phare-Says\",\n \"value\": \"Hello world!\"\n }\n ]\n },\n \"regions\": [],\n \"interval\": 60,\n \"timeout\": 20000,\n \"success_assertions\": [\n {\n \"type\": \"status_code\",\n \"operator\": \"in\",\n \"value\": \"2xx,30x,418\"\n }\n ],\n \"incident_confirmations\": 1,\n \"recovery_confirmations\": 1,\n \"region_threshold\": 1\n}"

response = http.request(request)
puts response.read_body
{
  "name": "Website",
  "request": {
    "url": "https://docs.phare.io/introduction",
    "tls_skip_verify": false,
    "body": "Hello, World!",
    "follow_redirects": true,
    "user_agent_secret": "definitely-not-a-bot",
    "headers": [
      {
        "name": "X-Phare-Says",
        "value": "Hello world!"
      }
    ]
  },
  "regions": [],
  "id": 1,
  "project_id": 1,
  "paused": true,
  "response_time": 123,
  "interval": 60,
  "timeout": 20000,
  "success_assertions": [
    {
      "type": "status_code",
      "operator": "in",
      "value": "2xx,30x,418"
    }
  ],
  "incident_confirmations": 1,
  "recovery_confirmations": 1,
  "region_threshold": 1,
  "created_at": "2023-11-07T05:31:56Z",
  "updated_at": "2023-11-07T05:31:56Z"
}
{
"message": "Unauthorized"
}
{
"message": "The platform:write permission is required to perform this action."
}
{
"message": "<string>",
"errors": {
"key": [
"The key field is required"
]
}
}

Authorizations

Authorization
string
header
required

Use a user token to access authenticated routes. The token must be specified in the Authorization HTTP header with the following format 'Authorization: Bearer '.

Headers

X-Phare-Project-Id
integer

A project header is required when using an organization-scoped API key.

Example:

1

X-Phare-Project-Slug
string

A project header is required when using an organization-scoped API key.

Example:

"luminous-guiding-tower"

Body

application/json

Monitor request

name
string
required

Monitor name

Example:

"Website"

protocol
enum<string>
required
Available options:
http,
tcp
request
HTTP protocol · object
required

Monitoring request, depends of the chosen protocol

regions
enum<string>[]
required

List of regions where monitoring checks are performed

Required array length: 1 - 6 elements
Available options:
as-jpn-hnd,
as-sgp-sin,
as-tha-bkk,
eu-deu-fra,
eu-fra-cdg,
eu-gbr-lhr,
eu-swe-arn,
ng-nld-ams,
na-mex-mex,
na-usa-iad,
na-usa-sea,
oc-aus-syd,
sa-bra-gru
interval
enum<integer>
default:60

Monitoring interval in seconds

Available options:
30,
60,
120,
180,
300,
600,
900,
1800,
3600
Example:

60

timeout
enum<integer>
default:20000

Monitoring timeout in milliseconds

Available options:
1000,
2000,
3000,
4000,
5000,
6000,
7000,
8000,
9000,
10000,
15000,
20000,
25000,
30000
Example:

20000

success_assertions
(Status code assertion · object | Response header assertion · object | Response body assertion · object)[]

List of assertions that must be true for the check to be considered successful

incident_confirmations
enum<integer>
default:3

Number of uninterrupted failed checks required to create an incident

Available options:
1,
2,
3,
4,
5
Example:

1

recovery_confirmations
enum<integer>
default:3

Number of uninterrupted successful checks required to resolve an incident

Available options:
1,
2,
3,
4,
5
Example:

1

region_threshold
integer
default:1

Number of regions that must fail before an incident is confirmed

Required range: 1 <= x <= 10
Example:

1

Response

Success, monitor created

name
string
required

Monitor name

Example:

"Website"

protocol
enum<string>
required
Available options:
http,
tcp
request
HTTP protocol · object
required

Monitoring request, depends of the chosen protocol

regions
enum<string>[]
required

List of regions where monitoring checks are performed

Required array length: 1 - 6 elements
Available options:
as-jpn-hnd,
as-sgp-sin,
as-tha-bkk,
eu-deu-fra,
eu-fra-cdg,
eu-gbr-lhr,
eu-swe-arn,
ng-nld-ams,
na-mex-mex,
na-usa-iad,
na-usa-sea,
oc-aus-syd,
sa-bra-gru
id
integer

Monitor ID

Example:

1

project_id
integer

Parent project ID

Example:

1

status
enum<string>
Available options:
fetching,
online,
offline,
partial,
paused
paused
boolean

Whether the monitor is currently paused

Example:

true

response_time
integer | null

Rolling average response time of the last 10 requests, in milliseconds

Example:

123

interval
enum<integer>
default:60

Monitoring interval in seconds

Available options:
30,
60,
120,
180,
300,
600,
900,
1800,
3600
Example:

60

timeout
enum<integer>
default:20000

Monitoring timeout in milliseconds

Available options:
1000,
2000,
3000,
4000,
5000,
6000,
7000,
8000,
9000,
10000,
15000,
20000,
25000,
30000
Example:

20000

success_assertions
(Status code assertion · object | Response header assertion · object | Response body assertion · object)[]

List of assertions that must be true for the check to be considered successful

incident_confirmations
enum<integer>
default:3

Number of uninterrupted failed checks required to create an incident

Available options:
1,
2,
3,
4,
5
Example:

1

recovery_confirmations
enum<integer>
default:3

Number of uninterrupted successful checks required to resolve an incident

Available options:
1,
2,
3,
4,
5
Example:

1

region_threshold
integer
default:1

Number of regions that must fail before an incident is confirmed

Required range: 1 <= x <= 10
Example:

1

created_at
string<date-time>

Date of creation for the entity

updated_at
string<date-time>

Date of last update for the entity

Last modified on February 8, 2026