Indiwtf API
REST APIs to check website accessibility, censorship status, and network responses on Indonesian networks.
{
"domain": "reddit.com",
"status": "blocked",
"ip": "36.86.63.185"
}Overview
Introduction
The Indiwtf API lets you programmatically check website blocking status in Indonesia. Everything is delivered over REST + JSON.
Authentication
Authenticate every request
All endpoints require an API token. Pass it as the token query parameter:
GET https://indiwtf.com/api/check?domain=example.com&token=YOUR_API_TOKEN
Don't have a token yet? Pick a plan - your token shows up on the dashboard the moment the subscription settles.
Endpoint
GET /api/check
Check a domain’s blocking status, along with its resolved IP address.
| Parameter | Type | Description |
|---|---|---|
| token | string | Required. Your API token. |
| domain | string | Required. The domain to check. |
Example request
curl "https://indiwtf.com/api/check?domain=reddit.com&token=YOUR_API_TOKEN"
Blocked response
{
"domain": "reddit.com",
"status": "blocked",
"ip": "36.86.63.185"
}Allowed response
{
"domain": "google.com",
"status": "allowed",
"ip": "216.239.38.120"
}Errors
| Status | Message |
|---|---|
| 401 | Invalid API token |
| 400 | Invalid domain format |
| 400 | Error resolving IP address for {domain} |
Endpoint
GET /api/usage
Inspect your plan, monthly limit, and how many requests you've made today and this month.
| Parameter | Type | Description |
|---|---|---|
| token | string | Required. Your API token. |
Example request
curl "https://indiwtf.com/api/usage?token=YOUR_API_TOKEN"
Response
{
"plan": "basic",
"term": "monthly",
"usage": {
"requests_today": 143,
"requests_this_month": 2567,
"total_requests": 2567,
"limits": { "monthly": 10000 },
"remaining": { "monthly": 7433 }
}
}Errors
| Status | Message |
|---|---|
| 401 | Invalid API token |
Endpoint
GET /api/links
List your Indiwtf Links with the destination each one currently points to.
The Links API is read-only. Authenticate with your API token via the Authorization: Bearer header or the token query parameter. It never consumes your check quota.
| Parameter | Type | Description |
|---|---|---|
| token | string | Required. Your API token (Bearer header or query param). |
Example request
curl -H "Authorization: Bearer YOUR_API_TOKEN" \ "https://indiwtf.com/api/links"
Response
{
"links": [
{
"id": 42,
"domain": "go.example.net",
"slug": "launch",
"short_url": "https://go.example.net/launch",
"destination": "https://backup.example.net/launch",
"destination_count": 3,
"is_stale": false,
"updated_at": "2026-06-11T09:00:00Z"
}
]
}destination is the candidate currently reachable from the Indonesian network. It's null before the first check, and is_stale is true when every destination is down and we're holding the last known-good pick.
Errors
| Status | Message |
|---|---|
| 401 | Invalid API token |
| 401 | The token has expired. |
Endpoint
GET /api/links/{id}
Fetch a single link and its current active destination by id.
| Parameter | Type | Description |
|---|---|---|
| id | integer | Required. The link id (path segment). |
| token | string | Required. Your API token (Bearer header or query param). |
Example request
curl -H "Authorization: Bearer YOUR_API_TOKEN" \ "https://indiwtf.com/api/links/42"
Response
{
"id": 42,
"domain": "go.example.net",
"slug": "launch",
"short_url": "https://go.example.net/launch",
"destination": "https://backup.example.net/launch",
"destination_count": 3,
"is_stale": false,
"updated_at": "2026-06-11T09:00:00Z"
}Errors
| Status | Message |
|---|---|
| 400 | Invalid link id |
| 401 | Invalid API token |
| 404 | Link not found |
Prefer a typed client? See the Links SDK.
Snippets
Code examples
The same /api/check call in a few common languages. Copy, replace the token, ship.
JavaScript
const TOKEN = "YOUR_API_TOKEN";
async function checkDomain(domain) {
const url = `https://indiwtf.com/api/check?domain=${domain}&token=${TOKEN}`;
const res = await fetch(url);
const data = await res.json();
if (!res.ok) throw new Error(data.error || `API ${res.status}`);
return data;
}
checkDomain("reddit.com").then(console.log);Go
package main
import (
"encoding/json"
"fmt"
"io"
"net/http"
)
type CheckResponse struct {
Domain string `json:"domain"`
Status string `json:"status"`
IP string `json:"ip"`
}
func main() {
url := "https://indiwtf.com/api/check?domain=reddit.com&token=YOUR_API_TOKEN"
resp, err := http.Get(url)
if err != nil { panic(err) }
defer resp.Body.Close()
body, _ := io.ReadAll(resp.Body)
var out CheckResponse
if err := json.Unmarshal(body, &out); err != nil { panic(err) }
fmt.Printf("%s → %s (%s)\n", out.Domain, out.Status, out.IP)
}Python
import requests
TOKEN = "YOUR_API_TOKEN"
def check_domain(domain: str) -> dict:
r = requests.get(
"https://indiwtf.com/api/check",
params={"domain": domain, "token": TOKEN},
timeout=10,
)
r.raise_for_status()
return r.json()
print(check_domain("reddit.com"))Ready to plug it in?
Grab an API token from any paid plan and you're a single request away from real Indonesian blocking data.