API
The SDM Public API reference documents the customer-callable DNS and Cloudflare operations served by the panel's HTTPS API listener on port 882.
Where to find it: Documentation > DNS Manager > API.
Available to: External API users created in SDM. The root account is deliberately rejected; each API user remains limited by active state, permission, source-IP policy, and zone ownership.
What this page does
Use this page to build integrations without guessing route paths or request keys. It covers 30 public operations: 18 actions on the DNS compatibility endpoint and 12 clean domain/Cloudflare routes. Private service, peer, panel-session, and local administration interfaces are deliberately outside this customer contract.
Before you start
- Create a dedicated non-root API user and keep both its panel account and API account active.
- Choose either
X-API-Name/X-API-Keyheaders or HTTP Basic authentication. - If API source rules are configured, send requests from an allowed IP or CIDR.
- Use the exact origin
https://panel.example.com:882. The port is part of the address, not decorative punctuation. - Read the target before a mutation and keep credentials out of browser JavaScript, source control, logs, and screenshots.
Authentication and request formats
The compatibility endpoint reads URL query keys for GET calls and URL-encoded form fields for POST calls; it does not treat a JSON body as compatibility form input. The clean Cloudflare routes use path/query parameters and JSON bodies exactly as listed in each card. All responses are JSON.
curl -sS 'https://panel.example.com:882/api/v1/dns?action=ping' \
-H 'X-API-Name: dns-automation' \
-H 'X-API-Key: YOUR_API_KEY'
Optional source metadata headers
The DNS compatibility endpoint records these headers after a successful call. They improve the root-only DNS API Sources view and do not replace authentication. When several aliases are present, SDM uses the first non-empty value in the order shown.
| Meaning | Accepted headers, in precedence order | Fallback |
|---|---|---|
| Server name | X-SHM-Source-Hostname, X-SHM-Hostname, X-Server-Name, X-Hosting-Server, X-Node-Name | Empty |
| Public IP | X-SHM-Source-IP, X-SHM-Server-IP, X-Server-IP, X-Public-IP | Observed request address |
| Product type | X-Source-Type, X-SHM-Source-Type, X-Product-Code, X-Product-Type, X-Server-Type | api; SHM aliases normalize to shm |
| Product version | X-SHM-Version, X-Product-Version, X-Server-Version | Empty |
| Capabilities | X-SHM-Capabilities, X-Server-Capabilities, X-Capabilities | Empty; comma, whitespace, semicolon, and pipe separators are normalized |
Public operation index (30)
| Method | Public operation | Purpose | Parameters |
|---|---|---|---|
| GET | /api/v1/dns?action=ping | Check credentials and API availability | 1 |
| GET | /api/v1/dns?action=heartbeat | Record an integration heartbeat | 1 |
| GET | /api/v1/dns?action=nodes_list | List public node status | 2 |
| GET | /api/v1/dns?action=zones_list | List zones owned by the API user | 5 |
| GET | /api/v1/dns?action=zone_get | Read one complete zone | 2 |
| POST | /api/v1/dns?action=zone_create | Create an owned DNS zone | 4 |
| POST | /api/v1/dns?action=zone_replace | Replace a complete zone safely | 8 |
| POST | /api/v1/dns?action=zone_delete | Delete an owned zone | 4 |
| GET | /api/v1/dns?action=zone_check | Validate a zone | 2 |
| POST | /api/v1/dns?action=zone_rectify | Rectify zone metadata | 2 |
| GET | /api/v1/dns?action=zone_dnssec_status | Read DNSSEC state and DS material | 2 |
| POST | /api/v1/dns?action=zone_dnssec_enable | Enable DNSSEC signing | 2 |
| POST | /api/v1/dns?action=zone_dnssec_disable | Disable DNSSEC safely | 4 |
| POST | /api/v1/dns?action=zone_dnssec_rollover | Advance a staged DNSSEC rollover | 4 |
| GET | /api/v1/dns?action=records_list | List records in one zone | 4 |
| POST | /api/v1/dns?action=record_add | Add a DNS record | 10 |
| POST | /api/v1/dns?action=record_update | Update a DNS record value | 9 |
| POST | /api/v1/dns?action=record_delete | Delete a record value or RRset | 5 |
| GET | /api/external/cloudflare/domains | List Cloudflare-managed domains | 3 |
| GET | /api/external/cloudflare/domains/{domain}/status | Read domain provider status | 1 |
| POST | /api/external/cloudflare/domains/{domain}/sync | Synchronize a domain to its desired provider | 1 |
| POST | /api/external/cloudflare/domains/{domain}/enable | Enable Cloudflare for a domain | 4 |
| POST | /api/external/cloudflare/domains/{domain}/disable | Disable Cloudflare and return to local DNS | 6 |
| GET | /api/external/cloudflare/domains/{domain}/settings | Read supported Cloudflare settings | 1 |
| PATCH | /api/external/cloudflare/domains/{domain}/settings/{setting} | Update one Cloudflare setting | 3 |
| POST | /api/external/cloudflare/domains/{domain}/cache/purge | Purge Cloudflare cache | 6 |
| GET | /api/external/cloudflare/domains/{domain}/records | List DNS records for a Cloudflare-capable domain | 3 |
| POST | /api/external/cloudflare/domains/{domain}/records | Create and synchronize a DNS record | 9 |
| PATCH | /api/external/cloudflare/domains/{domain}/records/{record_id} | Update and synchronize one DNS record | 10 |
| DELETE | /api/external/cloudflare/domains/{domain}/records/{record_id} | Delete and synchronize one DNS record | 2 |
Endpoint reference
GET/api/v1/dns?action=pingpublic APICheck credentials and API availability
What this operation does
Authenticates the caller and confirms that the public DNS API is responding.
Endpoint
GET /api/v1/dns?action=ping; accepted methods: GET or POST
Authentication and permissions
Send X-API-Name and X-API-Key, or use HTTP Basic authentication. Requires an active external API identity with dns.ping permission. Root is not accepted by the external API.
Parameters (1)
actionRequired- Send in
- Query string or form body
- Type
string- Accepted values
- ping
- Default
- No default
- Example
ping
Selects this operation on the compatibility endpoint.
Validation and use: Send the exact value ping. Action names are case-sensitive.
Complete request template
This template names all 1 supported path, query, form, and JSON keys. Conditional alternatives are shown together for reference; keep only the valid branch in a runnable request.
{
"path_parameters": {},
"query_parameters": {},
"form_body": {},
"json_body": {},
"query_or_form_parameters": {
"action": "ping"
}
}
Runnable workflow example
curl -sS 'https://panel.example.com:882/api/v1/dns?action=ping' \
-H 'X-API-Name: dns-automation' \
-H 'X-API-Key: YOUR_API_KEY'
Successful result
A successful response contains success=true and the authenticated identity's liveness information.
Error response
{
"success": false,
"error": {
"code": "external_auth_error",
"message": "Authentication failed, the source address is not allowed, the permission is missing, or the requested resource is outside this API user's ownership."
}
}
Operational note
Use ping before a longer workflow. It proves authentication and reachability, not access to every zone or mutation.
GET/api/v1/dns?action=heartbeatpublic APIRecord an integration heartbeat
What this operation does
Authenticates the sender and records its latest activity and optional source metadata for the DNS API Sources page.
Endpoint
GET /api/v1/dns?action=heartbeat; accepted methods: GET or POST
Authentication and permissions
Send X-API-Name and X-API-Key, or use HTTP Basic authentication. Requires a valid active external API identity. The same source-IP policy used by other public calls applies.
Parameters (1)
actionRequired- Send in
- Query string or form body
- Type
string- Accepted values
- heartbeat
- Default
- No default
- Example
heartbeat
Selects this operation on the compatibility endpoint.
Validation and use: Send the exact value heartbeat. Action names are case-sensitive.
Complete request template
This template names all 1 supported path, query, form, and JSON keys. Conditional alternatives are shown together for reference; keep only the valid branch in a runnable request.
{
"path_parameters": {},
"query_parameters": {},
"form_body": {},
"json_body": {},
"query_or_form_parameters": {
"action": "heartbeat"
}
}
Runnable workflow example
curl -sS 'https://panel.example.com:882/api/v1/dns?action=heartbeat' \
-H 'X-API-Name: dns-automation' \
-H 'X-API-Key: YOUR_API_KEY' \
-H 'X-SHM-Source-Hostname: hosting-01.example.net' \
-H 'X-Source-Type: shm'
Successful result
The response reports heartbeat_recorded and returns the normalized sender metadata that SDM stored.
Error response
{
"success": false,
"error": {
"code": "external_auth_error",
"message": "Authentication failed, the source address is not allowed, the permission is missing, or the requested resource is outside this API user's ownership."
}
}
Operational note
A heartbeat is an activity signal, not a DNS write and not a cluster health probe. Send it at a sensible interval; one per second only teaches the audit log to dislike you.
GET/api/v1/dns?action=nodes_listpublic APIList public node status
What this operation does
Returns the node inventory visible through the external DNS integration contract.
Endpoint
GET /api/v1/dns?action=nodes_list; accepted methods: GET or POST
Authentication and permissions
Send X-API-Name and X-API-Key, or use HTTP Basic authentication. Requires dns.nodes.read permission.
Parameters (2)
actionRequired- Send in
- Query string or form body
- Type
string- Accepted values
- nodes_list
- Default
- No default
- Example
nodes_list
Selects this operation on the compatibility endpoint.
Validation and use: Send the exact value nodes_list. Action names are case-sensitive.
statusOptional- Send in
- Query string or form body
- Type
enum- Accepted values
- empty/default, active, pending, removed, or all
- Default
- Empty: active and pending
- Example
active
Filters nodes by registration state.
Validation and use: Use all only when you also need removed nodes; an empty value returns active and pending nodes.
Complete request template
This template names all 2 supported path, query, form, and JSON keys. Conditional alternatives are shown together for reference; keep only the valid branch in a runnable request.
{
"path_parameters": {},
"query_parameters": {},
"form_body": {},
"json_body": {},
"query_or_form_parameters": {
"action": "nodes_list",
"status": "active"
}
}
Runnable workflow example
curl -sS 'https://panel.example.com:882/api/v1/dns?action=nodes_list&status=active' \
-H 'X-API-Name: dns-automation' \
-H 'X-API-Key: YOUR_API_KEY'
Successful result
The response contains count and a nodes array for the selected status set.
Error response
{
"success": false,
"error": {
"code": "external_auth_error",
"message": "Authentication failed, the source address is not allowed, the permission is missing, or the requested resource is outside this API user's ownership."
}
}
Operational note
This is a customer-callable summary action. It does not expose or invoke the private peer-to-peer cluster interface.
GET/api/v1/dns?action=zones_listpublic APIList zones owned by the API user
What this operation does
Returns the caller's accessible zones with search and offset pagination.
Endpoint
GET /api/v1/dns?action=zones_list; accepted methods: GET or POST
Authentication and permissions
Send X-API-Name and X-API-Key, or use HTTP Basic authentication. Requires dns.zones.read permission; ownership filtering remains active.
Parameters (5)
actionRequired- Send in
- Query string or form body
- Type
string- Accepted values
- zones_list
- Default
- No default
- Example
zones_list
Selects this operation on the compatibility endpoint.
Validation and use: Send the exact value zones_list. Action names are case-sensitive.
searchOptional- Send in
- Query string or form body
- Type
string- Accepted values
- A zone-name search fragment
- Default
- Empty
- Example
example
Filters the zone list by name.
Validation and use: If both search and q are supplied, search takes precedence.
qOptional- Send in
- Query string or form body
- Type
string- Accepted values
- A zone-name search fragment
- Default
- Empty
- Example
example
Compatibility alias for search.
Validation and use: Use either q or search. If both are present, search wins.
limitOptional- Send in
- Query string or form body
- Type
integer- Accepted values
- A positive page size accepted by the service
- Default
- 1000
- Example
100
Maximum number of zones requested for this page.
Validation and use: Use a bounded page size and follow next_offset when returned.
offsetOptional- Send in
- Query string or form body
- Type
integer- Accepted values
- 0 or greater
- Default
- 0
- Example
0
Number of matching zones to skip.
Validation and use: Start at 0 and advance by the returned page size or next_offset.
Complete request template
This template names all 5 supported path, query, form, and JSON keys. Conditional alternatives are shown together for reference; keep only the valid branch in a runnable request.
{
"path_parameters": {},
"query_parameters": {},
"form_body": {},
"json_body": {},
"query_or_form_parameters": {
"action": "zones_list",
"search": "example",
"q": "example",
"limit": 100,
"offset": 0
}
}
Runnable workflow example
curl -sS 'https://panel.example.com:882/api/v1/dns?action=zones_list&search=example&limit=100&offset=0' \
-H 'X-API-Name: dns-automation' \
-H 'X-API-Key: YOUR_API_KEY'
Successful result
The response contains total, filtered, limit, offset, next_offset, and the zones array.
Error response
{
"success": false,
"error": {
"code": "external_auth_error",
"message": "Authentication failed, the source address is not allowed, the permission is missing, or the requested resource is outside this API user's ownership."
}
}
Operational note
Pagination is safer than assuming every installation has a small zone list. Search operates inside the caller's ownership boundary.
GET/api/v1/dns?action=zone_getpublic APIRead one complete zone
What this operation does
Fetches one owned zone and its current authoritative data.
Endpoint
GET /api/v1/dns?action=zone_get; accepted methods: GET or POST
Authentication and permissions
Send X-API-Name and X-API-Key, or use HTTP Basic authentication. Requires dns.zones.read permission and access to the requested zone.
Parameters (2)
actionRequired- Send in
- Query string or form body
- Type
string- Accepted values
- zone_get
- Default
- No default
- Example
zone_get
Selects this operation on the compatibility endpoint.
Validation and use: Send the exact value zone_get. Action names are case-sensitive.
nameRequired- Send in
- Query string or form body
- Type
string- Accepted values
- A valid DNS zone name, with or without a final dot
- Default
- No default
- Example
example.com
The zone name affected by the request.
Validation and use: The authenticated API user must own the zone unless the operation creates it for that same user.
Complete request template
This template names all 2 supported path, query, form, and JSON keys. Conditional alternatives are shown together for reference; keep only the valid branch in a runnable request.
{
"path_parameters": {},
"query_parameters": {},
"form_body": {},
"json_body": {},
"query_or_form_parameters": {
"action": "zone_get",
"name": "example.com"
}
}
Runnable workflow example
curl -sS 'https://panel.example.com:882/api/v1/dns?action=zone_get&name=example.com' \
-H 'X-API-Name: dns-automation' \
-H 'X-API-Key: YOUR_API_KEY'
Successful result
The response contains the current zone object, including records and authoritative state supplied by SDM.
Error response
{
"success": false,
"error": {
"code": "external_auth_error",
"message": "Authentication failed, the source address is not allowed, the permission is missing, or the requested resource is outside this API user's ownership."
}
}
Operational note
Read the zone immediately before replacement or destructive work so your integration is not acting on stale content.
POST/api/v1/dns?action=zone_createpublic APICreate an owned DNS zone
What this operation does
Creates a Native zone for the authenticated API user and applies the supplied or local fallback nameservers.
Endpoint
POST /api/v1/dns?action=zone_create
Authentication and permissions
Send X-API-Name and X-API-Key, or use HTTP Basic authentication. Requires dns.zones.write permission. The new zone is assigned to the authenticated API user.
Parameters (4)
actionRequired- Send in
- Query string or form body
- Type
string- Accepted values
- zone_create
- Default
- No default
- Example
zone_create
Selects this operation on the compatibility endpoint.
Validation and use: Send the exact value zone_create. Action names are case-sensitive.
nameRequired- Send in
- Query string or form body
- Type
string- Accepted values
- A valid DNS zone name, with or without a final dot
- Default
- No default
- Example
example.com
The zone name affected by the request.
Validation and use: The authenticated API user must own the zone unless the operation creates it for that same user.
kindOptional- Send in
- Query string or form body
- Type
string- Accepted values
- Native is the supported normal value
- Default
- Native
- Example
Native
PowerDNS zone kind.
Validation and use: Leave this as Native unless Synconix support has confirmed a different deployment contract.
nameserversOptional- Send in
- Query string or form body
- Type
string- Accepted values
- Comma-, whitespace-, or newline-separated nameserver hostnames
- Default
- The server hostname when usable; otherwise the local fallback
- Example
ns1.example.net, ns2.example.net
Nameservers used when SDM creates the zone.
Validation and use: Use fully qualified names. An empty value invokes the server-side fallback.
Complete request template
This template names all 4 supported path, query, form, and JSON keys. Conditional alternatives are shown together for reference; keep only the valid branch in a runnable request.
{
"path_parameters": {},
"query_parameters": {},
"form_body": {},
"json_body": {},
"query_or_form_parameters": {
"action": "zone_create",
"name": "example.com",
"kind": "Native",
"nameservers": "ns1.example.net, ns2.example.net"
}
}
Runnable workflow example
curl -sS -X POST 'https://panel.example.com:882/api/v1/dns' \
-H 'X-API-Name: dns-automation' \
-H 'X-API-Key: YOUR_API_KEY' \
--data-urlencode 'action=zone_create' \
--data-urlencode 'name=example.com' \
--data-urlencode 'kind=Native' \
--data-urlencode 'nameservers=ns1.example.net, ns2.example.net'
Successful result
The response identifies the created zone and its initial authoritative state.
Error response
{
"success": false,
"error": {
"code": "external_auth_error",
"message": "Authentication failed, the source address is not allowed, the permission is missing, or the requested resource is outside this API user's ownership."
}
}
Operational note
Creating a zone in SDM does not change registrar delegation. Point the domain at the intended nameservers separately and verify from a public resolver.
POST/api/v1/dns?action=zone_replacepublic APIReplace a complete zone safely
What this operation does
Loads a complete zone file, reconciles ownership and optional DNSSEC policy, rectifies when requested, and registers the change for normal SDM synchronization.
Endpoint
POST /api/v1/dns?action=zone_replace
Authentication and permissions
Send X-API-Name and X-API-Key, or use HTTP Basic authentication. Requires a trusted active API identity that may access the zone. Non-root identities can assign only themselves as owner; the external API does not accept the root account.
Parameters (8)
actionRequired- Send in
- Query string or form body
- Type
string- Accepted values
- zone_replace
- Default
- No default
- Example
zone_replace
Selects this operation on the compatibility endpoint.
Validation and use: Send the exact value zone_replace. Action names are case-sensitive.
nameRequired- Send in
- Query string or form body
- Type
string- Accepted values
- A valid DNS zone name, with or without a final dot
- Default
- No default
- Example
example.com
The zone name affected by the request.
Validation and use: The authenticated API user must own the zone unless the operation creates it for that same user.
zonefileConditional- Send in
- Query string or form body
- Type
string- Accepted values
- RFC-style zone text using only $ORIGIN and $TTL directives
- Default
- No default
- Example
$ORIGIN example.com. $TTL 3600 @ IN A 192.0.2.10
Primary key for the complete zone file.
Validation and use: Required unless zone_text is used. Maximum size is 16 MiB. Do not send private signing material in the zone text.
zone_textConditional- Send in
- Query string or form body
- Type
string- Accepted values
- Same format and limit as zonefile
- Default
- No default
- Example
$ORIGIN example.com. $TTL 3600 @ IN A 192.0.2.10
Compatibility alias for zonefile.
Validation and use: Use one of zonefile or zone_text. If zonefile is present, it takes precedence.
dnssecOptional- Send in
- Query string or form body
- Type
enum- Accepted values
- preserve, enabled, or disabled
- Default
- preserve
- Example
preserve
Controls whether the existing DNSSEC policy is retained, enabled, or disabled during import.
Validation and use: Use disabled only after the parent DS has been removed. Enabled may be paired with dnssec_keyset for trusted synchronization.
dnssec_keysetConditional- Send in
- Query string or form body
- Type
sensitive JSON string- Accepted values
- A validated SDM DNSSEC keyset for the same zone
- Default
- Omitted
- Example
SECURE_KEYSET_FROM_TRUSTED_SYNC
Transfers an existing signing identity during authenticated SDM synchronization.
Validation and use: Valid only when dnssec=enabled. Treat it as secret material: never log it, paste it into tickets, or reuse the placeholder shown here.
rectifyOptional- Send in
- Query string or form body
- Type
boolean- Accepted values
- true or false; compatibility forms also accept 1, 0, yes, no, on, and off
- Default
- true when dnssec=preserve
- Example
false
Runs zone rectification after a preserve-policy import.
Validation and use: When DNSSEC policy changes, SDM rectifies as part of that policy flow. Set false only when a controlled follow-up rectification is planned.
owner_usernameOptional- Send in
- Query string or form body
- Type
string- Accepted values
- The authenticated username; root-only assignment to another account is reserved
- Default
- Authenticated API username
- Example
dns-automation
Owner recorded for the imported zone.
Validation and use: External API users can assign only themselves because root is not a permitted external identity.
Complete request template
This template names all 8 supported path, query, form, and JSON keys. Conditional alternatives are shown together for reference; keep only the valid branch in a runnable request.
{
"path_parameters": {},
"query_parameters": {},
"form_body": {},
"json_body": {},
"query_or_form_parameters": {
"action": "zone_replace",
"name": "example.com",
"zonefile": "$ORIGIN example.com.\n$TTL 3600\n@ IN A 192.0.2.10",
"zone_text": "$ORIGIN example.com.\n$TTL 3600\n@ IN A 192.0.2.10",
"dnssec": "preserve",
"dnssec_keyset": "SECURE_KEYSET_FROM_TRUSTED_SYNC",
"rectify": false,
"owner_username": "dns-automation"
}
}
Runnable workflow example
curl -sS -X POST 'https://panel.example.com:882/api/v1/dns' \
-H 'X-API-Name: dns-automation' \
-H 'X-API-Key: YOUR_API_KEY' \
--data-urlencode 'action=zone_replace' \
--data-urlencode 'name=example.com' \
--data-urlencode 'dnssec=preserve' \
--data-urlencode 'rectify=true' \
--data-urlencode 'zonefile@./example.com.zone'
Successful result
The response reports whether the zone was created or replaced, owner state, rectification, DNSSEC state, deduplication, audit recording, and synchronization delivery state.
Error response
{
"success": false,
"error": {
"code": "external_auth_error",
"message": "Authentication failed, the source address is not allowed, the permission is missing, or the requested resource is outside this API user's ownership."
}
}
Operational note
This is a whole-zone mutation. Keep a source copy, validate it with zone_check, and do not retry blindly while another mutation reports zone_mutation_busy or delivery pending.
POST/api/v1/dns?action=zone_deletepublic APIDelete an owned zone
What this operation does
Removes one zone. If the zone is linked to Cloudflare, the caller may also request verified deletion of the Cloudflare zone.
Endpoint
POST /api/v1/dns?action=zone_delete
Authentication and permissions
Send X-API-Name and X-API-Key, or use HTTP Basic authentication. Requires dns.zones.write permission and ownership of the zone.
Parameters (4)
actionRequired- Send in
- Query string or form body
- Type
string- Accepted values
- zone_delete
- Default
- No default
- Example
zone_delete
Selects this operation on the compatibility endpoint.
Validation and use: Send the exact value zone_delete. Action names are case-sensitive.
nameRequired- Send in
- Query string or form body
- Type
string- Accepted values
- A valid DNS zone name, with or without a final dot
- Default
- No default
- Example
example.com
The zone name affected by the request.
Validation and use: The authenticated API user must own the zone unless the operation creates it for that same user.
delete_cloudflare_zoneOptional- Send in
- Query string or form body
- Type
boolean- Accepted values
- true or false; compatibility forms also accept 1, 0, yes, no, on, and off
- Default
- false
- Example
false
Requests deletion of the linked Cloudflare zone before the local zone is removed.
Validation and use: When a linked Cloudflare zone exists, set true only with the exact confirmation value.
cloudflare_delete_confirmConditional- Send in
- Query string or form body
- Type
string- Accepted values
- The exact normalized zone name
- Default
- Omitted
- Example
example.com
Confirms the Cloudflare deletion branch.
Validation and use: Required when delete_cloudflare_zone=true and a linked Cloudflare zone exists. It must match name exactly.
Complete request template
This template names all 4 supported path, query, form, and JSON keys. Conditional alternatives are shown together for reference; keep only the valid branch in a runnable request.
{
"path_parameters": {},
"query_parameters": {},
"form_body": {},
"json_body": {},
"query_or_form_parameters": {
"action": "zone_delete",
"name": "example.com",
"delete_cloudflare_zone": false,
"cloudflare_delete_confirm": "example.com"
}
}
Runnable workflow example
curl -sS -X POST 'https://panel.example.com:882/api/v1/dns' \
-H 'X-API-Name: dns-automation' \
-H 'X-API-Key: YOUR_API_KEY' \
--data-urlencode 'action=zone_delete' \
--data-urlencode 'name=example.com' \
--data-urlencode 'delete_cloudflare_zone=false'
Successful result
The response confirms local deletion and, when requested, the verified Cloudflare deletion result.
Error response
{
"success": false,
"error": {
"code": "external_auth_error",
"message": "Authentication failed, the source address is not allowed, the permission is missing, or the requested resource is outside this API user's ownership."
}
}
Operational note
Deletion is not a substitute for a provider migration. Export or back up the zone first and make the Cloudflare branch explicit.
GET/api/v1/dns?action=zone_checkpublic APIValidate a zone
What this operation does
Runs the authoritative zone consistency check without changing records.
Endpoint
GET /api/v1/dns?action=zone_check; accepted methods: GET or POST
Authentication and permissions
Send X-API-Name and X-API-Key, or use HTTP Basic authentication. Requires dns.zones.read permission and access to the zone.
Parameters (2)
actionRequired- Send in
- Query string or form body
- Type
string- Accepted values
- zone_check
- Default
- No default
- Example
zone_check
Selects this operation on the compatibility endpoint.
Validation and use: Send the exact value zone_check. Action names are case-sensitive.
nameRequired- Send in
- Query string or form body
- Type
string- Accepted values
- A valid DNS zone name, with or without a final dot
- Default
- No default
- Example
example.com
The zone name affected by the request.
Validation and use: The authenticated API user must own the zone unless the operation creates it for that same user.
Complete request template
This template names all 2 supported path, query, form, and JSON keys. Conditional alternatives are shown together for reference; keep only the valid branch in a runnable request.
{
"path_parameters": {},
"query_parameters": {},
"form_body": {},
"json_body": {},
"query_or_form_parameters": {
"action": "zone_check",
"name": "example.com"
}
}
Runnable workflow example
curl -sS 'https://panel.example.com:882/api/v1/dns?action=zone_check&name=example.com' \
-H 'X-API-Name: dns-automation' \
-H 'X-API-Key: YOUR_API_KEY'
Successful result
The response includes the check result and diagnostic output supplied by the authoritative DNS tooling.
Error response
{
"success": false,
"error": {
"code": "external_auth_error",
"message": "Authentication failed, the source address is not allowed, the permission is missing, or the requested resource is outside this API user's ownership."
}
}
Operational note
Run this after an import and before assuming a syntactically accepted zone is operationally sound.
POST/api/v1/dns?action=zone_rectifypublic APIRectify zone metadata
What this operation does
Reconciles PowerDNS metadata for one owned zone after changes that require rectification.
Endpoint
POST /api/v1/dns?action=zone_rectify
Authentication and permissions
Send X-API-Name and X-API-Key, or use HTTP Basic authentication. Requires dns.zones.write permission and access to the zone.
Parameters (2)
actionRequired- Send in
- Query string or form body
- Type
string- Accepted values
- zone_rectify
- Default
- No default
- Example
zone_rectify
Selects this operation on the compatibility endpoint.
Validation and use: Send the exact value zone_rectify. Action names are case-sensitive.
nameRequired- Send in
- Query string or form body
- Type
string- Accepted values
- A valid DNS zone name, with or without a final dot
- Default
- No default
- Example
example.com
The zone name affected by the request.
Validation and use: The authenticated API user must own the zone unless the operation creates it for that same user.
Complete request template
This template names all 2 supported path, query, form, and JSON keys. Conditional alternatives are shown together for reference; keep only the valid branch in a runnable request.
{
"path_parameters": {},
"query_parameters": {},
"form_body": {},
"json_body": {},
"query_or_form_parameters": {
"action": "zone_rectify",
"name": "example.com"
}
}
Runnable workflow example
curl -sS -X POST 'https://panel.example.com:882/api/v1/dns' \
-H 'X-API-Name: dns-automation' \
-H 'X-API-Key: YOUR_API_KEY' \
--data-urlencode 'action=zone_rectify' \
--data-urlencode 'name=example.com'
Successful result
The response reports whether rectification completed and includes relevant command output.
Error response
{
"success": false,
"error": {
"code": "external_auth_error",
"message": "Authentication failed, the source address is not allowed, the permission is missing, or the requested resource is outside this API user's ownership."
}
}
Operational note
Rectify is a repair operation, not a content editor. Verify the zone and DNSSEC status afterward.
GET/api/v1/dns?action=zone_dnssec_statuspublic APIRead DNSSEC state and DS material
What this operation does
Returns the current signing state, public keys, DS records for the parent, authoritative readiness, and rollover state.
Endpoint
GET /api/v1/dns?action=zone_dnssec_status; accepted methods: GET or POST
Authentication and permissions
Send X-API-Name and X-API-Key, or use HTTP Basic authentication. Requires dns.zones.read permission and access to the zone.
Parameters (2)
actionRequired- Send in
- Query string or form body
- Type
string- Accepted values
- zone_dnssec_status
- Default
- No default
- Example
zone_dnssec_status
Selects this operation on the compatibility endpoint.
Validation and use: Send the exact value zone_dnssec_status. Action names are case-sensitive.
nameRequired- Send in
- Query string or form body
- Type
string- Accepted values
- A valid DNS zone name, with or without a final dot
- Default
- No default
- Example
example.com
The zone name affected by the request.
Validation and use: The authenticated API user must own the zone unless the operation creates it for that same user.
Complete request template
This template names all 2 supported path, query, form, and JSON keys. Conditional alternatives are shown together for reference; keep only the valid branch in a runnable request.
{
"path_parameters": {},
"query_parameters": {},
"form_body": {},
"json_body": {},
"query_or_form_parameters": {
"action": "zone_dnssec_status",
"name": "example.com"
}
}
Runnable workflow example
curl -sS 'https://panel.example.com:882/api/v1/dns?action=zone_dnssec_status&name=example.com' \
-H 'X-API-Name: dns-automation' \
-H 'X-API-Key: YOUR_API_KEY'
Successful result
The response contains enabled/configured state, public DS/DNSKEY material, parent observations, and any active rollover phase.
Error response
{
"success": false,
"error": {
"code": "external_auth_error",
"message": "Authentication failed, the source address is not allowed, the permission is missing, or the requested resource is outside this API user's ownership."
}
}
Operational note
Publish only DS records returned for the current keyset. A green local state is not enough until the parent and public resolvers agree.
POST/api/v1/dns?action=zone_dnssec_enablepublic APIEnable DNSSEC signing
What this operation does
Enables signing, rectifies the zone, clears relevant cache, and registers the updated zone for normal synchronization.
Endpoint
POST /api/v1/dns?action=zone_dnssec_enable
Authentication and permissions
Send X-API-Name and X-API-Key, or use HTTP Basic authentication. Requires dns.zones.write permission and access to the zone.
Parameters (2)
actionRequired- Send in
- Query string or form body
- Type
string- Accepted values
- zone_dnssec_enable
- Default
- No default
- Example
zone_dnssec_enable
Selects this operation on the compatibility endpoint.
Validation and use: Send the exact value zone_dnssec_enable. Action names are case-sensitive.
nameRequired- Send in
- Query string or form body
- Type
string- Accepted values
- A valid DNS zone name, with or without a final dot
- Default
- No default
- Example
example.com
The zone name affected by the request.
Validation and use: The authenticated API user must own the zone unless the operation creates it for that same user.
Complete request template
This template names all 2 supported path, query, form, and JSON keys. Conditional alternatives are shown together for reference; keep only the valid branch in a runnable request.
{
"path_parameters": {},
"query_parameters": {},
"form_body": {},
"json_body": {},
"query_or_form_parameters": {
"action": "zone_dnssec_enable",
"name": "example.com"
}
}
Runnable workflow example
curl -sS -X POST 'https://panel.example.com:882/api/v1/dns' \
-H 'X-API-Name: dns-automation' \
-H 'X-API-Key: YOUR_API_KEY' \
--data-urlencode 'action=zone_dnssec_enable' \
--data-urlencode 'name=example.com'
Successful result
The response returns the newly active DNSSEC state and DS material, plus replication state when known.
Error response
{
"success": false,
"error": {
"code": "external_auth_error",
"message": "Authentication failed, the source address is not allowed, the permission is missing, or the requested resource is outside this API user's ownership."
}
}
Operational note
Enabling signing is only the first half. Add the returned DS at the parent and verify authoritative readiness before calling the chain complete.
POST/api/v1/dns?action=zone_dnssec_disablepublic APIDisable DNSSEC safely
What this operation does
Disables signing only after an exact-name confirmation and the normal parent-DS safety check.
Endpoint
POST /api/v1/dns?action=zone_dnssec_disable
Authentication and permissions
Send X-API-Name and X-API-Key, or use HTTP Basic authentication. Requires dns.zones.write permission and access to the zone.
Parameters (4)
actionRequired- Send in
- Query string or form body
- Type
string- Accepted values
- zone_dnssec_disable
- Default
- No default
- Example
zone_dnssec_disable
Selects this operation on the compatibility endpoint.
Validation and use: Send the exact value zone_dnssec_disable. Action names are case-sensitive.
nameRequired- Send in
- Query string or form body
- Type
string- Accepted values
- A valid DNS zone name, with or without a final dot
- Default
- No default
- Example
example.com
The zone name affected by the request.
Validation and use: The authenticated API user must own the zone unless the operation creates it for that same user.
confirmRequired- Send in
- Query string or form body
- Type
string- Accepted values
- The exact zone name
- Default
- No default
- Example
example.com
Confirms that the caller intends to disable DNSSEC for this zone.
Validation and use: The normalized value must exactly match name.
forceOptional- Send in
- Query string or form body
- Type
boolean- Accepted values
- true or false; compatibility forms also accept 1, 0, yes, no, on, and off
- Default
- false
- Example
false
Bypasses selected DNSSEC safety gates in a root recovery context.
Validation and use: The public external API rejects root identities, so customer integrations must leave force=false. This key remains documented because the wrapper accepts it, but it is reserved for controlled recovery tooling.
Complete request template
This template names all 4 supported path, query, form, and JSON keys. Conditional alternatives are shown together for reference; keep only the valid branch in a runnable request.
{
"path_parameters": {},
"query_parameters": {},
"form_body": {},
"json_body": {},
"query_or_form_parameters": {
"action": "zone_dnssec_disable",
"name": "example.com",
"confirm": "example.com",
"force": false
}
}
Runnable workflow example
curl -sS -X POST 'https://panel.example.com:882/api/v1/dns' \
-H 'X-API-Name: dns-automation' \
-H 'X-API-Key: YOUR_API_KEY' \
--data-urlencode 'action=zone_dnssec_disable' \
--data-urlencode 'name=example.com' \
--data-urlencode 'confirm=example.com' \
--data-urlencode 'force=false'
Successful result
The response returns the disabled state and the latest synchronization status.
Error response
{
"success": false,
"error": {
"code": "external_auth_error",
"message": "Authentication failed, the source address is not allowed, the permission is missing, or the requested resource is outside this API user's ownership."
}
}
Operational note
Remove DS records at the registrar or parent first, wait for them to disappear publicly, and only then disable signing. Reversing that order can make the domain vanish for validating resolvers.
POST/api/v1/dns?action=zone_dnssec_rolloverpublic APIAdvance a staged DNSSEC rollover
What this operation does
Moves one zone through the begin, activate, and complete key-rollover phases.
Endpoint
POST /api/v1/dns?action=zone_dnssec_rollover
Authentication and permissions
Send X-API-Name and X-API-Key, or use HTTP Basic authentication. Requires dns.zones.write permission and access to an already signed zone.
Parameters (4)
actionRequired- Send in
- Query string or form body
- Type
string- Accepted values
- zone_dnssec_rollover
- Default
- No default
- Example
zone_dnssec_rollover
Selects this operation on the compatibility endpoint.
Validation and use: Send the exact value zone_dnssec_rollover. Action names are case-sensitive.
nameRequired- Send in
- Query string or form body
- Type
string- Accepted values
- A valid DNS zone name, with or without a final dot
- Default
- No default
- Example
example.com
The zone name affected by the request.
Validation and use: The authenticated API user must own the zone unless the operation creates it for that same user.
phaseRequired- Send in
- Query string or form body
- Type
enum- Accepted values
- begin, activate, or complete
- Default
- No default
- Example
begin
The exact rollover phase to execute.
Validation and use: Run phases in order. Read status between phases and update/verify the parent DS when the returned state requires it.
forceOptional- Send in
- Query string or form body
- Type
boolean- Accepted values
- true or false; compatibility forms also accept 1, 0, yes, no, on, and off
- Default
- false
- Example
false
Bypasses selected rollover safety gates in a root recovery context.
Validation and use: External customer identities cannot use root context. Leave false unless Synconix support is operating an isolated recovery workflow.
Complete request template
This template names all 4 supported path, query, form, and JSON keys. Conditional alternatives are shown together for reference; keep only the valid branch in a runnable request.
{
"path_parameters": {},
"query_parameters": {},
"form_body": {},
"json_body": {},
"query_or_form_parameters": {
"action": "zone_dnssec_rollover",
"name": "example.com",
"phase": "begin",
"force": false
}
}
Runnable workflow example
curl -sS -X POST 'https://panel.example.com:882/api/v1/dns' \
-H 'X-API-Name: dns-automation' \
-H 'X-API-Key: YOUR_API_KEY' \
--data-urlencode 'action=zone_dnssec_rollover' \
--data-urlencode 'name=example.com' \
--data-urlencode 'phase=begin' \
--data-urlencode 'force=false'
Successful result
The response reports the current keyset, rollover phase, DS material, authoritative readiness, and replication state when known.
Error response
{
"success": false,
"error": {
"code": "external_auth_error",
"message": "Authentication failed, the source address is not allowed, the permission is missing, or the requested resource is outside this API user's ownership."
}
}
Operational note
A rollover is a staged protocol, not three buttons to click quickly. Observe DNS and parent state between phases.
GET/api/v1/dns?action=records_listpublic APIList records in one zone
What this operation does
Returns the records visible to the authenticated owner, with optional offset pagination.
Endpoint
GET /api/v1/dns?action=records_list; accepted methods: GET or POST
Authentication and permissions
Send X-API-Name and X-API-Key, or use HTTP Basic authentication. Requires dns.records.read permission and access to the zone.
Parameters (4)
actionRequired- Send in
- Query string or form body
- Type
string- Accepted values
- records_list
- Default
- No default
- Example
records_list
Selects this operation on the compatibility endpoint.
Validation and use: Send the exact value records_list. Action names are case-sensitive.
zoneRequired- Send in
- Query string or form body
- Type
string- Accepted values
- A valid DNS zone name, with or without a final dot
- Default
- No default
- Example
example.com
The zone affected by the request.
Validation and use: The authenticated API user must own the zone unless the operation creates it for that same user.
limitOptional- Send in
- Query string or form body
- Type
integer- Accepted values
- A positive page size accepted by the service
- Default
- 5000
- Example
500
Maximum number of records requested.
Validation and use: If neither limit nor offset is supplied, the wrapper returns the full compatibility list returned by the current service.
offsetOptional- Send in
- Query string or form body
- Type
integer- Accepted values
- 0 or greater
- Default
- 0
- Example
0
Number of records to skip.
Validation and use: Use with limit for deterministic paging.
Complete request template
This template names all 4 supported path, query, form, and JSON keys. Conditional alternatives are shown together for reference; keep only the valid branch in a runnable request.
{
"path_parameters": {},
"query_parameters": {},
"form_body": {},
"json_body": {},
"query_or_form_parameters": {
"action": "records_list",
"zone": "example.com",
"limit": 500,
"offset": 0
}
}
Runnable workflow example
curl -sS 'https://panel.example.com:882/api/v1/dns?action=records_list&zone=example.com&limit=500&offset=0' \
-H 'X-API-Name: dns-automation' \
-H 'X-API-Key: YOUR_API_KEY'
Successful result
The response contains zone, records, limit, offset, and next_offset when another page exists.
Error response
{
"success": false,
"error": {
"code": "external_auth_error",
"message": "Authentication failed, the source address is not allowed, the permission is missing, or the requested resource is outside this API user's ownership."
}
}
Operational note
Obtain the current record content from this action before update or value-specific deletion.
POST/api/v1/dns?action=record_addpublic APIAdd a DNS record
What this operation does
Adds a value to an RRset, normalizes names and record-specific content, and synchronizes eligible Cloudflare state.
Endpoint
POST /api/v1/dns?action=record_add
Authentication and permissions
Send X-API-Name and X-API-Key, or use HTTP Basic authentication. Requires dns.records.write permission and access to the zone.
Parameters (10)
actionRequired- Send in
- Query string or form body
- Type
string- Accepted values
- record_add
- Default
- No default
- Example
record_add
Selects this operation on the compatibility endpoint.
Validation and use: Send the exact value record_add. Action names are case-sensitive.
zoneRequired- Send in
- Query string or form body
- Type
string- Accepted values
- A valid DNS zone name, with or without a final dot
- Default
- No default
- Example
example.com
The zone affected by the request.
Validation and use: The authenticated API user must own the zone unless the operation creates it for that same user.
nameOptional- Send in
- Query string or form body
- Type
string- Accepted values
- @, a relative label, or a name inside the zone
- Default
- @
- Example
www
Record owner name.
Validation and use: SDM normalizes the name into the selected zone.
typeRequired- Send in
- Query string or form body
- Type
DNS RR type- Accepted values
- A valid PowerDNS record type. The SDM editor currently offers A, AAAA, CNAME, MX, TXT, NS, PTR, SRV, CAA, AFSDB, DNAME, DS, and HINFO
- Default
- No default
- Example
A
Record type.
Validation and use: Use uppercase conventional names. Proxied is valid only for A, AAAA, and CNAME.
contentConditional- Send in
- Query string or form body
- Type
string- Accepted values
- Record data valid for the selected type
- Default
- No default
- Example
192.0.2.10
Record value.
Validation and use: Required except that an MX value can be constructed from mx_priority and mx_destination.
mx_priorityOptional- Send in
- Query string or form body
- Type
integer- Accepted values
- Valid MX priority
- Default
- 10 when MX content is constructed
- Example
10
Priority used when building MX content.
Validation and use: Used only for MX when mx_destination is provided and content is empty.
mx_destinationConditional- Send in
- Query string or form body
- Type
hostname- Accepted values
- A valid mail-exchanger hostname
- Default
- Omitted
- Example
mail.example.com
Destination used to build MX content.
Validation and use: For MX, provide this with mx_priority when content is omitted.
ttlOptional- Send in
- Query string or form body
- Type
integer- Accepted values
- A positive TTL in seconds
- Default
- 3600
- Example
3600
Record TTL.
Validation and use: Use a value appropriate to the change frequency and migration plan.
disabledOptional- Send in
- Query string or form body
- Type
boolean- Accepted values
- true or false; compatibility forms also accept 1, 0, yes, no, on, and off
- Default
- false
- Example
false
Creates the record in a disabled state when true.
Validation and use: Use an explicit true/false value. Omitting an optional boolean keeps its documented default.
proxiedOptional- Send in
- Query string or form body
- Type
boolean- Accepted values
- true or false; compatibility forms also accept 1, 0, yes, no, on, and off
- Default
- Provider/default state when omitted
- Example
false
Requests Cloudflare proxying for an eligible record.
Validation and use: Only meaningful for A, AAAA, and CNAME on a Cloudflare-capable zone. Other types must stay DNS-only.
Complete request template
This template names all 10 supported path, query, form, and JSON keys. Conditional alternatives are shown together for reference; keep only the valid branch in a runnable request.
{
"path_parameters": {},
"query_parameters": {},
"form_body": {},
"json_body": {},
"query_or_form_parameters": {
"action": "record_add",
"zone": "example.com",
"name": "www",
"type": "A",
"content": "192.0.2.10",
"mx_priority": 10,
"mx_destination": "mail.example.com",
"ttl": 3600,
"disabled": false,
"proxied": false
}
}
Runnable workflow example
curl -sS -X POST 'https://panel.example.com:882/api/v1/dns' \
-H 'X-API-Name: dns-automation' \
-H 'X-API-Key: YOUR_API_KEY' \
--data-urlencode 'action=record_add' \
--data-urlencode 'zone=example.com' \
--data-urlencode 'name=www' \
--data-urlencode 'type=A' \
--data-urlencode 'content=192.0.2.10' \
--data-urlencode 'ttl=3600' \
--data-urlencode 'disabled=false' \
--data-urlencode 'proxied=false'
Successful result
The response identifies the created or reconciled record and reports the resulting synchronization state.
Error response
{
"success": false,
"error": {
"code": "external_auth_error",
"message": "Authentication failed, the source address is not allowed, the permission is missing, or the requested resource is outside this API user's ownership."
}
}
Operational note
Adding an existing value may update its disabled/proxy state rather than create a duplicate. Read the RRset afterward.
POST/api/v1/dns?action=record_updatepublic APIUpdate a DNS record value
What this operation does
Replaces one existing record value and preserves or changes its TTL, disabled state, and eligible proxy preference.
Endpoint
POST /api/v1/dns?action=record_update
Authentication and permissions
Send X-API-Name and X-API-Key, or use HTTP Basic authentication. Requires dns.records.write permission and access to the zone.
Parameters (9)
actionRequired- Send in
- Query string or form body
- Type
string- Accepted values
- record_update
- Default
- No default
- Example
record_update
Selects this operation on the compatibility endpoint.
Validation and use: Send the exact value record_update. Action names are case-sensitive.
zoneRequired- Send in
- Query string or form body
- Type
string- Accepted values
- A valid DNS zone name, with or without a final dot
- Default
- No default
- Example
example.com
The zone affected by the request.
Validation and use: The authenticated API user must own the zone unless the operation creates it for that same user.
nameOptional- Send in
- Query string or form body
- Type
string- Accepted values
- @, relative label, or name inside the zone
- Default
- Empty; resolved by the underlying record contract
- Example
www
Record owner name.
Validation and use: Send the current owner name whenever more than one RRset of this type could exist.
typeRequired- Send in
- Query string or form body
- Type
DNS RR type- Accepted values
- A valid PowerDNS record type. The SDM editor currently offers A, AAAA, CNAME, MX, TXT, NS, PTR, SRV, CAA, AFSDB, DNAME, DS, and HINFO
- Default
- No default
- Example
A
Record type.
Validation and use: Must identify the RRset being changed.
old_contentOptional- Send in
- Query string or form body
- Type
string- Accepted values
- An existing value in the RRset
- Default
- Empty
- Example
192.0.2.10
Old value used to select the exact record.
Validation and use: Supplying old_content is the safest form when an RRset contains multiple values.
contentRequired- Send in
- Query string or form body
- Type
string- Accepted values
- New record data valid for type
- Default
- No default
- Example
192.0.2.20
Replacement value.
Validation and use: Use the full normalized value for compound types such as MX and SRV.
ttlOptional- Send in
- Query string or form body
- Type
integer- Accepted values
- A positive TTL in seconds
- Default
- 3600
- Example
3600
TTL applied to the resulting RRset.
Validation and use: The compatibility wrapper sends 3600 when omitted.
disabledOptional- Send in
- Query string or form body
- Type
boolean- Accepted values
- true or false; compatibility forms also accept 1, 0, yes, no, on, and off
- Default
- Preserved by the service when omitted where supported
- Example
false
Sets the resulting record disabled state.
Validation and use: Use an explicit true/false value. Omitting an optional boolean keeps its documented default.
proxiedOptional- Send in
- Query string or form body
- Type
boolean- Accepted values
- true or false; compatibility forms also accept 1, 0, yes, no, on, and off
- Default
- Preserved/provider state when omitted
- Example
false
Sets the Cloudflare proxy preference.
Validation and use: Only valid for A, AAAA, and CNAME in a Cloudflare-capable zone.
Complete request template
This template names all 9 supported path, query, form, and JSON keys. Conditional alternatives are shown together for reference; keep only the valid branch in a runnable request.
{
"path_parameters": {},
"query_parameters": {},
"form_body": {},
"json_body": {},
"query_or_form_parameters": {
"action": "record_update",
"zone": "example.com",
"name": "www",
"type": "A",
"old_content": "192.0.2.10",
"content": "192.0.2.20",
"ttl": 3600,
"disabled": false,
"proxied": false
}
}
Runnable workflow example
curl -sS -X POST 'https://panel.example.com:882/api/v1/dns' \
-H 'X-API-Name: dns-automation' \
-H 'X-API-Key: YOUR_API_KEY' \
--data-urlencode 'action=record_update' \
--data-urlencode 'zone=example.com' \
--data-urlencode 'name=www' \
--data-urlencode 'type=A' \
--data-urlencode 'old_content=192.0.2.10' \
--data-urlencode 'content=192.0.2.20' \
--data-urlencode 'ttl=3600'
Successful result
The response reports the updated record and resulting synchronization state.
Error response
{
"success": false,
"error": {
"code": "external_auth_error",
"message": "Authentication failed, the source address is not allowed, the permission is missing, or the requested resource is outside this API user's ownership."
}
}
Operational note
Use old_content when possible, then list the RRset to prove that the intended value—not its neighbor—changed.
POST/api/v1/dns?action=record_deletepublic APIDelete a record value or RRset
What this operation does
Deletes either one matching value or the complete RRset, depending on whether content is supplied.
Endpoint
POST /api/v1/dns?action=record_delete
Authentication and permissions
Send X-API-Name and X-API-Key, or use HTTP Basic authentication. Requires dns.records.write permission and access to the zone.
Parameters (5)
actionRequired- Send in
- Query string or form body
- Type
string- Accepted values
- record_delete
- Default
- No default
- Example
record_delete
Selects this operation on the compatibility endpoint.
Validation and use: Send the exact value record_delete. Action names are case-sensitive.
zoneRequired- Send in
- Query string or form body
- Type
string- Accepted values
- A valid DNS zone name, with or without a final dot
- Default
- No default
- Example
example.com
The zone affected by the request.
Validation and use: The authenticated API user must own the zone unless the operation creates it for that same user.
nameOptional- Send in
- Query string or form body
- Type
string- Accepted values
- @, relative label, or name inside the zone
- Default
- Empty
- Example
www
Record owner name.
Validation and use: Send the owner name to avoid selecting the wrong RRset.
typeRequired- Send in
- Query string or form body
- Type
DNS RR type- Accepted values
- A valid PowerDNS record type. The SDM editor currently offers A, AAAA, CNAME, MX, TXT, NS, PTR, SRV, CAA, AFSDB, DNAME, DS, and HINFO
- Default
- No default
- Example
A
Record type of the target RRset.
Validation and use: Combine with name and, for value deletion, content.
contentOptional- Send in
- Query string or form body
- Type
string- Accepted values
- An exact existing record value
- Default
- Omitted
- Example
192.0.2.10
Selects one value for deletion.
Validation and use: If omitted, SDM deletes the entire matching RRset. Include it when only one value should be removed.
Complete request template
This template names all 5 supported path, query, form, and JSON keys. Conditional alternatives are shown together for reference; keep only the valid branch in a runnable request.
{
"path_parameters": {},
"query_parameters": {},
"form_body": {},
"json_body": {},
"query_or_form_parameters": {
"action": "record_delete",
"zone": "example.com",
"name": "www",
"type": "A",
"content": "192.0.2.10"
}
}
Runnable workflow example
curl -sS -X POST 'https://panel.example.com:882/api/v1/dns' \
-H 'X-API-Name: dns-automation' \
-H 'X-API-Key: YOUR_API_KEY' \
--data-urlencode 'action=record_delete' \
--data-urlencode 'zone=example.com' \
--data-urlencode 'name=www' \
--data-urlencode 'type=A' \
--data-urlencode 'content=192.0.2.10'
Successful result
The response confirms the removed value or RRset and reports synchronization state.
Error response
{
"success": false,
"error": {
"code": "external_auth_error",
"message": "Authentication failed, the source address is not allowed, the permission is missing, or the requested resource is outside this API user's ownership."
}
}
Operational note
Omitting content broadens the deletion to the entire RRset. That is useful when intentional and memorable when accidental.
GET/api/external/cloudflare/domainspublic APIList Cloudflare-managed domains
What this operation does
Lists Cloudflare-capable domains owned by the API identity, including provider and synchronization state.
Endpoint
GET /api/external/cloudflare/domains
Authentication and permissions
Send X-API-Name and X-API-Key, or use HTTP Basic authentication. Requires cloudflare.zones.read permission and domain ownership.
Parameters (3)
limitOptional- Send in
- Query string
- Type
integer- Accepted values
- 1 to 5000 after service normalization
- Default
- 500
- Example
100
Maximum domains returned.
Validation and use: Use bounded pagination for integrations.
offsetOptional- Send in
- Query string
- Type
integer- Accepted values
- 0 or greater
- Default
- 0
- Example
0
Number of matching domains to skip.
Validation and use: Advance from the returned offset and limit.
searchOptional- Send in
- Query string
- Type
string- Accepted values
- A domain-name fragment
- Default
- Empty
- Example
example
Filters the owned-domain list.
Validation and use: Search never expands the caller's ownership scope.
Complete request template
This template names all 3 supported path, query, form, and JSON keys. Conditional alternatives are shown together for reference; keep only the valid branch in a runnable request.
{
"path_parameters": {},
"query_parameters": {
"limit": 100,
"offset": 0,
"search": "example"
},
"form_body": {},
"json_body": {},
"query_or_form_parameters": {}
}
Runnable workflow example
curl -sS 'https://panel.example.com:882/api/external/cloudflare/domains?limit=100&offset=0&search=example' \
-H 'X-API-Name: dns-automation' \
-H 'X-API-Key: YOUR_API_KEY'
Successful result
The response contains total, limit, offset, supported settings, and the matching domains array.
Error response
{
"success": false,
"error": {
"code": "external_auth_error",
"message": "Authentication failed, the source address is not allowed, the permission is missing, or the requested resource is outside this API user's ownership."
}
}
Operational note
This is the best discovery call before using a domain path or record id in the remaining Cloudflare operations.
GET/api/external/cloudflare/domains/{domain}/statuspublic APIRead domain provider status
What this operation does
Returns local and desired DNS provider state, Cloudflare identifiers, nameservers, delegation status, and recent synchronization information for one owned domain.
Endpoint
GET /api/external/cloudflare/domains/{domain}/status
Authentication and permissions
Send X-API-Name and X-API-Key, or use HTTP Basic authentication. Requires cloudflare.zones.read permission and ownership of domain.
Parameters (1)
domainRequired- Send in
- URL path
- Type
string- Accepted values
- A valid DNS zone name, with or without a final dot
- Default
- No default
- Example
example.com
The domain affected by the request.
Validation and use: The authenticated API user must own the zone unless the operation creates it for that same user.
Complete request template
This template names all 1 supported path, query, form, and JSON keys. Conditional alternatives are shown together for reference; keep only the valid branch in a runnable request.
{
"path_parameters": {
"domain": "example.com"
},
"query_parameters": {},
"form_body": {},
"json_body": {},
"query_or_form_parameters": {}
}
Runnable workflow example
curl -sS 'https://panel.example.com:882/api/external/cloudflare/domains/example.com/status' \
-H 'X-API-Name: dns-automation' \
-H 'X-API-Key: YOUR_API_KEY'
Successful result
The response describes the active and desired provider plus Cloudflare/delegation state for the domain.
Error response
{
"success": false,
"error": {
"code": "external_auth_error",
"message": "Authentication failed, the source address is not allowed, the permission is missing, or the requested resource is outside this API user's ownership."
}
}
Operational note
Read status before sync, enable, disable, settings, or purge. Live Cloudflare controls may be paused when public delegation does not match assigned nameservers.
POST/api/external/cloudflare/domains/{domain}/syncpublic APISynchronize a domain to its desired provider
What this operation does
Reconciles the owned local zone with its current desired DNS provider.
Endpoint
POST /api/external/cloudflare/domains/{domain}/sync
Authentication and permissions
Send X-API-Name and X-API-Key, or use HTTP Basic authentication. Requires cloudflare.zones.write permission and ownership of domain.
Parameters (1)
domainRequired- Send in
- URL path
- Type
string- Accepted values
- A valid DNS zone name, with or without a final dot
- Default
- No default
- Example
example.com
The domain affected by the request.
Validation and use: The authenticated API user must own the zone unless the operation creates it for that same user.
Complete request template
This template names all 1 supported path, query, form, and JSON keys. Conditional alternatives are shown together for reference; keep only the valid branch in a runnable request.
{
"path_parameters": {
"domain": "example.com"
},
"query_parameters": {},
"form_body": {},
"json_body": {},
"query_or_form_parameters": {}
}
Runnable workflow example
curl -sS -X POST 'https://panel.example.com:882/api/external/cloudflare/domains/example.com/sync' \
-H 'X-API-Name: dns-automation' \
-H 'X-API-Key: YOUR_API_KEY' \
-H 'Content-Type: application/json' \
--data '{}'
Successful result
The response reports the desired provider and the resulting synchronization job/state.
Error response
{
"success": false,
"error": {
"code": "external_auth_error",
"message": "Authentication failed, the source address is not allowed, the permission is missing, or the requested resource is outside this API user's ownership."
}
}
Operational note
Sync follows provider_desired; it does not silently choose Cloudflare. Read status first if the intended provider is uncertain.
POST/api/external/cloudflare/domains/{domain}/enablepublic APIEnable Cloudflare for a domain
What this operation does
Creates or locates the Cloudflare zone, synchronizes DNS records, records the desired provider, and optionally updates WHMCS-controlled nameservers.
Endpoint
POST /api/external/cloudflare/domains/{domain}/enable
Authentication and permissions
Send X-API-Name and X-API-Key, or use HTTP Basic authentication. Requires cloudflare.zones.write permission, ownership of domain, and a configured Cloudflare integration.
Parameters (4)
domainRequired- Send in
- URL path
- Type
string- Accepted values
- A valid DNS zone name, with or without a final dot
- Default
- No default
- Example
example.com
The domain affected by the request.
Validation and use: The authenticated API user must own the zone unless the operation creates it for that same user.
registered_with_usOptional- Send in
- JSON body
- Type
boolean- Accepted values
- JSON true or false
- Default
- false
- Example
false
Marks that registrar control is expected through the configured WHMCS integration.
Validation and use: When true, WHMCS validation becomes required if WHMCS automation is enabled.
client_idOptional- Send in
- JSON body
- Type
integer- Accepted values
- A positive WHMCS client id
- Default
- Omitted
- Example
123
Narrows WHMCS validation to one client.
Validation and use: When supplied, the returned WHMCS domain must belong to this client.
whmcs_domain_idOptional- Send in
- JSON body
- Type
integer- Accepted values
- A positive WHMCS domain id
- Default
- Omitted
- Example
456
Narrows WHMCS validation to one domain record.
Validation and use: When supplied, the WHMCS domain id must match the requested domain.
Complete request template
This template names all 4 supported path, query, form, and JSON keys. Conditional alternatives are shown together for reference; keep only the valid branch in a runnable request.
{
"path_parameters": {
"domain": "example.com"
},
"query_parameters": {},
"form_body": {},
"json_body": {
"registered_with_us": false,
"client_id": 123,
"whmcs_domain_id": 456
},
"query_or_form_parameters": {}
}
Runnable workflow example
curl -sS -X POST 'https://panel.example.com:882/api/external/cloudflare/domains/example.com/enable' \
-H 'X-API-Name: dns-automation' \
-H 'X-API-Key: YOUR_API_KEY' \
-H 'Content-Type: application/json' \
--data '{"registered_with_us":false}'
Successful result
The response returns Cloudflare status, zone id, assigned nameservers, WHMCS update result, and job id.
Error response
{
"success": false,
"error": {
"code": "external_auth_error",
"message": "Authentication failed, the source address is not allowed, the permission is missing, or the requested resource is outside this API user's ownership."
}
}
Operational note
Cloudflare enablement changes the desired provider but public delegation still has to reach the assigned nameservers. WHMCS ids are validation constraints, not arbitrary metadata.
POST/api/external/cloudflare/domains/{domain}/disablepublic APIDisable Cloudflare and return to local DNS
What this operation does
Sets the desired provider to local, deletes the Cloudflare zone when one exists, and optionally restores nameservers through WHMCS automation.
Endpoint
POST /api/external/cloudflare/domains/{domain}/disable
Authentication and permissions
Send X-API-Name and X-API-Key, or use HTTP Basic authentication. Requires cloudflare.zones.write permission and ownership of domain.
Parameters (6)
domainRequired- Send in
- URL path
- Type
string- Accepted values
- A valid DNS zone name, with or without a final dot
- Default
- No default
- Example
example.com
The domain affected by the request.
Validation and use: The authenticated API user must own the zone unless the operation creates it for that same user.
delete_cloudflare_zoneConditional- Send in
- JSON body
- Type
boolean- Accepted values
- JSON true or false
- Default
- false
- Example
false
Confirms that the linked Cloudflare zone may be deleted.
Validation and use: Required as true when a Cloudflare zone exists.
cloudflare_delete_confirmConditional- Send in
- JSON body
- Type
string- Accepted values
- The exact domain path value
- Default
- Omitted
- Example
example.com
Exact-text confirmation for Cloudflare zone deletion.
Validation and use: Required with delete_cloudflare_zone=true when a linked Cloudflare zone exists.
registered_with_usOptional- Send in
- JSON body
- Type
boolean- Accepted values
- JSON true or false
- Default
- false
- Example
false
Requests WHMCS domain control validation for registrar nameserver restoration.
Validation and use: Relevant only when WHMCS automation is enabled.
client_idOptional- Send in
- JSON body
- Type
integer- Accepted values
- A positive WHMCS client id
- Default
- Omitted
- Example
123
Narrows WHMCS validation to one client.
Validation and use: Must match the WHMCS domain owner when supplied.
whmcs_domain_idOptional- Send in
- JSON body
- Type
integer- Accepted values
- A positive WHMCS domain id
- Default
- Omitted
- Example
456
Narrows WHMCS validation to one WHMCS domain.
Validation and use: Must match the requested domain when supplied.
Complete request template
This template names all 6 supported path, query, form, and JSON keys. Conditional alternatives are shown together for reference; keep only the valid branch in a runnable request.
{
"path_parameters": {
"domain": "example.com"
},
"query_parameters": {},
"form_body": {},
"json_body": {
"delete_cloudflare_zone": false,
"cloudflare_delete_confirm": "example.com",
"registered_with_us": false,
"client_id": 123,
"whmcs_domain_id": 456
},
"query_or_form_parameters": {}
}
Runnable workflow example
curl -sS -X POST 'https://panel.example.com:882/api/external/cloudflare/domains/example.com/disable' \
-H 'X-API-Name: dns-automation' \
-H 'X-API-Key: YOUR_API_KEY' \
-H 'Content-Type: application/json' \
--data '{"delete_cloudflare_zone":true,"cloudflare_delete_confirm":"example.com"}'
Successful result
The response reports local provider state, whether the Cloudflare zone was deleted or already absent, local nameservers, WHMCS result, and job id.
Error response
{
"success": false,
"error": {
"code": "external_auth_error",
"message": "Authentication failed, the source address is not allowed, the permission is missing, or the requested resource is outside this API user's ownership."
}
}
Operational note
Plan delegation before disabling. Deleting the provider zone while a registrar still delegates to it causes an outage, however sincere the JSON confirmation was.
GET/api/external/cloudflare/domains/{domain}/settingspublic APIRead supported Cloudflare settings
What this operation does
Returns the five allowlisted live settings and whether each one is available and editable for the owned domain.
Endpoint
GET /api/external/cloudflare/domains/{domain}/settings
Authentication and permissions
Send X-API-Name and X-API-Key, or use HTTP Basic authentication. Requires cloudflare.zone_settings.read permission and ownership of domain.
Parameters (1)
domainRequired- Send in
- URL path
- Type
string- Accepted values
- A valid DNS zone name, with or without a final dot
- Default
- No default
- Example
example.com
The domain affected by the request.
Validation and use: The authenticated API user must own the zone unless the operation creates it for that same user.
Complete request template
This template names all 1 supported path, query, form, and JSON keys. Conditional alternatives are shown together for reference; keep only the valid branch in a runnable request.
{
"path_parameters": {
"domain": "example.com"
},
"query_parameters": {},
"form_body": {},
"json_body": {},
"query_or_form_parameters": {}
}
Runnable workflow example
curl -sS 'https://panel.example.com:882/api/external/cloudflare/domains/example.com/settings' \
-H 'X-API-Name: dns-automation' \
-H 'X-API-Key: YOUR_API_KEY'
Successful result
The response lists development_mode, security_level, cache_level, always_online, and brotli with current values, options, editability, and delegation state.
Error response
{
"success": false,
"error": {
"code": "external_auth_error",
"message": "Authentication failed, the source address is not allowed, the permission is missing, or the requested resource is outside this API user's ownership."
}
}
Operational note
Use this read before a patch. A setting can be supported by SDM yet temporarily unavailable from Cloudflare or blocked by delegation mismatch.
PATCH/api/external/cloudflare/domains/{domain}/settings/{setting}public APIUpdate one Cloudflare setting
What this operation does
Changes exactly one allowlisted setting for an owned, correctly delegated Cloudflare zone.
Endpoint
PATCH /api/external/cloudflare/domains/{domain}/settings/{setting}
Authentication and permissions
Send X-API-Name and X-API-Key, or use HTTP Basic authentication. Requires cloudflare.zone_settings.write permission and ownership of domain.
Parameters (3)
domainRequired- Send in
- URL path
- Type
string- Accepted values
- A valid DNS zone name, with or without a final dot
- Default
- No default
- Example
example.com
The domain affected by the request.
Validation and use: The authenticated API user must own the zone unless the operation creates it for that same user.
settingRequired- Send in
- URL path
- Type
enum- Accepted values
- development_mode, security_level, cache_level, always_online, or brotli
- Default
- No default
- Example
security_level
Setting identifier.
Validation and use: The value must belong to the selected setting's option set.
valueRequired- Send in
- JSON body
- Type
enum by setting- Accepted values
- development_mode: on|off; security_level: essentially_off|low|medium|high|under_attack; cache_level: basic|simplified|aggressive; always_online: on|off; brotli: on|off
- Default
- No default
- Example
high
New setting value.
Validation and use: Send one JSON value. Unsupported setting/value pairs are rejected.
Complete request template
This template names all 3 supported path, query, form, and JSON keys. Conditional alternatives are shown together for reference; keep only the valid branch in a runnable request.
{
"path_parameters": {
"domain": "example.com",
"setting": "security_level"
},
"query_parameters": {},
"form_body": {},
"json_body": {
"value": "high"
},
"query_or_form_parameters": {}
}
Runnable workflow example
curl -sS -X PATCH 'https://panel.example.com:882/api/external/cloudflare/domains/example.com/settings/security_level' \
-H 'X-API-Name: dns-automation' \
-H 'X-API-Key: YOUR_API_KEY' \
-H 'Content-Type: application/json' \
--data '{"value":"high"}'
Successful result
The response identifies the domain and returns the updated setting with its current value and Cloudflare metadata.
Error response
{
"success": false,
"error": {
"code": "external_auth_error",
"message": "Authentication failed, the source address is not allowed, the permission is missing, or the requested resource is outside this API user's ownership."
}
}
Operational note
Under Attack is the security_level value under_attack. Turn it off by selecting an explicit normal level, usually medium, rather than guessing what the previous value was.
POST/api/external/cloudflare/domains/{domain}/cache/purgepublic APIPurge Cloudflare cache
What this operation does
Purges exactly one target class: the entire zone, files, hosts, cache tags, or URL prefixes.
Endpoint
POST /api/external/cloudflare/domains/{domain}/cache/purge
Authentication and permissions
Send X-API-Name and X-API-Key, or use HTTP Basic authentication. Requires cloudflare.cache.purge permission, ownership of domain, an active Cloudflare zone id, and matching public delegation.
Parameters (6)
domainRequired- Send in
- URL path
- Type
string- Accepted values
- A valid DNS zone name, with or without a final dot
- Default
- No default
- Example
example.com
The domain affected by the request.
Validation and use: The authenticated API user must own the zone unless the operation creates it for that same user.
purge_everythingConditional- Send in
- JSON body
- Type
boolean- Accepted values
- JSON true or false
- Default
- false
- Example
false
Purges the full Cloudflare cache for the zone.
Validation and use: Choose exactly one of purge_everything=true, files, hosts, tags, or prefixes.
filesConditional- Send in
- JSON body
- Type
array of strings- Accepted values
- 1 to 100 file URLs without control characters
- Default
- Omitted
- Example
["https://example.com/assets/app.css"]
Purges specific URLs.
Validation and use: Mutually exclusive with every other purge target.
hostsConditional- Send in
- JSON body
- Type
array of strings- Accepted values
- 1 to 100 hostnames without control characters
- Default
- Omitted
- Example
["www.example.com"]
Purges cached content for selected hosts.
Validation and use: Mutually exclusive with every other purge target.
tagsConditional- Send in
- JSON body
- Type
array of strings- Accepted values
- 1 to 100 cache tags without control characters
- Default
- Omitted
- Example
["catalog"]
Purges objects carrying selected cache tags.
Validation and use: Requires a Cloudflare plan/feature that supports tag purge and is mutually exclusive with other targets.
prefixesConditional- Send in
- JSON body
- Type
array of strings- Accepted values
- 1 to 100 URL prefixes without control characters
- Default
- Omitted
- Example
["https://example.com/images/"]
Purges objects under selected prefixes.
Validation and use: Requires provider support and is mutually exclusive with other targets.
Complete request template
This template names all 6 supported path, query, form, and JSON keys. Conditional alternatives are shown together for reference; keep only the valid branch in a runnable request.
{
"path_parameters": {
"domain": "example.com"
},
"query_parameters": {},
"form_body": {},
"json_body": {
"purge_everything": false,
"files": [
"https://example.com/assets/app.css"
],
"hosts": [
"www.example.com"
],
"tags": [
"catalog"
],
"prefixes": [
"https://example.com/images/"
]
},
"query_or_form_parameters": {}
}
Runnable workflow example
curl -sS -X POST 'https://panel.example.com:882/api/external/cloudflare/domains/example.com/cache/purge' \
-H 'X-API-Name: dns-automation' \
-H 'X-API-Key: YOUR_API_KEY' \
-H 'Content-Type: application/json' \
--data '{"files":["https://example.com/assets/app.css"]}'
Successful result
The response identifies the purge type and returns Cloudflare's accepted purge result.
Error response
{
"success": false,
"error": {
"code": "external_auth_error",
"message": "Authentication failed, the source address is not allowed, the permission is missing, or the requested resource is outside this API user's ownership."
}
}
Operational note
Use the narrowest target that fixes the problem. purge_everything is effective, but it also asks every cache miss to become your origin's problem at once.
GET/api/external/cloudflare/domains/{domain}/recordspublic APIList DNS records for a Cloudflare-capable domain
What this operation does
Returns local authoritative records and their Cloudflare mapping/proxy state for one owned domain.
Endpoint
GET /api/external/cloudflare/domains/{domain}/records
Authentication and permissions
Send X-API-Name and X-API-Key, or use HTTP Basic authentication. Requires cloudflare.records.read permission and ownership of domain.
Parameters (3)
domainRequired- Send in
- URL path
- Type
string- Accepted values
- A valid DNS zone name, with or without a final dot
- Default
- No default
- Example
example.com
The domain affected by the request.
Validation and use: The authenticated API user must own the zone unless the operation creates it for that same user.
limitOptional- Send in
- Query string
- Type
integer- Accepted values
- 1 to 5000 after service normalization
- Default
- 1000
- Example
500
Maximum records returned.
Validation and use: Use pagination for large zones.
offsetOptional- Send in
- Query string
- Type
integer- Accepted values
- 0 or greater
- Default
- 0
- Example
0
Records to skip.
Validation and use: Advance by the returned limit.
Complete request template
This template names all 3 supported path, query, form, and JSON keys. Conditional alternatives are shown together for reference; keep only the valid branch in a runnable request.
{
"path_parameters": {
"domain": "example.com"
},
"query_parameters": {
"limit": 500,
"offset": 0
},
"form_body": {},
"json_body": {},
"query_or_form_parameters": {}
}
Runnable workflow example
curl -sS 'https://panel.example.com:882/api/external/cloudflare/domains/example.com/records?limit=500&offset=0' \
-H 'X-API-Name: dns-automation' \
-H 'X-API-Key: YOUR_API_KEY'
Successful result
The response contains provider state, total, limit, offset, and records with local id, Cloudflare id, TTL, disabled, priority, and proxied values where available.
Error response
{
"success": false,
"error": {
"code": "external_auth_error",
"message": "Authentication failed, the source address is not allowed, the permission is missing, or the requested resource is outside this API user's ownership."
}
}
Operational note
Use the local numeric record id returned here in the PATCH and DELETE paths; do not substitute a Cloudflare string id.
POST/api/external/cloudflare/domains/{domain}/recordspublic APICreate and synchronize a DNS record
What this operation does
Adds a local authoritative record and immediately synchronizes its RRset to Cloudflare when the domain is Cloudflare-capable.
Endpoint
POST /api/external/cloudflare/domains/{domain}/records
Authentication and permissions
Send X-API-Name and X-API-Key, or use HTTP Basic authentication. Requires cloudflare.records.write permission and ownership of domain.
Parameters (9)
domainRequired- Send in
- URL path
- Type
string- Accepted values
- A valid DNS zone name, with or without a final dot
- Default
- No default
- Example
example.com
The domain affected by the request.
Validation and use: The authenticated API user must own the zone unless the operation creates it for that same user.
nameOptional- Send in
- JSON body
- Type
string- Accepted values
- @, a relative label, or a name inside domain
- Default
- @
- Example
www
Record owner name.
Validation and use: SDM normalizes the name into the domain.
typeRequired- Send in
- JSON body
- Type
DNS RR type- Accepted values
- A valid PowerDNS record type. The SDM editor currently offers A, AAAA, CNAME, MX, TXT, NS, PTR, SRV, CAA, AFSDB, DNAME, DS, and HINFO
- Default
- No default
- Example
A
Record type.
Validation and use: Cloudflare proxying is restricted to A, AAAA, and CNAME.
contentRequired- Send in
- JSON body
- Type
string- Accepted values
- Record data valid for type
- Default
- No default
- Example
192.0.2.10
Record content.
Validation and use: For MX, content may be a destination hostname and priority/prio will be prepended, or content may already contain both priority and destination.
priorityOptional- Send in
- JSON body
- Type
integer- Accepted values
- A positive MX priority
- Default
- Omitted
- Example
10
Preferred MX priority key.
Validation and use: Used for MX only. If content already starts with a numeric priority, it is not added again.
prioOptional- Send in
- JSON body
- Type
integer- Accepted values
- A positive MX priority
- Default
- Omitted
- Example
10
Compatibility alias for priority.
Validation and use: Use priority for new integrations. It takes precedence when both keys are supplied.
ttlOptional- Send in
- JSON body
- Type
integer- Accepted values
- A positive TTL in seconds
- Default
- 3600
- Example
3600
Record TTL.
Validation and use: A non-positive or missing value becomes 3600.
disabledOptional- Send in
- JSON body
- Type
boolean- Accepted values
- JSON true or false
- Default
- false
- Example
false
Creates the record disabled when true.
Validation and use: Use an explicit true/false value. Omitting an optional boolean keeps its documented default.
proxiedOptional- Send in
- JSON body
- Type
boolean- Accepted values
- JSON true or false
- Default
- Provider/default state when omitted
- Example
false
Requests Cloudflare proxying.
Validation and use: Valid only for A, AAAA, and CNAME.
Complete request template
This template names all 9 supported path, query, form, and JSON keys. Conditional alternatives are shown together for reference; keep only the valid branch in a runnable request.
{
"path_parameters": {
"domain": "example.com"
},
"query_parameters": {},
"form_body": {},
"json_body": {
"name": "www",
"type": "A",
"content": "192.0.2.10",
"priority": 10,
"prio": 10,
"ttl": 3600,
"disabled": false,
"proxied": false
},
"query_or_form_parameters": {}
}
Runnable workflow example
curl -sS -X POST 'https://panel.example.com:882/api/external/cloudflare/domains/example.com/records' \
-H 'X-API-Name: dns-automation' \
-H 'X-API-Key: YOUR_API_KEY' \
-H 'Content-Type: application/json' \
--data '{"name":"www","type":"A","content":"192.0.2.10","ttl":3600,"disabled":false,"proxied":true}'
Successful result
The response returns the created local record and the Cloudflare synchronization result.
Error response
{
"success": false,
"error": {
"code": "external_auth_error",
"message": "Authentication failed, the source address is not allowed, the permission is missing, or the requested resource is outside this API user's ownership."
}
}
Operational note
The write is local-authoritative first and then provider-synchronized. Treat a sync error as an incomplete operation and read both record and domain status before retrying.
PATCH/api/external/cloudflare/domains/{domain}/records/{record_id}public APIUpdate and synchronize one DNS record
What this operation does
Loads the current local record by id, preserves omitted fields, applies supplied changes, and synchronizes the old and new RRsets as needed.
Endpoint
PATCH /api/external/cloudflare/domains/{domain}/records/{record_id}
Authentication and permissions
Send X-API-Name and X-API-Key, or use HTTP Basic authentication. Requires cloudflare.records.write permission and ownership of domain.
Parameters (10)
domainRequired- Send in
- URL path
- Type
string- Accepted values
- A valid DNS zone name, with or without a final dot
- Default
- No default
- Example
example.com
The domain affected by the request.
Validation and use: The authenticated API user must own the zone unless the operation creates it for that same user.
record_idRequired- Send in
- URL path
- Type
integer- Accepted values
- A positive local record id returned by the list operation
- Default
- No default
- Example
42
Local SDM record identifier.
Validation and use: It must belong to domain.
nameOptional- Send in
- JSON body
- Type
string- Accepted values
- @, relative label, or name inside domain
- Default
- Current name
- Example
api
Replacement owner name.
Validation and use: Omit to preserve the current name.
typeOptional- Send in
- JSON body
- Type
DNS RR type- Accepted values
- A valid PowerDNS record type. The SDM editor currently offers A, AAAA, CNAME, MX, TXT, NS, PTR, SRV, CAA, AFSDB, DNAME, DS, and HINFO
- Default
- Current type
- Example
AAAA
Replacement record type.
Validation and use: Omit to preserve the current type. Proxy validation uses the resulting type.
contentOptional- Send in
- JSON body
- Type
string- Accepted values
- Record data valid for the resulting type
- Default
- Current content
- Example
2001:db8::10
Replacement content.
Validation and use: Omit to preserve current content. For MX, priority/prio can be prepended when content lacks one.
priorityOptional- Send in
- JSON body
- Type
integer- Accepted values
- A positive MX priority
- Default
- Omitted/current content
- Example
10
Preferred MX priority key.
Validation and use: Used only when the resulting type is MX.
prioOptional- Send in
- JSON body
- Type
integer- Accepted values
- A positive MX priority
- Default
- Omitted/current content
- Example
10
Compatibility alias for priority.
Validation and use: Use priority for new clients.
ttlOptional- Send in
- JSON body
- Type
integer- Accepted values
- A positive TTL in seconds
- Default
- Current TTL
- Example
3600
Replacement TTL.
Validation and use: Omit or send a non-positive value to preserve the current TTL.
disabledOptional- Send in
- JSON body
- Type
boolean- Accepted values
- JSON true or false
- Default
- Current disabled state
- Example
false
Replacement disabled state.
Validation and use: Use an explicit true/false value. Omitting an optional boolean keeps its documented default.
proxiedOptional- Send in
- JSON body
- Type
boolean- Accepted values
- JSON true or false
- Default
- Current proxy preference
- Example
false
Replacement Cloudflare proxy preference.
Validation and use: Valid only when the resulting type is A, AAAA, or CNAME.
Complete request template
This template names all 10 supported path, query, form, and JSON keys. Conditional alternatives are shown together for reference; keep only the valid branch in a runnable request.
{
"path_parameters": {
"domain": "example.com",
"record_id": 42
},
"query_parameters": {},
"form_body": {},
"json_body": {
"name": "api",
"type": "AAAA",
"content": "2001:db8::10",
"priority": 10,
"prio": 10,
"ttl": 3600,
"disabled": false,
"proxied": false
},
"query_or_form_parameters": {}
}
Runnable workflow example
curl -sS -X PATCH 'https://panel.example.com:882/api/external/cloudflare/domains/example.com/records/42' \
-H 'X-API-Name: dns-automation' \
-H 'X-API-Key: YOUR_API_KEY' \
-H 'Content-Type: application/json' \
--data '{"content":"192.0.2.20","ttl":3600}'
Successful result
The response returns the resulting record and synchronization state.
Error response
{
"success": false,
"error": {
"code": "external_auth_error",
"message": "Authentication failed, the source address is not allowed, the permission is missing, or the requested resource is outside this API user's ownership."
}
}
Operational note
At least one meaningful field should be supplied. Read the current record first; omitted fields are preserved, which is convenient until a stale client assumes otherwise.
DELETE/api/external/cloudflare/domains/{domain}/records/{record_id}public APIDelete and synchronize one DNS record
What this operation does
Deletes the local record selected by id and synchronizes the remaining RRset to Cloudflare.
Endpoint
DELETE /api/external/cloudflare/domains/{domain}/records/{record_id}
Authentication and permissions
Send X-API-Name and X-API-Key, or use HTTP Basic authentication. Requires cloudflare.records.write permission and ownership of domain.
Parameters (2)
domainRequired- Send in
- URL path
- Type
string- Accepted values
- A valid DNS zone name, with or without a final dot
- Default
- No default
- Example
example.com
The domain affected by the request.
Validation and use: The authenticated API user must own the zone unless the operation creates it for that same user.
record_idRequired- Send in
- URL path
- Type
integer- Accepted values
- A positive local record id returned by the list operation
- Default
- No default
- Example
42
Local SDM record identifier.
Validation and use: It must belong to domain.
Complete request template
This template names all 2 supported path, query, form, and JSON keys. Conditional alternatives are shown together for reference; keep only the valid branch in a runnable request.
{
"path_parameters": {
"domain": "example.com",
"record_id": 42
},
"query_parameters": {},
"form_body": {},
"json_body": {},
"query_or_form_parameters": {}
}
Runnable workflow example
curl -sS -X DELETE 'https://panel.example.com:882/api/external/cloudflare/domains/example.com/records/42' \
-H 'X-API-Name: dns-automation' \
-H 'X-API-Key: YOUR_API_KEY'
Successful result
The response confirms record_id and returns the Cloudflare synchronization result.
Error response
{
"success": false,
"error": {
"code": "external_auth_error",
"message": "Authentication failed, the source address is not allowed, the permission is missing, or the requested resource is outside this API user's ownership."
}
}
Operational note
List the record immediately before deletion and list again afterward. Record ids are local identifiers and may change when a record is recreated.
Compatibility aliases
Use the clean routes above for new integrations. The following public aliases remain accepted for existing clients. They do not create extra capabilities; each one maps to the complete operation card named in the last column.
| Public alias | Method and complete location changes | Use this full contract |
|---|---|---|
/api/v1/dns/external | GET or POST. Send the same action and action-specific query/form keys as /api/v1/dns. | All 18 DNS compatibility cards. |
POST /api/external/cloudflare/enable | Move domain from the path into JSON. JSON keys: domain, registered_with_us, client_id, whmcs_domain_id. | Enable Cloudflare. |
POST /api/external/cloudflare/disable | Move domain into JSON. JSON keys: domain, delete_cloudflare_zone, cloudflare_delete_confirm, registered_with_us, client_id, whmcs_domain_id. | Disable Cloudflare. |
GET /api/external/domain/status | Query key domain; name is an accepted alias when domain is absent. | Read domain provider status. |
POST /api/external/domain/sync | JSON key domain. | Synchronize a domain. |
Direct-wrapper compatibility
Older deployments may call /api/external/cloudflare.php directly. Keep these only while migrating an existing client:
?action=domainsorlist: GET query keyslimit(500),offset(0), andsearch.?action=zone-settings,zone_settings, orsettings: GET querydomainor its aliasname.?action=zone-setting,zone_setting, orsetting: POST querydomain/name; JSONsettingandvaluewith the same five setting/value sets shown above.?action=purge-cache,purge_cache, orpurge: POST querydomain/name; JSON chooses exactly one ofpurge_everything,files,hosts,tags, orprefixes.?action=action: POST querydomain/nameand JSONaction. Accepted action aliases areenable_development_mode,development_mode_on,dev_mode_on,disable_cache,cache_bypass_on,disable_development_mode,development_mode_off,dev_mode_off,enable_cache,cache_bypass_off,enable_under_attack,under_attack_on,disable_under_attack,under_attack_off,set_security_level,set_cache_level,always_online_on,enable_always_online,always_online_off,disable_always_online,brotli_on,enable_brotli,brotli_off,disable_brotli,purge_cache, andpurge_everything. Optional keys arefallback_security_level(defaultmediumwhen disabling Under Attack),value,security_level,cache_level, and the five purge-target keys. For new clients, use the clean setting or purge routes instead.
Errors and safe retries
| HTTP result | Typical meaning | Next step |
|---|---|---|
400 | Missing, malformed, unsupported, or mutually incompatible parameters. | Compare the request with the complete template and the conditional rules. |
401 | Missing/invalid credentials, inactive linked panel account, or blocked external identity. | Check both account states, key rotation, and the authentication method. |
403 | Permission, ownership, source-IP, or reserved-root boundary. | Use the correct API user and source; do not try to turn an ownership error into a retry loop. |
404 | The public route, owned domain, zone, or record id was not found. | Confirm the port and public path, then rediscover current resource ids. |
409 | Safety confirmation, provider/delegation state, DNSSEC sequence, or concurrent mutation conflict. | Read current state and satisfy the stated prerequisite before retrying. |
413 | The complete zone file exceeded 16 MiB. | Stop and validate the source artifact instead of splitting one logical replacement into unsafe partial writes. |
5xx | Database, authoritative DNS, provider, or synchronization work did not complete. | Preserve the response, read current state, and retry only when the operation is proven idempotent. |
How to use it
- Call ping from the integration's real source address.
- Use a list/status operation to discover the owned zone, domain, or record id.
- Open the operation card and account for every parameter in its complete template.
- Build one valid branch, omitting mutually exclusive alternatives.
- Send the request once, inspect both HTTP status and JSON, then verify with the corresponding read operation.
Result and next check
A correct integration reaches https://panel.example.com:882, authenticates as a dedicated non-root API user, supplies every key required by its chosen workflow, and remains within its owned DNS scope. After any write, confirm the authoritative record or DNSSEC/provider state instead of treating a successful HTTP exchange as the end of the story.
Theme color