# ResellerHQ

> ResellerHQ is a white-label reseller platform for phone numbers, domains and mailbox licences: one prepaid wallet, one dashboard and one API, with your brand and your price in front of your customers.

## Products
### Phone numbers (Open in the dashboard)
Private numbers that receive SMS, for any service or locked to one.
- Rent from 12 hours to a year
- Messages by inbox, API or signed webhook
- Renew automatically or cancel for a refund

### Domains (Open in the sandbox)
Registration and renewal across the endings your customers ask for.
- Search one name across every ending at once
- Register and renew from your wallet
- One API call, safe to retry

### Mailbox licences (Open in the sandbox)
Google Workspace Business Starter licences for your customers' domains today; more Google Workspace plans and Microsoft 365 are coming soon.
- Bought per seat, on the plan you choose
- Seats added and removed as they grow
- The mailboxes stay with Google or Microsoft

## How it works
1. **Open an account.** Sign up with an email address. Your reseller account and a sandbox to test in are created in the same step.
2. **Fund your wallet.** The wallet is prepaid. An order reserves what it needs, charges only for what is delivered, and returns the rest.
3. **Place an order.** Choose a product in the dashboard, or send one POST request. You see the wholesale price before you commit.
4. **Sell it as yours.** Set your own price and deliver under your own brand. Events reach your systems as signed webhooks, so your customers never see us.

## Platform
- **A wallet you can audit.** Every movement of money is a double-entry journal line. Funds are held before a purchase and captured only for what was delivered, so a failed order costs nothing.
- **Several providers behind one price.** Each order is routed to the cheapest upstream provider that can fulfil it and falls through to the next if one cannot. You see one price, and it does not change with the provider.
- **Safe to retry.** Send an Idempotency-Key with a purchase and a retried request returns the original result instead of buying twice. The same rule protects renewals and cancellations.
- **Signed webhooks.** Events follow the Standard Webhooks specification: an HMAC-SHA256 signature, a timestamp and automatic retries with backoff. Verify them with any Standard Webhooks library.
- **Renewals that look after themselves.** Turn on auto-renew and what you sell is extended shortly before it ends. If the wallet is short you are told once, and it lapses on time instead of failing silently.
- **A sandbox that behaves like production.** Test accounts run against a built-in provider. Place orders with test funds, trigger test events and exercise your webhook handler before spending anything.

## API
- Base URL: https://resellerhq.com/api/v1
- Authentication: `Authorization: Bearer <API key>`
- Amounts are integers in US cents.
- OpenAPI 3.1 document: https://resellerhq.com/api/openapi.json
- Purchases, renewals and cancellations accept an `Idempotency-Key` header.
- A Model Context Protocol server at https://resellerhq.com/api/mcp lets an AI assistant read an account
  directly, over Streamable HTTP (protocol revision `2026-07-28`), with the same API key
  as a bearer token: [Use ResellerHQ from your AI assistant](https://resellerhq.com/docs/mcp).

```sh
curl -X POST https://resellerhq.com/api/v1/numbers/orders \
  -H "Authorization: Bearer $RHQ_API_KEY" \
  -H "Idempotency-Key: $(uuidgen)" \
  -H "Content-Type: application/json" \
  -d '{"country":"US","duration":"30d","customerId":"CUSTOMER_ID"}'
```

## Frequently asked questions
### What is ResellerHQ?
ResellerHQ is a white-label reseller platform for phone numbers, domains and mailbox licences. You buy at wholesale from one prepaid wallet, through a dashboard or a REST API, and sell to your own customers under your brand at a price you choose.

### Who is it for?
It is for agencies, SaaS companies and independent resellers who already have customers and want to sell them infrastructure without negotiating with carriers, registrars and licence distributors, or building billing, routing and delivery themselves.

### What can I resell?
Three product lines: phone numbers that receive SMS, domains across many endings, and mailbox licences. All three are open in the sandbox today; live ordering is opening account by account. Mailbox licences sell Google Workspace Business Starter for now, with more Google Workspace plans and Microsoft 365 coming soon. The platform is in early access.

### How does pricing work?
You pay a wholesale price that is shown before you buy, in the dashboard and from the offers endpoint of the API. You decide what to charge your own customers, and the difference is your margin.

### When is my wallet charged?
When you place an order, the total is reserved in your wallet. You are charged only for what is actually delivered; anything reserved for items that could not be delivered is returned automatically.

### Will my customers know I use ResellerHQ?
No. You sell under your own brand and at your own price. Orders are placed through your account, and events are delivered to your own systems by webhook, so your product is what your customers see.

### Is there an API?
Yes. Everything the dashboard does goes through a public REST API described by an OpenAPI 3.1 document. Amounts are integers in US cents, purchases accept an Idempotency-Key, and events are sent as signed webhooks.

### Can I try it before paying?
Yes. Every account starts in a sandbox with a built-in test provider. You can add test funds, place orders and trigger test events without a card and without buying anything real.

### What happens if an order cannot be fulfilled?
The order is tried with the next upstream provider. If none can fulfil it, the order fails, the money reserved for it is returned to your wallet, and you are not charged.

### What is acceptable use?
Everything bought through the platform must be used lawfully and in line with the terms of the services it is used with. Accounts used for fraud, spam or impersonation are suspended.

## Links
- [Home](https://resellerhq.com/)
- [Docs](https://resellerhq.com/docs)
- [API reference](https://resellerhq.com/docs/api)
- [OpenAPI document](https://resellerhq.com/api/openapi.json)
- [Create an account](https://resellerhq.com/signup)

## Free tools
112 free tools across 7 families, each one also Markdown at its own URL with .mdx added.

- [SPF checker](https://resellerhq.com/tools/spf-checker.mdx): Check an SPF record for the faults that silently break it, and count every DNS lookup it costs.
- [SPF record generator](https://resellerhq.com/tools/spf-generator.mdx): Build a valid SPF record from the senders you actually use, and see the DNS-lookup cost before you publish it.
- [DKIM checker](https://resellerhq.com/tools/dkim-checker.mdx): Find a domain’s DKIM key, read its tags in plain words, and flag a weak, revoked or malformed one.
- [DMARC checker](https://resellerhq.com/tools/dmarc-checker.mdx): Read a DMARC record in plain words, and see exactly what a receiver does with mail that fails.
- [DMARC record generator](https://resellerhq.com/tools/dmarc-generator.mdx): Build a DMARC record step by step, from monitoring through to full enforcement.
- [Email authentication report](https://resellerhq.com/tools/email-authentication-report.mdx): See SPF, DKIM, DMARC and MX for one domain together, with the fixes in the order to do them.
- [Google Workspace setup checker](https://resellerhq.com/tools/google-workspace-setup-checker.mdx): Check a domain’s MX, SPF and DKIM against the exact values Google Workspace documents.
- [Microsoft 365 setup checker](https://resellerhq.com/tools/microsoft-365-setup-checker.mdx): Check a domain’s Microsoft 365 SPF include and both DKIM selector CNAMEs, mistake by mistake.
- [Fastmail setup checker](https://resellerhq.com/tools/fastmail-setup-checker.mdx): Compare a domain’s MX, SPF and all three DKIM CNAMEs with the exact values Fastmail documents.
- [Zoho Mail setup checker](https://resellerhq.com/tools/zoho-mail-setup-checker.mdx): Confirm the SPF include Zoho documents, the zoho DKIM selector and Zoho’s mail hosts for a domain.
- [SPF flattening explainer](https://resellerhq.com/tools/spf-flattening-explainer.mdx): See how many of a domain’s SPF lookups flattening would actually remove, and what it costs to keep one flattened.
- [SPF record parser](https://resellerhq.com/tools/spf-record-parser.mdx): Paste a draft SPF record and read it term by term, with the faults named, before anything is published.
- [DMARC record parser](https://resellerhq.com/tools/dmarc-record-parser.mdx): Paste a DMARC record you are drafting and read every tag in it, with the syntax a receiver would discard it for.
- [Authentication-Results header explainer](https://resellerhq.com/tools/authentication-results-header-explainer.mdx): Paste the Authentication-Results line off a message and read what every verdict in it means, including Microsoft’s compauth result and its three-digit reason code.
- [Email header analyser](https://resellerhq.com/tools/email-header-analyser.mdx): Paste a raw email header block and read every Received hop, its delay and every SPF, DKIM and DMARC verdict in plain words.
- [DKIM key generator](https://resellerhq.com/tools/dkim-key-generator.mdx): Generate a DKIM keypair in your own browser and get the record to publish.
- [DMARC aggregate report reader](https://resellerhq.com/tools/dmarc-aggregate-report-reader.mdx): Read the RUA XML your mailbox provider emailed you by source IP, in this tab, without uploading it.
- [MTA-STS checker](https://resellerhq.com/tools/mta-sts-checker.mdx): Read a domain’s MTA-STS record and policy file, and check every mx pattern against its live MX records.
- [MTA-STS record and policy generator](https://resellerhq.com/tools/mta-sts-generator.mdx): Write both halves of MTA-STS at once: the _mta-sts TXT record and the policy file.
- [TLS-RPT record generator](https://resellerhq.com/tools/tls-rpt-generator.mdx): Build the _smtp._tls record that asks senders to report failed TLS to your mail hosts.
- [BIMI checker](https://resellerhq.com/tools/bimi-checker.mdx): Read a domain’s BIMI record, check the SVG logo against Tiny PS, and whether DMARC lets it count.
- [BIMI record generator](https://resellerhq.com/tools/bimi-generator.mdx): Build the BIMI TXT record for your logo, with or without a certificate.
- [MX lookup](https://resellerhq.com/tools/mx-lookup.mdx): See where a domain receives mail, in priority order, with the faults that stop it.
- [DNS lookup](https://resellerhq.com/tools/dns-lookup.mdx): Query any DNS record type from two resolvers at once, so a change still spreading is easy to spot.
- [DNS propagation checker](https://resellerhq.com/tools/dns-propagation-checker.mdx): See whether a DNS change has reached two independent public resolvers yet, with their TTLs.
- [Nameserver and DNS host checker](https://resellerhq.com/tools/nameserver-dns-host-checker.mdx): See who hosts a domain’s DNS from its nameservers, and whether the registry’s own list still matches what the zone answers.
- [DNS record type explainer](https://resellerhq.com/tools/dns-record-type-explainer.mdx): Nine DNS record types explained in plain words, each with a worked example - and, add a domain, the chosen type looked up live through two resolvers.
- [DNS change verifier](https://resellerhq.com/tools/dns-change-verifier.mdx): Get a plain pass or fail on whether the value you just set has actually taken effect.
- [CNAME chain follower](https://resellerhq.com/tools/cname-chain-follower.mdx): Follow a CNAME chain hop by hop to its final address, and catch a loop or a dead end before anything fetches it.
- [CAA record checker](https://resellerhq.com/tools/caa-checker.mdx): Read which certificate authorities a domain allows, and see whether the one you actually use is among them.
- [CAA record generator](https://resellerhq.com/tools/caa-generator.mdx): Build a CAA record that names exactly the certificate authorities allowed to issue for a domain, wildcards and all.
- [Apex CNAME checker](https://resellerhq.com/tools/apex-cname-checker.mdx): See whether a name is really its own zone apex, and whether a CNAME sitting there is legal or just flattened.
- [SOA record checker](https://resellerhq.com/tools/soa-record-checker.mdx): Read a zone’s SOA record as seven plain-English timers, and catch a serial or a refresh that will cause real trouble.
- [DNSSEC chain checker](https://resellerhq.com/tools/dnssec-chain-checker.mdx): See whether a domain publishes a DS record that actually matches its own DNSKEY, recomputed by hand rather than taken on trust.
- [Zone file checker](https://resellerhq.com/tools/zone-file-checker.mdx): Paste a BIND-style zone file, or point this at a live domain, to catch a CNAME sharing a name it should not and an SOA whose timers are ordered wrong.
- [TTL migration planner](https://resellerhq.com/tools/ttl-migration-planner.mdx): When to drop a TTL before a DNS cutover, and the first moment the old value is actually gone.
- [Subdomain takeover checker](https://resellerhq.com/tools/subdomain-takeover-checker.mdx): Follow a subdomain's CNAME to its target and say whether that target looks abandoned enough for someone else to claim.
- [IP-to-ASN and network lookup](https://resellerhq.com/tools/ip-to-asn-network-lookup.mdx): Look up which autonomous system and network an IP address belongs to, and who that network is registered to.
- [SRV record generator & checker](https://resellerhq.com/tools/srv-record-generator-checker.mdx): Build a correctly shaped SRV record for SIP or Microsoft Teams, then check the live one against it for exactly what a registrar panel tends to mangle.
- [DNS health report](https://resellerhq.com/tools/dns-health-report.mdx): See DNSSEC, CAA and the nameservers for one domain together, with the fixes in the order to do them.
- [Zoho Mail DNS record generator](https://resellerhq.com/tools/zoho-mail-dns-generator.mdx): Get the three MX records and the SPF include Zoho Mail needs, ready to paste into any DNS panel.
- [Fastmail DNS record generator](https://resellerhq.com/tools/fastmail-dns-generator.mdx): Get every DNS record a Fastmail custom domain needs - MX, SPF and all three DKIM CNAMEs - with nothing left as a placeholder.
- [Google Workspace DNS record generator](https://resellerhq.com/tools/google-workspace-dns-generator.mdx): Get the one MX record and SPF include Google Workspace documents, and a plain answer about the old "aspmx" records.
- [Microsoft 365 DNS record generator](https://resellerhq.com/tools/microsoft-365-dns-generator.mdx): Get the handful of DNS records Microsoft 365 documents as fixed for every tenant, and a plain list of the ones only your own admin center can give you.
- [Shopify DNS record generator](https://resellerhq.com/tools/shopify-dns-generator.mdx): Get the apex A record, the AAAA record and the www CNAME Shopify asks for, with its own one-record-only rule flagged before you publish.
- [GitHub Pages DNS record generator](https://resellerhq.com/tools/github-pages-dns-generator.mdx): Get the four fixed apex A records, the optional IPv6 set and the www CNAME GitHub Pages needs, with your own user or organisation name built in.
- [Squarespace DNS record generator](https://resellerhq.com/tools/squarespace-dns-generator.mdx): Get the four apex A records and the www CNAME Squarespace needs for a custom domain, ready to paste into any DNS panel.
- [Netlify DNS record generator](https://resellerhq.com/tools/netlify-dns-generator.mdx): Get Netlify's apex record - ALIAS, ANAME or the fallback A - plus a www CNAME completed with your own Netlify subdomain.
- [TXT record splitter](https://resellerhq.com/tools/txt-record-splitter.mdx): Split a long TXT record value into properly quoted 255-byte character-strings, or the one value a panel that auto-joins would want.
- [Domain availability checker](https://resellerhq.com/tools/domain-availability.mdx): Check whether a name is registered at the registry, across endings or a whole list at once.
- [WHOIS / RDAP lookup](https://resellerhq.com/tools/whois-rdap-lookup.mdx): See a domain’s registrar, its dates and every status code explained, read from RDAP rather than old WHOIS.
- [Bulk sender requirements checker](https://resellerhq.com/tools/bulk-sender-requirements-checker.mdx): Check one domain against Google's and Yahoo's own published bulk-sender rules, with what neither can see named outright.
- [Reverse DNS checker](https://resellerhq.com/tools/reverse-dns-checker.mdx): Look up the PTR record for an IP address, and see what it is worth fixing for mail.
- [FCrDNS checker](https://resellerhq.com/tools/fcrdns-checker.mdx): Run the real two-hop forward-confirmed reverse DNS check on an IP address, not just the PTR half.
- [Provider sending limit checker](https://resellerhq.com/tools/provider-sending-limit-checker.mdx): See Google Workspace's and Microsoft 365's own published sending limits side by side, each cited to the vendor's own page.
- [List-Unsubscribe header checker](https://resellerhq.com/tools/list-unsubscribe-checker.mdx): Paste raw headers and see whether List-Unsubscribe and List-Unsubscribe-Post pass RFC 8058's one-click unsubscribe syntax, with no request ever sent to the link inside.
- [List-Unsubscribe header generator](https://resellerhq.com/tools/list-unsubscribe-generator.mdx): Build the List-Unsubscribe and List-Unsubscribe-Post headers RFC 8058 one-click unsubscribe needs from your link, or nothing at all when the link cannot carry a POST.
- [Tracking domain CNAME checker](https://resellerhq.com/tools/tracking-domain-cname-checker.mdx): Follow a tracking subdomain’s CNAME chain and see whether it ends at a known ESP’s tracking host.
- [Mailbox calculator for cold email](https://resellerhq.com/tools/sending-capacity-calculator.mdx): How many mailboxes and domains a daily send target needs, once you say what one mailbox can safely carry.
- [Warm-up schedule planner](https://resellerhq.com/tools/warm-up-schedule-planner.mdx): A day-by-day ramp from a starting volume to a target, at whatever daily growth rate you choose to plan around.
- [Mailbox rotation planner](https://resellerhq.com/tools/mailbox-rotation-planner.mdx): Split today's send evenly across an existing mailbox pool, and flag any mailbox pushed past the safe figure you set.
- [Spam trigger word checker](https://resellerhq.com/tools/spam-trigger-word-checker.mdx): Check a subject and body against a fully shown list of urgency and money wording, all-caps words and repeated punctuation - grouped by category, nothing hidden.
- [Subject and preview text length tester](https://resellerhq.com/tools/subject-preview-length-tester.mdx): Count a subject line and preview text against the character cut-offs email service providers have actually measured, by client.
- [SPF/DKIM/DMARC alignment checker](https://resellerhq.com/tools/spf-dkim-dmarc-alignment-checker.mdx): Paste a message’s headers and see whether its DKIM signature and Return-Path actually align with the From: address the reader sees - strict and relaxed.
- [Gmail message size clipping checker](https://resellerhq.com/tools/message-size-clipping-checker.mdx): Compare a message’s HTML, or a byte count you already have, against the ~102 KB estimate Mailchimp and Litmus each measured for Gmail clipping - never presented as Google’s own rule.
- [SMS length calculator](https://resellerhq.com/tools/sms-length-calculator.mdx): Count a text message the way a carrier does, and see how many segments it costs.
- [SMS segment and cost estimator](https://resellerhq.com/tools/sms-segment-cost-estimator.mdx): Turn a message, a price per segment and a monthly volume into what you actually pay, charge and keep.
- [One-time code message tester](https://resellerhq.com/tools/otp-message-tester.mdx): Preview an OTP template, see its segment count, and flag a link, brand name or code length that could break delivery.
- [Sender ID rules by country](https://resellerhq.com/tools/sms-sender-id-rules.mdx): See whether an alphanumeric sender ID is usable, must be pre-registered, or isn't used at all, country by country.
- [A2P 10DLC throughput and registration cost planner](https://resellerhq.com/tools/a2p-10dlc-planner.mdx): Turn a Trust Score and a campaign type into the daily cap, the per-carrier MPS and the registration fee range that actually apply.
- [Number portability requirements checklist by country](https://resellerhq.com/tools/number-portability-checklist.mdx): See the document a country asks for to port a number out, how long it should take, and whose page that came from.
- [Phone number validator](https://resellerhq.com/tools/phone-number-validator.mdx): Check whether a phone number is a real, assigned range, and see every format it's used in.
- [Phone number formatter](https://resellerhq.com/tools/phone-number-formatter.mdx): Reformat any phone number into E.164, international, national and tel: form.
- [Phone number type lookup](https://resellerhq.com/tools/phone-number-type-lookup.mdx): See whether a number's range was assigned as mobile, landline, toll free or premium rate.
- [Bulk phone number validator](https://resellerhq.com/tools/bulk-phone-number-validator.mdx): Paste or upload a CSV of phone numbers and check every row's validity, country and type at once.
- [Markup vs margin calculator](https://resellerhq.com/tools/markup-margin-calculator.mdx): Turn a cost into a price or a price into a cost, and see markup and margin as the two different numbers they are.
- [Domain name generator](https://resellerhq.com/tools/domain-name-generator.mdx): Build names from your own words and see which ones the registry has no record of yet.
- [Domain ending explorer](https://resellerhq.com/tools/tld-explorer.mdx): See who runs each domain ending, when it was delegated and who it suits - then check your name on it.
- [Domain portfolio expiry checker](https://resellerhq.com/tools/domain-portfolio-expiry-checker.mdx): Paste up to 20 domains and get the registrar, expiry date, status and days left for every one.
- [Domain portfolio renewal calendar](https://resellerhq.com/tools/domain-portfolio-renewal-calendar.mdx): Paste the domains and dates you already have, see them sorted and grouped by month, and download the whole lot as a calendar file.
- [Domain renewal and transfer cost planner](https://resellerhq.com/tools/domain-renewal-transfer-cost-planner.mdx): Project several years of renewals across a portfolio, with the increase you expect compounding, and see which names cannot be transferred yet.
- [Typo and lookalike domain finder](https://resellerhq.com/tools/typo-lookalike-domain-finder.mdx): Generate the lookalikes of your domain and see which are already registered or resolving.
- [Domain age and registrar checker](https://resellerhq.com/tools/domain-age-registrar-checker.mdx): See how old a domain is by its registry registration date, and which registrar holds it.
- [EPP status code list explainer](https://resellerhq.com/tools/epp-status-list-explainer-paste.mdx): Paste a column of domain status codes from any export and read what every one of them means, with no lookup.
- [Domain naming rules checker](https://resellerhq.com/tools/domain-naming-rules-checker.mdx): Check a candidate name against the rule every ending shares, and then against that registry’s own stricter one.
- [Redirect chain checker](https://resellerhq.com/tools/redirect-chain-checker.mdx): Follow a URL hop by hop and see the status, the target and the headers of each one.
- [Google Workspace vs Microsoft 365 cost comparison](https://resellerhq.com/tools/workspace-vs-365-cost-comparison.mdx): Both vendors’ list prices at the tier and seat count you pick, with the storage each seat actually gets for the same money.
- [Reseller profit planner](https://resellerhq.com/tools/reseller-profit-planner.mdx): Every product line you bill in a month, the fixed costs no single sale sees, and the client count it takes to cover them.
- [Seat cost planner](https://resellerhq.com/tools/seat-cost-planner.mdx): Price a licence term seat by seat, put a figure on the seats nobody signs in to, and prorate a seat change that landed mid-cycle.
- [Reseller break-even calculator](https://resellerhq.com/tools/breakeven-calculator.mdx): How many clients it takes to cover a month of fixed costs, rounded up, because clients come whole.
- [Proration calculator](https://resellerhq.com/tools/proration-calculator.mdx): Work out what seats added or removed partway through a billing cycle are worth, to the cent, and check a vendor’s part-cycle line against it.
- [MRR to ARR calculator](https://resellerhq.com/tools/mrr-arr-calculator.mdx): Turn recurring revenue into its yearly figure, then watch what new, expansion, churn and contraction do to it over the next twelve months.
- [Customer lifetime value calculator](https://resellerhq.com/tools/churn-ltv-calculator.mdx): Work out what a customer is worth in profit rather than in revenue, and set it against what it cost to win them.
- [Renewal increase notice builder](https://resellerhq.com/tools/renewal-increase-notice-builder.mdx): Turn an old price and a new one into a customer-ready notice that names the exact dollar and percentage change, whichever way it moved.
- [Webhook signature verifier](https://resellerhq.com/tools/webhook-signature-verifier.mdx): Paste the three webhook headers, the raw body and the secret, and see whether the recomputed signature matches - and whether the timestamp is still inside the tolerance window.
- [Webhook replay window checker](https://resellerhq.com/tools/webhook-replay-window-checker.mdx): Decode a webhook-timestamp header into its exact UTC time and tolerance window, and check whether a clock reading falls inside or outside it.
- [Signing secret generator](https://resellerhq.com/tools/signing-secret-generator.mdx): Make a whsec_ webhook signing secret shaped exactly like ours, with its .env line, for testing a local receiver before a real endpoint exists.
- [Standard Webhooks payload signer](https://resellerhq.com/tools/standard-webhooks-payload-signer.mdx): Type an id, a timestamp and a raw body, give a whsec_ secret, and get the exact webhook-id, webhook-timestamp and webhook-signature headers for it.
- [Webhook payload example generator](https://resellerhq.com/tools/webhook-payload-example-generator.mdx): Pick one of our documented events and get a sample payload, plus the signed headers a delivery of it would carry, ready to send to a local receiver.
- [Idempotency key generator](https://resellerhq.com/tools/idempotency-key-generator.mdx): Make a UUID v4 for the Idempotency-Key header, with a ready curl line and our own retry rules explained next to it.
- [API request builder](https://resellerhq.com/tools/api-request-builder.mdx): Pick one of our documented operations and get a ready curl, Python or Node snippet, with the real base URL and an Idempotency-Key where the operation spends money.
- [Postman collection generator](https://resellerhq.com/tools/postman-collection-generator.mdx): Get a full Postman Collection v2.1 JSON for our API, with the real base URL and a bearer-auth placeholder already set - paste it straight into Postman.
- [API error code explainer](https://resellerhq.com/tools/api-error-code-explainer.mdx): Type one of our documented error codes, a bare status, or paste a whole response body, and get the exact status, message, meaning and what to change in the request.
- [ULID / request id decoder](https://resellerhq.com/tools/ulid-request-id-decoder.mdx): Split one of our own prefixed ids, or a bare ULID, and read the exact UTC time it was minted - and say plainly when a prefix is not one of ours.
- [Invoice maker](https://resellerhq.com/tools/invoice-maker.mdx): Build a real invoice PDF, right in your browser - no watermark, no limit, nothing uploaded.
- [Quote / proforma builder](https://resellerhq.com/tools/quote-proforma-builder.mdx): Build a real quote PDF with a validity date, right in your browser, then convert it to an invoice in one click.
- [Credit note maker](https://resellerhq.com/tools/credit-note-maker.mdx): Build a real credit note PDF that states plainly which invoice it reduces - right in your browser.
- [EU VAT number checker](https://resellerhq.com/tools/eu-vat-number-checker.mdx): Check an EU VAT number against VIES itself, and see the registered trader name.
- [Reverse charge VAT helper](https://resellerhq.com/tools/reverse-charge-vat-helper.mdx): See whether to charge VAT or write “reverse charge,” checking the buyer’s VAT number live against VIES.
- [Price list builder](https://resellerhq.com/tools/price-list-builder.mdx): Apply one markup policy to a whole list of SKUs at once, and get a price list to copy or download.
- [Dunning schedule planner](https://resellerhq.com/tools/dunning-schedule-planner.mdx): Turn one overdue invoice into the four reminder dates and reminder text to send for it.
- [VAT calculator](https://resellerhq.com/tools/vat-calculator.mdx): Add, remove or work out VAT using whatever rate you type - confirmed against the official source, not a table baked into this page.

## Docs
Every page below is Markdown. All of them in one file: https://resellerhq.com/llms-full.txt

- [Activity log](https://resellerhq.com/docs/activity.mdx): Every change made in your account, with who made it, when, and from where - in the dashboard and over the API.
- [For coding agents](https://resellerhq.com/docs/agents.mdx): Machine-readable descriptions of ResellerHQ, and a prompt to hand to a coding agent.
- [Authentication](https://resellerhq.com/docs/authentication.mdx): Authenticate with a bearer API key. The key also decides whether you reach the sandbox or the live side.
- [Use ResellerHQ in ChatGPT or Codex](https://resellerhq.com/docs/chatgpt.mdx): Once ResellerHQ is listed in OpenAI's app directory, connect it with one sign-in and ask ChatGPT or Codex about your wallet, domains, numbers, customers and invoices - never to buy, register, renew or top anything up.
- [Customer pricing](https://resellerhq.com/docs/customer-pricing.mdx): Price lists set what each of your customers pays on top of the wholesale price, with volume tiers, contract prices for one customer, prices fixed on single items, and lists in other currencies.
- [DNS](https://resellerhq.com/docs/dns.mdx): Host a domain's DNS with us: turn the zone on, keep its records, and know how long a change takes to be seen.
- [Domains](https://resellerhq.com/docs/domains.mdx): Search a name across every ending on offer, register it, renew it, and see it through to the end of its life.
- [Errors](https://resellerhq.com/docs/errors.mdx): The shape of an error response, and what each status code means.
- [Idempotency](https://resellerhq.com/docs/idempotency.mdx): Send an Idempotency-Key so a retried request can never buy twice.
- [Introduction](https://resellerhq.com/docs.mdx): What ResellerHQ is, what you can resell through it, and where to start.
- [Invoicing](https://resellerhq.com/docs/invoicing.mdx): Bill a customer for sales you have already made, discount an invoice before it is issued, correct one already sent with a void or a credit note, and record payments, refunds and statements against their balance.
- [Mailbox licences (retired)](https://resellerhq.com/docs/mailbox-licences.mdx): Licences are no longer sold. What still works for a licence you already hold.
- [Mailboxes](https://resellerhq.com/docs/mailboxes.mdx): Order Google mailboxes on a domain in one call, and sign in with OAuth or an app password.
- [Use ResellerHQ from your AI assistant](https://resellerhq.com/docs/mcp.mdx): Connect Claude, Cursor or another MCP client to your account with an API key, and ask it to read your wallet, customers, domains, numbers, mailboxes and sales - or, with a buying key, to order and invoice with a confirmation step in front of every purchase.
- [Phone numbers](https://resellerhq.com/docs/numbers.mdx): Rent private numbers that receive SMS, read their messages, and renew or cancel them.
- [Quickstart](https://resellerhq.com/docs/quickstart.mdx): Create a sandbox key, add test funds, order a phone number and read its first message.
- [Sandbox and live](https://resellerhq.com/docs/sandbox-and-live.mdx): Every account has a sandbox and a live side. They have separate wallets, data and API keys.
- [Signing in](https://resellerhq.com/docs/signing-in.mdx): A password, a provider or a passkey - and what a passkey is if you have never used one.
- [Team and roles](https://resellerhq.com/docs/team.mdx): Invite colleagues with their own logins, each with a role that controls what they can do.
- [Wallet](https://resellerhq.com/docs/wallet.mdx): The prepaid wallet reserves money for an order, charges for what is delivered, and returns the rest.
- [Webhooks](https://resellerhq.com/docs/webhooks.mdx): Receive signed events on your own endpoint, following the Standard Webhooks specification.
- [API reference](https://resellerhq.com/docs/api.mdx): Every route of the ResellerHQ REST API, with its parameters, responses and errors.
- [Get the account](https://resellerhq.com/docs/api/account/get-account.mdx): The account this API key belongs to, with its environment, the product lines it can order and its wallet.
- [Update billing details](https://resellerhq.com/docs/api/account/update-account-billing.mdx): How your account is identified on invoices, and the defaults a new invoice falls back to when `dueInDays`, `taxBps` or `note` is not given. Send only what changes; `null` clears a field. Live and sandbox keep their own.
- [Update the customer portal](https://resellerhq.com/docs/api/account/customer-portal/update-account-portal.mdx): How your customer portal and storefront look, and what your customers may do there. Send only what changes; `null` clears a field, putting it back on its default - your account name for `brandName`, your billing email for `supportEmail`, on for `enabled`, off for `selfSignup`, read-only for `allow`. Live and sandbox keep their own, so you can brand your sandbox and look at it first.
- [Update the customer portal draft](https://resellerhq.com/docs/api/account/customer-portal/update-account-portal-draft.mdx): The customer-portal builder’s own draft (design §4): every field `PATCH /account/portal` accepts, plus the builder’s own appearance, content and access fields. Written only here, never to your live portal - `POST /account/portal/publish` copies it across when you are ready. Send only what changes; `null` clears a field, putting it back on its default. Live and sandbox keep their own draft, same as the live portal.
- [Publish the customer portal draft](https://resellerhq.com/docs/api/account/customer-portal/publish-account-portal.mdx): Copies the customer-portal builder’s draft onto your live portal, whole: every field the draft holds, including the ones it holds at their default, replaces the matching field on the live document. Customers see the result at once. Live and sandbox publish their own draft, independently.
- [Discard the customer portal draft](https://resellerhq.com/docs/api/account/customer-portal/discard-account-portal.mdx): Overwrites the customer-portal builder’s draft with your live portal’s own values, exactly - restoring the last published state. Your live portal is untouched either way.
- [Upload a customer portal logo](https://resellerhq.com/docs/api/account/customer-portal/upload-account-portal-logo.mdx): Stores an uploaded PNG, JPEG or WebP logo (at most 256 KB) and writes its own address onto the customer-portal builder’s draft `logoUrl` field (`logoDarkUrl` with `variant: "dark"`), seeding the rest of the draft from your live portal the first time it is ever written, same as `PATCH /account/portal/draft`. Paste a URL instead through that route for an SVG logo - there is no sanitizer here for one. `POST /account/portal/publish` copies the result onto your live portal, same as any other draft field.
- [Ask for a product line](https://resellerhq.com/docs/api/account/request-product.mdx): Asks for a product line (`numbers`, `domains` or `licences`) to be switched on for this account. Product lines are turned on by the platform; this records the ask, with when it was made, for the team to act on. Asking again keeps the first date. Refused with `product_already_on` for a line the account can already order.
- [Bring sandbox setup to live](https://resellerhq.com/docs/api/account/copy-sandbox-setup.mdx): Copies what was set up while trying the account in the sandbox to live, for the parts asked for: `prices` (every price list, with its rules), `portal` (the customer portal’s branding and content, published and draft) and `business` (the details printed on invoices). Once, before live has sold anything; refused with `live_in_use` after. Never overwrites: a part live already has is left as it is, and the response says which parts were copied. Promotions, customers and which customer is on which list stay behind, as sandbox customers are not live ones.
- [Update domain-order settings](https://resellerhq.com/docs/api/account/update-account-domains.mdx): The registrant every order falls back to, absent a per-order one; `POST /domains` can still send its own for a single order, and is refused with `registrant_required` when there is neither. `null` clears it. Changing any field of a contact already stored drops the registrar's handle and validation for it; sending back the exact same contact keeps them. `privacyByDefault` adds WHOIS privacy to new registrations wherever the ending offers it. `autoRenewByDefault` turns auto-renew on for new registrations. `digestEnabled` turns the weekly expiry digest email off. Live and sandbox keep their own.
- [Update analytics settings](https://resellerhq.com/docs/api/account/update-account-analytics.mdx): Switches dashboard session replay off for this account, or back on. Has no effect on an account flagged `internal` in the admin panel, which never records whatever this is set to.
- [Get the tax rules](https://resellerhq.com/docs/api/account/tax/get-tax-rules.mdx): Your own tax rules (issue #341): the first rule whose country, region and business all match a customer decides what a new invoice bills them. Rules are tried in this order. Empty is a valid, intentional configuration: every invoice carries no tax until you add one.
- [Replace the tax rules](https://resellerhq.com/docs/api/account/tax/update-tax-rules.mdx): Replaces the whole list, in the order they are tried. There is no id to patch one rule by: send every rule you want to keep. Turns the tax rules engine on for new invoices from now on, ahead of the older `defaultTaxBps`, even when sent empty.
- [Apply a tax rules preset](https://resellerhq.com/docs/api/account/tax/apply-tax-preset.mdx): A one-click starting point for the tax rules engine (issue #341), built from your home country and home state or region (`PATCH /account/billing`); set those first. Replaces the whole rule list. A starting point, not tax advice: check it with whoever handles your tax before relying on it.
- [Re-prove a strong credential](https://resellerhq.com/docs/api/account/step-up.mdx): Confirms a sensitive action by password (and a code, if two-factor is on). A passkey instead re-asserts through `/api/auth/passkey/verify-authentication`. Either one starts a short grace window during which a gated action proceeds without being asked again.
- [List connected hostnames](https://resellerhq.com/docs/api/account/hostnames/list-account-hostnames.mdx): Every hostname this account has connected to its portal (issue #443).
- [Connect a hostname](https://resellerhq.com/docs/api/account/hostnames/create-account-hostname.mdx): Claims a hostname for this account. A `custom` hostname stays `pending` until its CNAME is confirmed (`POST .../:id/check`, or the worker checking in the background); a `subdomain` one is verified at once.
- [Disconnect a hostname](https://resellerhq.com/docs/api/account/hostnames/delete-account-hostname.mdx): Stops this hostname resolving to this account, at once.
- [Check a hostname now](https://resellerhq.com/docs/api/account/hostnames/check-account-hostname.mdx): Runs the CNAME check immediately, the same one the worker runs in the background, and reaches it even if repeated failure has parked it.
- [Get your branded nameserver set](https://resellerhq.com/docs/api/account/branded-nameservers/get-branded-nameservers.mdx): Your one branded nameserver set (#344), or null if you have none yet.
- [Create your branded nameserver set](https://resellerhq.com/docs/api/account/branded-nameservers/create-branded-nameservers.mdx): 2 to 4 hostnames under a domain you hold with us, each given a host record and checked at once, so a correctly-pointed set comes back already ready rather than making you poll. Refused while you already have a set: remove it first.
- [Remove your branded nameserver set](https://resellerhq.com/docs/api/account/branded-nameservers/delete-branded-nameservers.mdx): Puts every domain still pointed at these names back on the default nameservers, deletes each host record at the registrar, and removes the set.
- [Check your branded nameserver set](https://resellerhq.com/docs/api/account/branded-nameservers/check-branded-nameservers.mdx): Checks that each name still resolves, from outside, to the addresses its host record was given, and updates its status accordingly.
- [Get the account overview](https://resellerhq.com/docs/api/account/get-overview.mdx): What you hold, what needs you and what renews by itself over the next 30 days, counted across every page. Each part your role cannot see comes back empty.
- [Get the balance](https://resellerhq.com/docs/api/wallet/get-wallet.mdx): What you can spend now, and what is reserved for orders in progress.
- [List transactions](https://resellerhq.com/docs/api/wallet/list-wallet-transactions.mdx): Every movement of the wallet, newest first.
- [Start a card top-up](https://resellerhq.com/docs/api/wallet/create-wallet-top-up.mdx): Opens a Stripe Checkout session for adding funds by card. The wallet is credited once Stripe confirms the payment - from the webhook, never from this response.
- [List customers](https://resellerhq.com/docs/api/customers/list-customers.mdx)
- [Create a customer](https://resellerhq.com/docs/api/customers/create-customer.mdx): A customer is someone you sell to. Pass its id when ordering to keep track of who has what.
- [Get a customer](https://resellerhq.com/docs/api/customers/get-customer.mdx)
- [Update a customer](https://resellerhq.com/docs/api/customers/update-customer.mdx): Changes the name, your reference, the price list, the billing address, the tax number or the registrant. Send only what changes. `registrant` falls back ahead of your account default on a domain ordered for this customer with no contact of its own; `null` clears it. Changing any field of a registrant already stored drops the registrar's handle and validation for it; sending back the exact same contact keeps them. Changing `taxId` itself clears `taxIdCheck` and `taxIdTrusted`: a check and a trust decision belong to the number that was checked, not to whatever replaces it.
- [Validate a tax number](https://resellerhq.com/docs/api/customers/validate-customer-tax-id.mdx): Checks this customer's `taxId` against the EU Commission's VIES service and stores the result with its date. VIES being unreachable is not a failure of the customer: the answer is `valid: null`, "could not be checked", the number is kept, and `taxIdTrusted` on `PATCH /customers/:id` is how you choose to treat it as valid anyway.
- [List activity](https://resellerhq.com/docs/api/activity/list-activity.mdx): Every change made inside your account: who did it, what they did, to what, when and from where. Newest first. Kept for 13 months and then removed. Readable with a dashboard session only: these records name your colleagues, so no API key reaches this route, whatever its level.
- [List ordering options](https://resellerhq.com/docs/api/numbers/get-number-options.mdx): The countries, products and durations this account can order.
- [List offers](https://resellerhq.com/docs/api/numbers/list-number-offers.mdx): Your price for each duration, for a country and product. For `single_service` there is one offer per service. With `customerId`, each price also says what that customer pays, promotions counted. A coupon that cannot be used is simply not applied here.
- [List orders](https://resellerhq.com/docs/api/numbers/list-number-orders.mdx): Orders with their numbers, newest first.
- [Create an order](https://resellerhq.com/docs/api/numbers/create-number-order.mdx): Charges your wallet and returns the order with its numbers. Send an Idempotency-Key header so a retry can never buy twice. Check `status`: an order can be `failed` (nothing charged) or still `provisioning` when this returns. A `coupon` is checked before anything is bought, so an order it cannot be used on is refused with nothing charged, unless you send `couponOptional`.
- [Get an order](https://resellerhq.com/docs/api/numbers/get-number-order.mdx)
- [List numbers](https://resellerhq.com/docs/api/numbers/list-numbers.mdx): The numbers you hold or have held, newest first.
- [Get a number](https://resellerhq.com/docs/api/numbers/get-number.mdx)
- [Update a number](https://resellerhq.com/docs/api/numbers/update-number.mdx): Change the nickname, the renewal settings or the price fixed for the customer. Fields you leave out stay as they are.
- [Renew a number](https://resellerhq.com/docs/api/numbers/renew-number.mdx): Adds time to the end of the rental and charges your wallet.
- [Cancel a number](https://resellerhq.com/docs/api/numbers/cancel-number.mdx): Only possible before the number has received a message, and not before `cancellableFrom` while the provider still holds a new number (5 minutes for most).
- [List messages](https://resellerhq.com/docs/api/numbers/list-number-messages.mdx): The SMS a number has received, newest first.
- [Search for a domain](https://resellerhq.com/docs/api/domains/search-domains.mdx): Checks one name across every ending on offer, with your price for each. With `customerId`, each also says what that customer pays, promotions counted. A premium name is left out until it can be priced properly, and one the registrar could not check comes back `unknown`.
- [Check domains](https://resellerhq.com/docs/api/domains/check-domains.mdx): For buying several at once. A name that is malformed or whose ending is not on offer comes back unavailable, with a null price, as does a premium name or one the registrar could not check.
- [List domains](https://resellerhq.com/docs/api/domains/list-domains.mdx): The domains you have registered, newest first.
- [Register a domain](https://resellerhq.com/docs/api/domains/register-domain.mdx): Charges your wallet for the years asked for, plus WHOIS privacy for those years when it is on. Send an Idempotency-Key header so a retry can never register twice. The registrar can answer `pending`: the domain comes back with `status: "pending"` and the charge stays held until it finishes. A `coupon` is checked before the registrar is asked, so an order it cannot be used on is refused with nothing registered, unless you send `couponOptional`.
- [Forecast upcoming auto-renewals](https://resellerhq.com/docs/api/domains/get-domain-renewal-forecast.mdx): What auto-renew will charge your wallet over the next 30 days: every domain with it on, due to renew inside that window, added up.
- [Get a domain](https://resellerhq.com/docs/api/domains/get-domain.mdx)
- [Update a domain, charging for privacy turned on](https://resellerhq.com/docs/api/domains/update-domain.mdx): Changes the nameservers, the contacts, the transfer lock, the registrar hold, WHOIS privacy or the price fixed for the customer. Send only the fields you want to change. Only privacy costs anything: turning it on charges your wallet for the whole years left in the current term, and turning it off refunds nothing. Answers `202` instead of `200` when the registrar accepted the change but has not finished it yet; the body is the domain as it stands now, before that change lands.
- [Delete a domain](https://resellerhq.com/docs/api/domains/delete-domain.mdx): Gives the registration up at the registrar. The name stops being yours and goes back to the registry; it cannot be undone from here. Inside the registry's add grace period the registration charge alone is credited back to your wallet - not WHOIS privacy, and never a renewal; quote it first with `GET /v1/domains/{id}/delete-quote`. The domain stays on your account as a record, with `status: "deleted"`.
- [Renew a domain](https://resellerhq.com/docs/api/domains/renew-domain.mdx): Adds years to the end of the registration and charges your wallet, including WHOIS privacy for those years while it is on. A promotion only reaches a renewal when it is set to; an introductory offer the domain was first bought on does not.
- [Get a transfer code](https://resellerhq.com/docs/api/domains/create-domain-auth-code.mdx): Generates a fresh transfer (auth) code and shows it once: we never store it, and it never appears in a list or a webhook. The domain must have its transfer lock off first; this never turns it off for you. A new code replaces the old one.
- [Resend the registrant validation email](https://resellerhq.com/docs/api/domains/resend-domain-validation.mdx): For a domain stuck in `pending_validation`: asks the registrar to send the registrant another copy of the validation email. Only the registrant's own link in that email can clear the hold; this never changes the domain itself.
- [List domain transfers](https://resellerhq.com/docs/api/domains/domain-transfers/list-domain-transfers.mdx): Transfers in you have started, newest first.
- [Transfer a domain in](https://resellerhq.com/docs/api/domains/domain-transfers/transfer-domain.mdx): Starts a transfer in from another registrar: holds the transfer price for this ending and answers 202 with a transfer whose status you poll. A wrong auth code is never known this early - only the losing registrar or the registrant finds that out, which can take days - so it never fails this call; it only ever shows up later as this transfer ending `rejected`. Send an Idempotency-Key header so a retry can never start a second one.
- [Cancel a domain transfer](https://resellerhq.com/docs/api/domains/domain-transfers/cancel-domain-transfer.mdx): Cancels a transfer that is still pending and gives the hold back in full.
- [Quote a restore](https://resellerhq.com/docs/api/domains/quote-domain-restore.mdx): What bringing this domain back out of redemption would cost you. A restore costs many times a renewal and the registry usually charges a year with it, so read this before committing. Only a domain in `redemption` can be quoted.
- [Restore a domain](https://resellerhq.com/docs/api/domains/restore-domain.mdx): Brings a domain in redemption back and charges your wallet the restore price, including the year the registry charges with it. Quote it first with `GET /v1/domains/{id}/restore-quote`. The domain comes back `active` with its new expiry date.
- [Quote a delete](https://resellerhq.com/docs/api/domains/quote-domain-delete.mdx): What deleting this domain now would give back. The window is the registry's own add grace period, read from the registrar and measured from the registration: inside it the registration charge alone comes back, and outside it nothing does. WHOIS privacy is not refunded, and neither is any renewal since.
- [List a domain's hosts](https://resellerhq.com/docs/api/domains/child-nameservers/list-domain-hosts.mdx): The child nameservers (glue records) registered at the registrar under this domain, such as ns1.acme.com for acme.com, each with the addresses it answers on. Hosts live at the registrar, not on this record, so this always reads them fresh.
- [Register a child nameserver](https://resellerhq.com/docs/api/domains/child-nameservers/create-domain-host.mdx): Registers a host (glue record) at the registrar, such as ns1.acme.com for acme.com, with the addresses it answers on. The host must be a hostname under this exact domain.
- [Change a host's addresses](https://resellerhq.com/docs/api/domains/child-nameservers/update-domain-host.mdx): Replaces a host's full address list at the registrar. There is no rename: to change the name itself, delete this host and create one under the new name.
- [Delete a host](https://resellerhq.com/docs/api/domains/child-nameservers/delete-domain-host.mdx): Deletes a host (glue record) at the registrar. Refused while any of your domains - including this one - still lists it as a nameserver.
- [List a domain's history](https://resellerhq.com/docs/api/domains/list-domain-history.mdx): Everything that was done to this domain, newest first: what it was, when, and who asked for it. The same events a webhook carries, read back per domain - one row per thing done, so putting a domain on hold reads as the hold itself rather than also as a settings change.
- [Turn hosted DNS, or DNSSEC on a hosted zone, on or off](https://resellerhq.com/docs/api/dns/set-domain-dns.mdx): Hosts this domain's DNS with us, or hands it back. Turning it on creates the zone at the registrar and points the domain at the registrar's DNS nameservers, keeping the ones it had so turning it off can put them back. Turning it off puts the domain on the nameservers you send, or the ones it had before hosting, or the registrar's own - and gives the zone up: the records stored here go with it, and so does any DNSSEC signing. Hosted DNS is included with the domain and costs nothing. Asking for the state it is already in changes nothing. `dnssec` signs or unsigns a zone already hosted with us: we manage the keys and any rollover, and only on or off is ever asked for. Give `hosted`, `dnssec`, or both.
- [Set the DNSSEC keys for a domain hosted elsewhere](https://resellerhq.com/docs/api/dns/set-domain-dnssec-keys.mdx): Sends the DNSSEC keys your own DNS provider generated, so the registry can add the matching DS record. An empty list removes every key and, with it, every DS record the registry holds - the only way one is ever removed. Refused when this domain's DNS is hosted with us: turn signing on or off with `PUT /v1/domains/{id}/dns` instead, since we manage those keys.
- [List a zone's records](https://resellerhq.com/docs/api/dns/list-domain-dns-records.mdx): Every record in the zone we host for this domain, each with an id you can change or delete it by. Hosted DNS has to be on first.
- [Add a record](https://resellerhq.com/docs/api/dns/create-domain-dns-record.mdx): Adds one record to the zone. The record is checked here before the registrar sees any of it: a CNAME at the root or beside another record with the same name, a missing MX priority and a malformed address are each refused with a message naming the record, and nothing is sent upstream.
- [Replace every record](https://resellerhq.com/docs/api/dns/replace-domain-dns-records.mdx): Swaps the whole record set in one call, for keeping DNS in a system of your own. At most 200 records. Every record is checked first, so one bad record leaves the zone exactly as it was. The ids are new: these are new records, not edits of the ones they replace.
- [Change a record](https://resellerhq.com/docs/api/dns/update-domain-dns-record.mdx): Changes one record. Send only the fields you want to change. Changing the type to one that has no priority drops the priority with it.
- [Delete a record](https://resellerhq.com/docs/api/dns/delete-domain-dns-record.mdx): Removes one record from the zone. The rest of the zone is sent to the registrar as it now stands, because a zone is replaced whole.
- [Set URL forwarding](https://resellerhq.com/docs/api/dns/set-domain-forwarding.mdx): Redirects the root, and any named subdomains, to a destination URL - a permanent (301) redirect, the only kind the registrar behind hosted DNS does. Replaces only the records this made before: anything you added by hand is untouched. An empty list removes forwarding. Hosted DNS has to be on first.
- [Set email forwarding](https://resellerhq.com/docs/api/dns/set-domain-email-forwarding.mdx): Forwards mail for a named address, or the catch-all, to another address. Replaces only the records this made before: anything you added by hand is untouched. An empty list removes forwarding. Hosted DNS has to be on first.
- [Get the mailbox price](https://resellerhq.com/docs/api/mailboxes/get-mailbox-price.mdx): What one Google mailbox costs you per month today. A domain keeps the price it was connected at. Each domain takes up to 10 mailboxes.
- [List mailboxes](https://resellerhq.com/docs/api/mailboxes/list-mailboxes.mdx): Your mailboxes, newest first. Sign-in details are only on the credentials route.
- [Order mailboxes](https://resellerhq.com/docs/api/mailboxes/create-mailboxes.mdx): Orders Google mailboxes on a domain, by its name or id: the one call you need. A domain you bought here needs nothing else: we point its nameservers ourselves, keep its existing records (website, verifications), and the mailboxes are set up as soon as it is ready (`nameserversManaged: true`). For a domain registered elsewhere, set the `nameservers` in `mailboxDomain` at its registrar; the mailboxes wait, paid for, and are set up once it points there. A domain nobody has registered is checked with the registrar first: send `buy: true` to register it (a year, to the registrant on the customer or your account default) before its mailboxes are ordered, or leave it off and get `domain_not_registered`, with nothing held or charged. A premium name is never bought here, whatever `buy` says (`premium_domain`). Order more later the same way, up to 10 per domain. Each month is held from your wallet now (checked first, so a short balance changes nothing) and only taken once that mailbox is set up. Send an Idempotency-Key header so a retry never orders twice.
- [Check domains for mailboxes](https://resellerhq.com/docs/api/mailboxes/mailbox-domains/check-mailbox-domains.mdx): Before ordering on several domains at once: whether each is connected here already (and how many more mailboxes it takes), held here, free to buy (and at what price), registered elsewhere, or cannot have mailboxes, such as one already used with Google Workspace elsewhere. `registrant` says whether a domain bought with the order has someone to be registered to.
- [List mailbox domains](https://resellerhq.com/docs/api/mailboxes/mailbox-domains/list-mailbox-domains.mdx): Your connected domains, newest first.
- [Connect a domain](https://resellerhq.com/docs/api/mailboxes/mailbox-domains/connect-mailbox-domain.mdx): Connects a domain without ordering anything, for when you want its nameservers before you buy: most often a domain registered elsewhere, so they can be set at its registrar ahead of time. Not needed otherwise: ordering mailboxes connects the domain by itself. Free.
- [Get a mailbox domain](https://resellerhq.com/docs/api/mailboxes/mailbox-domains/get-mailbox-domain.mdx)
- [Update a mailbox domain](https://resellerhq.com/docs/api/mailboxes/mailbox-domains/update-mailbox-domain.mdx): Fixes what the customer pays per mailbox on this domain.
- [Delete a mailbox domain](https://resellerhq.com/docs/api/mailboxes/mailbox-domains/delete-mailbox-domain.mdx): Deletes the domain and every mailbox on it, for good: they stop renewing and are removed from Google. A mailbox cannot be deleted on its own. Nothing already paid is refunded; money held for mailboxes not yet set up goes back to your wallet. A domain held here keeps its nameservers: change them on the domain afterwards.
- [Regenerate nameservers](https://resellerhq.com/docs/api/mailboxes/mailbox-domains/regenerate-mailbox-domain-nameservers.mdx): A fresh set of nameservers for a domain that is `failed` or still waiting. Set the new ones at the registrar (a domain held here is changed for you).
- [Add mailboxes to a domain](https://resellerhq.com/docs/api/mailboxes/mailbox-domains/order-mailboxes.mdx): Orders mailboxes on a connected domain by its id: the same as `POST /v1/mailboxes` naming the domain. The first ones or more later, up to 10 in all. Each month is held from your wallet now and only taken once that mailbox is set up, so one that fails costs nothing. The first mailbox on a domain administers its Google account. Follow `mailbox.active` or poll each mailbox; then read its sign-in details from the credentials route. Send an Idempotency-Key header so a retry never orders twice.
- [Order mailboxes on several domains](https://resellerhq.com/docs/api/mailboxes/create-mailboxes-bulk.mdx): Orders mailboxes on up to 50 domains in one call, buying the ones sent with `buy: true` first (for a year, to the customer's registrant or your default one). The wallet is checked for everything up front, so a short balance changes nothing. Each domain then succeeds or fails on its own: `results` says which, and a failed one can be sent again alone. A domain still being registered comes back `awaiting_domain`, its mailboxes paid for and set up once the registration finishes. Send an Idempotency-Key header so a retry never orders twice.
- [Get a mailbox](https://resellerhq.com/docs/api/mailboxes/get-mailbox.mdx)
- [Update a mailbox](https://resellerhq.com/docs/api/mailboxes/update-mailbox.mdx): Changes the name, username (and so the address), profile picture or password of a set-up mailbox.
- [Upload a mailbox profile photo](https://resellerhq.com/docs/api/mailboxes/upload-mailbox-picture.mdx): Sets the Google profile photo of a set-up mailbox from an uploaded PNG, JPEG, WebP or GIF (at most 1 MB): the photo people see beside its mail. To use an image already online, send its address as `profilePictureUrl` to `PATCH /mailboxes/:id`.
- [Reveal sign-in details](https://resellerhq.com/docs/api/mailboxes/reveal-mailbox-credentials.mdx): The mailbox's password, app password and two-step verification secret, with the Gmail IMAP and SMTP settings. Each reveal is recorded in your activity log. Two ways to connect: sign in through OAuth with a client ID granted on the domain, or use the app password over IMAP/SMTP.
- [Get a sign-in code](https://resellerhq.com/docs/api/mailboxes/get-mailbox-totp.mdx): The mailbox's current two-step verification code.
- [List DNS records](https://resellerhq.com/docs/api/mailboxes/mailbox-dns/list-mailbox-domain-dns-records.mdx): The domain's DNS, hosted alongside its mailboxes. Records mail depends on are marked `protected` and cannot be changed here.
- [Add DNS records](https://resellerhq.com/docs/api/mailboxes/mailbox-dns/add-mailbox-domain-dns-records.mdx)
- [Update a DNS record](https://resellerhq.com/docs/api/mailboxes/mailbox-dns/update-mailbox-domain-dns-record.mdx)
- [Delete a DNS record](https://resellerhq.com/docs/api/mailboxes/mailbox-dns/delete-mailbox-domain-dns-record.mdx)
- [Check mail DNS](https://resellerhq.com/docs/api/mailboxes/mailbox-dns/check-mailbox-domain-dns.mdx): Whether every record the mailboxes need is in place.
- [Repair mail DNS](https://resellerhq.com/docs/api/mailboxes/mailbox-dns/repair-mailbox-domain-dns.mdx): Puts back any mail record that is missing or wrong, then checks again.
- [Set website forwarding](https://resellerhq.com/docs/api/mailboxes/mailbox-domain-settings/set-mailbox-domain-forwarding.mdx): Redirects the domain's website to a URL. `url: null` removes the redirect.
- [Remove DMARC](https://resellerhq.com/docs/api/mailboxes/mailbox-domain-settings/remove-mailbox-domain-dmarc.mdx)
- [Set DMARC](https://resellerhq.com/docs/api/mailboxes/mailbox-domain-settings/set-mailbox-domain-dmarc.mdx): Sets the domain's DMARC policy. `DELETE` removes it.
- [List OAuth client IDs](https://resellerhq.com/docs/api/mailboxes/mailbox-domain-settings/list-mailbox-domain-client-ids.mdx)
- [Grant an OAuth client ID](https://resellerhq.com/docs/api/mailboxes/mailbox-domain-settings/grant-mailbox-domain-client-id.mdx): Trusts your app's Google OAuth client on the domain's Google account, so its mailboxes can sign in to it. `delegated: true` grants domain-wide delegation for `scopes` instead, so the app can act as any mailbox on the domain without each one signing in. Needs the domain’s admin mailbox set up. We follow the request and send `client_id.completed` or `client_id.failed`.
- [List purchases](https://resellerhq.com/docs/api/orders/list-orders.mdx): Everything bought across products, newest first: each number order, each domain registered and each block of mailbox licences.
- [List wholesale price drops](https://resellerhq.com/docs/api/pricing/list-catalogue-drops.mdx): Domain endings whose upstream wholesale cost is currently lower than usual, for a window the registrar itself named (issue #1023's suggestion): one row per ending, gone once the window ends or the price goes back up. Shared across every account on this installation, since the wholesale price is the registrar's, not any one reseller's. Never changes what a customer is charged; create a promotion of your own to pass a drop on.
- [List price lists](https://resellerhq.com/docs/api/pricing/price-lists/list-price-lists.mdx): What you charge your customers. Your wallet is always charged the wholesale price; a price list sets what each customer pays you.
- [Create a price list](https://resellerhq.com/docs/api/pricing/price-lists/create-price-list.mdx): Your first list becomes the default for every customer.
- [Get a price list](https://resellerhq.com/docs/api/pricing/price-lists/get-price-list.mdx)
- [Update a price list](https://resellerhq.com/docs/api/pricing/price-lists/update-price-list.mdx): Send only what changes. `rules` replaces the whole set. New prices apply to purchases and renewals from now on; sales already recorded keep the price they were made at. A change sends a `price_list.updated` event naming the settings that moved and the customers on the list.
- [Delete a price list](https://resellerhq.com/docs/api/pricing/price-lists/delete-price-list.mdx): Customers on it go back to the default list.
- [Preview a price change](https://resellerhq.com/docs/api/pricing/price-lists/preview-price-list-change.mdx): Takes the changes you are thinking of making to a list and saves nothing. Says how many customers are on the list and, for up to 50 of the domains, licences and numbers they hold, what one unit of the next renewal costs them now and what it would cost after the change.
- [Quote customer prices](https://resellerhq.com/docs/api/pricing/price-lists/quote-prices.mdx): Works out what a customer, or anyone on a list, pays for items at the wholesale prices given. Nothing is bought. With neither a customer nor a list, the default list. A customer's contract prices count; prices fixed on single items do not, since no item is named. A promotion everyone on the list gets is counted without asking; send `coupon` to see what the promotion behind a code would do. A coupon that cannot be used is simply not applied.
- [List contract prices](https://resellerhq.com/docs/api/pricing/contract-prices/list-contract-rules.mdx): The prices agreed with one customer alone. A contract rule that fits a purchase and is in date beats everything on the customer's price list.
- [Replace contract prices](https://resellerhq.com/docs/api/pricing/contract-prices/replace-contract-rules.mdx): Replaces the whole set; send an empty list to clear it. Rules have the same shape as price list rules, with optional dates. `add` and `fixed` values are in the currency of the customer's list. Two rules for the same items and tier must not be in date at the same time.
- [List sales](https://resellerhq.com/docs/api/pricing/sales/list-sales.mdx): Every purchase and renewal made for a customer, newest first, with what it cost you and what the customer pays at the prices in force at the time.
- [Summarise sales](https://resellerhq.com/docs/api/pricing/sales/summarise-sales.mdx): Totals for the sales the filters cover: one customer, one product, one list, a stretch of time, or everything. With `groupBy`, the same totals split one way as well, each group summing to the ungrouped total. Always in US cents, whatever currency each sale was charged in, and net of credit notes issued against those sales.
- [List promotions](https://resellerhq.com/docs/api/pricing/promotions/list-promotions.mdx): Every offer you have run, newest first. An account holds at most 200 of them, so they all come back at once.
- [Create a promotion](https://resellerhq.com/docs/api/pricing/promotions/create-promotion.mdx): A price for the dates it runs, on one list or on every list. With no `code` everyone on the list gets it; with one, only an order that sends that coupon. It changes what the customer is charged and nothing else: your wallet is still charged wholesale. An offer that would have to sell under what you pay is refused unless you set `allowBelowCost`; `POST /v1/promotions/impact` shows the margin either way first.
- [Preview a promotion](https://resellerhq.com/docs/api/pricing/promotions/preview-promotion.mdx): Takes the offer you are thinking of running and saves nothing. Says how many customers are on its list, how many things they hold, and for a sample of those what one unit costs them now and what it would cost on the offer. `belowCost` counts the ones that would sell under what you pay: this route reports them rather than refusing the offer, since seeing the margin is the point of it.
- [Get a promotion](https://resellerhq.com/docs/api/pricing/promotions/get-promotion.mdx): One offer, with how many times it has been used and what it has taken off.
- [Update a promotion](https://resellerhq.com/docs/api/pricing/promotions/update-promotion.mdx): Send only what changes. Purchases already made keep the price they were made at, and the uses already claimed stay claimed.
- [Delete a promotion](https://resellerhq.com/docs/api/pricing/promotions/delete-promotion.mdx): Stops the offer and frees its coupon code. Sales made on it keep the price they were made at. To end an offer early without losing the record of it, move its `endsAt` instead.
- [List invoices](https://resellerhq.com/docs/api/invoices/list-invoices.mdx): Newest first.
- [Create an invoice](https://resellerhq.com/docs/api/invoices/create-invoice.mdx): Bills a customer for sales not yet on an invoice: every one of them, or the ones you name. Each line is a copy of a sale at the price it was made at. An invoice is in one currency and holds at most 500 sales, oldest first. ResellerHQ does not collect payment from your customers: you take the money however you already do, and record it here. Send an Idempotency-Key header so a retry can never invoice twice.
- [Summarise invoices](https://resellerhq.com/docs/api/invoices/summarise-invoices.mdx): What the business is owed, one row for each currency you have invoiced in, sorted by currency code. `open` is every invoice still open, overdue ones included; `overdue` is the part of it past its due date. Void invoices are not counted. An account that has never invoiced gets no rows. Every figure but the counts is net of the credit notes issued against those invoices.
- [Get an invoice](https://resellerhq.com/docs/api/invoices/get-invoice.mdx)
- [Mark an invoice paid](https://resellerhq.com/docs/api/invoices/pay-invoice.mdx): Records that the customer paid. Nothing is charged. ResellerHQ does not collect payment from your customers: you take the money however you already do, and record it here.
- [Void an invoice](https://resellerhq.com/docs/api/invoices/void-invoice.mdx): Withdraws an open invoice. Its number is not used again, and its sales can go on another invoice. A paid invoice cannot be voided, and neither can one that already carries a credit note: credit the rest of that one instead.
- [Share an invoice](https://resellerhq.com/docs/api/invoices/share-invoice.mdx): Creates a public, read-only link to this invoice that needs no API key: `GET /public/invoices/{token}`. Calling this again returns the same token, so the share button is safe to press twice. Works on an invoice in any status.
- [Revoke an invoice link](https://resellerhq.com/docs/api/invoices/revoke-invoice-share.mdx): The public link stops working at once. An invoice with no link also answers 204: there is nothing to revoke. Sharing again afterwards mints a different token; the old one stays dead for good.
- [List credit notes against an invoice](https://resellerhq.com/docs/api/invoices/credit-notes/list-invoice-credit-notes.mdx): Newest first, at most 200.
- [Issue a credit note](https://resellerhq.com/docs/api/invoices/credit-notes/create-credit-note.mdx): Corrects an invoice already issued, by named lines or by a flat amount, instead of editing it: an invoice is never rewritten once sent. A fully credited open invoice moves to `credited`; a paid invoice stays `paid`. Send an Idempotency-Key header so a retry can never credit twice.
- [See what is left to credit on an invoice](https://resellerhq.com/docs/api/invoices/credit-notes/get-invoice-creditable.mdx): What is left uncredited on this invoice, line by line and in total. A void invoice answers with everything at zero.
- [List credit notes](https://resellerhq.com/docs/api/invoices/credit-notes/list-credit-notes.mdx): Newest first.
- [Get a credit note](https://resellerhq.com/docs/api/invoices/credit-notes/get-credit-note.mdx)
- [Share a credit note](https://resellerhq.com/docs/api/invoices/credit-notes/share-credit-note.mdx): Creates a public, read-only link to this credit note that needs no API key: `GET /public/credit-notes/{token}`. Calling this again returns the same token, so the share button is safe to press twice.
- [Revoke a credit note link](https://resellerhq.com/docs/api/invoices/credit-notes/revoke-credit-note-share.mdx): The public link stops working at once. A credit note with no link also answers 204: there is nothing to revoke. Sharing again afterwards mints a different token; the old one stays dead for good.
- [Get a customer's balance](https://resellerhq.com/docs/api/invoices/payments/get-customer-balance.mdx): What a customer owes you and has paid, with one row for each currency they have been sold in. A customer with no sales has no rows. Every invoiced figure is net of the credit notes issued against those invoices.
- [List a customer's payments](https://resellerhq.com/docs/api/invoices/payments/list-customer-payments.mdx): Newest first.
- [Record a payment](https://resellerhq.com/docs/api/invoices/payments/record-payment.mdx): Records money received from this customer. Applied to the invoices you name, each for the amount you give it, in that order, or else to their oldest open invoices in the same currency, each in full. Anything left over stays as credit on the customer's account. ResellerHQ does not collect payment from your customers: you take the money however you already do, and record it here. Send an Idempotency-Key header so a retry can never record the payment twice.
- [Get a payment](https://resellerhq.com/docs/api/invoices/payments/get-payment.mdx)
- [Share a payment receipt](https://resellerhq.com/docs/api/invoices/payments/share-payment.mdx): Creates a public, read-only receipt link for this payment that needs no API key: `GET /public/payments/{token}`. Calling this again returns the same token, so the share button is safe to press twice.
- [Revoke a payment receipt link](https://resellerhq.com/docs/api/invoices/payments/revoke-payment-share.mdx): The public receipt stops working at once. A payment with no link also answers 204: there is nothing to revoke.
- [List a customer's refunds](https://resellerhq.com/docs/api/invoices/payments/list-customer-refunds.mdx): Newest first.
- [Record a refund](https://resellerhq.com/docs/api/invoices/payments/record-refund.mdx): Records money handed back out of credit this customer holds with you. Refused when it is more than they have. ResellerHQ does not collect payment from your customers: you take the money however you already do, and record it here. Send an Idempotency-Key header so a retry can never record the refund twice.
- [Get a customer's statement](https://resellerhq.com/docs/api/invoices/payments/get-customer-statement.mdx): Opening balance, every invoice, credit note, payment and refund in the date range, and the closing balance: one row set for each currency this customer has been billed, paid or refunded in. `GET /customers/{id}/statement.csv` with the same query returns the same rows as CSV.
- [Get a customer's statement as CSV](https://resellerhq.com/docs/api/invoices/payments/get-customer-statement-csv.mdx): `GET /customers/{id}/statement`'s own rows, as `text/csv`.
- [Apply a customer's credit to an invoice](https://resellerhq.com/docs/api/invoices/apply-credit-to-invoice.mdx): Draws on the customer's unallocated payment credit, oldest payment first, to pay down this invoice as far as the credit in the invoice's own currency goes. Refused when the invoice is not open, or there is no credit in that currency.
- [Preview a billing run](https://resellerhq.com/docs/api/invoices/billing-runs/preview-billing-run.mdx): Computes, but does not create, one invoice per `(customerId, currency)` pair that has eligible, uninvoiced sales made at or before `asOf`: the same rules `POST /invoices` already enforces, applied to every customer at once, at most 500 sales per row, oldest first. Nothing is written to your sales or invoices; nothing bills a customer until a run is committed. One run holds at most 1000 rows: with more customers waiting than that, `truncated` is true and the rest come up in your next run.
- [Get a billing run](https://resellerhq.com/docs/api/invoices/billing-runs/get-billing-run.mdx)
- [Commit a billing run](https://resellerhq.com/docs/api/invoices/billing-runs/commit-billing-run.mdx): Starts billing every `pending` row of a `previewed` run: raises the invoices, one per row, with the exact sales the preview fixed. Returns as soon as the run moves to `committing`; a background worker finishes it, so poll `GET /billing-runs/{id}` for progress. Calling this again on a `completed_with_failures` run retries only the rows still `failed`, leaving every `done`, `skipped` and `excluded` row untouched, so it is always safe to repeat.
- [Exclude a row from a billing run](https://resellerhq.com/docs/api/invoices/billing-runs/exclude-from-billing-run.mdx): Holds one `(customerId, currency)` row back from this run, so it is not billed on commit: this only works on a `previewed` run, and repeating it on a row already `excluded` is a no-op.
- [List endpoints](https://resellerhq.com/docs/api/webhooks/list-webhook-endpoints.mdx)
- [Create an endpoint](https://resellerhq.com/docs/api/webhooks/create-webhook-endpoint.mdx): Deliveries are signed per the Standard Webhooks specification. The signing secret is returned once, in this response.
- [Delete an endpoint](https://resellerhq.com/docs/api/webhooks/delete-webhook-endpoint.mdx): Deliveries to it stop at once.
- [List an endpoint's recent deliveries](https://resellerhq.com/docs/api/webhooks/list-webhook-deliveries.mdx): Newest first: what was sent, when, and how it went. A `failed` or `blocked` one can be sent again with `POST /webhook-deliveries/{id}/redeliver`.
- [Resend a delivery](https://resellerhq.com/docs/api/webhooks/redeliver-webhook-delivery.mdx): Queues a fresh delivery of the same event to the same endpoint, carrying the same event id so a receiver that de-dupes on it sees no difference from the original. Goes out right away, ahead of anything else queued for this endpoint and subject.
- [List API keys](https://resellerhq.com/docs/api/keys/list-api-keys.mdx): The active keys on this side of the account. The keys themselves are never returned.
- [Create an API key](https://resellerhq.com/docs/api/keys/create-api-key.mdx): The key itself is returned once, in this response, and cannot be read again.
- [Change an API key](https://resellerhq.com/docs/api/keys/update-api-key.mdx): Changes what this key may do, or its spending ceilings. Only the fields sent change; send `null` to clear a limit or to give the key back full, unlevelled access.
- [Revoke an API key](https://resellerhq.com/docs/api/keys/revoke-api-key.mdx): The key stops working at once. This cannot be undone.
- [List assistant activity](https://resellerhq.com/docs/api/keys/list-assistant-activity.mdx): What your API keys and any connected assistant have done, newest first - including a call a spending limit refused, so a key handed to an integration is something you can watch rather than something you have to trust.
- [List MCP connections](https://resellerhq.com/docs/api/mcp-connections/list-mcp-connections.mdx): Every assistant you have connected through MCP, the level and spending limits you granted it, and when it was last used.
- [Disconnect an assistant](https://resellerhq.com/docs/api/mcp-connections/delete-mcp-connection.mdx): Ends the connection at once: every access and refresh token issued to it stops working immediately, not merely the next time it is checked. This cannot be undone.
- [List pending sub-reseller invitations](https://resellerhq.com/docs/api/sub-resellers/list-sub-reseller-invitations.mdx)
- [Invite a sub-reseller](https://resellerhq.com/docs/api/sub-resellers/create-sub-reseller-invitation.mdx): Mails a single-use link that lets the invitee sign up as a reseller of their own, priced from the given list (unset, your default list). One level deep: an account that is itself a sub-reseller cannot invite another.
- [Withdraw an invitation](https://resellerhq.com/docs/api/sub-resellers/delete-sub-reseller-invitation.mdx): The token stops working at once, whether or not it has already expired.
- [List your sub-resellers](https://resellerhq.com/docs/api/sub-resellers/list-sub-resellers.mdx): Every reseller invited through you, newest first, with the price list it is charged from and its wallet balance. One level deep: a sub-reseller has none of its own.
- [Get a sub-reseller](https://resellerhq.com/docs/api/sub-resellers/get-sub-reseller.mdx)
- [Price or suspend a sub-reseller](https://resellerhq.com/docs/api/sub-resellers/update-sub-reseller.mdx): Sets the price list a sub-reseller is charged from (`null` clears it, so your default list prices it instead), its status, or both. Suspending stops it buying or renewing anything, same as suspending yourself does for your own account.
- [List a sub-reseller's number orders](https://resellerhq.com/docs/api/sub-resellers/list-sub-reseller-orders.mdx): Orders with their numbers, newest first - the same shape your own `GET /numbers/orders` returns, minus `customerId` at both levels: a sub-reseller's own customers are not this account's to join.
- [List a sub-reseller's sales](https://resellerhq.com/docs/api/sub-resellers/list-sub-reseller-sales.mdx): Every purchase and renewal the sub-reseller made, newest first - the same shape as your own `GET /sales`, minus `customerId`: a sub-reseller's own customers are not this account's to join.
- [Fund a sub-reseller](https://resellerhq.com/docs/api/sub-resellers/fund-sub-reseller.mdx): Moves money out of your own wallet and into a sub-reseller's, in one step. Refused when either account is suspended, or when your own balance cannot cover it, with nothing moved either way. Send an Idempotency-Key header so a retry can never move the money twice.
- [Withdraw unspent funds from a sub-reseller](https://resellerhq.com/docs/api/sub-resellers/withdraw-from-sub-reseller.mdx): Moves money out of a sub-reseller's wallet and back into your own, the mirror of fund. Moves only what is available: a sub-reseller's held funds belong to orders in flight and are never disturbed, so an over-withdrawal is refused with nothing moved. Allowed even when the sub-reseller is suspended, since suspension only stops it spending - the money withdrawn is yours to recover. Send an Idempotency-Key header so a retry can never move the money twice.

## Articles
Guides and comparisons. Each cites its sources and is Markdown at the link.

- [Holding a domain portfolio: renewals, status codes and the names that attack yours](https://resellerhq.com/blog/holding-a-domain-portfolio.mdx): Holding more than a few domains means missed renewals, EPP status codes on failed transfers, and lookalike names registered against your brand.
- [How SPF, DKIM and DMARC work together, and what to do when one fails](https://resellerhq.com/blog/how-spf-dkim-and-dmarc-work-together.mdx): SPF checks who may send, DKIM checks the message was not altered, and DMARC ties the two together and tells a receiver what to do on failure. Fix SPF first, then DKIM by provider, then move DMARC to enforcement.
- [Pricing what you resell: cost, markup, margin and the invoice at the end of it](https://resellerhq.com/blog/pricing-what-you-resell-cost-markup-and-margin.mdx): Pricing what you resell as eight sums: one sale's margin, Workspace vs 365 seat cost, break-even, MRR/ARR and lifetime value, each by free calculator.
- [Sending SMS that arrives: segments, sender names and A2P registration](https://resellerhq.com/blog/sending-sms-that-arrives.mdx): An SMS fails for one of three reasons: too many segments, a blocked sender name, or no A2P 10DLC registration. One guide, with a calculator for each.
- [The DNS records a domain needs, and what each one actually does](https://resellerhq.com/blog/the-dns-records-a-domain-needs.mdx): A domain's own DNS mostly comes down to five record types: TXT, MX, CNAME, CAA, and the NS/SOA pair every zone carries. This guide explains what each one does, with a live checker for every claim.
- [Verifying one of our webhooks: signatures, retries and every error, with our own API](https://resellerhq.com/blog/verifying-one-of-our-webhooks.mdx): Recompute our webhook signature in bash, Python and Node, generate test secrets and keys, read every documented error code, and decode a ULID, against our exact API.
- [What Google and Yahoo require from bulk senders, and how to prove you meet it](https://resellerhq.com/blog/what-google-and-yahoo-require-from-bulk-senders.mdx): Google and Yahoo both require SPF, DKIM, DMARC, forward/reverse DNS and under 0.3% spam complaints. The '5,000 a day' rule is Google's, not Yahoo's.
- [Can AI agents order through a reseller API?](https://resellerhq.com/blog/can-ai-agents-order-through-a-reseller-api.mdx): Can AI agents order through a reseller API? Yes, if the API publishes an OpenAPI document, idempotency keys, a sandbox key and signed webhooks for events.
- [How to change subscription seat counts without double-charging a customer](https://resellerhq.com/blog/idempotent-seat-changes-for-mailbox-licences.mdx): How to change subscription seat counts without double-charging a customer: retry the exact seat total and read the 409 error naming the unresolved change.
- [How to invoice your reseller customers](https://resellerhq.com/blog/how-to-invoice-your-reseller-customers.mdx): What a reseller invoice must show, invoicing each sale versus running one bill a month, keeping wholesale cost off the page, and chasing what is overdue.
- [How to price reseller services: markup, price lists and customer-specific rates](https://resellerhq.com/blog/how-to-price-reseller-services-markup-and-price-lists.mdx): How to price reseller services: set a markup on wholesale cost, choose a price list or an agreed price, and change prices without surprising a customer.
- [How to register domains in bulk through an API](https://resellerhq.com/blog/how-to-register-domains-in-bulk-through-an-api.mdx): Register domains in bulk through an API by checking an exact list first, then sending one idempotent request per domain. The safe workflow, and its limits.
- [How to test a reseller API integration in a sandbox](https://resellerhq.com/blog/how-to-test-a-reseller-api-integration-in-a-sandbox.mdx): A sandbox proves your code handles a completed order, a failed one, a retried request and a signed webhook. The test plan, and where live still differs.
- [Multi-provider failover routing for a reseller API](https://resellerhq.com/blog/multi-provider-failover-routing-for-reseller-apis.mdx): Multi-provider failover routing for a reseller API tries the cheapest upstream first and falls through on a clear decline, never on an unclear one.
- [What happens when you can't pay for a renewal as a reseller](https://resellerhq.com/blog/how-renewals-and-grace-periods-work-for-resellers.mdx): Numbers, mailbox licences and domains each fail a renewal differently: one event and no grace period, a week of retries, or no automatic renewal at all.
- [Cold email infrastructure: how many domains and mailboxes you need](https://resellerhq.com/blog/cold-email-infrastructure-domains-and-mailboxes.mdx): Vendor guidance implies 20 to 100 mailboxes on 2 to 17 domains per 1,000 cold emails a day. Gmail and Yahoo require spam complaint rates below 0.3%.
- [Domain reseller APIs compared: what developers should check](https://resellerhq.com/blog/domain-reseller-api-comparison.mdx): Domain reseller APIs differ most in retry safety, webhooks, rate limits and test environments, not in REST versus XML. Here is what each one documents.
- [Google Workspace vs Microsoft 365: which is better to resell?](https://resellerhq.com/blog/google-workspace-vs-microsoft-365-for-resellers.mdx): Microsoft 365 is easier to start reselling and publishes its rules; Google Workspace has simpler terms and API, but a contract with Google comes first.
- [How to become a Google Workspace reseller in 2026](https://resellerhq.com/blog/how-to-become-a-google-workspace-reseller.mdx): To resell Google Workspace you need a signed Google reseller contract, or a distributor or wholesale platform that holds one. Steps, prices and terms.
- [How to start a domain and email reselling business](https://resellerhq.com/blog/how-to-start-a-domain-and-email-reselling-business.mdx): Open a wholesale domain account, add Google Workspace or Microsoft 365 through a distributor, price for renewals, and earn your margin on service.
- [Idempotency keys and signed webhooks: the two things a reseller API must get right](https://resellerhq.com/blog/idempotency-keys-and-webhooks-for-reseller-apis.mdx): An idempotency key makes a retried purchase safe and a signed webhook makes an event trustworthy. Here is what the specs say and how to check a provider.
- [Phone number APIs for receiving SMS, compared](https://resellerhq.com/blog/phone-number-apis-for-receiving-sms.mdx): US list prices on 7 October 2026: Plivo has the cheapest local number at $0.50 a month and Telnyx the cheapest inbound SMS at $0.004 per message part.
- [Prepaid wallet billing for a reseller platform: holds, captures and a double-entry ledger](https://resellerhq.com/blog/prepaid-wallet-billing-for-resellers.mdx): A reseller wallet should reserve funds with a hold, capture only what is delivered, release the rest, and record every step in a double-entry ledger.
- [ResellerClub alternatives in 2026, compared](https://resellerhq.com/blog/resellerclub-alternatives.mdx): Six ResellerClub alternatives compared on pricing model, API, sandbox, white-label and payment terms, using each vendor's own pages as read in October 2026.
- [Reselling Microsoft 365: a plain guide to CSP in 2026](https://resellerhq.com/blog/microsoft-365-csp-reseller-guide.mdx): New Microsoft 365 resellers join CSP as indirect resellers through a distributor; direct bill needs 12 months of history and USD 1 million in CSP revenue.
- [Twilio alternatives for reselling phone numbers](https://resellerhq.com/blog/twilio-alternatives-for-reselling-phone-numbers.mdx): Telnyx, Plivo, Sinch, Vonage and Bandwidth all separate numbers per customer. Only Telnyx and Vonage document customer balances; none publish reseller margins.
- [What is a white-label reseller platform?](https://resellerhq.com/blog/what-is-a-white-label-reseller-platform.mdx): A white-label reseller platform lets you buy domains, mailbox licences or phone numbers at wholesale and sell them under your own brand and price.
