API v1.0
Developer API
The checks behind the tools on this site, available over HTTP. No key, no account, no registration.
Introduction
Every endpoint below runs the same code as the corresponding tool page. There is no
separate implementation and no reduced version — /api/v1/dns is the lookup the
DNS checker performs, and /api/v1/email-health is the check the email tool runs.
The base URL is https://ipget.app. Every response is JSON. Successful responses
carry a data object and a meta object; failures carry an
error object with a stable code and a human-readable
message. Nothing else is ever returned — no stack traces, no server details,
no upstream vendor names.
What it is for
-
IP intelligence
Read the address a request arrived from, its version and whether it is globally routable — without shipping a third-party script to your users.
-
DNS tooling
Look up A, AAAA, CNAME, MX, TXT, NS, SOA and CAA records from a fixed resolver, for dashboards, CI checks and onboarding flows.
-
Security checks
Inspect the certificate a host actually serves, and read the four DNS records that decide whether a domain can send and receive mail.
Authentication
None, currently. These endpoints are open and unauthenticated. Rate limits apply per calling address.
Keys and paid tiers are planned. When they arrive, the endpoints documented here will keep
working without a key at the free tier — a URL under /api/v1/ will not start demanding
authentication, because that would break every client written against this page.
Response envelope
Success
{
"data": { … },
"meta": {
"timestamp": "2026-08-18T21:04:11.482Z",
"version": "1.0"
}
} Failure
{
"error": {
"code": "invalid_input",
"message": "Enter a domain name."
}
} Rate limits
Limits are per calling address and per endpoint class, so exhausting the DNS budget leaves the certificate budget untouched. Every response carries the remaining allowance.
| Class | Limit | Why |
|---|---|---|
| cheap | 60 / 60s | Answered from the request itself, with no upstream lookup. |
| dns | 30 / 60s | Each request costs at least one query to a public DNS resolver. |
| network | 15 / 60s | Each request opens an outbound connection to the host being checked. |
Every response — successful or not — includes:
X-RateLimit-Limit— requests permitted in the window.X-RateLimit-Remaining— requests still available.X-RateLimit-Reset— seconds until the window resets.X-API-Version— which version answered.
A 429 additionally carries Retry-After. The standard
RateLimit-* fields are sent alongside the X- forms.
Endpoints
IP address
GET /api/v1/ip Returns the public address the request arrived from, its version, and whether it is a globally routable address.
Rate limit: 60 requests / 60s
Examples
curl -s "https://ipget.app/api/v1/ip"
Response
{
"data": {
"ip": "93.184.216.34",
"version": 4,
"scope": "public"
},
"meta": {
"timestamp": "2026-08-18T21:04:11.482Z",
"version": "1.0"
}
}
Errors
-
unavailable(503) — The request address could not be determined. -
rate_limited(429) — The rate limit for this endpoint class was exceeded. -
invalid_input(400) — A parameter was missing, malformed or out of range. -
unavailable(502) — The request could not be completed. Safe to retry.
DNS lookup
GET /api/v1/dns Looks up one record type for one domain. The resolver is fixed and the record type must be one of the supported set, so this is a lookup rather than a proxy.
Rate limit: 30 requests / 60s
| Parameter | Required | Description |
|---|---|---|
| domain | Yes | A domain name. No protocol, path or port. Internationalised names are converted to punycode. |
| type | No | One of A, AAAA, CNAME, MX, TXT, NS, SOA, CAA. Defaults to A. |
Examples
curl -s "https://ipget.app/api/v1/dns?domain=example.com"
Response
{
"data": {
"domain": "example.com",
"type": "A",
"records": [
{ "type": "A", "value": "93.184.215.14", "ttl": 234 }
],
"empty": false
},
"meta": {
"timestamp": "2026-08-18T21:04:12.109Z",
"version": "1.0",
"cached": false
}
}
Errors
-
nxdomain(404) — No DNS zone exists for that domain. -
dns_timeout(504) — The resolver did not answer in time. -
dns_refused(502) — The nameserver refused the query. -
rate_limited(429) — The rate limit for this endpoint class was exceeded. -
invalid_input(400) — A parameter was missing, malformed or out of range. -
unavailable(502) — The request could not be completed. Safe to retry.
TLS certificate
GET /api/v1/ssl Inspects the certificate a public host actually serves: issuer, validity dates, chain, subject alternative names and the negotiated cipher. Only ports that begin TLS immediately can be inspected.
Rate limit: 15 requests / 60s
| Parameter | Required | Description |
|---|---|---|
| domain | Yes | A domain name or a full https:// URL. The path is ignored. |
| port | No | Defaults to 443. STARTTLS ports such as 25, 110, 143 and 587 are refused. |
Examples
curl -s "https://ipget.app/api/v1/ssl?domain=github.com"
Response
{
"data": {
"hostname": "github.com",
"address": "140.82.121.4",
"port": 443,
"protocol": "TLSv1.3",
"validity": "valid",
"validFrom": "2026-02-05T00:00:00.000Z",
"validTo": "2027-02-05T23:59:59.000Z",
"daysRemaining": 171
},
"meta": {
"timestamp": "2026-08-18T21:04:13.771Z",
"version": "1.0"
}
}
Errors
-
blocked_target(403) — The host resolved to a non-public address. -
tls_failed(502) — The TLS handshake could not be completed. -
upstream_timeout(504) — The host did not answer in time. -
rate_limited(429) — The rate limit for this endpoint class was exceeded. -
invalid_input(400) — A parameter was missing, malformed or out of range. -
unavailable(502) — The request could not be completed. Safe to retry.
Email DNS health
GET /api/v1/email-health Reads MX, SPF, DKIM and DMARC for a domain and returns a grade with findings. Counts SPF DNS lookups through include chains against the RFC 7208 limit of ten. Sends no mail and opens no SMTP connection.
Rate limit: 30 requests / 60s
| Parameter | Required | Description |
|---|---|---|
| domain | Yes | A domain name. |
| selector | No | A DKIM selector. DKIM is only checked when one is supplied — selectors cannot be discovered from DNS. |
Examples
curl -s "https://ipget.app/api/v1/email-health?domain=example.com"
Response
{
"data": {
"domain": "google.com",
"mx": { "present": true, "lookupFailed": false, "hosts": [{ "host": "smtp.google.com", "priority": 10 }], "ttl": 300, "nullMx": false },
"spf": { "present": true, "lookupCount": 1, "lookupCountPartial": false, "all": "~all" },
"dkim": { "selector": null, "present": null },
"dmarc": { "present": true, "policy": "reject", "rua": ["mailto:mailauth-reports@google.com"] },
"grade": "excellent",
"issues": []
},
"meta": {
"timestamp": "2026-08-18T21:04:15.003Z",
"version": "1.0"
}
}
Errors
-
nxdomain(404) — No DNS zone exists for that domain. -
dns_timeout(504) — A resolver did not answer in time. -
rate_limited(429) — The rate limit for this endpoint class was exceeded. -
invalid_input(400) — A parameter was missing, malformed or out of range. -
unavailable(502) — The request could not be completed. Safe to retry.
Roadmap
Version 1.0 is what exists today. Everything below “next” is intent rather than a commitment, and none of it is built.
- now Four endpoints, open and unauthenticated, rate limited per address.
- next API keys with per-key quotas, so limits follow the client rather than the network it happens to be on.
- next More endpoints promoted from the internal set — reverse DNS, HTTP headers and WHOIS are the likely first three.
- later Paid tiers for higher volume. The free tier stays genuinely useful; that is the point of it.
- later Bulk lookups, for callers checking many domains at once rather than looping.
API questions
Do I need an API key?
No. Every endpoint below is open, unauthenticated and free to call. Rate limits are applied per calling address rather than per key. Keys and plans are on the roadmap, and when they arrive the current endpoints will keep working unauthenticated at the free tier — a v1 URL will not start requiring a key.
Is there a paid plan?
Not yet, and there is no billing code in the project. The intention is a free tier that stays genuinely useful, with paid tiers for higher volume. Until that exists, the honest answer is that these endpoints are best-effort and should not be depended on for anything critical.
What happens when I exceed a rate limit?
You get HTTP 429 with the standard error envelope and a Retry-After header. Every response, successful or not, carries X-RateLimit-Limit, X-RateLimit-Remaining and X-RateLimit-Reset, so a well-behaved client can slow down before being refused rather than after.
Can I check private or internal hosts?
No. Every endpoint that makes an outbound connection resolves the host first and refuses private, loopback, link-local and cloud-metadata addresses, then connects to the address it validated rather than to the name. That restriction is what makes it safe to offer these publicly, and it applies to redirects too.
Do you log what I look up?
No. Domains, addresses and URLs passed to these endpoints are not stored, not logged and not sent to any analytics system. Results are cached in memory by the value looked up so a repeated query is cheap, and that cache holds no record of who asked. There is no per-request record of any kind, which is also why there are no per-customer usage statistics.
Is CORS allowed?
Yes. Every endpoint answers preflight requests and permits cross-origin reads, so you can call the API directly from a browser without a proxy.