URL: /guides/dns-presets

---
title: Apply a DNS preset
description: One-click templates for Vercel, Google Workspace, Microsoft 365, and other common providers.
---

A preset is a bundle of records that one apply will configure a known service. Applying a preset:

1. Lists the records the preset wants.
2. Deletes any conflicting records on your zone.
3. Creates the new records.

Presets always confirm — even if the cost is zero, applying one is a bulk operation.

## List presets

```bash
curl "https://api.domaingenius.com.au/api/v1/orgs/$DG_ORG/domains/example.com.au/dns/presets" \
  -H "Authorization: Bearer $DG_KEY"
```

Currently shipped: `vercel`, `cloudflare_pages`, `google_workspace_mx`, `google_workspace_dkim`, `microsoft_365_mx`, `proton_mail`, `fastmail`, `netlify`, `github_pages`, plus a few SPF helpers.

## Apply

```bash
curl -X POST "https://api.domaingenius.com.au/api/v1/orgs/$DG_ORG/domains/example.com.au/dns/presets/apply" \
  -H "Authorization: Bearer $DG_KEY" \
  -H "Content-Type: application/json" \
  -d '{ "preset": "vercel" }'
```

Some presets need inputs:

```json
{
  "preset": "google_workspace_dkim",
  "input_values": {
    "selector": "google",
    "public_key": "v=DKIM1; k=rsa; p=MIIB..."
  }
}
```

## What's currently active

```bash
curl "https://api.domaingenius.com.au/api/v1/orgs/$DG_ORG/domains/example.com.au/dns/presets/active" \
  -H "Authorization: Bearer $DG_KEY"
```

Detection is record-shape-based — if you've manually added records that match a preset, it'll show as active.

## Remove

```bash
curl -X POST "https://api.domaingenius.com.au/api/v1/orgs/$DG_ORG/domains/example.com.au/dns/presets/remove" \
  -H "Authorization: Bearer $DG_KEY" \
  -d '{ "preset": "vercel" }'
```

Removes only the records that match the preset, not the whole zone.

## Stacking

Presets are designed to compose. You can have `google_workspace_mx` and `vercel` on the same zone — the MX records and the apex routing don't conflict.

Presets that conflict at apply time (e.g. two MX-providing presets) will fail with `PRESET_CONFLICT`. Remove the existing one first.
