Hello Square Developer Support,
We are unable to create a Sandbox webhook subscription for our Square application, although the notification URL is publicly reachable.
Application details
- Application: HB POS
- Application ID: `sq0idp-r2GuCM5jVxp5eNYxB4oPww`
- Environment: Sandbox
- Notification URL: `https://[REDACTED-DOMAIN]/pos-api/api/v1/square/webhooks`
The Developer Console returns HTTP 400:
```json
{
“errors”: [
{
“category”: “INVALID_REQUEST_ERROR”,
“code”: “UNREACHABLE_URL”,
“detail”: “URL is unreachable for `subscription.notification_url`.”,
“field”: “subscription.notification_url”
}
]
}
```
The same Square application successfully accepts this ngrok URL:
`https://[REDACTED-NGROK-DOMAIN]/api/v1/square/webhooks`
We also tested:
`https://www.[REDACTED-DOMAIN]/pos-api/api/v1/square/webhooks`
Both [REDACTED-DOMAIN] URLs were rejected with `UNREACHABLE_URL`.
Architecture clarification
`[REDACTED-DOMAIN]` is an existing, separate website hosted on the same server. Nginx serves that website on HTTPS port 443, while the `/pos-api/` path is reverse-proxied to a separate POS API service listening locally on port 5003. Port 5003 is not intended to be accessed directly from the public internet.
During the Square reachability tests, the exact webhook path was temporarily configured at the Nginx layer to return an immediate HTTP 200 response, specifically to rule out the backend application, signature validation, and response time.
Diagnostic results
- DNS A record resolves consistently to the expected origin IP.
- There is no AAAA record.
- DNSPod authoritative nameservers return the same result.
- The TLS certificate is valid and covers both `[REDACTED-DOMAIN]` and `www.[REDACTED-DOMAIN]`.
- TLS 1.2, TLS 1.3, HTTP/1.1, HTTP/2, SNI, and ALPN work.
- The certificate chain validates successfully and includes the intermediate certificate.
- The exact notification URL returned HTTP 200 during the reachability test.
- Fourteen public probes across the US, Europe, Australia, New Zealand, and Japan returned HTTP 200.
- AWS probes in `us-east-1` and `us-west-2` also returned HTTP 200.
- TCP port 443 is open publicly in both the cloud firewall and host firewall.
- The published Square Sandbox webhook IP addresses are not blocked.
Most importantly, during each failed save attempt, we captured **all inbound TCP SYN packets to port 443** for approximately 25–30 seconds. No connection attempt from Square reached the server, and Nginx recorded no access-log or error-log entry.
Failure times
- Initial failure: approximately `2026-07-13 08:40 UTC`
- Apex-domain retry: approximately `2026-07-13 08:53 UTC`
- www-domain retry: `2026-07-13 09:07:51 UTC`
Because no TCP connection reached the origin, this does not appear to be caused by the Nginx path routing or the API service on port 5003. The failure seems to occur before the request reaches our server, possibly in the subscription URL validator’s DNS resolution, egress routing, TLS preflight, security/SSRF/reputation policy, cache, or timeout handling.
Could a Square team member please inspect the internal webhook URL validator logs for the application and timestamps above and advise:
- Did the validator resolve `[REDACTED-DOMAIN]` to the expected origin IP?
- Did the validator attempt a TCP connection?
- Was the domain or IP rejected by a security, SSRF, or reputation policy?
- Is the domain’s TLD, Tencent Cloud IP/ASN, or DNSPod path restricted?
- Is there a cached unreachable result that can be cleared?
- Does the control-plane validator use the published Sandbox webhook IPs or different egress IPs, and what connection timeout does it enforce?
We have not included any access token, signature key, or customer code.
Thank you.