dnshe-freedomains

Compare original and translation side by side

🇺🇸

Original

English
🇨🇳

Translation

Chinese

DNSHE Free Domains & Anycast DNS

DNSHE 免费域名与Anycast DNS

Skill by ara.so — Daily 2026 Skills collection.
DNSHE (dnshe.com) provides free subdomains under
us.ci
,
cc.cd
,
de5.net
, and
ccwu.cc
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.

ara.so提供的技能 — 2026每日技能合集。
DNSHE(dnshe.com)提供
us.ci
cc.cd
de5.net
ccwu.cc
下的免费子域名,由企业级Anycast DNS提供支持。它支持A、AAAA、CNAME、MX、TXT、NS、SRV和CAA记录,提供180天的续期窗口,并支持通过REST API实现全自动化操作——无需信用卡。

Getting Started

快速开始

1. Register an Account

1. 注册账户

Go to dnshe.com and sign up. No credit card needed.
访问dnshe.com并注册账户,无需信用卡。

2. Claim a Subdomain

2. 申领子域名

Search for your desired prefix (e.g.,
myproject
) and pair it with a suffix:
SuffixUse Case
*.us.ci
CI/CD pipelines, API endpoints, SaaS
*.cc.cd
Portfolios, creative projects
*.de5.net
Tech blogs, dev environments, docs
*.ccwu.cc
Personal pages, community projects
搜索你想要的前缀(例如
myproject
),并搭配对应的后缀:
后缀适用场景
*.us.ci
CI/CD流水线、API端点、SaaS服务
*.cc.cd
作品集、创意项目
*.de5.net
技术博客、开发环境、文档站点
*.ccwu.cc
个人页面、社区项目

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
Authorization
header:
Authorization: Bearer $DNSHE_API_TOKEN
Store your token as an environment variable:
bash
export DNSHE_API_TOKEN="your_token_here"
export DNSHE_BASE_URL="https://www.dnshe.com/api/v1"

所有请求需在
Authorization
头部携带Bearer令牌:
Authorization: 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
undefined
yaml
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.py
undefined
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.py
undefined

Bash: Quick Record Update (Dynamic DNS)

Bash: 快速记录更新(动态DNS)

bash
#!/bin/bash
bash
#!/bin/bash

update-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}"

---
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}"

---

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

支持的记录类型

TypePurpose
A
IPv4 address
AAAA
IPv6 address
CNAME
Canonical name alias
MX
Mail exchange
TXT
Text (SPF, DKIM, ACME)
NS
Name server delegation
SRV
Service locator
CAA
Certificate authority authorization

类型用途
A
IPv4地址
AAAA
IPv6地址
CNAME
规范名称别名
MX
邮件交换
TXT
文本记录(SPF、DKIM、ACME验证)
NS
域名服务器委托
SRV
服务定位器
CAA
证书颁发机构授权

Renewal Policy

续期政策

  • Window: 180 days before expiry — renew any time within this window.
  • Automation: Use the
    /renew
    API endpoint in a weekly cron job to never miss a renewal.
  • Best practice: Renew at 60–90 days before expiry to leave buffer time.

  • 窗口:到期前180天内可续期——在此窗口内随时可操作。
  • 自动化:使用
    /renew
    API端点搭配每周Cron任务,避免错过续期。
  • 最佳实践:在到期前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
    GET /domains/{domain}/records
    to confirm.
  • Use
    dig myproject.us.ci
    or
    nslookup myproject.us.ci
    to test resolution.
  • 检查生效情况:通过Anycast网络,DNS变更通常数秒内全球生效,但ISP缓存可能需要最多5分钟。
  • 确认记录已保存:调用
    GET /domains/{domain}/records
    接口验证记录是否存在。
  • 使用
    dig myproject.us.ci
    nslookup myproject.us.ci
    测试解析情况。

API returning 401

API返回401错误

  • Ensure
    DNSHE_API_TOKEN
    is set correctly.
  • 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:

DNSHE对非法使用采取零容忍政策:

Support & Links

支持与链接

ResourceURL
Dashboarddnshe.com
Support Emailsupport@dnshe.com
ToSdnshe.com/tos.html
Abuse Reportsdnshe.com/domainabuse/
资源链接
控制台dnshe.com
支持邮箱support@dnshe.com
服务条款dnshe.com/tos.html
滥用举报dnshe.com/domainabuse/