OpenProvider (openprovider.eu) is the domain registrar and DNS provider for Atlas Frontline. This skill handles all domain, DNS, SSL, and customer handle operations via the OpenProvider REST API v1beta.
Always obtain a token before making any API call.
OPENPROVIDER_USERNAME / OPENPROVIDER_PASSWORD (env vars), with legacy fallback from OPENPROVIDER_USER / OPENPROVIDER_PASS, or DB table system_settings (key: integration_credentials_openprovider)POST https://api.openprovider.eu/v1beta/auth/loginAuthorization: Bearer {token} headerbash
# Get token
OP_USER="${OPENPROVIDER_USERNAME:-${OPENPROVIDER_USER:-}}"
OP_PASS="${OPENPROVIDER_PASSWORD:-${OPENPROVIDER_PASS:-}}"
TOKEN=$(curl -s -X POST https://api.openprovider.eu/v1beta/auth/login \
-H "Content-Type: application/json" \
-d '{"username": "'"$OP_USER"'", "password": "'"$OP_PASS"'"}' \
| jq -r '.data.token')
→ Full auth docs: references/auth.md
SettingValueBase URLhttps://api.openprovider.eu/v1beta/AuthBearer TokenContent-Typeapplication/jsonTimeout30sRetries3 (backoff: 1s, 3s, 9s)
Use this table to find the right action and reference file:
RequestEndpointMethodReferenceIs domain available? / Check domain/domains/checkPOSTdomains.mdRegister / buy domain/domainsPOSTdomains.mdGet domain status/domains/{id}GETdomains.mdList all domains/domainsGETdomains.mdRenew domain/domains/{id}/renewPOSTdomains.mdUpdate domain settings/domains/{id}PUTdomains.mdTransfer domain/domains/transferPOSTdomains.mdDelete / cancel domain/domains/{id}DELETEdomains.mdRestore domain/domains/{id}/restorePOSTdomains.md
RequestEndpointMethodReferenceCreate DNS zone/dns/zonesPOSTdns.mdGet DNS zone/dns/zones/{domain}GETdns.mdAdd/remove DNS records/dns/zones/{domain}PUTdns.mdList DNS records/dns/zones/{domain}/recordsGETdns.mdDelete DNS zone/dns/zones/{domain}DELETEdns.mdList all DNS zones/dns/zonesGETdns.md
RequestEndpointMethodReferenceOrder SSL certificate/ssl/ordersPOSTssl.mdList SSL certificates/ssl/ordersGETssl.mdGet SSL certificate details/ssl/orders/{id}GETssl.mdReissue SSL certificate/ssl/orders/{id}/reissuePOSTssl.mdRenew SSL certificate/ssl/orders/{id}/renewPOSTssl.mdCancel SSL certificate/ssl/orders/{id}DELETEssl.mdList SSL products/prices/ssl/productsGETssl.md
RequestEndpointMethodReferenceList NS groups/dns/nameservers/groupsGETnameservers.mdGet NS group details/dns/nameservers/groups/{name}GETnameservers.mdCreate NS group/dns/nameservers/groupsPOSTnameservers.mdUpdate NS group/dns/nameservers/groups/{name}PUTnameservers.mdDelete NS group/dns/nameservers/groups/{name}DELETEnameservers.md
RequestEndpointMethodReferenceList all TLDs/tldsGETtlds.mdGet TLD details & prices/tlds/{name}GETtlds.md
RequestEndpointMethodReferenceList customers/customersGETcustomers-resellers.mdGet customer/customers/{handle}GETcustomers-resellers.mdCreate customer / handle/customersPOSTcustomers-resellers.mdUpdate customer/customers/{handle}PUTcustomers-resellers.mdDelete customer/customers/{handle}DELETEcustomers-resellers.mdReseller info/resellers/{id}GETcustomers-resellers.md
Full flow when a user says "register the domain example.com":
POST /domains/check with with_price: trueGET /customers or POST /customersPOST /domains with owner_handle, ns_groupPOST /dns/zonesPUT /dns/zones/{domain} (A, MX, SPF, DKIM, DMARC)GET /domains/{id}GET /dns/zones/{domain}/recordsPUT /dns/zones/{domain} with records.removePUT /dns/zones/{domain} with records.addGET /dns/zones/{domain}/recordsImportant: Do NOT combine remove and add in a single PUT call! Two separate calls required (Error 817).
When updating records in zone /dns/zones/{domain}, OpenProvider expects the
record name in zone-relative form for subdomains.
Use:
phone for phone.example.com in zone example.com_dmarc for _dmarc.example.com in zone example.comwww for www.example.com in zone example.comDo NOT use the full FQDN as name when writing records inside a zone unless
you have verified OpenProvider expects it for that exact operation.
If you send phone.example.com as name inside zone example.com, OpenProvider may
append the zone again and create the wrong record:
phone.example.comphone.example.com.example.comBefore any DNS write:
example.comexample.com → apex/root ( "" empty string for OpenProvider zone writes, not the full domain, and not @ unless explicitly verified)phone.example.com → phone_dmarc.example.com → _dmarcFor OpenProvider PUT /dns/zones/{domain} writes, the zone apex must be sent as an empty string name:
json
{
"name": "",
"type": "TXT",
"value": "google-site-verification=...",
"ttl": 600
}
Do not send the full domain name as name for apex writes inside the zone payload.
If you send example.com as name while writing inside zone example.com, OpenProvider may create:
example.comexample.com.example.comAlso do not assume @ works for OpenProvider. It may be rejected as an invalid record name.
For any add/replace of a record:
namedig) because provider acceptance ≠ public propagationFor OpenProvider DNS writes, MX records use the field name prio, not priority.
Correct example for a mail subdomain inside zone example.com:
json
{
"records": {
"add": [
{
"name": "send",
"type": "MX",
"value": "feedback-smtp.eu-west-1.amazonses.com",
"ttl": 600,
"prio": 10
}
]
}
}
Do not use priority in the payload unless you have verified a different endpoint/schema.
For Resend/Amazon SES sender domains, a known-good public result is:
bash
dig +short MX send.example.com
# 10 feedback-smtp.eu-west-1.amazonses.com.
Zone: example.com
Correct add payload for phone.example.com:
json
{
"records": {
"add": [
{
"name": "phone",
"type": "A",
"value": "46.225.220.40",
"ttl": 900
}
]
}
}
Incorrect payload:
json
{
"records": {
"add": [
{
"name": "phone.example.com",
"type": "A",
"value": "46.225.220.40",
"ttl": 900
}
]
}
}
That incorrect payload can create phone.example.com.example.com.
Apex TXT example for example.com:
Correct:
json
{
"records": {
"add": [
{
"name": "",
"type": "TXT",
"value": "google-site-verification=...",
"ttl": 600
}
]
}
}
Incorrect:
json
{
"records": {
"add": [
{
"name": "example.com",
"type": "TXT",
"value": "google-site-verification=...",
"ttl": 600
}
]
}
}
That incorrect payload can create example.com.example.com.
POST /customers if neededPOST /domains/transfer with auth_code + owner_handleAll API responses follow this structure:
json
{"code": 0, "desc": "...", "data": {...}}
code: 0 = successcode: != 0 = error (details in desc)OPENPROVIDER_USER / OPENPROVIDER_PASSCommon errors:
CodeMeaningSolution817Duplicate DNS recordRemove existing record first, then add new one816Validation error / invalid field valueRe-check record schema; for MX use prio instead of priority801Domain already existsDomain is already registered899Rate limitReduce batch size, wait1000Auth failedCheck credentials
→ Full error reference: references/auth.md
OpenProvider is integrated into Atlas via the Frontline module:
api/services/frontline/openprovider.ts — API clientapi/services/frontline/dns.ts — DNS configuration & verificationapi/services/frontline/handles.ts — Workspace handle managementapi/services/frontline/domain-search.ts — Domain availability searchapi/services/frontline/domains.ts — Domain lifecycleshared/types/frontline.ts — TypeScript definitionssystem_settings table, key integration_credentials_openproviderLimitValueDomain check batch sizeMax 5 per requestSuggestions per searchMax 20Token validity48h (cache: 24h)Request timeout30sDNS TTL minimum600sDomain registrations per workspace/dayMax 3 (Atlas limit)
FileContentsreferences/auth.mdAuthentication, tokens, credentials, error handlingreferences/domains.mdDomain CRUD, check, transfer, renew, restorereferences/dns.mdDNS zones & records (CRUD, patterns, pitfalls)references/ssl.mdSSL certificates (order, reissue, renew, cancel)references/nameservers.mdNameserver group managementreferences/tlds.mdTLD information & pricingreferences/customers-resellers.mdCustomer handles & reseller info