Skip to content
InternetData

See which state a telehealth visit comes from.

A clinician may only treat patients in the states they're licensed in. One lookup on a paid plan says which state or province a patient connects from, and whether a VPN, a proxy or a hosting server hides where they really are.

Unlimited lookups, no key needed · Sign up to try every field, no card
Telehealth check-ins
Example
  • Visit 7781
    198.51.100.7
    Austin, TexasTexas clinician
  • Visit 7782
    203.0.113.24
    VPNMullvadConfirm state
  • Portal log-in
    192.0.2.140
    HostingSecond factor
  • Refill request
    203.0.113.91
    CarrierVerizonApproved

Care in the right state, and portals kept safe.

  • State licensure

    A clinician licensed in one state sees a patient connecting from another. Ask the patient to confirm where they are before the visit starts.

    Answered bylocation.region_codeis_vpn
  • Patient portal log-ins

    Credential stuffing hits portals from proxy pools and hosting servers. Ask for a second factor when a log-in comes from one.

    Answered byis_resproxyis_hosting
  • Prescription requests

    Refill requests for controlled medicines come through VPNs to hide where they're from. Hold them for a pharmacist when they do.

    Answered byis_vpnlocation.region
  • Appointment times

    Patients in another timezone miss appointments booked in yours. Show each slot in the patient's own time.

    Answered bylocation.timezone

The state, and what might hide it.

The country, timezone, Tor and privacy relays answer with no key and no daily or monthly cap. The state, and VPN, proxy and hosting flags, come with every paid plan, and Pricing lists every field by plan.

  • location.region, region_code
    The state or province, with its ISO 3166-2 code.Paid plans
  • location.country
    The country, for care across borders.Unlimited
  • location.timezone
    The IANA timezone, for appointment times.Unlimited
  • is_vpn
    A commercial VPN's exit, which hides the patient's state.Paid plans
  • is_resproxy
    A residential proxy exit, the kind credential stuffing runs through.Paid plans
  • is_hosting
    A hosting or cloud server rather than a home or mobile line.Paid plans
  • is_relay
    A privacy relay, such as iCloud Private Relay: usually a real patient.Unlimited

Check at the moments licensure and safety depend on.

  1. 01

    At check-in

    Look up the patient's address when the visit starts and compare its state with the clinician's licenses. A VPN or a different state asks the patient to confirm where they are.

  2. 02

    At portal log-in

    Check each log-in's address before the session opens. A proxy or a hosting server asks for a second factor, and a home or mobile line goes straight through.

  3. 03

    When booking

    Read the timezone as the booking page loads, so every slot shows in the patient's own time. Keep their own choice if they set one.

Start free, then add every field.

The same code runs with no key and with one: without a key it answers the free fields, and an upgrade adds the rest with no change to the code.

  1. 1

    Call it with no key

    Unlimited

    Run the code on this page as it is, with no account.

  2. 2

    Sign up for a key

    No card

    Your account's first 100 lookups each day answer every field, so you can try the state check on real visits.

  3. 3

    Upgrade for every lookup

    From $39 a month

    Every paid plan answers every field on every lookup, and takes up to 1,000 lookups in one request.

import { InternetData } from "@internetdata/internetdata";
// No key needed. With one, every field answers.
const client = new InternetData({ apiKey: process.env.INTERNETDATA_API_KEY });
export async function checkIn(visit) {
const r = await client.lookup(visit.ip);
// The state, VPNs, proxies and hosting answer on a paid plan.
if (r.isVpn || r.isResproxy || (r.isHosting && !r.isRelay)
|| !visit.clinician.states.includes(r.location.region_code)) {
return askPatientToConfirm(visit);
}
return startVisit(visit);
}
checkin.mjsnpm install @internetdata/internetdata

Also available for Web, .NET, Ruby, Rust, Swift, Erlang, Perl and Zig. See all on GitHub →

On this page

Is an address enough to prove where a patient is?

No, and it shouldn't be the only check. It says where the connection is placed and whether a VPN or a proxy may hide it; ask the patient to confirm their location when the two disagree.

00 · Unlimited

Unlimited lookups, no sign-up.

Paste it into a terminal. Any address answers with its country, network, company and hostname, with no key and no daily or monthly cap. ASes and domains answer too.

curl https://api.internetdata.io/8.8.8.8
{
"ip": "8.8.8.8",
"is_bogon": false,
"is_tor": false,
"is_relay": false,
"is_anycast": true,
"is_carrier": false,
"is_satellite": false,
"is_ssh": false,
"is_smtp": false,
"is_web": true,
"is_dns_resolver": true,
"is_bittorrent": false,
"hostname": "dns.google",
"location": {
"continent": "NA",
"continent_name": "North America",
"country": "US",
"country_name": "United States",
"timezone": "America/Los_Angeles",
"currency_code": "USD",
"currency_name": "Dollar",
"currency_symbol": "$",
"flag_emoji": "🇺🇸",
"flag_unicode": "U+1F1FA U+1F1F8"
},
"asn": {
"asn": 15169,
"name": "Google LLC",
"domain": "google.com",
"type": "hosting",
"prefix": "8.8.8.0/24"
},
"company": {
"name": "Google LLC",
"domain": "google.com"
},
"tor": {},
"relay": {},
"abuse": {
"email": "network-abuse@google.com"
}
}
01 · Every field

All of the data on a paid plan.

VPN, proxy, hosting and CDN flags, each naming the operator.
Location to the city, with coordinates and an accuracy radius.
WHOIS records, the whole abuse contact and the services an address runs.
Up to 1,000 addresses, ASes and domains in one request.

A free API key answers every field for its first 100 lookups each day, with no card.