curl --request POST \
--url https://dns.basaltic.sh/v1/zones \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"name": "example.com",
"description": "Production apex",
"visibility": "public",
"dnssec": true,
"import_existing_records": true,
"vpcs": [
"c3d4e5f6-a7b8-4901-c2d3-e4f5a6b7c8d9"
],
"tags": {
"environment": "production",
"team": "backend"
}
}
'import requests
url = "https://dns.basaltic.sh/v1/zones"
payload = {
"name": "example.com",
"description": "Production apex",
"visibility": "public",
"dnssec": True,
"import_existing_records": True,
"vpcs": ["c3d4e5f6-a7b8-4901-c2d3-e4f5a6b7c8d9"],
"tags": {
"environment": "production",
"team": "backend"
}
}
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: 'example.com',
description: 'Production apex',
visibility: 'public',
dnssec: true,
import_existing_records: true,
vpcs: ['c3d4e5f6-a7b8-4901-c2d3-e4f5a6b7c8d9'],
tags: {environment: 'production', team: 'backend'}
})
};
fetch('https://dns.basaltic.sh/v1/zones', 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://dns.basaltic.sh/v1/zones",
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' => 'example.com',
'description' => 'Production apex',
'visibility' => 'public',
'dnssec' => true,
'import_existing_records' => true,
'vpcs' => [
'c3d4e5f6-a7b8-4901-c2d3-e4f5a6b7c8d9'
],
'tags' => [
'environment' => 'production',
'team' => 'backend'
]
]),
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://dns.basaltic.sh/v1/zones"
payload := strings.NewReader("{\n \"name\": \"example.com\",\n \"description\": \"Production apex\",\n \"visibility\": \"public\",\n \"dnssec\": true,\n \"import_existing_records\": true,\n \"vpcs\": [\n \"c3d4e5f6-a7b8-4901-c2d3-e4f5a6b7c8d9\"\n ],\n \"tags\": {\n \"environment\": \"production\",\n \"team\": \"backend\"\n }\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://dns.basaltic.sh/v1/zones")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"name\": \"example.com\",\n \"description\": \"Production apex\",\n \"visibility\": \"public\",\n \"dnssec\": true,\n \"import_existing_records\": true,\n \"vpcs\": [\n \"c3d4e5f6-a7b8-4901-c2d3-e4f5a6b7c8d9\"\n ],\n \"tags\": {\n \"environment\": \"production\",\n \"team\": \"backend\"\n }\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://dns.basaltic.sh/v1/zones")
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\": \"example.com\",\n \"description\": \"Production apex\",\n \"visibility\": \"public\",\n \"dnssec\": true,\n \"import_existing_records\": true,\n \"vpcs\": [\n \"c3d4e5f6-a7b8-4901-c2d3-e4f5a6b7c8d9\"\n ],\n \"tags\": {\n \"environment\": \"production\",\n \"team\": \"backend\"\n }\n}"
response = http.request(request)
puts response.read_body{
"zone": {
"id": "550e8400-e29b-41d4-a716-446655440000",
"crn": "crn:dns::my-account:zone/example.com",
"name": "example.com",
"description": "Public zone for the marketing site",
"nameservers": [
"028t5cy4tqkff.triton.dns.basaltic.cloud",
"028t5cy4tqkff.proteus.dns.basaltic.cloud"
],
"soa": {
"primary_ns": "028t5cy4tqkff.triton.dns.basaltic.cloud",
"admin_email": "hostmaster@basaltic.sh",
"refresh": 10800,
"retry": 3600,
"expire": 604800,
"minimum": 3600
},
"visibility": "public",
"dnssec": {
"enabled": true,
"ksk_key_tag": 12345,
"zsk_key_tag": 54321,
"algorithm": 13,
"ds_records": [
{
"key_tag": 12345,
"algorithm": 13,
"digest_type": 2,
"digest": "B8FA03AA1BB49CC702C32C5C3FE6061BBDD0808371F43A28A8E8BE2738CC9861",
"rdata": "12345 13 2 B8FA03AA1BB49CC702C32C5C3FE6061BBDD0808371F43A28A8E8BE2738CC9861"
}
]
},
"tags": {
"environment": "production",
"team": "backend"
},
"ownership": {
"verified": false,
"verified_at": "2026-01-15T09:30:00Z",
"checked_at": "2026-04-14T09:30:00Z",
"recheck_deadline": "2026-04-28T09:30:00Z"
}
}
}{
"error": {
"code": "INVALID_INPUT",
"message": "Invalid request parameters",
"request_id": "550e8400-e29b-41d4-a716-446655440000"
}
}{
"error": {
"code": "UNAUTHORIZED",
"message": "Authentication required",
"request_id": "550e8400-e29b-41d4-a716-446655440000"
}
}{
"error": {
"code": "ACCESS_DENIED",
"message": "You don't have permission to perform this action",
"request_id": "550e8400-e29b-41d4-a716-446655440000"
}
}{
"error": {
"code": "NOT_FOUND",
"message": "Resource not found",
"request_id": "550e8400-e29b-41d4-a716-446655440000"
}
}{
"error": {
"code": "INVALID_INPUT",
"message": "Invalid request parameters",
"request_id": "550e8400-e29b-41d4-a716-446655440000",
"params": {
"instances": 2,
"pools": 0
}
}
}{
"error": {
"code": "IDEMPOTENCY_KEY_REUSED",
"message": "This Idempotency-Key was already used with a different request payload",
"request_id": "550e8400-e29b-41d4-a716-446655440000"
}
}{
"error": {
"code": "INTERNAL_ERROR",
"message": "An internal error occurred",
"request_id": "550e8400-e29b-41d4-a716-446655440000"
}
}Criar uma zona
Crie uma nova zona DNS. Os registros SOA e NS são gerados automaticamente contra a lista de servidores de nomes da plataforma; a zona é consultável imediatamente após o sucesso.
Por padrão, é uma zona pública. Passe visibility: private mais pelo menos uma entrada vpcs para uma zona que resolve somente dentro dessas VPCs — uma zona privada sem VPC ou uma zona pública que carrega vpcs é rejeitada com 400 em vez de ser silenciosamente forçada.
curl --request POST \
--url https://dns.basaltic.sh/v1/zones \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"name": "example.com",
"description": "Production apex",
"visibility": "public",
"dnssec": true,
"import_existing_records": true,
"vpcs": [
"c3d4e5f6-a7b8-4901-c2d3-e4f5a6b7c8d9"
],
"tags": {
"environment": "production",
"team": "backend"
}
}
'import requests
url = "https://dns.basaltic.sh/v1/zones"
payload = {
"name": "example.com",
"description": "Production apex",
"visibility": "public",
"dnssec": True,
"import_existing_records": True,
"vpcs": ["c3d4e5f6-a7b8-4901-c2d3-e4f5a6b7c8d9"],
"tags": {
"environment": "production",
"team": "backend"
}
}
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: 'example.com',
description: 'Production apex',
visibility: 'public',
dnssec: true,
import_existing_records: true,
vpcs: ['c3d4e5f6-a7b8-4901-c2d3-e4f5a6b7c8d9'],
tags: {environment: 'production', team: 'backend'}
})
};
fetch('https://dns.basaltic.sh/v1/zones', 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://dns.basaltic.sh/v1/zones",
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' => 'example.com',
'description' => 'Production apex',
'visibility' => 'public',
'dnssec' => true,
'import_existing_records' => true,
'vpcs' => [
'c3d4e5f6-a7b8-4901-c2d3-e4f5a6b7c8d9'
],
'tags' => [
'environment' => 'production',
'team' => 'backend'
]
]),
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://dns.basaltic.sh/v1/zones"
payload := strings.NewReader("{\n \"name\": \"example.com\",\n \"description\": \"Production apex\",\n \"visibility\": \"public\",\n \"dnssec\": true,\n \"import_existing_records\": true,\n \"vpcs\": [\n \"c3d4e5f6-a7b8-4901-c2d3-e4f5a6b7c8d9\"\n ],\n \"tags\": {\n \"environment\": \"production\",\n \"team\": \"backend\"\n }\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://dns.basaltic.sh/v1/zones")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"name\": \"example.com\",\n \"description\": \"Production apex\",\n \"visibility\": \"public\",\n \"dnssec\": true,\n \"import_existing_records\": true,\n \"vpcs\": [\n \"c3d4e5f6-a7b8-4901-c2d3-e4f5a6b7c8d9\"\n ],\n \"tags\": {\n \"environment\": \"production\",\n \"team\": \"backend\"\n }\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://dns.basaltic.sh/v1/zones")
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\": \"example.com\",\n \"description\": \"Production apex\",\n \"visibility\": \"public\",\n \"dnssec\": true,\n \"import_existing_records\": true,\n \"vpcs\": [\n \"c3d4e5f6-a7b8-4901-c2d3-e4f5a6b7c8d9\"\n ],\n \"tags\": {\n \"environment\": \"production\",\n \"team\": \"backend\"\n }\n}"
response = http.request(request)
puts response.read_body{
"zone": {
"id": "550e8400-e29b-41d4-a716-446655440000",
"crn": "crn:dns::my-account:zone/example.com",
"name": "example.com",
"description": "Public zone for the marketing site",
"nameservers": [
"028t5cy4tqkff.triton.dns.basaltic.cloud",
"028t5cy4tqkff.proteus.dns.basaltic.cloud"
],
"soa": {
"primary_ns": "028t5cy4tqkff.triton.dns.basaltic.cloud",
"admin_email": "hostmaster@basaltic.sh",
"refresh": 10800,
"retry": 3600,
"expire": 604800,
"minimum": 3600
},
"visibility": "public",
"dnssec": {
"enabled": true,
"ksk_key_tag": 12345,
"zsk_key_tag": 54321,
"algorithm": 13,
"ds_records": [
{
"key_tag": 12345,
"algorithm": 13,
"digest_type": 2,
"digest": "B8FA03AA1BB49CC702C32C5C3FE6061BBDD0808371F43A28A8E8BE2738CC9861",
"rdata": "12345 13 2 B8FA03AA1BB49CC702C32C5C3FE6061BBDD0808371F43A28A8E8BE2738CC9861"
}
]
},
"tags": {
"environment": "production",
"team": "backend"
},
"ownership": {
"verified": false,
"verified_at": "2026-01-15T09:30:00Z",
"checked_at": "2026-04-14T09:30:00Z",
"recheck_deadline": "2026-04-28T09:30:00Z"
}
}
}{
"error": {
"code": "INVALID_INPUT",
"message": "Invalid request parameters",
"request_id": "550e8400-e29b-41d4-a716-446655440000"
}
}{
"error": {
"code": "UNAUTHORIZED",
"message": "Authentication required",
"request_id": "550e8400-e29b-41d4-a716-446655440000"
}
}{
"error": {
"code": "ACCESS_DENIED",
"message": "You don't have permission to perform this action",
"request_id": "550e8400-e29b-41d4-a716-446655440000"
}
}{
"error": {
"code": "NOT_FOUND",
"message": "Resource not found",
"request_id": "550e8400-e29b-41d4-a716-446655440000"
}
}{
"error": {
"code": "INVALID_INPUT",
"message": "Invalid request parameters",
"request_id": "550e8400-e29b-41d4-a716-446655440000",
"params": {
"instances": 2,
"pools": 0
}
}
}{
"error": {
"code": "IDEMPOTENCY_KEY_REUSED",
"message": "This Idempotency-Key was already used with a different request payload",
"request_id": "550e8400-e29b-41d4-a716-446655440000"
}
}{
"error": {
"code": "INTERNAL_ERROR",
"message": "An internal error occurred",
"request_id": "550e8400-e29b-41d4-a716-446655440000"
}
}dns:CreateZone. Consulte permissões de DNS para obter a lista completa, o que cada uma abrange e um exemplo de política.Autorizações
Um token bearer OAuth 2.0, enviado como Authorization: Bearer <token>. Esta é a forma recomendada de autenticação.
Obtenha o token trocando o par de chaves de acesso de uma conta de serviço em POST /v1/oauth/token com grant_type=client_credentials. Esse é o fluxo padrão de credenciais de cliente; bibliotecas compatíveis com OAuth podem obter e renovar o token para você.
curl -s -u "$KEY_ID:$SECRET" -d grant_type=client_credentials \
https://iam.basaltic.sh/v1/oauth/token
Os tokens duram uma hora por padrão. O mesmo par de chaves de acesso também serve como credencial AWS SigV4 para o endpoint de objetos compatível com S3, que aceita somente esse método de autenticação.
Cabeçalhos
Chave opcional gerada pelo cliente que torna uma criação segura para reprodução. A reintentar uma solicitação com a mesma chave retorna o resultado original literalmente em vez de criar um recurso duplicado. A reutilização de uma chave com um corpo de solicitação diferente é rejeitada (422); uma solicitação cuja chave ainda está sendo processada retorna 409. Os registros são honrados por 24 horas. Use um UUID ou token exclusivo semelhante.
255Corpo
FQDN de zona. Os nomes de recursos não devem começar com o prefixo literal crn: ou ser UUIDs (formas canônicas, compactas, entre colchetes ou urn:uuid:, em qualquer caso).
"example.com"
Nota de forma livre armazenada e retornada na zona.
"Production apex"
private restringe a zona para as VPCs nomeadas em vpcs e requer pelo menos uma; public (o padrão) rejeita vpcs completamente em vez de ignorá-los. Não pode ser alterado posteriormente.
public, private "public"
Assine a zona com DNSSEC. Ligado a menos que você diga o contrário, e quase todas as zonas devem deixá-lo ligado.
Desative-o somente se este domínio for servido por outro provedor de DNS ao mesmo tempo que nós. Uma zona assinada coloca nosso registro DS no pai, e esse DS cobre apenas as respostas que assinamos — então um resolver de validação que por acaso pergunta ao outro provedor obtém uma assinatura que não pode verificar e falha na pesquisa. Cerca de metade das suas consultas, de forma imprevisível, o que é pior do que qualquer provedor sozinho. Não assinado é a única configuração que funciona para essa configuração hoje.
Fixo na criação. Desativar a assinatura mais tarde interrompe o domínio até que o DS seja retirado no registrador e essa retirada tenha se propagado, o que é uma sequência que essa API não pode executar para você.
true
Leia os registros do domínio dos servidores de nomes que o atendem HOJE e copie-os para esta zona, antes de mover a delegação para aqui.
Vale a pena perguntar quando você está migrando um domínio ativo. A delegação é a prova de propriedade, então no momento em que você aponta seu registrador para essa zona é o momento em que começamos a responder por ela — e uma zona vazia responde com nada, o que leva o site e o e-mail para baixo até que você tenha redigitado tudo.
Executa-se em segundo plano; a zona é criada imediatamente. Poll GET /v1/zones/{zone_id}/record-import para o resultado.
Melhor esforço, e o resultado diz o quão bom foi. Uma transferência de zona é exaustiva e quase sempre recusada; o fallback consulta uma lista de nomes comuns e não consegue encontrar um registro que não pensou em pedir. Verifique record_import.complete antes de desligar o seu antigo provedor.
Os registros que você já criou nunca são substituídos, e os registros que esta plataforma gerencia sozinha — o SOA, a cadeia DNSSEC, os servidores de nomes da zona — nunca são importados.
true
UUIDs de VPC de propriedade da conta ou CRNs de rede/vpc nos quais a zona resolve. Nomes nulos são rejeitados com 400 porque a solicitação não corrige nenhuma região. CRNs resolvem em sua região nomeada; UUIDs pesquisam todas as regiões habilitadas para DNS. VPCs ausentes, de conta estrangeira ou de região não configurada retornam 404. Pesquisas incompletas de UUID ou identidades duplicadas de UUID regional falham com um erro de servidor. As referências são deduplicadas pelo UUID. Necessário quando visibility=private, rejeitado quando visibility=public. Mais podem ser associados mais tarde via POST /v1/zones/{zone_id}/vpc-associations.
["c3d4e5f6-a7b8-4901-c2d3-e4f5a6b7c8d9"]
Show child attributes
Show child attributes
{
"environment": "production",
"team": "backend"
}
Resposta
Zona criada
Show child attributes
Show child attributes

