Skip to main content
All routes require:
The key must include the scope below and access to that store. The dashboard permission ceiling is manageSettings.
PUT and POST /verify require a Premium or Business plan (customDomains). Free returns 403. GET and DELETE are not plan-gated, so a downgraded store can still be read and disconnected. Saving a domain does not check DNS and does not make the hostname live. Call POST /verify after the CNAME exists. The storefront uses the custom domain only when customDomainStatus is active. Seller steps and the DNS table are in Custom domain.

Domain object

GET, PUT, and DELETE return this object. POST /verify returns the same object plus verification.
string
Store subdomain label, without the platform host.
string
Public subdomain URL, for example https://acme.joinmarkt.com. This address stays available after a custom domain is connected.
string | null
Saved hostname, or null when none is connected. Stored lowercase, without a scheme, path, port, or leading www..
string | null
pending, active, failed, or null. Assign sets pending. Verify sets active when the check passes and pending when it does not. null means no domain is connected.
string | null
ISO time of the last successful verification, or null. A later failed check does not clear it.
string
https://{customDomain} while status is active. Otherwise the same value as subdomainUrl.
string
Hostname the traffic CNAME must point at. The Domains page copies this value. The platform default is stores.joinmarkt.com.
string | null
_join-markt-verify.{domain} when a domain is saved, otherwise null. Add a TXT on this host only when dnsInstructions includes that TXT row.
array
Rows to create at the seller’s DNS provider. Empty when no domain is saved. With Cloudflare for SaaS this is one CNAME unless Cloudflare has asked for another row.
boolean
true when Join Markt is using Cloudflare for SaaS for this hostname. Verification then requires the traffic CNAME plus an active Cloudflare hostname and certificate. The ownership TXT is not required.
string | null
Cloudflare custom-hostname status, or null when SaaS has no hostname yet.
string | null
Cloudflare certificate status, or null. The domain becomes active only when this is active and cloudflareHostnameStatus is active.

Get domain

Scope: domain:read. No body.
string
required
The store id.
Returns the domain object. dnsInstructions is empty until a domain is saved.

Assign domain

Scope: domain:write. Replaces any hostname already saved on this store. Status is set to pending and customDomainVerifiedAt is cleared. DNS is not checked in this call.
string
required
The store id.
string
required
Hostname to connect, 3–253 characters after trim. https://, a path, a port, and a leading www. are removed before save. Example: shop.example.com or example.com.
Rejected hostnames (400): empty after normalize, longer than 253 characters, not a domain (Enter a valid domain like shop.example.com), reserved (joinmarkt.com, www.joinmarkt.com, dash.joinmarkt.com, stores.joinmarkt.com, fallback.joinmarkt.com, cdn.joinmarkt.com), a local or internal name, or any Join Markt platform host. A hostname already connected to another store returns 409.
Response is the domain object with customDomainStatus pending.

Verify domain

Scope: domain:write. No body. Requires a domain already saved with PUT. Checks DNS, then (when SaaS is configured) waits until Cloudflare reports the hostname and certificate active.
string
required
The store id.
The response is the domain object plus:
object
Result of this check. customDomainStatus on the parent object is the stored outcome (active or pending).
400 with No custom domain configured when nothing has been saved.

Remove domain

Scope: domain:write. No body. Clears the hostname, status, and verification time, and removes the Cloudflare custom hostname when one exists. The subdomain keeps working.
string
required
The store id.
Response is the domain object with customDomain, customDomainStatus, customDomainVerifiedAt, and verificationHost set to null, and dnsInstructions set to [].

Errors

Failed responses use { "success": false, "error": "...", "code": "..." }.