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": {},
"paymentIntentId": "<string>",
"connectedAccount": "<string>"
}
'import requests
url = "https://api.parallellabs.app/api/v0/domains/purchase"
payload = {
"companyId": "<string>",
"domain": "<string>",
"contactDetails": {},
"paymentIntentId": "<string>",
"connectedAccount": "<string>"
}
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: {},
paymentIntentId: '<string>',
connectedAccount: '<string>'
})
};
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' => [
],
'paymentIntentId' => '<string>',
'connectedAccount' => '<string>'
]),
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 \"paymentIntentId\": \"<string>\",\n \"connectedAccount\": \"<string>\"\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 \"paymentIntentId\": \"<string>\",\n \"connectedAccount\": \"<string>\"\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 \"paymentIntentId\": \"<string>\",\n \"connectedAccount\": \"<string>\"\n}"
response = http.request(request)
puts response.read_body{
"domain": {},
"pricing": {},
"providerStatus": "<string>"
}{
"error": "<string>"
}{
"error": "<string>"
}{
"error": "<string>"
}{
"error": "<string>"
}Purchase a root-domain registration.
This is a financial action and requires a successful Stripe PaymentIntent created for the same user, company, and domain. The purchase starts a yearly renewal subscription on the same card. The domain is not connected for SSL routing; create a domain-connection for a hostname under it when needed. Never blindly retry a provider timeout; check the domain list first.
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": {},
"paymentIntentId": "<string>",
"connectedAccount": "<string>"
}
'import requests
url = "https://api.parallellabs.app/api/v0/domains/purchase"
payload = {
"companyId": "<string>",
"domain": "<string>",
"contactDetails": {},
"paymentIntentId": "<string>",
"connectedAccount": "<string>"
}
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: {},
paymentIntentId: '<string>',
connectedAccount: '<string>'
})
};
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' => [
],
'paymentIntentId' => '<string>',
'connectedAccount' => '<string>'
]),
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 \"paymentIntentId\": \"<string>\",\n \"connectedAccount\": \"<string>\"\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 \"paymentIntentId\": \"<string>\",\n \"connectedAccount\": \"<string>\"\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 \"paymentIntentId\": \"<string>\",\n \"connectedAccount\": \"<string>\"\n}"
response = http.request(request)
puts response.read_body{
"domain": {},
"pricing": {},
"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 root-domain registration purchase with yearly renewal
Root-domain registration for email infrastructure, renewed yearly. 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. Premium names, https://, and subdomains are not supported.
Registrant data: firstName, lastName, email, phone, address1, city, province, postalCode, and country; organization is optional. The registrant email is reused for DMARC reports. Domain forwarding is not configured by this purchase path.
Successful Stripe PaymentIntent created for this exact company and domain.
Stripe connected account returned when the payment was created, if applicable.
Response
The registered domain
The newly registered domain, unconnected until the customer connects it; it uses no connection slot until then
Registration price in USD: customerPrice (first payment) and renewalPrice (billed yearly), with basePrice, renewalBasePrice, and priceMultiplier. This is not the monthly connection add-on price.
Registration status from the managed domain service

