FastDDNS 客户端 API

每当你的IP地址发生变化时,自动更新你的动态DNS主机名。

概述

FastDDNS 客户端 API 允许任何支持 HTTP 的设备——路由器、IP 摄像头、脚本或专用更新软件——保持你的 DNS 主机名指向你当前的 IP 地址。 该 API 遵循简单的 GET 请求设计:客户端发送凭证和主机名,服务器会以简短的状态码响应结果。

服务器会自动检测到客户端的公共IP地址。指定IP不需要额外参数。

i️ HTTPHTTPS(HTTPS)都被支持。强烈建议使用 HTTPS 以保护你在传输过程中的凭证。

认证

该API支持两种认证方式。两者都被同等接受——选择在你的设备或路由器上更容易配置的那个。

🔑 每个主机名的凭证:你在FastDDNS上创建的每个主机名都会被分配到专属的user_nameuser_pass。这些凭证可以只有 更新该特定主机名后,无法登录FastDDNS管理仪表盘。这种设计限制了设备凭证被泄露时的影响。

方法1 — HTTP基本认证(URL嵌入)

凭据通过标准的user:password@host格式嵌入URL中。路由器、摄像头和HTTP客户端库都广泛支持该功能。用仪表盘上的更新器客户端密钥作为密码。

https://{user_name}:{user_pass}@client.fastddns.net/?hostname={hostname}


场地 描述 在哪里可以找到
{user_name} 用户名是在创建时分配给该特定主机名的。 FastDDNS 仪表盘→主机名→详细信息
{user_pass} 密码是在创建时分配给该特定主机名的。 FastDDNS 仪表盘→主机名→详细信息
{hostname} 更新的完全限定主机名,例如:testhost.fastddns.org FastDDNS 仪表盘→主机名→详细信息

方法2 — 查询字符串参数

凭据作为纯查询参数与hostname一起传递。这对于无法配置 HTTP Basic 认证头部但允许完全自定义 URL 字符串的设备和固件非常有用。

https://client.fastddns.net/?hostname={hostname}&user_name={user_name}&user_pass={user_pass}
参数 类型 描述
{user_name}


string 用户名是创建时分配给该主机名的。
{user_pass} string 这个主机名在创建时分配的密码。
{hostname} string 要更新的完全限定主机名,例如 testhost.fastddns.org

使用查询字符串认证的示例:

https://client.fastddns.net/?hostname=testhost.fastddns.org&user_name=fastddnstest&user_pass=569832
⚠️ 使用查询字符串认证时,始终优先选择 HTTPS,这样凭证不会以明文形式传输。 HTTP 可用,但应仅用于可信的本地网络或测试。

执行更新

发送一个GET请求,更新注册在你账户中的主机名的IP地址。每次请求会更新一个主机名

终点

GET https://client.fastddns.net/
也可以通过普通 HTTP 访问——将 https 替换为 http

URL 格式 — 方法1:HTTP 基本认证

https://{user_name}:{user_pass}@client.fastddns.net/?hostname={hostname}

URL 格式 — 方法二:查询字符串

https://client.fastddns.net/?hostname={hostname}&user_name={user_name}&user_pass={user_pass}

查询参数

参数 类型 描述
hostname 要求 string 更新的主机名(FQDN),例如 myhome.fastddns.nettesthost.fastddns.org。每个请求只支持一个主机名。
user_name 方法二 string 这个主机名的用户名。使用查询字符串认证(方法2)时必须这样做。使用HTTP Basic Auth(方法1)时不需要。
user_pass 方法二 string 这个主机名的密码。使用查询字符串认证(方法2)时必须这样做。使用HTTP Basic Auth(方法1)时不需要。
IP自动检测:服务器会利用输入TCP连接的源IP来确定你的公共IP地址。你不需要提供myip参数。

示例请求

方法1 — 基于HTTPS的HTTP基本认证:

https://fastddnstest:569832@client.fastddns.net/?hostname=testhost.fastddns.org

方法二 — HTTPS上的查询字符串:

https://client.fastddns.net/?hostname=testhost.fastddns.org&user_name=fastddnstest&user_pass=569832

使用纯HTTP(仅测试/可信网络):

http://fastddnstest:569832@client.fastddns.net/?hostname=testhost.fastddns.org

退货代码

所有更新响应都会返回HTTP状态200 OK 正文是纯文本。 你的客户必须解析这段文本,以确定更新的实际结果。

good {ip}

更新成功

主机名记录已更新为检测到的IP地址。实际的IP会包含在回复中,例如good 203.0.113.45。这是IP变更时的预期反应。

nochg {ip}

无需更改

主机名已经指向检测到的IP地址——不需要更新。当前IP包含在内,例如nochg 203.0.113.45。这是正常的、无错误的响应。

badauth

认证失败

用户名或更新客户端密钥错误或已被撤销。请在FastDDNS仪表盘中验证你的凭证。不要自动重试——先修复凭证。

nohost

主机名未找到

指定的主机名不存在于你的账户中,或者不符合动态更新的资格。检查主机名拼写,确认它是否注册在你的账户下。

911

服务器错误

FastDDNS 服务器端发生了内部错误。至少等5分钟再重试。如果问题依旧,请查看FastDDNS状态页面或联系支持。

回应摘要

回应文本 HTTP 状态 含义 需要采取行动
good {ip} 200 IP 更新成功 无 — 更新完成
nochg {ip} 200 IP未变,未更新 没有——已经是新的
badauth 200 无效凭证 检查用户名/客户端密钥
nohost 200 主机名未注册 在仪表盘中验证主机名
911 200 服务器端错误 5+分钟后重试
⚠️ 自动化的重要性:总是解析回应正文 ,不仅仅是HTTP状态码。API 总是返回 200——文本正文告诉你更新是否真的成功。

获取客户端IP

FastDDNS 提供了一个简单的工具端点,返回服务器所见的公共 IP 地址。 这对调试、验证设备发送的IP或在调用更新端点前的自定义脚本中非常有用。

终点

GET https://client.fastddns.net/dyndns/getip
无需身份验证。也可以通过普通 HTTP 访问。

反响

返回HTTP200 OK 在响应正文中,检测到的公共IP地址以明文形式显示。

# Example response body
203.0.113.45RESPONSE

示例请求

https://client.fastddns.net/dyndns/getip
http://client.fastddns.net/dyndns/getip

使用 curl

curl https://client.fastddns.net/dyndns/getipSHELL

代码示例

Shell / cURL

# Method 1: HTTP Basic Auth (HTTPS, IP auto-detected)
curl "https://fastddnstest:[email protected]/?hostname=testhost.fastddns.org"
# Method 2: Query string credentials
curl "https://client.fastddns.net/?hostname=testhost.fastddns.org&user_name=fastddnstest&user_pass=569832"
# Check what IP the server sees from your device
curl "https://client.fastddns.net/dyndns/getip"SHELL

蟒蛇

import requests
HOSTNAME  = "testhost.fastddns.org"
USER_NAME = "fastddnstest"
USER_PASS = "569832"
# Method 1: HTTP Basic Auth
resp = requests.get(
    "https://client.fastddns.net/",
    auth=(USER_NAME, USER_PASS),
    params={"hostname": HOSTNAME}
)
# Method 2: Query string
# resp = requests.get("https://client.fastddns.net/", params={
#     "hostname": HOSTNAME, "user_name": USER_NAME, "user_pass": USER_PASS
# })
body = resp.text.strip()
if body.startswith("good"):
    print(f"Updated successfully: {body}")
elif body.startswith("nochg"):
    print(f"No change needed: {body}")
elif body == "badauth":
    print("Authentication failed. Check credentials.")
elif body == "nohost":
    print("Hostname not found.")
elif body == "911":
    print("Server error. Try again later.")PYTHON

PHP

<?php
$hostname  = 'testhost.fastddns.org';
$user_name = 'fastddnstest';
$user_pass = '569832';
// Method 1: HTTP Basic Auth embedded in URL
$url = "https://{$user_name}:{$user_pass}@client.fastddns.net/?hostname=" . urlencode($hostname);
// Method 2: Query string credentials
// $url = "https://client.fastddns.net/?hostname=" . urlencode($hostname)
//      . "&user_name=" . urlencode($user_name)
//      . "&user_pass=" . urlencode($user_pass);
$ctx = stream_context_create(['http' => ['timeout' => 10]]);
$body = trim(file_get_contents($url, false, $ctx));
switch (true) {
    case str_starts_with($body, 'good'):
        echo "Updated: {$body}\n"; break;
    case str_starts_with($body, 'nochg'):
        echo "No change: {$body}\n"; break;
    case $body === 'badauth':
        echo "Auth failed. Check hostname credentials.\n"; break;
    case $body === 'nohost':
        echo "Hostname not found.\n"; break;
    case $body === '911':
        echo "Server error, retry later.\n"; break;
}PHP

Bash(Cron / 路由器脚本)

#!/bin/bash
HOSTNAME="testhost.fastddns.org"
USER_NAME="fastddnstest"
USER_PASS="569832"
# Method 1: HTTP Basic Auth
RESULT=$(curl -s "https://${USER_NAME}:${USER_PASS}@client.fastddns.net/?hostname=${HOSTNAME}")
# Method 2: Query string (uncomment to use instead)
# RESULT=$(curl -s "https://client.fastddns.net/?hostname=${HOSTNAME}&user_name=${USER_NAME}&user_pass=${USER_PASS}")
case "$RESULT" in
  good*)   echo "[OK] $RESULT" ;;
  nochg*)  echo "[OK] $RESULT" ;;
  badauth) echo "[ERR] Bad credentials — check hostname user/pass"; exit 1 ;;
  nohost)  echo "[ERR] Hostname not found"; exit 1 ;;
  911)     echo "[ERR] Server error, retry later"; exit 1 ;;
  *)       echo "[WARN] Unknown response: $RESULT" ;;
esacBASH

故障排除

我收到badauth

所提供的user_nameuser_pass与分配给该主机名的凭证不匹配。 每个主机名都有独立的凭据——可以在你的仪表盘下找到主机名→详情 . 请注意,这些凭据是针对主机名的,不能用于登录FastDDNS管理门户。 如果你最近重置了凭证,请更新使用该主机名的所有设备。

我收到nohost

hostname参数中的主机名不存在,或者不属于所提供的凭证所识别的账户。 检查主机名是否有错别字,确认它在你的仪表盘上列出,并确认user_nameuser_pass是否匹配那个特定的主机名 .

服务器检测到错误的 IP

服务器使用TCP连接的源IP。如果你的设备位于NAT路由器后面,路由器的公共IP会被检测到——这通常是理想的行为。如果你在VPN或代理上,服务器会看到VPN/代理的退出IP。 用getip endpoint来验证服务器从你的设备看到的IP地址。

我收到911

这表明存在临时的服务器端问题。至少等5分钟再重试。不要快速循环请求——这可能会触发速率限制。请查看FastDDNS状态页面是否有任何活跃事件。

我应该多久轮询一次更新端点?

我们建议每5分钟检查一次IP变更。当你的IP没有变化时,服务器会返回nochg,这是一种轻量级的无操作。不建议每分钟超过一次轮询,可能导致速率限制。