dnshe-freedomains
Compare original and translation side by side
🇺🇸
Original
English🇨🇳
Translation
ChineseDNSHE Free Domains & Anycast DNS
DNSHE 免费域名与Anycast DNS
Skill by ara.so — Daily 2026 Skills collection.
DNSHE (dnshe.com) provides free subdomains under , , , and backed by enterprise Anycast DNS. It supports A, AAAA, CNAME, MX, TXT, NS, SRV, and CAA records, a 180-day renewal window, and a REST API for full automation — no credit card required.
us.cicc.cdde5.netccwu.ccGetting Started
快速开始
1. Register an Account
1. 注册账户
2. Claim a Subdomain
2. 申领子域名
Search for your desired prefix (e.g., ) and pair it with a suffix:
myproject| Suffix | Use Case |
|---|---|
| CI/CD pipelines, API endpoints, SaaS |
| Portfolios, creative projects |
| Tech blogs, dev environments, docs |
| Personal pages, community projects |
搜索你想要的前缀(例如),并搭配对应的后缀:
myproject| 后缀 | 适用场景 |
|---|---|
| CI/CD流水线、API端点、SaaS服务 |
| 作品集、创意项目 |
| 技术博客、开发环境、文档站点 |
| 个人页面、社区项目 |
3. Add DNS Records
3. 添加DNS记录
From the dashboard, add your records (A, CNAME, TXT, etc.). Propagation happens in seconds via Anycast.
在控制台中添加你的记录(A、CNAME、TXT等)。通过Anycast网络,记录生效仅需数秒。
REST API Reference
REST API 参考
All API interactions require an API token obtained from the DNSHE dashboard under account settings.
所有API交互都需要从DNSHE控制台的账户设置中获取API令牌。
Authentication
身份验证
All requests use a Bearer token in the header:
AuthorizationAuthorization: Bearer $DNSHE_API_TOKENStore your token as an environment variable:
bash
export DNSHE_API_TOKEN="your_token_here"
export DNSHE_BASE_URL="https://www.dnshe.com/api/v1"所有请求需在头部携带Bearer令牌:
AuthorizationAuthorization: Bearer $DNSHE_API_TOKEN将令牌存储为环境变量:
bash
export DNSHE_API_TOKEN="your_token_here"
export DNSHE_BASE_URL="https://www.dnshe.com/api/v1"Key API Operations
核心API操作
List Your Domains
列出你的域名
bash
curl -s -X GET "$DNSHE_BASE_URL/domains" \
-H "Authorization: Bearer $DNSHE_API_TOKEN" \
-H "Content-Type: application/json"bash
curl -s -X GET "$DNSHE_BASE_URL/domains" \
-H "Authorization: Bearer $DNSHE_API_TOKEN" \
-H "Content-Type: application/json"Register a Subdomain
注册子域名
bash
curl -s -X POST "$DNSHE_BASE_URL/domains" \
-H "Authorization: Bearer $DNSHE_API_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"subdomain": "myproject",
"suffix": "us.ci"
}'bash
curl -s -X POST "$DNSHE_BASE_URL/domains" \
-H "Authorization: Bearer $DNSHE_API_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"subdomain": "myproject",
"suffix": "us.ci"
}'Add a DNS Record
添加DNS记录
bash
curl -s -X POST "$DNSHE_BASE_URL/domains/myproject.us.ci/records" \
-H "Authorization: Bearer $DNSHE_API_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"type": "A",
"name": "@",
"value": "203.0.113.42",
"ttl": 300
}'bash
curl -s -X POST "$DNSHE_BASE_URL/domains/myproject.us.ci/records" \
-H "Authorization: Bearer $DNSHE_API_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"type": "A",
"name": "@",
"value": "203.0.113.42",
"ttl": 300
}'Update a DNS Record
更新DNS记录
bash
curl -s -X PUT "$DNSHE_BASE_URL/domains/myproject.us.ci/records/{record_id}" \
-H "Authorization: Bearer $DNSHE_API_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"type": "A",
"name": "@",
"value": "203.0.113.99",
"ttl": 300
}'bash
curl -s -X PUT "$DNSHE_BASE_URL/domains/myproject.us.ci/records/{record_id}" \
-H "Authorization: Bearer $DNSHE_API_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"type": "A",
"name": "@",
"value": "203.0.113.99",
"ttl": 300
}'Delete a DNS Record
删除DNS记录
bash
curl -s -X DELETE "$DNSHE_BASE_URL/domains/myproject.us.ci/records/{record_id}" \
-H "Authorization: Bearer $DNSHE_API_TOKEN"bash
curl -s -X DELETE "$DNSHE_BASE_URL/domains/myproject.us.ci/records/{record_id}" \
-H "Authorization: Bearer $DNSHE_API_TOKEN"Renew a Domain
续期域名
bash
curl -s -X POST "$DNSHE_BASE_URL/domains/myproject.us.ci/renew" \
-H "Authorization: Bearer $DNSHE_API_TOKEN"bash
curl -s -X POST "$DNSHE_BASE_URL/domains/myproject.us.ci/renew" \
-H "Authorization: Bearer $DNSHE_API_TOKEN"Code Examples
代码示例
Python: Full Domain Setup Script
Python: 完整域名设置脚本
python
import os
import requests
API_TOKEN = os.environ["DNSHE_API_TOKEN"]
BASE_URL = "https://www.dnshe.com/api/v1"
HEADERS = {
"Authorization": f"Bearer {API_TOKEN}",
"Content-Type": "application/json",
}
def register_subdomain(subdomain: str, suffix: str) -> dict:
resp = requests.post(
f"{BASE_URL}/domains",
headers=HEADERS,
json={"subdomain": subdomain, "suffix": suffix},
)
resp.raise_for_status()
return resp.json()
def add_record(domain: str, record_type: str, name: str, value: str, ttl: int = 300) -> dict:
resp = requests.post(
f"{BASE_URL}/domains/{domain}/records",
headers=HEADERS,
json={"type": record_type, "name": name, "value": value, "ttl": ttl},
)
resp.raise_for_status()
return resp.json()
def renew_domain(domain: str) -> dict:
resp = requests.post(
f"{BASE_URL}/domains/{domain}/renew",
headers=HEADERS,
)
resp.raise_for_status()
return resp.json()
def list_domains() -> list:
resp = requests.get(f"{BASE_URL}/domains", headers=HEADERS)
resp.raise_for_status()
return resp.json()
if __name__ == "__main__":
# Register subdomain
result = register_subdomain("myproject", "us.ci")
print("Registered:", result)
# Point it to a server
record = add_record("myproject.us.ci", "A", "@", "203.0.113.42")
print("Record added:", record)
# Add a www CNAME
cname = add_record("myproject.us.ci", "CNAME", "www", "myproject.us.ci")
print("CNAME added:", cname)python
import os
import requests
API_TOKEN = os.environ["DNSHE_API_TOKEN"]
BASE_URL = "https://www.dnshe.com/api/v1"
HEADERS = {
"Authorization": f"Bearer {API_TOKEN}",
"Content-Type": "application/json",
}
def register_subdomain(subdomain: str, suffix: str) -> dict:
resp = requests.post(
f"{BASE_URL}/domains",
headers=HEADERS,
json={"subdomain": subdomain, "suffix": suffix},
)
resp.raise_for_status()
return resp.json()
def add_record(domain: str, record_type: str, name: str, value: str, ttl: int = 300) -> dict:
resp = requests.post(
f"{BASE_URL}/domains/{domain}/records",
headers=HEADERS,
json={"type": record_type, "name": name, "value": value, "ttl": ttl},
)
resp.raise_for_status()
return resp.json()
def renew_domain(domain: str) -> dict:
resp = requests.post(
f"{BASE_URL}/domains/{domain}/renew",
headers=HEADERS,
)
resp.raise_for_status()
return resp.json()
def list_domains() -> list:
resp = requests.get(f"{BASE_URL}/domains", headers=HEADERS)
resp.raise_for_status()
return resp.json()
if __name__ == "__main__":
# Register subdomain
result = register_subdomain("myproject", "us.ci")
print("Registered:", result)
# Point it to a server
record = add_record("myproject.us.ci", "A", "@", "203.0.113.42")
print("Record added:", record)
# Add a www CNAME
cname = add_record("myproject.us.ci", "CNAME", "www", "myproject.us.ci")
print("CNAME added:", cname)Python: Automated Renewal Script (Cron-friendly)
Python: 自动化续期脚本(支持Cron)
python
import os
import requests
from datetime import datetime, timedelta
API_TOKEN = os.environ["DNSHE_API_TOKEN"]
BASE_URL = "https://www.dnshe.com/api/v1"
HEADERS = {"Authorization": f"Bearer {API_TOKEN}"}
def renew_expiring_domains(days_threshold: int = 30):
"""Renew any domain expiring within `days_threshold` days."""
resp = requests.get(f"{BASE_URL}/domains", headers=HEADERS)
resp.raise_for_status()
domains = resp.json()
now = datetime.utcnow()
threshold = now + timedelta(days=days_threshold)
for domain in domains:
# Adjust field name to match actual API response
expires_at = datetime.fromisoformat(domain.get("expires_at", "").replace("Z", ""))
if expires_at <= threshold:
name = domain["domain"]
renew_resp = requests.post(f"{BASE_URL}/domains/{name}/renew", headers=HEADERS)
if renew_resp.ok:
print(f"✅ Renewed: {name}")
else:
print(f"❌ Failed to renew {name}: {renew_resp.text}")
if __name__ == "__main__":
renew_expiring_domains(days_threshold=30)python
import os
import requests
from datetime import datetime, timedelta
API_TOKEN = os.environ["DNSHE_API_TOKEN"]
BASE_URL = "https://www.dnshe.com/api/v1"
HEADERS = {"Authorization": f"Bearer {API_TOKEN}"}
def renew_expiring_domains(days_threshold: int = 30):
"""Renew any domain expiring within `days_threshold` days."""
resp = requests.get(f"{BASE_URL}/domains", headers=HEADERS)
resp.raise_for_status()
domains = resp.json()
now = datetime.utcnow()
threshold = now + timedelta(days=days_threshold)
for domain in domains:
# Adjust field name to match actual API response
expires_at = datetime.fromisoformat(domain.get("expires_at", "").replace("Z", ""))
if expires_at <= threshold:
name = domain["domain"]
renew_resp = requests.post(f"{BASE_URL}/domains/{name}/renew", headers=HEADERS)
if renew_resp.ok:
print(f"✅ Renewed: {name}")
else:
print(f"❌ Failed to renew {name}: {renew_resp.text}")
if __name__ == "__main__":
renew_expiring_domains(days_threshold=30)JavaScript/Node.js: Domain Management Client
JavaScript/Node.js: 域名管理客户端
javascript
const fetch = require('node-fetch'); // or use built-in fetch in Node 18+
const API_TOKEN = process.env.DNSHE_API_TOKEN;
const BASE_URL = 'https://www.dnshe.com/api/v1';
const headers = {
'Authorization': `Bearer ${API_TOKEN}`,
'Content-Type': 'application/json',
};
async function registerSubdomain(subdomain, suffix) {
const res = await fetch(`${BASE_URL}/domains`, {
method: 'POST',
headers,
body: JSON.stringify({ subdomain, suffix }),
});
if (!res.ok) throw new Error(`Register failed: ${await res.text()}`);
return res.json();
}
async function addRecord(domain, type, name, value, ttl = 300) {
const res = await fetch(`${BASE_URL}/domains/${domain}/records`, {
method: 'POST',
headers,
body: JSON.stringify({ type, name, value, ttl }),
});
if (!res.ok) throw new Error(`Add record failed: ${await res.text()}`);
return res.json();
}
async function listDomains() {
const res = await fetch(`${BASE_URL}/domains`, { headers });
if (!res.ok) throw new Error(`List failed: ${await res.text()}`);
return res.json();
}
async function renewDomain(domain) {
const res = await fetch(`${BASE_URL}/domains/${domain}/renew`, {
method: 'POST',
headers,
});
if (!res.ok) throw new Error(`Renew failed: ${await res.text()}`);
return res.json();
}
// Example usage
(async () => {
const domain = await registerSubdomain('myapp', 'cc.cd');
console.log('Registered:', domain);
const record = await addRecord('myapp.cc.cd', 'A', '@', '203.0.113.42');
console.log('A record added:', record);
// Add TXT for domain verification / Let's Encrypt
const txt = await addRecord('myapp.cc.cd', 'TXT', '_acme-challenge', 'your-challenge-value');
console.log('TXT record added:', txt);
})();javascript
const fetch = require('node-fetch'); // or use built-in fetch in Node 18+
const API_TOKEN = process.env.DNSHE_API_TOKEN;
const BASE_URL = 'https://www.dnshe.com/api/v1';
const headers = {
'Authorization': `Bearer ${API_TOKEN}`,
'Content-Type': 'application/json',
};
async function registerSubdomain(subdomain, suffix) {
const res = await fetch(`${BASE_URL}/domains`, {
method: 'POST',
headers,
body: JSON.stringify({ subdomain, suffix }),
});
if (!res.ok) throw new Error(`Register failed: ${await res.text()}`);
return res.json();
}
async function addRecord(domain, type, name, value, ttl = 300) {
const res = await fetch(`${BASE_URL}/domains/${domain}/records`, {
method: 'POST',
headers,
body: JSON.stringify({ type, name, value, ttl }),
});
if (!res.ok) throw new Error(`Add record failed: ${await res.text()}`);
return res.json();
}
async function listDomains() {
const res = await fetch(`${BASE_URL}/domains`, { headers });
if (!res.ok) throw new Error(`List failed: ${await res.text()}`);
return res.json();
}
async function renewDomain(domain) {
const res = await fetch(`${BASE_URL}/domains/${domain}/renew`, {
method: 'POST',
headers,
});
if (!res.ok) throw new Error(`Renew failed: ${await res.text()}`);
return res.json();
}
// Example usage
(async () => {
const domain = await registerSubdomain('myapp', 'cc.cd');
console.log('Registered:', domain);
const record = await addRecord('myapp.cc.cd', 'A', '@', '203.0.113.42');
console.log('A record added:', record);
// Add TXT for domain verification / Let's Encrypt
const txt = await addRecord('myapp.cc.cd', 'TXT', '_acme-challenge', 'your-challenge-value');
console.log('TXT record added:', txt);
})();GitHub Actions: Auto-Renewal Workflow
GitHub Actions: 自动续期工作流
yaml
undefinedyaml
undefined.github/workflows/dnshe-renew.yml
.github/workflows/dnshe-renew.yml
name: DNSHE Domain Auto-Renewal
on:
schedule:
- cron: '0 9 * * 1' # Every Monday at 9am UTC
workflow_dispatch:
jobs:
renew:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Set up Python
uses: actions/setup-python@v5
with:
python-version: '3.12'
- name: Install dependencies
run: pip install requests
- name: Run renewal script
env:
DNSHE_API_TOKEN: ${{ secrets.DNSHE_API_TOKEN }}
run: python scripts/renew_domains.pyundefinedname: DNSHE Domain Auto-Renewal
on:
schedule:
- cron: '0 9 * * 1' # Every Monday at 9am UTC
workflow_dispatch:
jobs:
renew:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Set up Python
uses: actions/setup-python@v5
with:
python-version: '3.12'
- name: Install dependencies
run: pip install requests
- name: Run renewal script
env:
DNSHE_API_TOKEN: ${{ secrets.DNSHE_API_TOKEN }}
run: python scripts/renew_domains.pyundefinedBash: Quick Record Update (Dynamic DNS)
Bash: 快速记录更新(动态DNS)
bash
#!/bin/bashbash
#!/bin/bashupdate-dns.sh — Update A record to current public IP
update-dns.sh — Update A record to current public IP
DOMAIN="${DNSHE_DOMAIN:-myproject.us.ci}"
RECORD_ID="${DNSHE_RECORD_ID}" # Get from dashboard or API list
PUBLIC_IP=$(curl -s https://api.ipify.org)
echo "Updating $DOMAIN to $PUBLIC_IP"
curl -s -X PUT "https://www.dnshe.com/api/v1/domains/${DOMAIN}/records/${RECORD_ID}"
-H "Authorization: Bearer $DNSHE_API_TOKEN"
-H "Content-Type: application/json"
-d "{"type": "A", "name": "@", "value": "${PUBLIC_IP}", "ttl": 60}"
-H "Authorization: Bearer $DNSHE_API_TOKEN"
-H "Content-Type: application/json"
-d "{"type": "A", "name": "@", "value": "${PUBLIC_IP}", "ttl": 60}"
---DOMAIN="${DNSHE_DOMAIN:-myproject.us.ci}"
RECORD_ID="${DNSHE_RECORD_ID}" # Get from dashboard or API list
PUBLIC_IP=$(curl -s https://api.ipify.org)
echo "Updating $DOMAIN to $PUBLIC_IP"
curl -s -X PUT "https://www.dnshe.com/api/v1/domains/${DOMAIN}/records/${RECORD_ID}"
-H "Authorization: Bearer $DNSHE_API_TOKEN"
-H "Content-Type: application/json"
-d "{"type": "A", "name": "@", "value": "${PUBLIC_IP}", "ttl": 60}"
-H "Authorization: Bearer $DNSHE_API_TOKEN"
-H "Content-Type: application/json"
-d "{"type": "A", "name": "@", "value": "${PUBLIC_IP}", "ttl": 60}"
---Common Record Patterns
常见记录配置示例
Static Website (A record)
静态网站(A记录)
json
{ "type": "A", "name": "@", "value": "YOUR_SERVER_IP", "ttl": 300 }json
{ "type": "A", "name": "@", "value": "YOUR_SERVER_IP", "ttl": 300 }Subdomain Alias (CNAME)
子域名别名(CNAME)
json
{ "type": "CNAME", "name": "www", "value": "myproject.us.ci", "ttl": 300 }json
{ "type": "CNAME", "name": "www", "value": "myproject.us.ci", "ttl": 300 }Email (MX record)
邮件服务(MX记录)
json
{ "type": "MX", "name": "@", "value": "mail.example.com", "ttl": 300, "priority": 10 }json
{ "type": "MX", "name": "@", "value": "mail.example.com", "ttl": 300, "priority": 10 }SSL Verification (TXT for Let's Encrypt DNS-01)
SSL验证(Let's Encrypt DNS-01的TXT记录)
json
{ "type": "TXT", "name": "_acme-challenge", "value": "ACME_CHALLENGE_TOKEN", "ttl": 60 }json
{ "type": "TXT", "name": "_acme-challenge", "value": "ACME_CHALLENGE_TOKEN", "ttl": 60 }IPv6 (AAAA record)
IPv6(AAAA记录)
json
{ "type": "AAAA", "name": "@", "value": "2001:db8::1", "ttl": 300 }json
{ "type": "AAAA", "name": "@", "value": "2001:db8::1", "ttl": 300 }Service Discovery (SRV)
服务发现(SRV记录)
json
{ "type": "SRV", "name": "_http._tcp", "value": "10 20 80 myproject.us.ci", "ttl": 300 }json
{ "type": "SRV", "name": "_http._tcp", "value": "10 20 80 myproject.us.ci", "ttl": 300 }Supported Record Types
支持的记录类型
| Type | Purpose |
|---|---|
| IPv4 address |
| IPv6 address |
| Canonical name alias |
| Mail exchange |
| Text (SPF, DKIM, ACME) |
| Name server delegation |
| Service locator |
| Certificate authority authorization |
| 类型 | 用途 |
|---|---|
| IPv4地址 |
| IPv6地址 |
| 规范名称别名 |
| 邮件交换 |
| 文本记录(SPF、DKIM、ACME验证) |
| 域名服务器委托 |
| 服务定位器 |
| 证书颁发机构授权 |
Renewal Policy
续期政策
- Window: 180 days before expiry — renew any time within this window.
- Automation: Use the API endpoint in a weekly cron job to never miss a renewal.
/renew - Best practice: Renew at 60–90 days before expiry to leave buffer time.
- 窗口:到期前180天内可续期——在此窗口内随时可操作。
- 自动化:使用API端点搭配每周Cron任务,避免错过续期。
/renew - 最佳实践:在到期前60-90天续期,预留缓冲时间。
Troubleshooting
故障排查
Domain not resolving
域名无法解析
- Check propagation: DNS changes typically propagate in seconds globally via Anycast, but ISP caches can take up to 5 minutes.
- Verify your record was saved: call to confirm.
GET /domains/{domain}/records - Use or
dig myproject.us.cito test resolution.nslookup myproject.us.ci
- 检查生效情况:通过Anycast网络,DNS变更通常数秒内全球生效,但ISP缓存可能需要最多5分钟。
- 确认记录已保存:调用接口验证记录是否存在。
GET /domains/{domain}/records - 使用或
dig myproject.us.ci测试解析情况。nslookup myproject.us.ci
API returning 401
API返回401错误
- Ensure is set correctly.
DNSHE_API_TOKEN - Token may be expired — regenerate in the dashboard.
- 确保设置正确。
DNSHE_API_TOKEN - 令牌可能已过期——在控制台重新生成。
API returning 409 Conflict
API返回409冲突错误
- Subdomain is already taken. Try a different prefix.
- 子域名已被占用,尝试更换前缀。
API returning 429 Too Many Requests
API返回429请求过于频繁错误
- You've hit rate limits. Add exponential backoff in your automation scripts.
- 已触发速率限制,在自动化脚本中添加指数退避机制。
Record update not reflecting
记录更新未生效
- TTL caching: lower the TTL to 60 before making changes, then raise it again after.
- TTL缓存问题:修改记录前将TTL降至60,修改完成后再调回原值。
Compliance & Abuse
合规与滥用
DNSHE has a zero-tolerance policy for illegal use:
- Prohibited: Phishing, fraud, malware, illegal content.
- ToS: dnshe.com/tos.html
- Report Abuse: dnshe.com/domainabuse/
- Security contact: abuse@dnshe.com
DNSHE对非法使用采取零容忍政策:
- 禁止用途:钓鱼、欺诈、恶意软件、非法内容。
- 服务条款:dnshe.com/tos.html
- 举报滥用:dnshe.com/domainabuse/
- 安全联系邮箱:abuse@dnshe.com
Support & Links
支持与链接
| Resource | URL |
|---|---|
| Dashboard | dnshe.com |
| Support Email | support@dnshe.com |
| ToS | dnshe.com/tos.html |
| Abuse Reports | dnshe.com/domainabuse/ |
| 资源 | 链接 |
|---|---|
| 控制台 | dnshe.com |
| 支持邮箱 | support@dnshe.com |
| 服务条款 | dnshe.com/tos.html |
| 滥用举报 | dnshe.com/domainabuse/ |