> ## Documentation Index
> Fetch the complete documentation index at: https://vpn-docs.wxapros.com/llms.txt
> Use this file to discover all available pages before exploring further.

# Point-in-time lookups

> Our answer for an IP on a past day, from a daily archive kept since 2026-07-31. Business and Enterprise.

Add `as_of` to a single-IP lookup to get our answer for that IP on a past UTC
day instead of today. Point-in-time lookups come with the Business and
Enterprise plans; on any other plan the request gets `403`.

```
GET https://vpn-proxy-detection.whoisxmlapi.com/api/v1?apiKey=YOUR_API_KEY&ipAddress=193.32.248.66&as_of=2026-10-01
```

The path form takes it too: `GET /api/v1/ip/193.32.248.66?as_of=2026-10-01`.
Batch lookups don't take `as_of`.

## The archive

We keep each UTC day's classification data, starting with 2026-07-31, and add
a day each day. Write the day as `YYYY-MM-DD`. A day the archive doesn't hold
gets `400 as_of_outside_coverage`, and the error gives the first and last days
it does hold.

## The answer

```json theme={null}
{
  "ip": "193.32.248.66",
  "as_of": "2026-10-01",
  "network": "193.32.248.66/32",
  "classification": "vpn",
  "provider": "mullvad",
  "confidence": 1.0,
  "first_seen": "2026-03-29T15:58:25.399655+00:00",
  "last_seen": "2026-10-01T04:26:35.597830+00:00",
  "observation_count": 0,
  "hits_days_pct": null,
  "providers_num": 0,
  "freshness_class": "current",
  "is_vpn": true,
  "is_proxy": false,
  "is_tor": false,
  "is_relay": false,
  "is_hosting": false,
  "is_cdn": false,
  "is_residential_proxy": false,
  "is_residential_proxy_high_confidence": false,
  "is_residential_proxy_mobile": false,
  "is_open_proxy": false,
  "is_corporate_vpn": false,
  "netblock": "193.32.248.0-193.32.248.255",
  "netname": "NET-31173-193-32-248-0-24",
  "netblock_org": "31173 Services Germany",
  "archive": {
    "first_day": "2026-07-31",
    "last_day": "2026-10-29",
    "data_as_of": "2026-10-01T06:30:02.524799+00:00",
    "errata": []
  }
}
```

The body is `IpAsOfResponse` in the [single-IP reference](https://vpn-docs.wxapros.com/api-reference/lookup-ip.md).
It carries that day's `classification`, `provider` and `confidence`, the
sighting fields (`first_seen`, `last_seen`, `observation_count`,
`hits_days_pct`, `providers_num`), the `is_*` flags and the registered network
owner, under the same plan rules as a lookup for today.

`freshness_class` is measured on that day, from `archive.data_as_of`: in the
example, the address was last seen two hours before that day's most recent
observation, so it reads `current`.

Fields that describe the present are left out: `asn`, `asn_org`, `infra_type`,
`risk_score`, `reasons`, `source`, `metadata` and the enrichment objects.

The `archive` block gives the archive's `first_day` and `last_day`, the time of
the most recent observation in that day's data (`data_as_of`), and `errata`:
known problems with that day's data, in plain words. It is empty on most days.

## Today's rules, that day's data

An answer is rebuilt from that day's archived data under today's
data-handling and attribution rules. It is not a copy of what a lookup returned
on that day, so a name or a label can differ from that day's answer.

## Credits and errors

A successful answer uses one lookup credit, like any single lookup; errors use
none. On top of the errors any lookup can return:

| Status | `error.code` | When |
| - | - | - |
| `400` | `invalid_as_of` | The value is not a calendar day written `YYYY-MM-DD` |
| `400` | `as_of_outside_coverage` | The archive holds no such day; `first_day` and `last_day` in the error give the days it holds |
| `503` | `as_of_warming` | That day is being prepared, or the archive is busy; retry after the seconds in the `Retry-After` header |
| `503` | `as_of_over_budget` or `as_of_unavailable` | The lookup can't be served right now; retry later |


This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.