curl --request POST \
--url https://api.parallellabs.app/api/v0/domains/purchase \
--header 'Content-Type: application/json' \
--header 'X-API-Key: <api-key>' \
--data '
{
"companyId": "<string>",
"domain": "<string>",
"contactDetails": {},
"purchaseConfirmed": true
}
'import requests
url = "https://api.parallellabs.app/api/v0/domains/purchase"
payload = {
"companyId": "<string>",
"domain": "<string>",
"contactDetails": {},
"purchaseConfirmed": True
}
headers = {
"X-API-Key": "<api-key>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {'X-API-Key': '<api-key>', 'Content-Type': 'application/json'},
body: JSON.stringify({
companyId: '<string>',
domain: '<string>',
contactDetails: {},
purchaseConfirmed: true
})
};
fetch('https://api.parallellabs.app/api/v0/domains/purchase', 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.parallellabs.app/api/v0/domains/purchase",
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([
'companyId' => '<string>',
'domain' => '<string>',
'contactDetails' => [
],
'purchaseConfirmed' => true
]),
CURLOPT_HTTPHEADER => [
"Content-Type: application/json",
"X-API-Key: <api-key>"
],
]);
$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.parallellabs.app/api/v0/domains/purchase"
payload := strings.NewReader("{\n \"companyId\": \"<string>\",\n \"domain\": \"<string>\",\n \"contactDetails\": {},\n \"purchaseConfirmed\": true\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("X-API-Key", "<api-key>")
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.parallellabs.app/api/v0/domains/purchase")
.header("X-API-Key", "<api-key>")
.header("Content-Type", "application/json")
.body("{\n \"companyId\": \"<string>\",\n \"domain\": \"<string>\",\n \"contactDetails\": {},\n \"purchaseConfirmed\": true\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.parallellabs.app/api/v0/domains/purchase")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["X-API-Key"] = '<api-key>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"companyId\": \"<string>\",\n \"domain\": \"<string>\",\n \"contactDetails\": {},\n \"purchaseConfirmed\": true\n}"
response = http.request(request)
puts response.read_body{
"domain": {},
"pricing": {},
"dnsRecord": {},
"providerStatus": "<string>"
}{
"error": "<string>"
}{
"error": "<string>"
}{
"error": "<string>"
}{
"error": "<string>"
}Purchase a root-domain registration and create its pending connection.
This is a financial, non-idempotent action. First call the pricing endpoint, obtain approval, then set purchaseConfirmed to true. Never blindly retry a timeout; check the domain list first to avoid a duplicate purchase. This is separate from connecting a customer-owned domain for SSL termination and routing.
curl --request POST \
--url https://api.parallellabs.app/api/v0/domains/purchase \
--header 'Content-Type: application/json' \
--header 'X-API-Key: <api-key>' \
--data '
{
"companyId": "<string>",
"domain": "<string>",
"contactDetails": {},
"purchaseConfirmed": true
}
'import requests
url = "https://api.parallellabs.app/api/v0/domains/purchase"
payload = {
"companyId": "<string>",
"domain": "<string>",
"contactDetails": {},
"purchaseConfirmed": True
}
headers = {
"X-API-Key": "<api-key>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {'X-API-Key': '<api-key>', 'Content-Type': 'application/json'},
body: JSON.stringify({
companyId: '<string>',
domain: '<string>',
contactDetails: {},
purchaseConfirmed: true
})
};
fetch('https://api.parallellabs.app/api/v0/domains/purchase', 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.parallellabs.app/api/v0/domains/purchase",
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([
'companyId' => '<string>',
'domain' => '<string>',
'contactDetails' => [
],
'purchaseConfirmed' => true
]),
CURLOPT_HTTPHEADER => [
"Content-Type: application/json",
"X-API-Key: <api-key>"
],
]);
$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.parallellabs.app/api/v0/domains/purchase"
payload := strings.NewReader("{\n \"companyId\": \"<string>\",\n \"domain\": \"<string>\",\n \"contactDetails\": {},\n \"purchaseConfirmed\": true\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("X-API-Key", "<api-key>")
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.parallellabs.app/api/v0/domains/purchase")
.header("X-API-Key", "<api-key>")
.header("Content-Type", "application/json")
.body("{\n \"companyId\": \"<string>\",\n \"domain\": \"<string>\",\n \"contactDetails\": {},\n \"purchaseConfirmed\": true\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.parallellabs.app/api/v0/domains/purchase")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["X-API-Key"] = '<api-key>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"companyId\": \"<string>\",\n \"domain\": \"<string>\",\n \"contactDetails\": {},\n \"purchaseConfirmed\": true\n}"
response = http.request(request)
puts response.read_body{
"domain": {},
"pricing": {},
"dnsRecord": {},
"providerStatus": "<string>"
}{
"error": "<string>"
}{
"error": "<string>"
}{
"error": "<string>"
}{
"error": "<string>"
}Authorizations
Company API key - scoped to a specific company. Generate from the Integrations page in your dashboard.
Body
Confirmed one-time root-domain registration purchase
One-time root-domain registration for email infrastructure. This is separate from the $5/month branded-domain connection add-on for SSL termination and routing.
Company that will own the registered domain and connection
Available root domain to purchase, e.g. example.com. Do not include https:// or a subdomain.
Registrant data: firstName, lastName, email, phone, address1, city, province, postalCode, and country; organization is optional. The registrant email is reused for DMARC reports, and its root domain is used for reply forwarding.
Must be true. This confirms the quoted customer price and authorizes the irreversible purchase.
Response
Registered domain and its pending branded-domain connection
The pending branded-domain connection created for the newly registered domain
Registration quote: basePrice, priceMultiplier, and customerPrice in USD. This is not the monthly connection add-on price.
A record used by the branded-domain connection for SSL termination and routing
Registration status from the managed domain service

