Verify subdomain
curl --request POST \
--url https://management-api.fpjs.io/subdomains/{id}/verify \
--header 'Authorization: Bearer <token>' \
--header 'X-API-Version: <x-api-version>'import requests
url = "https://management-api.fpjs.io/subdomains/{id}/verify"
headers = {
"X-API-Version": "<x-api-version>",
"Authorization": "Bearer <token>"
}
response = requests.post(url, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {'X-API-Version': '<x-api-version>', Authorization: 'Bearer <token>'}
};
fetch('https://management-api.fpjs.io/subdomains/{id}/verify', 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://management-api.fpjs.io/subdomains/{id}/verify",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>",
"X-API-Version: <x-api-version>"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"net/http"
"io"
)
func main() {
url := "https://management-api.fpjs.io/subdomains/{id}/verify"
req, _ := http.NewRequest("POST", url, nil)
req.Header.Add("X-API-Version", "<x-api-version>")
req.Header.Add("Authorization", "Bearer <token>")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.post("https://management-api.fpjs.io/subdomains/{id}/verify")
.header("X-API-Version", "<x-api-version>")
.header("Authorization", "Bearer <token>")
.asString();require 'uri'
require 'net/http'
url = URI("https://management-api.fpjs.io/subdomains/{id}/verify")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["X-API-Version"] = '<x-api-version>'
request["Authorization"] = 'Bearer <token>'
response = http.request(request)
puts response.read_body{
"data": {
"id": "certv2_a1b2c3d4e5f6",
"subdomain": "metrics.yourwebsite.com",
"status": "pending",
"created_at": "2026-03-05T14:00:00.000Z",
"updated_at": "2026-03-05T14:35:00.000Z",
"dns_records": {
"verification": {
"type": "CNAME",
"host": "_acme-challenge.metrics.yourwebsite.com",
"value": "dcv.fpjs.io",
"status": "pending_validation"
},
"routing": [
{
"type": "CNAME",
"host": "_acme-challenge.metrics.yourwebsite.com",
"value": "dcv.fpjs.io",
"status": "pending_validation"
}
]
},
"webhook_url": "https://customer.com/hooks/fp-subdomain"
}
}{
"error": {
"message": "<string>",
"code": "<string>"
}
}{
"error": {
"message": "<string>",
"code": "<string>"
}
}{
"error": {
"message": "<string>",
"code": "<string>"
}
}subdomains
Verify subdomain
Trigger manual verification for a subdomain.
POST
/
subdomains
/
{id}
/
verify
Verify subdomain
curl --request POST \
--url https://management-api.fpjs.io/subdomains/{id}/verify \
--header 'Authorization: Bearer <token>' \
--header 'X-API-Version: <x-api-version>'import requests
url = "https://management-api.fpjs.io/subdomains/{id}/verify"
headers = {
"X-API-Version": "<x-api-version>",
"Authorization": "Bearer <token>"
}
response = requests.post(url, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {'X-API-Version': '<x-api-version>', Authorization: 'Bearer <token>'}
};
fetch('https://management-api.fpjs.io/subdomains/{id}/verify', 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://management-api.fpjs.io/subdomains/{id}/verify",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>",
"X-API-Version: <x-api-version>"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"net/http"
"io"
)
func main() {
url := "https://management-api.fpjs.io/subdomains/{id}/verify"
req, _ := http.NewRequest("POST", url, nil)
req.Header.Add("X-API-Version", "<x-api-version>")
req.Header.Add("Authorization", "Bearer <token>")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.post("https://management-api.fpjs.io/subdomains/{id}/verify")
.header("X-API-Version", "<x-api-version>")
.header("Authorization", "Bearer <token>")
.asString();require 'uri'
require 'net/http'
url = URI("https://management-api.fpjs.io/subdomains/{id}/verify")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["X-API-Version"] = '<x-api-version>'
request["Authorization"] = 'Bearer <token>'
response = http.request(request)
puts response.read_body{
"data": {
"id": "certv2_a1b2c3d4e5f6",
"subdomain": "metrics.yourwebsite.com",
"status": "pending",
"created_at": "2026-03-05T14:00:00.000Z",
"updated_at": "2026-03-05T14:35:00.000Z",
"dns_records": {
"verification": {
"type": "CNAME",
"host": "_acme-challenge.metrics.yourwebsite.com",
"value": "dcv.fpjs.io",
"status": "pending_validation"
},
"routing": [
{
"type": "CNAME",
"host": "_acme-challenge.metrics.yourwebsite.com",
"value": "dcv.fpjs.io",
"status": "pending_validation"
}
]
},
"webhook_url": "https://customer.com/hooks/fp-subdomain"
}
}{
"error": {
"message": "<string>",
"code": "<string>"
}
}{
"error": {
"message": "<string>",
"code": "<string>"
}
}{
"error": {
"message": "<string>",
"code": "<string>"
}
}Triggers an on-demand DNS check instead of waiting for the next background check. Use it right after you add your DNS records to move the subdomain forward without waiting.
This endpoint is idempotent: if the check doesn’t advance the subdomain, or the subdomain is already
active, it still returns 200 with the current state. It’s rate limited per subdomain, so call it sparingly rather than in a tight loop. To poll for status, use Get subdomain instead.Was this page helpful?