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} header# 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
| Setting | Value |
|---|---|
| --------- | ------- |
| Base URL | https://api.openprovider.eu/v1beta/ |
| Auth | Bearer Token |
| Content-Type | application/json |
| Timeout | 30s |
| Retries | 3 (backoff: 1s, 3s, 9s) |
Use this table to find the right action and reference file:
| Request | Endpoint | Method | Reference |
|---|---|---|---|
| --------- | ---------- | -------- | ----------- |
| Is domain available? / Check domain | /domains/check | POST | domains.md |
| Register / buy domain | /domains | POST | domains.md |
| Get domain status | /domains/{id} | GET | domains.md |
| List all domains | /domains | GET | domains.md |
| Renew domain | /domains/{id}/renew | POST | domains.md |
| Update domain settings | /domains/{id} | PUT | domains.md |
| Transfer domain | /domains/transfer | POST | domains.md |
| Delete / cancel domain | /domains/{id} | DELETE | domains.md |
| Restore domain | /domains/{id}/restore | POST | domains.md |
| Request | Endpoint | Method | Reference |
|---|---|---|---|
| --------- | ---------- | -------- | ----------- |
| Create DNS zone | /dns/zones | POST | dns.md |
| Get DNS zone | /dns/zones/{domain} | GET | dns.md |
| Add/remove DNS records | /dns/zones/{domain} | PUT | dns.md |
| List DNS records | /dns/zones/{domain}/records | GET | dns.md |
| Delete DNS zone | /dns/zones/{domain} | DELETE | dns.md |
| List all DNS zones | /dns/zones | GET | dns.md |
| Request | Endpoint | Method | Reference |
|---|---|---|---|
| --------- | ---------- | -------- | ----------- |
| Order SSL certificate | /ssl/orders | POST | ssl.md |
| List SSL certificates | /ssl/orders | GET | ssl.md |
| Get SSL certificate details | /ssl/orders/{id} | GET | ssl.md |
| Reissue SSL certificate | /ssl/orders/{id}/reissue | POST | ssl.md |
| Renew SSL certificate | /ssl/orders/{id}/renew | POST | ssl.md |
| Cancel SSL certificate | /ssl/orders/{id} | DELETE | ssl.md |
| List SSL products/prices | /ssl/products | GET | ssl.md |
| Request | Endpoint | Method | Reference |
|---|---|---|---|
| --------- | ---------- | -------- | ----------- |
| List NS groups | /dns/nameservers/groups | GET | nameservers.md |
| Get NS group details | /dns/nameservers/groups/{name} | GET | nameservers.md |
| Create NS group | /dns/nameservers/groups | POST | nameservers.md |
| Update NS group | /dns/nameservers/groups/{name} | PUT | nameservers.md |
| Delete NS group | /dns/nameservers/groups/{name} | DELETE | nameservers.md |
| Request | Endpoint | Method | Reference |
|---|---|---|---|
| --------- | ---------- | -------- | ----------- |
| List all TLDs | /tlds | GET | tlds.md |
| Get TLD details & prices | /tlds/{name} | GET | tlds.md |
| Request | Endpoint | Method | Reference |
|---|---|---|---|
| --------- | ---------- | -------- | ----------- |
| List customers | /customers | GET | customers-resellers.md |
| Get customer | /customers/{handle} | GET | customers-resellers.md |
| Create customer / handle | /customers | POST | customers-resellers.md |
| Update customer | /customers/{handle} | PUT | customers-resellers.md |
| Delete customer | /customers/{handle} | DELETE | customers-resellers.md |
| Reseller info | /resellers/{id} | GET | customers-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}/records> Important: 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:
{
"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:
{
"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:
dig +short MX send.example.com
# 10 feedback-smtp.eu-west-1.amazonses.com.
Zone: example.com
Correct add payload for phone.example.com:
{
"records": {
"add": [
{
"name": "phone",
"type": "A",
"value": "46.225.220.40",
"ttl": 900
}
]
}
}
Incorrect payload:
{
"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:
{
"records": {
"add": [
{
"name": "",
"type": "TXT",
"value": "google-site-verification=...",
"ttl": 600
}
]
}
}
Incorrect:
{
"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:
{"code": 0, "desc": "...", "data": {...}}
code: 0 = successcode: != 0 = error (details in desc)OPENPROVIDER_USER / OPENPROVIDER_PASSCommon errors:
| Code | Meaning | Solution |
|---|---|---|
| ------ | --------- | ---------- |
| 817 | Duplicate DNS record | Remove existing record first, then add new one |
| 816 | Validation error / invalid field value | Re-check record schema; for MX use prio instead of priority |
| 801 | Domain already exists | Domain is already registered |
| 899 | Rate limit | Reduce batch size, wait |
| 1000 | Auth failed | Check 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_openprovider| Limit | Value |
|---|---|
| ------- | ------- |
| Domain check batch size | Max 5 per request |
| Suggestions per search | Max 20 |
| Token validity | 48h (cache: 24h) |
| Request timeout | 30s |
| DNS TTL minimum | 600s |
| Domain registrations per workspace/day | Max 3 (Atlas limit) |
| File | Contents |
|---|---|
| ------ | ---------- |
| references/auth.md | Authentication, tokens, credentials, error handling |
| references/domains.md | Domain CRUD, check, transfer, renew, restore |
| references/dns.md | DNS zones & records (CRUD, patterns, pitfalls) |
| references/ssl.md | SSL certificates (order, reissue, renew, cancel) |
| references/nameservers.md | Nameserver group management |
| references/tlds.md | TLD information & pricing |
| references/customers-resellers.md | Customer handles & reseller info |
共 1 个版本