How To Bulk Domain Transfer To Cloudflare Registrar And Save On Domain Renewal Costs

Cloudflare Domain Registrar is a privacy focused no markup price domain registrar provider which can reduce your domain renewal costs significantly. However, a requirement is that you use their Cloudflare nameservers and have onboarded your domain(s) to their service first. This guide will show how you can bulk domain transfer many domains including onboarding to Cloudflare service and nameservers.

Step 1. Cloudflare Add New Sites

For this domain registrar transfer process, I signed up a separate and new free Cloudflare plan account. You don’t need to sign up a new Cloudflare account, you can use your existing account if you want.

To meet Cloudflare Domain Registrar requirements, need to first have the intended domains being transferred running using Cloudflare’s own DNS nameservers before initiating the domain registrar transfer process. I used Cloudflare’s API to bulk add the intended domains to my newly signed up Cloudflare account’s global API key. You could of course just do manual add site process for Cloudflare account too but it would be more time consuming if you have dozens or hundreds of domains to add compared to using Cloudflare API to bulk add all domains.

To do this I’d need access to SSH terminal of a server or local computer and first export Cloudflare API key and CF_ACCOUNT_ID which is your Cloudflare Account ID which you can find on CF domain zone’s Overview right side column and user variables and install jq package. This was done on CentOS 7 server

yum -y install jq
export CF_API_EMAIL=you@example.com
export CF_API_KEY=abc123def456ghi789
export CF_ACCOUNT_ID=your_cloudflare_account_id

Then setup domains.txt file with one domain per line for domains you intend to setup initially for Cloudflare account

touch domains.txt

add to domains.txt file one per line, the intended domains you want to transfer to Cloudflare Domain Registrar

domain1.xyz
domain2.xyz
domain3.xyz
domain4.xyz
domain5.xyz
domain6.xyz

Add domains in domain.txt to your Cloudflare account via CF API and populate JSON output into the result.txt text file

for domain in $(cat domains.txt); do \
  curl -sX POST -H "X-Auth-Key: $CF_API_KEY" -H "X-Auth-Email: $CF_API_EMAIL" \
  -H "Content-Type: application/json" \
  "https://api.cloudflare.com/client/v4/zones" \
  --data '{"name":"'$domain'","account":{"id":"'$CF_ACCOUNT_ID'"},"jump_start":true,"type":"full"}' | tee -a result.txt; done

You will be able to see pretty json output for populated result.txt file using command

cat result.txt | jq

You will be able to inspect and extract the Cloudflare DNS nameservers via the result.txt file contents. The outputted DNS nameservers are the ones you need to update with their existing domain registrars for each intended domain you want to transfer to Cloudflare Domain Registrar for this Cloudflare account. Example further below is of using Namesilo’s API to bulk update domains’ nameservers.

cat result.txt | jq -r '.result | [.name, .name_servers[]]'

Example output for the above command

cat result.txt | jq -r '.result | [.name, .name_servers[]]'

[
"domain1.xyz",
"arch.ns.cloudflare.com",
"nelly.ns.cloudflare.com"
]
[
"domain2.xyz",
"arch.ns.cloudflare.com",
"nelly.ns.cloudflare.com"
]
[
"domain3.xyz",
"arch.ns.cloudflare.com",
"nelly.ns.cloudflare.com"
]
[
"domain4.xyz",
"arch.ns.cloudflare.com",
"nelly.ns.cloudflare.com"
]
[
"domain5.xyz",
"arch.ns.cloudflare.com",
"nelly.ns.cloudflare.com"
]
[
"domain6.xyz",
"arch.ns.cloudflare.com",
"nelly.ns.cloudflare.com"
]

Or in comma separated values.

cat result.txt | jq -r '.result | [.name, .name_servers[]] | @csv'

Output

cat result.txt | jq -r '.result | [.name, .name_servers[]] | @csv'

"domain1.xyz","arch.ns.cloudflare.com","nelly.ns.cloudflare.com"
"domain2.xyz","arch.ns.cloudflare.com","nelly.ns.cloudflare.com"
"domain3.xyz","arch.ns.cloudflare.com","nelly.ns.cloudflare.com"
"domain4.xyz","arch.ns.cloudflare.com","nelly.ns.cloudflare.com"
"domain5.xyz","arch.ns.cloudflare.com","nelly.ns.cloudflare.com"
"domain6.xyz","arch.ns.cloudflare.com","nelly.ns.cloudflare.com"

You will also be able to use the result.txt info to extract the Cloudflare zoneid and domain name if for your records if you intend to further use the Cloudflare API to work with specific domains as you need the zoneid

cat result.txt | jq -r '.result | "\(.id) \(.name)"'

so something like this will be outputted

cat result.txt | jq -r '.result | "\(.id) \(.name)"'
yourzoneid1 domain1.xyz
yourzoneid2 domain2.xyz
yourzoneid3 domain3.xyz
yourzoneid4 domain4.xyz
yourzoneid5 domain5.xyz
yourzoneid6 domain6.xyz

Step 2. Cloudflare Domain Registrar Transfer Process

Now wait for each domain’s listing in your Cloudflare account to go from nameserver pending to Active status – you may need to wait up to 24hrs for Cloudflare to detect the DNS nameserver changes for each domain you intend to transfer over. Once updated, you will see the listed domains marked as = Active

Cloudflare Account Listed Domains

You will see on Cloudflare Account Home page a top navigation link to the far right for = Domain Registration. This is where you initiate your domain transfer request process.  The usual process for domain transfers is that you unlock your intended domains from existing domain registrar and obtain an EPP authorisation code first. You can see specific instructions for common domain registrars at Transfer Instructions – Cloudflare Registrar.

For my particular case of transferring domains from NameCheap to Cloudflare Domain Registrar, I followed instructions outlined at Namecheap – Cloudflare Registrar.  For my 6x XYZ domains, cost based pricing is US$8.00 per domain with US$0.18 ICAAN fee per domain, so total cost is US$8.18×6 = US$49.08. Remember to add a payment method to be able to proceed.

Cloudflare Domain Registrar Transfers

Next is to confirm the domains and go to next step to enter EPP authorisation codes you obtained from your existing domain registrar.

Cloudflare Registrar domain transfer instructions

Then after confirming the authorization codes, you will need to enter in contact information to confirm and finalize the domain transfers to Cloudflare Domain Registrar. Note you can’t leave Organization field blank as the confirm and finalize button is greyed out until that field is populated. For that I just added my first and last name.

Cloudflare Registrar contact information

Once you click confirm and finalize transfer you will get to the completion page

Cloudflare Registrar domain transfer underway

and then receive separate emails for each domain you’re transferring confirming the domain transfer request and the domain transfer initiated processes

Cloudflare Registrar domain transfer request email

Cloudflare Registrar domain transfer initiated email

Now to wait for the form of authorization emails to come in via your domain’s existing domain registrar contact email address for you to approve the initiated domain transfer to Cloudflare Domain Registrar.

On the Domain Registration page it will show status of transfer but confusing text is for

We’re unable to transfer the following domains
Some domains cannot be transferred to Cloudflare Registrar. If you registered, transferred, or modified the contact information on a domain in the last 60 days, we cannot transfer yet. In other cases, we do not yet support the TLD. We’re constantly working to improve that list, though. Check back soon.

When in fact we’re waiting on this form of authorization emails and clicking the approval links.

Cloudflare Registrar domain transfer status list page

Step 3. Cloudflare Domain Registrar Transfer Process Completion

I approved all 6x form of authorization email’s approval links and already domains are starting to receive the Domain Transfer Complete emails.

Cloudflare Registrar domain transfer success email

Cloudflare domain overview page has a Domain Registrar status and shows the registrar, expiration date

Cloudflare Registrar domain overview page

Some transferred domains’ Overview page lists expiration date as invalid – apparently there can be delays in updating that for display. But you can check actual whois record for the domain to confirm the expiration date.

Cloudflare Registrar domain invalid date

You can verify if your transferred domains’ whois info is redacted by Cloudflare via whois command in SSH terminal. If you used the Cloudflare API steps above to add domains listed in domains.txt file via curl command, you can also easily use that domains.txt file to run whois checks against whois.cloudflare.com nameservers.

cat domains.txt | while read d; do whois -h whois.cloudflare.com $d; done

This will run whois query against each domain listed in domains.txt file – example output

[Querying whois.cloudflare.com]
[whois.cloudflare.com]
Domain Name: DOMAIN1.XYZ
Registry Domain ID:
Registrar WHOIS Server: whois.cloudflare.com
Registrar URL: https://www.cloudflare.com
Updated Date: 2018-11-17T06:00:23Z
Creation Date: 2018-11-17T03:38:44Z
Registrar Abuse Contact Email: registrar-abuse@cloudflare.com
Registrar Abuse Contact Phone: +1.4153197517
Registrar Registration Expiration Date:
Registrar: Cloudflare, Inc.
Registrar IANA ID: 1910
Registry Registrant ID:
Registrant Name: DATA REDACTED
Registrant Organization: DATA REDACTED
Registrant Street: DATA REDACTED
Registrant City: DATA REDACTED
Registrant State/Province: DATA REDACTED
Registrant Postal Code: DATA REDACTED
Registrant Country: DATA REDACTED
Registrant Phone: DATA REDACTED
Registrant Phone Ext: DATA REDACTED
Registrant Fax: DATA REDACTED
Registrant Fax Ext: DATA REDACTED
Registrant Email: DATA REDACTED
Registry Admin ID:
Admin Name: DATA REDACTED
Admin Organization: DATA REDACTED
Admin Street: DATA REDACTED
Admin City: DATA REDACTED
Admin State/Province: DATA REDACTED
Admin Postal Code: DATA REDACTED
Admin Country: DATA REDACTED
Admin Phone: DATA REDACTED
Admin Phone Ext: DATA REDACTED
Admin Fax: DATA REDACTED
Admin Fax Ext: DATA REDACTED
Admin Email: DATA REDACTED
Registry Tech ID:
Tech Name: DATA REDACTED
Tech Organization: DATA REDACTED
Tech Street: DATA REDACTED
Tech City: DATA REDACTED
Tech State/Province: DATA REDACTED
Tech Postal Code: DATA REDACTED
Tech Country: DATA REDACTED
Tech Phone: DATA REDACTED
Tech Phone Ext: DATA REDACTED
Tech Fax: DATA REDACTED
Tech Fax Ext: DATA REDACTED
Tech Email: DATA REDACTED
Registry Billing ID:
Billing Name: DATA REDACTED
Billing Organization: DATA REDACTED
Billing Street: DATA REDACTED
Billing City: DATA REDACTED
Billing State/Province: DATA REDACTED
Billing Postal Code: DATA REDACTED
Billing Country: DATA REDACTED
Billing Phone: DATA REDACTED
Billing Phone Ext: DATA REDACTED
Billing Fax: DATA REDACTED
Billing Fax Ext: DATA REDACTED
Billing Email: DATA REDACTED

URL of the ICANN WHOIS Data Problem Reporting System: http://wdprs.internic.net

For more information on Whois status codes, please visit https://icann.org/epp

Cloudflare provides more than 10 million domains with the tools to give their global users a faster, more secure, and more reliable internet experience.

NOTICE:

Data in the CloudFlare Registrar WHOIS database is provided to you by CloudFlare
under the terms and conditions at https://www.cloudflare.com/domain-registration-agreement/

By submitting this query, you agree to abide by these terms.

Register your domain name at https://www.cloudflare.com/registrar/

Step 4. Bulk Cloudflare Domain Zone API Updates

After you have your new domains set up in activated Cloudflare domain zones, you can now also use Cloudflare API to do bulk domain zone configuration changes that apply to all the newly added domains rather than manually updating the settings. There are various Cloudflare Zone settings you can change via API including default Cloudflare Browser Cache TTL of 8hrs to some other value and default Minimum TLS Version – changing from TLSv1.0 default to TLSv1.2 default etc. There are even undocumented Cloudflare API endpoints to enable Cloudflare Tiered Caching via bulk API updates.

Similar to step 1, you have exported your Cloudflare Global API key into your terminal/SSH session first.

export CF_API_EMAIL=you@example.com
export CF_API_KEY=abc123def456ghi789

You can bulk change the default Cloudflare Browser Cache TTL value setting from default 8hrs (14400 seconds) to Respect Existing Headers origin cache control (0 seconds).

Get the default Cloudflare Browser Cache TTL value using the previous created result.txt file’s saved output to get the domain’s Cloudflare ZoneID and domain name.

cat result.txt | jq -r '.result | "\(.id) \(.name)"'
yourzoneid1 domain1.xyz
yourzoneid2 domain2.xyz

Then feed that output into a while read loop and Cloudflare API endpoint to get the default Cloudflare Browser Cache TTL value.

cat result.txt | jq -r '.result | "\(.id) \(.name)"' | while read zid domain; do \
echo "$zid $domain"; echo "Get Cloudflare Browser Cache TTL value"; \
curl -s -X GET "https://api.cloudflare.com/client/v4/zones/${zid}/settings/browser_cache_ttl" \
     -H "X-Auth-Email: ${CF_API_EMAIL}" -H "X-Auth-Key: ${CF_API_KEY}" \
     -H "Content-Type: application/json" | jq; done

Example output showing the default 8hrs = 14400 seconds value.

cat result.txt | jq -r '.result | "\(.id) \(.name)"' | while read zid domain; do \
echo "$zid $domain"; echo "Get Cloudflare Browser Cache TTL value"; \
curl -s -X GET "https://api.cloudflare.com/client/v4/zones/${zid}/settings/browser_cache_ttl" \
     -H "X-Auth-Email: ${CF_API_EMAIL}" -H "X-Auth-Key: ${CF_API_KEY}" \
     -H "Content-Type: application/json" | jq; done

yourzoneid1 domain1.xyz
Get Cloudflare Browser Cache TTL value
{
  "result": {
    "id": "browser_cache_ttl",
    "value": 14400,
    "modified_on": "2021-11-22T07:04:22.884557Z",
    "editable": true
  },
  "success": true,
  "errors": [],
  "messages": []
}
yourzoneid2 domain2.xyz
Get Cloudflare Browser Cache TTL value
{
  "result": {
    "id": "browser_cache_ttl",
    "value": 14400,
    "modified_on": "2021-11-22T07:13:37.486291Z",
    "editable": true
  },
  "success": true,
  "errors": [],
  "messages": []
}

Then to make bulk changes to the default Cloudflare Browser Cache TTL value to equal 0.

cat result.txt | jq -r '.result | "\(.id) \(.name)"' | while read zid domain; do \
echo "$zid $domain"; echo "Set Cloudflare Browser Cache TTL value"; \
curl -s -X PATCH "https://api.cloudflare.com/client/v4/zones/${zid}/settings/browser_cache_ttl" \
     -H "X-Auth-Email: ${CF_API_EMAIL}" -H "X-Auth-Key: ${CF_API_KEY}" \
     -H "Content-Type: application/json" \
     --data '{"value":0}' | jq; done

Example output for setting Cloudflare domain zone’s Browser Cache TTL to Respect Existing Headers value of 0.

cat result.txt | jq -r '.result | "\(.id) \(.name)"' | while read zid domain; do \
echo "$zid $domain"; echo "Set Cloudflare Browser Cache TTL value"; \
curl -s -X PATCH "https://api.cloudflare.com/client/v4/zones/${zid}/settings/browser_cache_ttl" \
     -H "X-Auth-Email: ${CF_API_EMAIL}" -H "X-Auth-Key: ${CF_API_KEY}" \
     -H "Content-Type: application/json" \
     --data '{"value":0}' | jq; done

yourzoneid1 domain1.xyz
Set Cloudflare Browser Cache TTL value
{
  "result": {
    "id": "browser_cache_ttl",
    "value": 0,
    "modified_on": "2021-11-22T07:04:22.884557Z",
    "editable": true
  },
  "success": true,
  "errors": [],
  "messages": []
}
yourzoneid2 domain2.xyz
Set Cloudflare Browser Cache TTL value
{
  "result": {
    "id": "browser_cache_ttl",
    "value": 0,
    "modified_on": "2021-11-22T07:13:37.486291Z",
    "editable": true
  },
  "success": true,
  "errors": [],
  "messages": []
}

You can also do bulk updating of Cloudflare domain zone’s Minimum TLS Version value from TLSv1.0 to TLSv1.2.

First, get the current default values:

cat result.txt | jq -r '.result | "\(.id) \(.name)"' | while read zid domain; do \
echo "$zid $domain"; echo "Get Cloudflare Default Min TLS version value"; \
curl -s -X GET "https://api.cloudflare.com/client/v4/zones/${zid}/settings/min_tls_version" \
     -H "X-Auth-Email: ${CF_API_EMAIL}" -H "X-Auth-Key: ${CF_API_KEY}" \
     -H "Content-Type: application/json" | jq; done

Example output shows a value = 1.0 for TLSv1.0:

cat result.txt | jq -r '.result | "\(.id) \(.name)"' | while read zid domain; do \
echo "$zid $domain"; echo "Get Cloudflare Default Min TLS version value"; \
curl -s -X GET "https://api.cloudflare.com/client/v4/zones/${zid}/settings/min_tls_version" \
     -H "X-Auth-Email: ${CF_API_EMAIL}" -H "X-Auth-Key: ${CF_API_KEY}" \
     -H "Content-Type: application/json" | jq; done

yourzoneid1 domain1.xyz
Get Cloudflare Default Min TLS version value
{
  "result": {
    "id": "min_tls_version",
    "value": "1.0",
    "modified_on": null,
    "editable": true
  },
  "success": true,
  "errors": [],
  "messages": []
}
yourzoneid2 domain2.xyz
Get Cloudflare Default Min TLS version value
{
  "result": {
    "id": "min_tls_version",
    "value": "1.0",
    "modified_on": null,
    "editable": true
  },
  "success": true,
  "errors": [],
  "messages": []
}

Then bulk update them with a value of 1.2 for TLSv1.2:

cat result.txt | jq -r '.result | "\(.id) \(.name)"' | while read zid domain; do \
echo "$zid $domain"; echo "Set Cloudflare Default Min TLS version value = TLSv1.2"; \
curl -s -X PATCH "https://api.cloudflare.com/client/v4/zones/${zid}/settings/min_tls_version" \
     -H "X-Auth-Email: ${CF_API_EMAIL}" -H "X-Auth-Key: ${CF_API_KEY}" \
     -H "Content-Type: application/json" \
     --data '{"value":"1.2"}' | jq; done

Example output:

cat result.txt | jq -r '.result | "\(.id) \(.name)"' | while read zid domain; do \
echo "$zid $domain"; echo "Set Cloudflare Default Min TLS version value = TLSv1.2"; \
curl -s -X PATCH "https://api.cloudflare.com/client/v4/zones/${zid}/settings/min_tls_version" \
     -H "X-Auth-Email: ${CF_API_EMAIL}" -H "X-Auth-Key: ${CF_API_KEY}" \
     -H "Content-Type: application/json" \
     --data '{"value":"1.2"}' | jq; done

yourzoneid1 domain1.xyz
Set Cloudflare Default Min TLS version value = TLSv1.2
{
  "result": {
    "id": "min_tls_version",
    "value": "1.2",
    "modified_on": null,
    "editable": true
  },
  "success": true,
  "errors": [],
  "messages": []
}
yourzoneid2 domain2.xyz
Set Cloudflare Default Min TLS version value = TLSv1.2
{
  "result": {
    "id": "min_tls_version",
    "value": "1.2",
    "modified_on": null,
    "editable": true
  },
  "success": true,
  "errors": [],
  "messages": []
}

Step 5. Cloudflare Domain Registrar Costs versus Namecheap Costs

How does this pricing compared to renewal at NameCheap ? XYZ domain renewal pricing is US$12.88 + US$0.18 = US$13.06 per domain x 6 = US$78.36. So Cloudflare Domain Registrar’s XYZ domain cost pricing reduces my domain renewal costs by US$29.28 per year for those 6x XYZ domains. That’s a savings of just over 37% !

Namecheap domain renewal costs

Step 5. Namesilo.com to Cloudflare Domain Registrar Transfers Via APIs

The above Cloudflare bulk domain addition via Cloudflare API prior to domain registrar transfer instructions are handy to have when you have dozens or hundreds of domains to transfer. However, you still need to bulk update on loosing domain registrar end a few settings to unlock domains, retrieve EPP codes and update Cloudflare name servers prior to being able to transfer domains to Cloudflare Domain Registrar.

Below is my latest attempt to transfer dozens of domains from Namesilo.com to Cloudflare Domain Registrar via Namesilo API end to bulk update domains to unlock domains, retrieve EPP codes, disable auto-renewal and update Cloudflare name servers prior

First this is to enable Namesilo API and whitelist your server IP you intend to run below API curl commands from so that you are able to run Namesilo API commands.

Enable Namesilo API

Second is retrieve and set Namesilo API key in variable in SSH command/session called nskey. This nskey variable is valid only for the SSH session. If you log out and log back in, you need to set it again by typing the below line.

nskey=your_namesilo_apikey

Install yq command to be able to prettify and parse Namesilo’s xml generated API output. The yq install also includes command xq which allows parsing xml output from API responses

pip install yq

Example to list all domains on in your Namesilo account via api would get the following API response output piped through xq command

curl -s "https://www.namesilo.com/api/listDomains?version=1&type=xml&key=$nskey" | xq .
{
  "namesilo": {
    "request": {
      "operation": "listDomains",
      "ip": "xxx.xxx.xxx.xxx"
    },
    "reply": {
      "code": "300",
      "detail": "success",
      "domains": {
        "domain": [
          "domain.com",
          "domain.net"
        ]
      }
    }
  }
}

To just list domains you can manipulate xq filter

curl -s "https://www.namesilo.com/api/listDomains?version=1&type=xml&key=$nskey" | xq -r '.namesilo.reply.domains.domain[]'

domain.com
domain.net

With the Namesilo API verified as working, we need to bulk unlock domains, retrieve EPP codes and update nameservers to Cloudflare bulk API derived nameservers outlined in above 1st step.

cat result.txt | jq -r '.result | [.name, .name_servers[]]'

Example output for the above command

cat result.txt | jq -r '.result | [.name, .name_servers[]]'

[
"domain1.xyz",
"arch.ns.cloudflare.com",
"nelly.ns.cloudflare.com"
]
[
"domain2.xyz",
"arch.ns.cloudflare.com",
"nelly.ns.cloudflare.com"
]
[
"domain3.xyz",
"arch.ns.cloudflare.com",
"nelly.ns.cloudflare.com"
]
[
"domain4.xyz",
"arch.ns.cloudflare.com",
"nelly.ns.cloudflare.com"
]
[
"domain5.xyz",
"arch.ns.cloudflare.com",
"nelly.ns.cloudflare.com"
]
[
"domain6.xyz",
"arch.ns.cloudflare.com",
"nelly.ns.cloudflare.com"
]

Or in comma separated values.

cat result.txt | jq -r '.result | [.name, .name_servers[]] | @csv'

Output

cat result.txt | jq -r '.result | [.name, .name_servers[]] | @csv'

"domain1.xyz","arch.ns.cloudflare.com","nelly.ns.cloudflare.com"
"domain2.xyz","arch.ns.cloudflare.com","nelly.ns.cloudflare.com"
"domain3.xyz","arch.ns.cloudflare.com","nelly.ns.cloudflare.com"
"domain4.xyz","arch.ns.cloudflare.com","nelly.ns.cloudflare.com"
"domain5.xyz","arch.ns.cloudflare.com","nelly.ns.cloudflare.com"
"domain6.xyz","arch.ns.cloudflare.com","nelly.ns.cloudflare.com"

You would of already created and populated the domains.txt file from above steps in 1st step

cd /root/tools
mkdir cfdomains
cd cfdomains
touch domains.txt

domains.txt would contain all domains (one per line) you intend to update from Namesilo which are already added to Cloudflare account via API but not yet transferred domain registrar wise.

Now to domain unlock https://www.namesilo.com/api_reference.php#domainUnlock

for domain in $(cat domains.txt); do curl -s "https://www.namesilo.com/api/domainUnlock?version=1&type=xml&key=$nskey&domain=$domain" | tee -a unlock-result.txt; done

domain disable autorenewal https://www.namesilo.com/api_reference.php#removeAutoRenewal

for domain in $(cat domains.txt); do curl -s "https://www.namesilo.com/api/removeAutoRenewal?version=1&type=xml&key=$nskey&domain=$domain" | tee -a noautorenewal-result.txt; done

change nameservers https://www.namesilo.com/api_reference.php#changeNameServers

set nsone and nstwo variables to the Cloudflare namservers needed to activate/add your domains to Cloudflare account. If for some reason, not all domains have the same assigned Cloudflare nameservers, you can split the domains.txt into groupings of similar Cloudflare nameservers and just do the commands separately for each group.

nsone=arch.ns.cloudflare.com
nstwo=nelly.ns.cloudflare.com
for domain in $(cat domains.txt); do curl -s "https://www.namesilo.com/api/changeNameServers?version=1&type=xml&key=$nskey&domain=$domain&ns1=$nsone&ns2=$nstwo" | tee -a nameserver-update-result.txt; done

retrieve EPP codes https://www.namesilo.com/api_reference.php#retrieveAuthCode which will be sent to domain’s admin email contact

for domain in $(cat domains.txt); do curl -s "https://www.namesilo.com/api/retrieveAuthCode?version=1&type=xml&key=$nskey&domain=$domain" | tee -a epp-result.txt; done

After this, you will receive lots of Namesilo emails especially if you have Domain Defender Alerts enabled. Some of the emails will be confirmation of actions for unlocking domains, retrieving EPP codes, disabling auto-renewal and updating nameservers in bulk via Namesilo API.

At this stage after you have done Cloudflare bulk API add from 1st step in this guide along with Namesilo API bulk changes outlined, you should have Cloudflare dashboard listing all your newly added domains as active in Cloudflare account. You will be then ready to do the domain registrar transfers from Namesilo to Cloudflare. Very handy if you have dozens, hundreds or thousands of domains you need to add to Cloudflare account + transfer from Namesilo to Cloudflare Domain Registrar.

The list of bulk domains added to my Cloudflare account from Namesilo prior to Cloudflare domain registrar transfer which I will be doing soon as domains up for renewal soon. Total cost saved from transferring the most recent above set of domains from Namesilo to Cloudflare Domain Registrar is US$31.80/yr !

Namesilo list of domains to transfer to Cloudflare Registrar

Cloudflare Registrar FAQ & Notes