You found this address in your access log, in a request that said:
User-Agent: Mozilla/5.0 (compatible; uup/1.0; +https://uup.dev/probe) X-Uup-Check: chk_…
The You Up? probe sends both. The uup in them is the name our software gives itself, as in our address, uup.dev, and it stays the same so that rules you write for it keep working.
Every request the probe sends is signed with Web Bot Auth, an open method, being standardized at the IETF, that lets a server or a bot filter check that a request came from the bot it names. The signature is in three more headers:
Signature-Agent: "https://uup.dev" Signature-Input: sig1=… Signature: sig1=:…:
Signature-Agent names us, and it is always exactly "https://uup.dev", quotes included. The other two change with every request. The keys that check them are listed in our key directory, at https://uup.dev/.well-known/http-message-signatures-directory.
A server that ignores these headers works as it did before, and nothing else about the request changes. A server or a bot filter that wants to can check the signature against the key directory. A signature that checks was made with our key, for your site, in the last minute.
You Up? is an uptime monitoring service. A customer of ours asked us to check that an address on your server answers. That customer is usually you, your company, or somebody who builds or runs the site for you.
The probe is not a crawler and not a scanner. It requests the one address it was given, on the schedule the customer chose, from a few places in the world. It follows no links and reads no other pages.
It does not read robots.txt. That file tells crawlers which pages they may visit, and the probe visits only the one address a customer gave it.
A visit may also come from the Down checker, a free tool on uup.dev where anyone can check whether a website answers. Then the request says X-Uup-Check: dck_…, and the probe sends one GET of the address typed, once from each place, with nothing added. It never shows anyone what your server sent back.
The probe reads the status line and the headers, and then it closes the connection. It downloads the body only when the customer asked it to check what the body says, or when the answer is an error, and then it reads only a small part of it.
Some servers write this early close to the log as a client abort. nginx logs it as status 499. Your server did nothing wrong, and neither did the probe. It had what it came for.
If a firewall or a bot filter blocks the probe, our customer is told that your site is down when it is not. The safest way to let it through is to allow requests from the addresses listed under Where it comes from, and to skip bot and rate-limit checks for them. Allow the IPv6 addresses as well as the IPv4 ones. Steps for each service shows where that is done in the tools sites use most.
If your tool can only match a request's headers, allow requests that match either of these:
User-Agent header that contains uup/1.0X-Uup-Check header. Every request the probe sends has one.Anybody can copy a header, so an allow rule on a header is a rule for traffic that you are willing to let anybody send. The signature is different: nobody else can make a new one that checks. If your tool can check it, see Every request is signed.
The value of X-Uup-Check starts with chk_ and names the check that sent the request. The same check always sends the same value. If you run the site, you can use it to recognize your own checks, or to skip a side effect that a monitoring request must not cause.
The probe sends only from these addresses, one server in each place. The list last changed on . When an address is added or replaced, it changes here first, and that date moves.
| Location | Name | Addresses |
|---|---|---|
| New York | us.probe.uup.dev | 194.113.73.1082605:7380:8000:1000:b0a1:fcff:fe31:4439 |
| San Jose | us-sjo.probe.uup.dev | 209.50.61.332604:ed40:1000:1711:b0a1:fcff:fe31:617f |
| Frankfurt | de.probe.uup.dev | 85.9.207.572a04:3542:1000:910:b0a1:fcff:fe31:2cdb |
| Helsinki | fi.probe.uup.dev | 80.47.224.1642a04:3540:1000:310:b0a1:fcff:fe31:1fc9 |
| Singapore | sg.probe.uup.dev | 213.163.193.1522a04:3543:1000:2310:b0a1:fcff:fe31:7791 |
The same addresses, for a script that keeps an allowlist current: ips.txt, one address per line, and ips.json, by location, with updatedAt set to the day the list last changed.
Every address above has reverse DNS that names a host under probe.uup.dev, and that name resolves back to the same address. Only we can set both. Look up the address from your log, then look up the name it gives:
dig -x ADDRESS +short NAME.probe.uup.dev. dig NAME.probe.uup.dev A +short ADDRESS
Ask for AAAA instead of A for an IPv6 address. If the name is not under probe.uup.dev, or it does not lead back to the address you started from, the request did not come from us, whatever its headers say.
Each service names its menus its own way and changes them from time to time. These steps follow what each one publishes, as it read on 14 October 2026. Some keep part of their documentation behind a login; if a menu is not where a step says, their support can point you to it. Add every address from ips.txt, and only those.
The probe is a Cloudflare verified bot: see its entry in Cloudflare Radar's bots directory. If your Cloudflare rules still block it, these steps let it through.
uup_probes and add every address.ip.src in $uup_probes and the action Skip.Or, on any plan, add each address as an IP access rule with the action Allow.
Bot Fight Mode, on the Free plan, cannot be skipped this way. Cloudflare documents that it runs outside its rules, so Skip, Bypass and Allow have no effect on it. If it blocks the probe, turn it off under Security settings, Bot traffic. On Pro and above, Super Bot Fight Mode takes its place, and the Skip rule above lets the probe through it.
A Client List used as an IP/Geo Firewall block exception does not do the same: Akamai documents that it lifts only IP, geography and network blocks, not its other protections.
ip:192.0.2.10 OR ip:"2001:db8::10", with every IPv6 address in double quotes./32 and one for IPv6 with each as /128, in the web ACL's Region, or Global for CloudFront.On BIG-IP Advanced WAF:
On F5 Distributed Cloud, add the addresses to your Bot Defense allowlist policy under IP Allowlist, and to the load balancer's trusted client rules.
In Cloud WAAP, add an advanced rule whose condition is the source address being in a list of these addresses, with the action Bypass.
Kasada publishes no steps of its own for this. Ask Kasada's support or your account team to allow the addresses in ips.txt.
In the firewall dashboard, open the site's Access Control, enter each address under Allow IP Addresses, and press Allow.
Open Wordfence, Firewall, All Firewall Options, add every address to Allowlisted IP addresses that bypass all rules, and save.
To keep the probe out of a limit_req limit, give it an empty key, since nginx does not count a request whose key is empty:
geo $uup_probe {
default 0;
194.113.73.108 1;
2605:7380:8000:1000:b0a1:fcff:fe31:4439 1;
209.50.61.33 1;
2604:ed40:1000:1711:b0a1:fcff:fe31:617f 1;
85.9.207.57 1;
2a04:3542:1000:910:b0a1:fcff:fe31:2cdb 1;
80.47.224.164 1;
2a04:3540:1000:310:b0a1:fcff:fe31:1fc9 1;
213.163.193.152 1;
2a04:3543:1000:2310:b0a1:fcff:fe31:7791 1;
}
map $uup_probe $limit_key {
0 $binary_remote_addr;
1 "";
}
limit_req_zone $limit_key zone=perip:10m rate=10r/s;nginx checks allow and deny in order, so put these above any deny:
allow 194.113.73.108; allow 2605:7380:8000:1000:b0a1:fcff:fe31:4439; allow 209.50.61.33; allow 2604:ed40:1000:1711:b0a1:fcff:fe31:617f; allow 85.9.207.57; allow 2a04:3542:1000:910:b0a1:fcff:fe31:2cdb; allow 80.47.224.164; allow 2a04:3540:1000:310:b0a1:fcff:fe31:1fc9; allow 213.163.193.152; allow 2a04:3543:1000:2310:b0a1:fcff:fe31:7791;
Let the addresses through a block that denies others:
<RequireAny>
Require ip 194.113.73.108 2605:7380:8000:1000:b0a1:fcff:fe31:4439 209.50.61.33 2604:ed40:1000:1711:b0a1:fcff:fe31:617f 85.9.207.57 2a04:3542:1000:910:b0a1:fcff:fe31:2cdb 80.47.224.164 2a04:3540:1000:310:b0a1:fcff:fe31:1fc9 213.163.193.152 2a04:3543:1000:2310:b0a1:fcff:fe31:7791
<RequireAll>
Require all granted
# your existing Require not ip lines
</RequireAll>
</RequireAny>With ModSecurity, load this before your other rules, with an id none of your rules uses:
SecRule REMOTE_ADDR "@ipMatch 194.113.73.108,2605:7380:8000:1000:b0a1:fcff:fe31:4439,209.50.61.33,2604:ed40:1000:1711:b0a1:fcff:fe31:617f,85.9.207.57,2a04:3542:1000:910:b0a1:fcff:fe31:2cdb,80.47.224.164,2a04:3540:1000:310:b0a1:fcff:fe31:1fc9,213.163.193.152,2a04:3543:1000:2310:b0a1:fcff:fe31:7791" \
"id:1000010,phase:1,pass,nolog,ctl:ruleEngine=Off"Behind a proxy or a CDN, the server sees the proxy's address unless it restores the visitor's, with real_ip in nginx or mod_remoteip in Apache.
If you did not ask for this traffic and you want it to stop, or anything about it looks wrong, write to probe@uup.dev. Include the X-Uup-Check value from your log. It lets us find the exact check and the customer who owns it.