# Dev Tools — Zapi reference > Every Dev Tools endpoint on Zapi, with parameters, request shape and an example response. **Base URL:** `https://api.zpi.web.id` **Auth:** Send `x-api-key: YOUR_KEY` header on every request. Get a key at https://zpi.web.id/dashboard/keys (free tier — 2,000 req/mo, no credit card). **Response envelope:** `{ status: "success" | "error", message: string, content: }` **Rate limit:** 60 req/min (free tier). Per-endpoint cache TTL is documented below. **Errors:** standard HTTP codes (`401` invalid key, `429` rate limited, `5xx` upstream). Body always has `{ status: "error", message, errors? }`. ```bash curl "https://api.zpi.web.id/v1/CATEGORY:SCRAPER/ENDPOINT?param=value" \ -H "x-api-key: $ZAPI_KEY" ``` **Category page:** https://zpi.web.id/category/dev-tools **Full catalog:** https://zpi.web.id/apis · **Index:** https://zpi.web.id/llms-full.txt --- ## CF Sitekey Extractor **Category:** dev-tools · **Slug:** `cf-sitekey` **Detail page:** https://zpi.web.id/api/dev-tools/cf-sitekey Mengekstrak Cloudflare Turnstile sitekey dari halaman web dengan multiple fetch mode. **Tags:** cloudflare, turnstile, sitekey ### Extract - **Method:** `GET` - **Endpoint:** `https://api.zpi.web.id/v1/dev-tools:cf-sitekey/extract` - **Cache TTL:** 3600s **Parameters:** | Name | Type | Location | Required | Description | |------|------|----------|----------|-------------| | `url` | string | query | yes | URL halaman yang ingin diekstrak Cloudflare Turnstile sitekey-nya | | `mode` | enum(auto|http|workers|flaresolverr|stealth) | query | no | Mode fetch. Default 'auto' (http → workers → flaresolverr → stealth) | | `followScripts` | boolean | query | no | Ikuti & scan external script bundle. Default true | | `maxScripts` | number | query | no | Maksimal script bundle yang di-scan. Default 10 | **cURL:** ```bash curl "https://api.zpi.web.id/v1/dev-tools:cf-sitekey/extract?url=https%3A%2F%2Fminitoolai.com%2Fxiaomi-mimo%2F&mode=auto&followScripts=true&maxScripts=10" \ -H "x-api-key: YOUR_API_KEY" ``` **JavaScript / TypeScript:** ```javascript const res = await fetch("https://api.zpi.web.id/v1/dev-tools:cf-sitekey/extract?url=https%3A%2F%2Fminitoolai.com%2Fxiaomi-mimo%2F&mode=auto&followScripts=true&maxScripts=10", { headers: { "x-api-key": process.env.ZAPI_KEY } }); const data = await res.json(); ``` **Python:** ```python import requests r = requests.get("https://api.zpi.web.id/v1/dev-tools:cf-sitekey/extract?url=https%3A%2F%2Fminitoolai.com%2Fxiaomi-mimo%2F&mode=auto&followScripts=true&maxScripts=10", headers={"x-api-key": "YOUR_API_KEY"}) data = r.json() ``` **Example response:** ```json { "count": 1, "items": [ { "via": "http", "source": "inline-js", "siteKey": "0x4AAAAAABjI2cBIeVpBYEFi", "scrapedAt": "2026-05-23T00:10:54.586Z", "sourceUrl": "https://minitoolai.com/xiaomi-mimo/" } ], "sourceUrl": "https://minitoolai.com/xiaomi-mimo/" } ``` --- ## DNS Lookup **Category:** dev-tools · **Slug:** `dns-lookup` **Detail page:** https://zpi.web.id/api/dev-tools/dns-lookup Query DNS records (A, AAAA, MX, TXT, NS, CNAME, SOA, CAA) via secure DNS-over-HTTPS resolver. **Tags:** dns, domain, lookup, records ### Lookup Perform lookup dengan input yang diberikan. - **Method:** `GET` - **Endpoint:** `https://api.zpi.web.id/v1/dev-tools:dns-lookup/lookup` - **Cache TTL:** 300s **Parameters:** | Name | Type | Location | Required | Description | |------|------|----------|----------|-------------| | `domain` | string | query | yes | Domain name (akan di-normalize: strip protocol, www, path) | | `type` | enum(A|AAAA|MX|TXT|NS|CNAME|SOA|CAA) | query | no | DNS record type. Default: A | **cURL:** ```bash curl "https://api.zpi.web.id/v1/dev-tools:dns-lookup/lookup?domain=google.com&type=A" \ -H "x-api-key: YOUR_API_KEY" ``` **JavaScript / TypeScript:** ```javascript const res = await fetch("https://api.zpi.web.id/v1/dev-tools:dns-lookup/lookup?domain=google.com&type=A", { headers: { "x-api-key": process.env.ZAPI_KEY } }); const data = await res.json(); ``` **Python:** ```python import requests r = requests.get("https://api.zpi.web.id/v1/dev-tools:dns-lookup/lookup?domain=google.com&type=A", headers={"x-api-key": "YOUR_API_KEY"}) data = r.json() ``` **Example response:** ```json { "type": "A", "count": 6, "domain": "google.com", "source": "dns", "status": "NOERROR", "records": [ { "ttl": 281, "data": "142.250.4.100", "name": "google.com", "type": "A" }, { "ttl": 281, "data": "142.250.4.139", "name": "google.com", "type": "A" }, { "ttl": 281, "data": "142.250.4.101", "name": "google.com", "type": "A" }, { "ttl": 281, "data": "142.250.4.138", "name": "google.com", "type": "A" }, { "ttl": 281, "data": "142.250.4.102", "name": "google.com", "type": "A" }, { "ttl": 281, "data": "142.250.4.113", "name": "google.com", "type": "A" } ] } ``` --- ## HTTP Headers Inspector **Category:** dev-tools · **Slug:** `http-headers` **Detail page:** https://zpi.web.id/api/dev-tools/http-headers Inspect HTTP response headers and redirect chain for any URL. **Tags:** utility, http, headers, inspector ### Inspect Headers Fetch HTTP response headers and redirect chain. - **Method:** `GET` - **Endpoint:** `https://api.zpi.web.id/v1/dev-tools:http-headers/inspect` - **Cache TTL:** 300s **Parameters:** | Name | Type | Location | Required | Description | |------|------|----------|----------|-------------| | `url` | string | query | yes | URL target (harus full URL termasuk protokol) | | `method` | enum(HEAD|GET) | query | no | HTTP method. Default: HEAD (lebih cepat). Pakai GET kalau server reject HEAD | **cURL:** ```bash curl "https://api.zpi.web.id/v1/dev-tools:http-headers/inspect?url=https%3A%2F%2Fexample.com&method=HEAD" \ -H "x-api-key: YOUR_API_KEY" ``` **JavaScript / TypeScript:** ```javascript const res = await fetch("https://api.zpi.web.id/v1/dev-tools:http-headers/inspect?url=https%3A%2F%2Fexample.com&method=HEAD", { headers: { "x-api-key": process.env.ZAPI_KEY } }); const data = await res.json(); ``` **Python:** ```python import requests r = requests.get("https://api.zpi.web.id/v1/dev-tools:http-headers/inspect?url=https%3A%2F%2Fexample.com&method=HEAD", headers={"x-api-key": "YOUR_API_KEY"}) data = r.json() ``` **Example response:** ```json { "ok": true, "url": "https://example.com", "method": "HEAD", "status": 200, "headers": { "age": "1939", "date": "Wed, 27 May 2026 13:44:44 GMT", "allow": "GET, HEAD", "cf-ray": "a02574beabfcf8d6-SIN", "server": "cloudflare", "connection": "keep-alive", "content-type": "text/html", "last-modified": "Fri, 22 May 2026 08:22:30 GMT", "cf-cache-status": "HIT", "content-encoding": "br" }, "finalUrl": "https://example.com", "redirectChain": [] } ``` --- ## IP Geolocation **Category:** dev-tools · **Slug:** `ip-geo` **Detail page:** https://zpi.web.id/api/dev-tools/ip-geo IP geolocation lookup — country, region, city, ISP, ASN, koordinat untuk IPv4 dan IPv6. **Tags:** ip, geolocation, asn, isp ### Lookup Perform lookup dengan input yang diberikan. - **Method:** `GET` - **Endpoint:** `https://api.zpi.web.id/v1/dev-tools:ip-geo/lookup` - **Cache TTL:** 300s **Parameters:** | Name | Type | Location | Required | Description | |------|------|----------|----------|-------------| | `ip` | string | query | yes | IP address (IPv4 atau IPv6) | **cURL:** ```bash curl "https://api.zpi.web.id/v1/dev-tools:ip-geo/lookup?ip=8.8.8.8" \ -H "x-api-key: YOUR_API_KEY" ``` **JavaScript / TypeScript:** ```javascript const res = await fetch("https://api.zpi.web.id/v1/dev-tools:ip-geo/lookup?ip=8.8.8.8", { headers: { "x-api-key": process.env.ZAPI_KEY } }); const data = await res.json(); ``` **Python:** ```python import requests r = requests.get("https://api.zpi.web.id/v1/dev-tools:ip-geo/lookup?ip=8.8.8.8", headers={"x-api-key": "YOUR_API_KEY"}) data = r.json() ``` **Example response:** ```json { "ip": "8.8.8.8", "asn": "AS15169 Google LLC", "isp": "Google LLC", "org": "Google Public DNS", "zip": "20149", "city": "Ashburn", "region": "VA", "source": "geo", "country": "United States", "latitude": 39.03, "timezone": "America/New_York", "longitude": -77.5, "regionName": "Virginia", "countryCode": "US" } ``` --- ## Meta/OG Preview **Category:** dev-tools · **Slug:** `meta-preview` **Detail page:** https://zpi.web.id/api/dev-tools/meta-preview Fetch link preview metadata dari URL — Open Graph, Twitter Card, favicon, canonical, theme color (kayak WhatsApp/Slack link preview). **Tags:** meta, opengraph, preview, og ### Lookup Perform lookup dengan input yang diberikan. - **Method:** `GET` - **Endpoint:** `https://api.zpi.web.id/v1/dev-tools:meta-preview/lookup` - **Cache TTL:** 300s **Parameters:** | Name | Type | Location | Required | Description | |------|------|----------|----------|-------------| | `url` | string | query | yes | URL halaman web. Auto-parse Open Graph / Twitter Card / meta tags untuk preview. | **cURL:** ```bash curl "https://api.zpi.web.id/v1/dev-tools:meta-preview/lookup?url=https%3A%2F%2Fgithub.com" \ -H "x-api-key: YOUR_API_KEY" ``` **JavaScript / TypeScript:** ```javascript const res = await fetch("https://api.zpi.web.id/v1/dev-tools:meta-preview/lookup?url=https%3A%2F%2Fgithub.com", { headers: { "x-api-key": process.env.ZAPI_KEY } }); const data = await res.json(); ``` **Python:** ```python import requests r = requests.get("https://api.zpi.web.id/v1/dev-tools:meta-preview/lookup?url=https%3A%2F%2Fgithub.com", headers={"x-api-key": "YOUR_API_KEY"}) data = r.json() ``` **Example response:** ```json { "url": "https://github.com", "type": "object", "image": "https://images.ctfassets.net/8aevphvgewt8/4pe4eOtUJ0ARpZRE4fNekf/f52b1f9c52f059a33170229883731ed0/GH-Homepage-Universe-img.png", "title": "GitHub · Change is constant. GitHub keeps you ahead.", "favicon": "https://github.githubassets.com/favicons/favicon", "finalUrl": "https://github.com/", "siteName": "GitHub", "canonical": "https://github.com/", "scrapedAt": "2026-05-27T07:14:08.168Z", "themeColor": "#1e2327", "description": "Join the world's most widely adopted, AI-powered developer platform where millions of developers, businesses, and the largest open source community build software that advances humanity.", "twitterCard": { "card": "summary_large_image", "site": "@github", "image": "https://images.ctfassets.net/8aevphvgewt8/4pe4eOtUJ0ARpZRE4fNekf/f52b1f9c52f059a33170229883731ed0/GH-Homepage-Universe-img.png", "title": "GitHub · Change is constant. GitHub keeps you ahead.", "description": "Join the world's most widely adopted, AI-powered developer platform where millions of developers, businesses, and the largest open source community build software that advances humanity." } } ``` --- ## SSL Labs **Category:** dev-tools · **Slug:** `ssl-labs` **Detail page:** https://zpi.web.id/api/dev-tools/ssl-labs Retrieve SSL/TLS analysis report for a hostname. **Tags:** utility, ssl, tls, security ### Analyze SSL Fetch SSL/TLS analysis report for a hostname. - **Method:** `GET` - **Endpoint:** `https://api.zpi.web.id/v1/dev-tools:ssl-labs/analyze` - **Cache TTL:** 300s **Parameters:** | Name | Type | Location | Required | Description | |------|------|----------|----------|-------------| | `host` | string | query | yes | Hostname target untuk analisa SSL/TLS | **cURL:** ```bash curl "https://api.zpi.web.id/v1/dev-tools:ssl-labs/analyze?host=google.com" \ -H "x-api-key: YOUR_API_KEY" ``` **JavaScript / TypeScript:** ```javascript const res = await fetch("https://api.zpi.web.id/v1/dev-tools:ssl-labs/analyze?host=google.com", { headers: { "x-api-key": process.env.ZAPI_KEY } }); const data = await res.json(); ``` **Python:** ```python import requests r = requests.get("https://api.zpi.web.id/v1/dev-tools:ssl-labs/analyze?host=google.com", headers={"x-api-key": "YOUR_API_KEY"}) data = r.json() ``` **Example response:** ```json { "ok": true, "host": "google.com", "source": "ssl-labs", "status": "READY", "partial": false, "testTime": 1779885872622, "endpoints": [ { "grade": "B", "duration": 121852, "progress": 100, "ipAddress": "2607:f8b0:4002:c06:0:0:0:65", "serverName": "yv-in-f101.1e100.net", "hasWarnings": false, "isExceptional": false, "statusMessage": "Ready", "gradeTrustIgnored": "B" }, { "grade": "B", "duration": 121697, "progress": 100, "ipAddress": "2607:f8b0:4002:c06:0:0:0:64", "serverName": "yv-in-x64.1e100.net", "hasWarnings": false, "isExceptional": false, "statusMessage": "Ready", "gradeTrustIgnored": "B" }, { "grade": "B", "duration": 122199, "progress": 100, "ipAddress": "2607:f8b0:4002:c06:0:0:0:66", "serverName": "yv-in-f102.1e100.net", "hasWarnings": false, "isExceptional": false, "statusMessage": "Ready", "gradeTrustIgnored": "B" }, { "grade": "B", "duration": 118030, "progress": 100, "ipAddress": "74.125.21.139", "serverName": "yv-in-f139.1e100.net", "hasWarnings": false, "isExceptional": false, "statusMessage": "Ready", "gradeTrustIgnored": "B" }, { "grade": "B", "duration": 118726, "progress": 100, "ipAddress": "74.125.21.138", "serverName": "yv-in-f138.1e100.net", "hasWarnings": false, "isExceptional": false, "statusMessage": "Ready", "gradeTrustIgnored": "B" }, { "grade": "B", "duration": 118352, "progress": 100, "ipAddress": "74.125.21.101", "serverName": "yv-in-f101.1e100.net", "hasWarnings": false, "isExceptional": false, "statusMessage": "Ready", "gradeTrustIgnored": "B" }, { "grade": "B", "duration": 118569, "progress": 100, "ipAddress": "74.125.21.100", "serverName": "yv-in-f100.1e100.net", "hasWarnings": false, "isExceptional": false, "statusMessage": "Ready", "gradeTrustIgnored": "B" }, { "grade": "B", "duration": 122629, "progress": 100, "ipAddress": "2607:f8b0:4002:c06:0:0:0:8a", "serverName": "yv-in-x8a.1e100.net", "hasWarnings": false, "isExceptional": false, "statusMessage": "Ready", "gradeTrustIgnored": "B" }, { "grade": "B", "duration": 118847, "progress": 100, "ipAddress": "74.125.21.102", "serverName": "yv-in-f102.1e100.net", "hasWarnings": false, "isExceptional": false, "statusMessage": "Ready", "gradeTrustIgnored": "B" }, { "grade": "B", "duration": 118828, "progress": 100, "ipAddress": "74.125.21.113", "serverName": "yv-in-f113.1e100.net", "hasWarnings": false, "isExceptional": false, "statusMessage": "Ready", "gradeTrustIgnored": "B" } ], "startTime": 1779884672773, "engineVersion": "2.4.2", "statusMessage": "", "criteriaVersion": "2009q" } ``` --- ## WHOIS Lookup **Category:** dev-tools · **Slug:** `whois-lookup` **Detail page:** https://zpi.web.id/api/dev-tools/whois-lookup WHOIS / RDAP domain lookup — registrar, registration & expiry dates, nameservers, status, registrant contact. **Tags:** whois, domain, dns, rdap ### Lookup Perform lookup dengan input yang diberikan. - **Method:** `GET` - **Endpoint:** `https://api.zpi.web.id/v1/dev-tools:whois-lookup/lookup` - **Cache TTL:** 300s **Parameters:** | Name | Type | Location | Required | Description | |------|------|----------|----------|-------------| | `domain` | string | query | yes | Domain name (akan di-normalize: strip protocol, www, path) | **cURL:** ```bash curl "https://api.zpi.web.id/v1/dev-tools:whois-lookup/lookup?domain=google.com" \ -H "x-api-key: YOUR_API_KEY" ``` **JavaScript / TypeScript:** ```javascript const res = await fetch("https://api.zpi.web.id/v1/dev-tools:whois-lookup/lookup?domain=google.com", { headers: { "x-api-key": process.env.ZAPI_KEY } }); const data = await res.json(); ``` **Python:** ```python import requests r = requests.get("https://api.zpi.web.id/v1/dev-tools:whois-lookup/lookup?domain=google.com", headers={"x-api-key": "YOUR_API_KEY"}) data = r.json() ``` **Example response:** ```json { "domain": "google.com", "source": "whois", "status": [ "client delete prohibited", "client transfer prohibited", "client update prohibited", "server delete prohibited", "server transfer prohibited", "server update prohibited" ], "expiresAt": "2028-09-14T04:00:00Z", "registrar": "MarkMonitor Inc.", "updatedAt": "2019-09-09T15:39:04Z", "nameservers": [ "ns1.google.com", "ns2.google.com", "ns3.google.com", "ns4.google.com" ], "registeredAt": "1997-09-15T04:00:00Z" } ``` ---