> Documentation

DataSentry Docs

IP intelligence API. Lookup, geolocation, threat data, and carrier info.

Quick Start

Get your first IP lookup in under 5 minutes.

1

Create an account and get your API key

Sign up at datasentry.site/pricing, choose a plan, and copy your API key from the dashboard.

2

Make your first request

curl
curl -H "x-api-key: YOUR_API_KEY" \
  "https://api.datasentry.site/v1/lookup?ip=8.8.8.8"
3

Get the response

response
{
  "ip": "8.8.8.8",
  "location": {
    "country": "United States",
    "country_code": "US",
    "region": "California",
    "city": "Mountain View",
    "latitude": 37.422,
    "longitude": -122.084,
    "timezone": "America/Los_Angeles",
    "isp": "Google LLC",
    "asn": "AS15169 Google LLC"
  },
  "security": {
    "is_vpn": false,
    "is_proxy": false,
    "is_tor": false,
    "is_hosting": false,
    "risk_score": 0,
    "threat_types": []
  },
  "carrier": {
    "mobile": false,
    "carrier": "Google LLC",
    "connection_type": "unknown"
  }
}

Authentication

Every request requires an API key passed in the x-api-key header.

header
x-api-key: ds_prod_xxxxxxxxxxxxxxxx

Find your key in the API Keys dashboard. Keys start with ds_prod_.

! Never expose your API key in client-side code or public repositories.

Error Handling

Errors use RFC 7807 Problem Details format.

ParameterTypeDescription
400Bad RequestInvalid IP address or missing parameter
401UnauthorizedMissing or invalid API key
429Too Many RequestsRate limit or quota exceeded
500Internal Server ErrorServer-side lookup failure
response
{
  "type": "https://datasentry.site/errors",
  "title": "Bad Request",
  "status": 400,
  "detail": "Missing required query parameter: ip"
}
GET

/v1/lookup

Look up geolocation, security, and carrier data for a single IPv4 address.

Parameters

ParameterTypeDescription
ip*stringIPv4 address to lookup
fieldsstringComma-separated fields to include in response
nocachebooleanSkip cache and fetch fresh data

Example

curl
curl -H "x-api-key: ds_prod_xxxxxxxx" \
  "https://api.datasentry.site/v1/lookup?ip=8.8.8.8"

Response

response
{
  "ip": "8.8.8.8",
  "location": {
    "country": "United States",
    "country_code": "US",
    "region": "California",
    "city": "Mountain View",
    "latitude": 37.422,
    "longitude": -122.084,
    "timezone": "America/Los_Angeles",
    "isp": "Google LLC",
    "asn": "AS15169 Google LLC"
  },
  "security": {
    "is_vpn": false,
    "is_proxy": false,
    "is_tor": false,
    "is_hosting": false,
    "risk_score": 0,
    "threat_types": []
  },
  "carrier": {
    "mobile": false,
    "carrier": "Google LLC",
    "connection_type": "unknown"
  },
  "metadata": {
    "lookup_time_ms": 12.5,
    "cached": false,
    "source": "maxmind"
  }
}
POST

/v1/bulk

Look up multiple IPs in a single request. Maximum 1,000 IPs per request. Each batch counts as one quota unit.

Request Body

ParameterTypeDescription
ips*string[]Array of IPv4 addresses (max 1,000)

Example

curl
curl -X POST \
  -H "x-api-key: ds_prod_xxxxxxxx" \
  -H "Content-Type: application/json" \
  -d '{"ips": ["8.8.8.8", "1.1.1.1", "208.67.222.222"]}' \
  "https://api.datasentry.site/v1/bulk"

Response

response
{
  "request_id": "550e8400-e29b-41d4-a716-446655440000",
  "total": 3,
  "results": [
    {
      "ip": "8.8.8.8",
      "location": { "country": "United States", "city": "Mountain View", ... },
      "security": { ... },
      "carrier": { ... }
    },
    { ... },
    { ... }
  ],
  "response_time_ms": 45.2
}
GET

/api/health

Check service health and dependency status. No authentication required.

response
{
  "status": "ok",
  "timestamp": "2026-05-29T12:00:00.000Z",
  "services": {
    "redis": "connected",
    "clerk": "configured",
    "polar": "configured",
    "database": "configured"
  }
}

Dashboard

The web dashboard at datasentry.site/dashboard gives you full visibility and control.

Overview

Real-time API usage stats, response latency metrics, and geographic distribution of your lookups. The overview loads data from /api/dashboard/overview.

API Keys

Create, view, and revoke API keys. Each key is tied to your account and scoped to your subscription plan. Keys are displayed once at creation.

Usage

Track monthly quota consumption, daily request volume, and per-endpoint breakdowns. Data sourced from /api/dashboard/usage.

Playground

Test API calls interactively. Enter an IP address or paste a bulk request body and see the response in real time.

Billing

Subscription management has moved to Settings. You can view your current plan, upgrade, or cancel your subscription from the Account tab. For billing issues, contact supp.datasentry@gmail.com.

Settings

Configure webhook endpoints for subscription events, set usage notification thresholds, manage API preferences, and handle subscription billing (upgrade, cancel, view plan status).

Threat Feed

Real-time threat intelligence view. Browse flagged IPs, threat scores, and risk classifications from recent lookups.

Bulk Ops

Batch IP lookup tool. Paste or upload a list of IPs and get results without writing code.

Integrations

Overview of available integrations: CLI tool, JavaScript SDK, Python SDK, MCP Server, and webhooks.

JavaScript SDK

Zero-dependency TypeScript client. Uses native fetch. Works in Node.js 18+ and browsers.

Install

terminal
npm install @datasentry/sdk

Usage

typescript
import { DataSentry } from "@datasentry/sdk";

const client = new DataSentry({ apiKey: "ds_prod_xxxxxxxx" });

// Single lookup
const result = await client.lookup({ ip: "8.8.8.8" });
console.log(result.location.city); // "Mountain View"

// Bulk lookup
const bulk = await client.bulk(["8.8.8.8", "1.1.1.1"]);
console.log(bulk.results.length); // 2

// Check usage
const usage = await client.usage();
console.log(usage.credits_remaining);

The SDK retries failed requests with exponential backoff (up to 3 attempts) and throws typed errors: UnauthorizedError, RateLimitError, ValidationError.

Python SDK

Async-first client with sync support. Uses httpx under the hood.

Install

terminal
pip install datasentry

Sync Usage

python
from datasentry import DataSentry

client = DataSentry(api_key="ds_prod_xxxxxxxx")

# Single lookup
result = client.lookup(ip="8.8.8.8")
print(result.location.city)  # "Mountain View"

# Check usage
usage = client.usage()
print(usage.credits_remaining)

Async Usage

python
import asyncio
from datasentry import DataSentry

async def main():
    async with DataSentry(api_key="ds_prod_xxxxxxxx") as client:
        result = await client.lookup_async(ip="8.8.8.8")
        print(result.location.city)

asyncio.run(main())

CLI Tool

Run IP lookups from your terminal. Install globally and authenticate once.

Install

terminal
npm install -g @datasentry/cli

Authenticate

terminal
datasentry auth ds_prod_xxxxxxxx

Commands

CommandDescription
datasentry lookup [ip]Lookup a specific IP (or your own IP if omitted)
datasentry lookup --jsonOutput raw JSON
datasentry usageView credit balance and quota
datasentry auth [key]Save API key locally
datasentry logoutClear local credentials

Webhooks

DataSentry sends webhook events via Polar.sh when subscription state changes. Configure your webhook endpoint in Settings.

Events

EventTrigger
subscription.createdNew subscription purchased
subscription.updatedPlan changed or payment updated
subscription.activeSubscription confirmed active
subscription.cancelledUser cancelled subscription
subscription.revokedSubscription revoked by admin

Verification

Webhooks are signed with HMAC-SHA256. Verify the polar-signature header against your POLAR_WEBHOOK_SECRET.

Rate Limits

Enforced per API key. Check the x-rate-limit-remaining response header.

PlanRequests/minMonthly QuotaMax Bulk Size
Standard20100,0001,000 IPs
Pro200500,00010,000 IPs
Lifetime500Unlimited50,000 IPs

Pricing

All plans include access to the full API, SDKs, and dashboard. Paid via Polar.sh.

Standard

$39/mo

100K requests · 20 req/min · 1K bulk

Popular

Pro

$79/mo

500K requests · 200 req/min · 10K bulk

Lifetime

$199 one-time

Unlimited · 500 req/min · 50K bulk

Ready to start?

Create an account, grab your API key, and make your first call.