Skip to content
API referenceConsumerConsumer.vspaces

Update a VSpace's MagicDNS settings

PUT
/consumer/v1/vspaces/{id}/dns

Validates + entitlement-gates + persists MagicDNS settings for the VSpace, then republishes the account's live device maps (MD-D-07). The curated nameserver picker, toggle, default search suffix, and basic override-local-DNS are free; custom resolvers/DoH, split-DNS routes, and static records are paid (HTTP 402 on a non-entitled tier or over quota). Enabling MagicDNS / override-local-DNS with zero resolvers is rejected (never-leak / never-zero, HTTP 400).

Authorization

bearer_auth
AuthorizationBearer <token>

In: header

Path Parameters

id*string

VSpace ID

Formatuuid

Header Parameters

X-Project-Id*string

UUID of the project that scopes consumer accounts, devices, sessions, and VSpaces for the request.

Formatuuid

Request Body

application/json

MagicDNS settings patch (PUT semantics: present fields replace, absent fields are unchanged).

TypeScript Definitions

Use the request body type in TypeScript.

The MagicDNS settings PUT body (MD-13). PUT semantics: a present field replaces that knob wholesale; an absent field leaves it unchanged.

Response Body

application/json

application/json

application/json

application/json

application/json

application/json

curl -X PUT "https://example.com/consumer/v1/vspaces/44444444-4444-4444-4444-444444444444/dns" \  -H "X-Project-Id: 11111111-1111-1111-1111-111111111111" \  -H "Content-Type: application/json" \  -d '{    "enabled": true,    "extra_records": [      {        "name": "printer.mesh.fvpn.net",        "rtype": "a",        "value": "100.64.0.9"      }    ],    "nameservers": [      {        "provider": "cloudflare"      }    ],    "override_local_dns": true,    "register_dual_stack": false,    "routes": [      {        "resolvers": [          {            "addr": "10.0.0.53"          }        ],        "suffix": "corp.example.com"      }    ],    "search_domains": [      "corp.example.com"    ]  }'
{  "cert_domains": [],  "enabled": true,  "extra_records": [    {      "name": "printer.mesh.fvpn.net",      "rtype": "a",      "value": "100.64.0.9"    }  ],  "override_local_dns": true,  "register_dual_stack": false,  "resolvers": [    {      "addr": "1.1.1.1",      "use_with_exit_node": false    }  ],  "routes": [    {      "resolvers": [        {          "addr": "10.0.0.53",          "use_with_exit_node": false        }      ],      "suffix": "corp.example.com"    }  ],  "search_domains": [    "corp.example.com"  ],  "suffix": "mesh.fvpn.net"}
{  "detail": "Pool slug must be unique.",  "instance": "urn:forestvpn:trace:a1b2c3d4",  "title": "Validation Error",  "type": "https://fvpn.net/errors/validation"}
{  "detail": "Pool slug must be unique.",  "instance": "urn:forestvpn:trace:a1b2c3d4",  "title": "Validation Error",  "type": "https://fvpn.net/errors/validation"}
{  "detail": "Pool slug must be unique.",  "instance": "urn:forestvpn:trace:a1b2c3d4",  "title": "Validation Error",  "type": "https://fvpn.net/errors/validation"}
{  "detail": "Pool slug must be unique.",  "instance": "urn:forestvpn:trace:a1b2c3d4",  "title": "Validation Error",  "type": "https://fvpn.net/errors/validation"}
{  "detail": "Pool slug must be unique.",  "instance": "urn:forestvpn:trace:a1b2c3d4",  "title": "Validation Error",  "type": "https://fvpn.net/errors/validation"}