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"
}
}Crear una zona
Crear una nueva zona DNS. Los registros SOA y NS se generan automáticamente en la lista de servidores de nombres de la plataforma; la zona se puede consultar inmediatamente en caso de éxito.
Por defecto, una zona pública. Pase visibility: private más al menos una entrada vpcs para una zona que resuelve solo dentro de esas VPCs: una zona privada sin VPC o una zona pública que lleva vpcs se rechaza con 400 en lugar de ser forzada silenciosamente.
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 permisos de DNS para obtener la lista completa, lo que cubre cada una y un ejemplo de política.Autorizaciones
Un token bearer de OAuth 2.0, enviado como Authorization: Bearer <token>. Esta es la forma recomendada de autenticación.
Obtén el token intercambiando el par de claves de acceso de una cuenta de servicio en POST /v1/oauth/token con grant_type=client_credentials. Es el flujo estándar de credenciales de cliente; las bibliotecas compatibles con OAuth pueden obtener y renovar el token por ti.
curl -s -u "$KEY_ID:$SECRET" -d grant_type=client_credentials \
https://iam.basaltic.sh/v1/oauth/token
Los tokens duran una hora por defecto. El mismo par de claves de acceso también sirve como credencial AWS SigV4 para el endpoint de objetos compatible con S3, que solo acepta ese método de autenticación.
Encabezados
Clave opcional generada por el cliente que hace que una creación sea segura para la reproducción. Al volver a intentar una solicitud con la misma clave, se devuelve el resultado original literalmente en lugar de crear un recurso duplicado. Se rechaza la reutilización de una clave con un cuerpo de solicitud diferente (422); una solicitud cuya clave todavía se está procesando devuelve 409. Los registros se mantienen durante 24 horas. Usa un UUID o un token único similar.
255Cuerpo
Zona de FQDN. Los nombres de los recursos no deben comenzar con el prefijo literal crn: ni ser UUID (en cualquier caso, en las formas canónica, compacta, entre corchetes o urn:uuid:).
"example.com"
Nota de forma libre almacenada y devuelta en la zona.
"Production apex"
private restringe la zona a las VPCs nombradas en vpcs y requiere al menos una; public (el valor predeterminado) rechaza vpcs directamente en lugar de ignorarlos. No se puede cambiar después.
public, private "public"
Firmar la zona con DNSSEC. Encendido a menos que usted diga lo contrario, y casi todas las zonas deben dejarlo encendido.
Desactiva solo si este dominio es servido por otro proveedor de DNS al mismo tiempo que nosotros. Una zona firmada pone nuestro registro DS en el padre, y ese DS cubre solo las respuestas que firmamos, por lo que un resolver de validación que le pregunta al otro proveedor obtiene una firma que no puede verificar y falla la búsqueda. Aproximadamente la mitad de sus consultas, de forma impredecible, lo que es peor que cualquier proveedor por sí solo. Sin firmar es la única configuración que funciona para esa configuración hoy en día.
Fijado en la creación. Si desactivas la firma más tarde, el dominio se interrumpe hasta que el DS se retira en el registrador y esa retirada se ha propagado, lo cual es una secuencia que esta API no puede gestionar por ti.
true
Lee los registros del dominio de los servidores de nombres que lo sirven HOY y cópielos en esta zona, antes de mover la delegación aquí.
Vale la pena preguntar cuando estás migrando un dominio activo. La delegación es la prueba de propiedad, así que el momento en que usted señala a su registrador a esta zona es el momento en que comenzamos a responder por ella — y una zona vacía responde con nada, lo que lleva el sitio y el correo hasta que haya vuelto a escribir todo.
Se ejecuta en segundo plano; la zona se crea inmediatamente. Poll GET /v1/zones/{zone_id}/record-import para ver el resultado.
El mejor esfuerzo, y el resultado dice lo bueno que fue. Una transferencia de zona es exhaustiva y casi siempre se rechaza; el fallback consulta una lista de nombres comunes y no puede encontrar un registro que no pensó en pedir. Compruebe record_import.complete antes de desactivar su antiguo proveedor.
Los registros que ya haya creado nunca se sobrescriben y los registros que esta plataforma gestiona por sí misma (el SOA, la cadena DNSSEC, los servidores de nombres de la zona) nunca se importan.
true
UUID de VPC de propiedad de la cuenta o CRN de red/vpc en los que se resuelve la zona. Los nombres desnudos se rechazan con 400 porque la solicitud no fija ninguna región. Los CRN se resuelven en su región con nombre; los UUID buscan en todas las regiones habilitadas para DNS. Las VPC que faltan, de cuenta extranjera o de región no configurada devuelven 404. Las búsquedas de UUID incompletas o las identidades de UUID regionales duplicadas fallan con un error de servidor. Las referencias se deduplican por UUID. Requerido cuando visibility=private, rechazado cuando visibility=public. Más se pueden asociar más tarde a través de POST /v1/zones/{zone_id}/vpc-associations.
["c3d4e5f6-a7b8-4901-c2d3-e4f5a6b7c8d9"]
Show child attributes
Show child attributes
{
"environment": "production",
"team": "backend"
}
Respuesta
Zona creada
Show child attributes
Show child attributes

