Weather

Current weather for a city

View Docs

Parameters

latitude string Required

Latitude

Example: -33.9141

longitude string Required

Longitude

Example: 151.2152

Responses

200 OK Success
{
  "ok": true,
  "data": {
    "city": "Sydney",
    "tempC": 21.4
  }
}
400 BAD_REQUEST Missing latitude or longitude query parameters
500 INTERNAL_SERVER_ERROR Internal server error

Iss Location

Where the ISS (International Space Station) is currently located

View Docs

Responses

200 OK Success
{
  "ok": true,
  "data": {
    "city": "Sydney",
    "tempC": 21.4
  }
}
502 Bad Gateway Failed to fetch ISS location data

Gold

Spot gold in US dollars. price is one troy ounce. /usd is the same quote, /units lists every unit, /history is what this process has fetched.

View Docs

Parameters

unit string

oz, g, 10g, tola, or kg. Defaults to oz.

Example: g

amount number

How many of that unit to price. Defaults to 1.

Example: 2

Responses

200 OK Success
{
  "ok": true,
  "metal": "gold",
  "symbol": "XAU",
  "currency": "USD",
  "price": 4286.9,
  "unit": "oz",
  "amount": 1,
  "totalUsd": 4286.9
}
400 BAD_REQUEST unknown unit
502 BAD_GATEWAY could not load the gold price

Silver

Spot silver in US dollars for one troy ounce. Same unit and amount query as gold. /usd, /units, and /history work the same way.

View Docs

Parameters

unit string

oz, g, 10g, tola, or kg. Defaults to oz.

Example: kg

amount number

How many of that unit to price. Defaults to 1.

Example: 10

Responses

200 OK Success
{
  "ok": true,
  "metal": "silver",
  "symbol": "XAG",
  "currency": "USD",
  "price": 64.53,
  "unit": "oz",
  "amount": 1,
  "totalUsd": 64.53
}
400 BAD_REQUEST unknown unit
502 BAD_GATEWAY could not load the silver price

Platinum

Spot platinum in US dollars for one troy ounce. /usd is the same quote.

View Docs

Parameters

unit string

oz, g, 10g, tola, or kg. Defaults to oz.

Example: tola

amount number

How many of that unit to price. Defaults to 1.

Example: 1

Responses

200 OK Success
{
  "ok": true,
  "metal": "platinum",
  "symbol": "XPT",
  "currency": "USD",
  "price": 1783,
  "unit": "oz",
  "amount": 1,
  "totalUsd": 1783
}
400 BAD_REQUEST unknown unit
502 BAD_GATEWAY could not load the platinum price

Copper

Copper in US dollars per pound. The ounce here is a sixteenth of a pound, not the gold ounce. /usd is the same quote.

View Docs

Parameters

unit string

lb, oz, kg, or t. Defaults to lb.

Example: kg

amount number

How many of that unit to price. Defaults to 1.

Example: 1

Responses

200 OK Success
{
  "ok": true,
  "metal": "copper",
  "symbol": "HG",
  "currency": "USD",
  "price": 6.7,
  "unit": "lb",
  "amount": 1,
  "totalUsd": 6.7
}
400 BAD_REQUEST unknown unit
502 BAD_GATEWAY could not load the copper price

Crude oil

WTI or Brent in US dollars per barrel. /wti and /brent force the benchmark. /units and /history are there too.

View Docs

Parameters

benchmark string

wti or brent. Defaults to wti.

Example: brent

unit string

bbl, gal, l, or impgal. Defaults to bbl.

Example: l

amount number

How many of that unit to price. Defaults to 1.

Example: 1

Responses

200 OK Success
{
  "ok": true,
  "commodity": "crude oil",
  "benchmark": "wti",
  "currency": "USD",
  "price": 92.56,
  "unit": "bbl",
  "amount": 1,
  "totalUsd": 92.56
}
400 BAD_REQUEST unknown benchmark
502 BAD_GATEWAY could not load the crude oil price

Natural gas

Henry Hub natural gas in US dollars per million BTU. /usd is the same quote.

View Docs

Parameters

unit string

mmbtu or therm. Defaults to mmbtu. A therm is a tenth of an MMBtu.

Example: therm

amount number

How many of that unit to price. Defaults to 1.

Example: 10

Responses

200 OK Success
{
  "ok": true,
  "commodity": "natural gas",
  "symbol": "NG=F",
  "currency": "USD",
  "price": 3.225,
  "unit": "mmbtu",
  "amount": 1,
  "total": 3.225
}
400 BAD_REQUEST unknown unit
502 BAD_GATEWAY could not load the natural gas price

Stock

Last traded price for one share. US tickers are plain. NSE names need .NS, and the currency follows the listing.

View Docs

Parameters

symbol string Required

Ticker in the path. AAPL or RELIANCE.NS.

Example: RELIANCE.NS

amount number

How many shares to extend the price across. Defaults to 1.

Example: 2

Responses

200 OK Success
{
  "ok": true,
  "kind": "stock",
  "symbol": "AAPL",
  "currency": "USD",
  "price": 341.07,
  "amount": 1,
  "total": 341.07
}
400 BAD_REQUEST symbol looks wrong
502 BAD_GATEWAY could not load that stock

Market index

Index level for the S&P 500, Nasdaq, Nifty 50, or Sensex. /api/v1/index lists the four names.

View Docs

Parameters

name string Required

sp500, nasdaq, nifty, or sensex, in the path.

Example: nifty

Responses

200 OK Success
{
  "ok": true,
  "kind": "index",
  "index": "nifty",
  "currency": "INR",
  "price": 23140.5
}
400 BAD_REQUEST unknown index
502 BAD_GATEWAY could not load that index

Exchange rate

How much quote currency you get for one unit of the base. USDINR is rupees per dollar. /api/v1/fx lists a few common pairs.

View Docs

Parameters

pair string Required

Pair in the path. USDINR, EURUSD, GBPUSD, USDJPY, or another 6 letter pair.

Example: USDINR

amount number

How many units of the base currency to convert. Defaults to 1.

Example: 10

Responses

200 OK Success
{
  "ok": true,
  "kind": "fx",
  "pair": "USDINR",
  "base": "USD",
  "quote": "INR",
  "price": 95.82,
  "amount": 10,
  "total": 958.2
}
400 BAD_REQUEST pair looks wrong
502 BAD_GATEWAY could not load that rate

Crypto

Dollar price of bitcoin or ethereum. /api/v1/crypto lists the two coins.

View Docs

Parameters

symbol string Required

btc or eth in the path. bitcoin and ethereum work too.

Example: btc

amount number

How many coins to price. Fractions are fine. Defaults to 1.

Example: 0.1

Responses

200 OK Success
{
  "ok": true,
  "kind": "crypto",
  "coin": "btc",
  "currency": "USD",
  "price": 84029,
  "amount": 0.1,
  "total": 8402.9
}
400 BAD_REQUEST unknown coin
502 BAD_GATEWAY could not load that coin

Regret

What a pile of cash would be worth today if you had bought gold, bitcoin, oil, Nifty, Reliance, or the S&P on that date. Cash left alone is in the list too.

View Docs

Parameters

date string Required

YYYY-MM-DD. A weekend walks forward to the next session.

Example: 2020-03-23

amount number Required

How much cash you pretend you had.

Example: 100000

currency string

INR or USD. Defaults to INR.

Example: INR

only string

Comma list if you do not want the whole basket. gold, btc, oil, nifty, reliance, sp500.

Example: btc,gold

Responses

200 OK Success
{
  "ok": true,
  "date": "2020-03-23",
  "amount": 100000,
  "currency": "INR",
  "winner": {
    "id": "btc",
    "multiple": 16.61
  },
  "verdict": "Bitcoin did 16.61x. The rupees under the mattress are still 100000."
}
400 BAD_REQUEST date is in the future
502 BAD_GATEWAY could not load the rupee rate

Portfolio

POST a list of holdings and get them marked to today's spot in INR or USD. Aliases cover gold, silver, platinum, copper, oil, gas, btc, eth, and the usual indices. Anything else is a stock ticker. GET /api/v1/portfolio lists the aliases. Gold/silver/platinum amounts are troy ounces; copper is pounds.

View Docs

Parameters

currency string

INR or USD for the total and for cash. Defaults to INR. Sent in the JSON body.

Example: INR

holdings array Required

JSON array of { id, amount }. 1 to 20 rows. Duplicate ids merge.

Example: [{"id":"gold","amount":2},{"id":"btc","amount":0.1},{"id":"AAPL","amount":10},{"id":"cash","amount":50000}]

Responses

200 OK Success
{
  "ok": true,
  "currency": "INR",
  "total": 1854321.5,
  "holdings": [
    {
      "id": "gold",
      "name": "Gold",
      "symbol": "GC=F",
      "amount": 2,
      "price": 4286.9,
      "quoteCurrency": "USD",
      "value": 820000.12,
      "weight": 0.44
    }
  ],
  "skipped": [],
  "winner": {
    "id": "gold",
    "weight": 0.44
  },
  "loser": {
    "id": "cash",
    "weight": 0.03
  },
  "verdict": "Gold is 44% of the pile. Cash is the quiet leftover."
}
400 BAD_REQUEST holdings cannot be empty
502 BAD_GATEWAY none of those holdings had a price

Split

POST a bill total and a list of people with shares. Each person gets what they owe in the request currency plus INR and USD via today's rupee rate. share is a fraction or the string equal. GET /api/v1/split shows the body shape.

View Docs

Parameters

total number Required

Bill total in the request currency. Sent in the JSON body.

Example: 3000

currency string

INR or USD. Defaults to INR.

Example: INR

people array Required

JSON array of { name, share }. 1 to 20. share is 0-1 or equal.

Example: [{"name":"a","share":0.5},{"name":"b","share":0.3},{"name":"c","share":"equal"}]

Responses

200 OK Success
{
  "ok": true,
  "total": 3000,
  "currency": "INR",
  "usdInr": 95.82,
  "people": [
    {
      "name": "a",
      "share": 0.5,
      "owes": 1500,
      "owesInr": 1500,
      "owesUsd": 15.65
    }
  ],
  "winner": {
    "name": "a",
    "owes": 1500
  },
  "verdict": "a pays the most (1500 rupees)."
}
400 BAD_REQUEST people cannot be empty
502 BAD_GATEWAY could not load the rupee rate

Ladder

POST a date, amount, and weighted buys. Same growth math as regret, but you pick the mix. Weights must add to 1. Cash left alone is always in the result. GET /api/v1/ladder lists the assets.

View Docs

Parameters

date string Required

YYYY-MM-DD in the JSON body. A weekend walks forward.

Example: 2020-03-23

amount number Required

Cash you pretend you had.

Example: 100000

currency string

INR or USD. Defaults to INR.

Example: INR

buys array Required

JSON array of { id, weight }. 1 to 6. Weights sum to 1. ids: gold, btc, oil, nifty, reliance, sp500.

Example: [{"id":"btc","weight":0.4},{"id":"gold","weight":0.3},{"id":"nifty","weight":0.3}]

Responses

200 OK Success
{
  "ok": true,
  "date": "2020-03-23",
  "amount": 100000,
  "currency": "INR",
  "winner": {
    "id": "btc",
    "multiple": 16.61
  },
  "verdict": "Bitcoin did 16.61x. The rupees under the mattress are still 100000."
}
400 BAD_REQUEST weights have to add up to 1
502 BAD_GATEWAY could not load the rupee rate

Invoice

POST a messy bill of aliases, tickers, and cash lines. Marks assets to today's spot, totals in INR or USD, and says what most of the invoice is. GET /api/v1/invoice lists the aliases.

View Docs

Parameters

currency string

INR or USD for the total. Defaults to INR. Sent in the JSON body.

Example: INR

lines array Required

JSON array. Use { id, amount } for aliases/tickers, or { label, cash } for plain money. 1 to 20.

Example: [{"id":"gold","amount":1},{"id":"AAPL","amount":2},{"label":"snacks","cash":500}]

Responses

200 OK Success
{
  "ok": true,
  "currency": "INR",
  "total": 420500.12,
  "lines": [
    {
      "id": "gold",
      "name": "Gold",
      "symbol": "GC=F",
      "amount": 1,
      "price": 4286.9,
      "quoteCurrency": "USD",
      "value": 410000,
      "weight": 0.97
    }
  ],
  "skipped": [],
  "verdict": "Most of this invoice is gold."
}
400 BAD_REQUEST lines cannot be empty
502 BAD_GATEWAY none of those lines had a price

URL Shortener

POST a long http(s) url to get a short code stored in Cloudflare KV. Optional custom code and ttlDays. GET /api/v1/short/:code returns JSON. GET /api/v1/short/:code/go redirects. Same url twice returns the existing code.

View Docs

Parameters

url string Required

http or https url in the JSON body.

Example: https://example.com/some/long/path

code string

Optional custom slug, 3-32 chars. Letters, numbers, _ or -.

Example: lunch

ttlDays number

Optional expiry in days, 1 to 365.

Example: 30

Responses

200 OK Success
{
  "ok": true,
  "code": "lunch",
  "url": "https://example.com/some/long/path",
  "shortPath": "/api/v1/short/lunch/go",
  "infoPath": "/api/v1/short/lunch",
  "createdAt": "2026-10-04T04:00:00.000Z",
  "expiresAt": null,
  "existing": false
}
400 BAD_REQUEST url has to be http or https
404 NOT_FOUND unknown code
409 CONFLICT code is already taken

QR Generator

Stick text or a URL in, get a QR code back as SVG or PNG. Optional size, ecc, margin, and colors. Default is image/svg+xml; format=png returns image/png; format=json wraps the svg and a data URI. Nothing stored.

View Docs

Parameters

text string Required

String to encode. Trimmed. Max 1024 characters.

Example: https://threethirds.dev

size number

Output width and height in px, 64 to 1024. Default 256.

Example: 256

ecc string

Error correction: L, M, Q, or H. Default M.

Example: M

format string

svg (default), png, or json.

Example: png

Responses

200 OK Success
{
  "ok": true,
  "text": "https://threethirds.dev",
  "size": 256,
  "ecc": "M",
  "svg": "<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"256\" height=\"256\" viewBox=\"0 0 256 256\">...</svg>",
  "dataUri": "data:image/svg+xml;base64,..."
}
400 BAD_REQUEST text is required
400 BAD_REQUEST size has to be an integer from 64 to 1024
400 BAD_REQUEST ecc has to be L, M, Q, or H

Minecraft Status

Live status, player count, version, and clean MOTD for any Minecraft server.

View Docs

Parameters

server string Required

Server IP or hostname

Example: 2b2t.org

Responses

200 OK Success
{
  "online": true,
  "ip": "144.217.10.166",
  "port": 25565,
  "version": "1.20.4",
  "players": {
    "online": 412,
    "max": 1050
  },
  "motd": "2b2t is a Minecraft server with no rules."
}
502 BAD_GATEWAY Failed to query server

Status Page Lie Detector

Audits official Statuspage claims against live monotonic latency probes.

View Docs

Parameters

service string Required

github, vercel, or cloudflare

Example: vercel

Responses

200 OK Success
{
  "service": "Vercel",
  "official_claim": "All Systems Operational",
  "live_probe": {
    "reachable": true,
    "status": 200,
    "latencyMs": 62
  },
  "trust_score": "99/100",
  "verdict": "Truthful: Fast response time matches operational status claim."
}
404 NOT_FOUND Unknown service

Hackatime User Stats

Aggregates total coding hours, daily averages, streaks, trust factor, languages, and projects.

View Docs

Parameters

username string Required

Hackatime username or Slack ID

Example: chish

Responses

200 OK Success
{
  "username": "chish",
  "total_hours": 26,
  "daily_average_hours": 3.7,
  "streak_days": 8,
  "trust_factor": "green",
  "languages": [
    {
      "name": "Rust",
      "hours": 15.2,
      "percent": 58.5
    }
  ]
}
403 FORBIDDEN User has disabled public stats lookup
404 NOT_FOUND User not found

Currently Hacking

Live feed of Hack Club members actively logging code in the last 5 minutes.

View Docs

Responses

200 OK Success
{
  "count": 14,
  "users": [
    {
      "display_name": "Orpheus",
      "avatar_url": "https://hackatime.hackclub.com/images/athena.png",
      "working_on": {
        "project_name": "hackatime"
      }
    }
  ]
}
502 BAD_GATEWAY Failed to fetch currently hacking users

Generate Master Key

Generates a 128-bit ApiContrib Master Key (ac_live_...) and initializes an empty vault.

View Docs

Parameters

name string

Label for the key

Example: Production Laptop

Responses

200 OK Success
{
  "message": "Master key successfully generated! Store it safely; it will never be displayed again.",
  "master_key": "ac_live_7f8a9b0c1d2e3f4a5b6c7d8e9f0a1b2c",
  "user_id": "c1a2b3c4-d5e6-7f8a-9b0c-1d2e3f4a5b6c"
}

Authenticated Weather Proxy

Api Required

Proxies live weather queries by unlocking the user's vaulted OpenWeather credential. Zero credentials exposed to frontend.

View Docs

Parameters

city string Required

City name in path

Example: tokyo

Responses

200 OK Success
{
  "city": "Tokyo",
  "country": "JP",
  "temperature_c": 18.5,
  "conditions": "clear sky",
  "proxied_for": "Chish"
}
401 UNAUTHORIZED Missing API key
400 BAD_REQUEST No openweather key found in your vault

Rust Crate Inspector

Fetches info like total downloads, repository, docs.rs links and stuff from crates.io

View Docs

Parameters

city string Required

Crate name in path

Example: tokio

Responses

200 OK Success
{
  "name": "tokio",
  "max_version": "1.53.1",
  "description": "An event-driven, non-blocking I/O platform for writing asynchronous I/O\nbacked applications.\n",
  "downloads": {
    "total": 1003889737,
    "recent": 235563205
  },
  "repository": "https://github.com/tokio-rs/tokio",
  "documentation": "https://docs.rs/tokio",
  "crates_io_url": "https://crates.io/crates/tokio",
  "updated_at": "2026-07-20T17:06:09.996426Z",
  "cached": false
}
404 NOT_FOUND Crate not found on crates.io
502 BAD_GATEWAY Crates.io returned HTTP error

Linux Kernel Info

Fetches info like total downloads, repository, docs.rs links and stuff from crates.io

View Docs

Parameters

version string Required

Kernel version to audit

Example: 6.12.5

Responses

200 OK Success
{
  "queried_version": "6.12.5",
  "branch": "6.12",
  "status": "Active (Latest Stable/Mainline)",
  "is_eol": false,
  "latest_patch_on_branch": "6.12.5",
  "recommendation": "You are on the latest cutting-edge kernel."
}
404 NOT_FOUND Invalid version format
502 BAD_GATEWAY Failed to fetch Linux kernel data

XKCD Comics

Browse and randomise XKCD comics, with some metadata like title, alt and stuff. Also try /xkcd/random and /xkcd/latest

View Docs

Parameters

id string

Comic ID(like 327) could also be 'latest' or 'random'

Example: 327

Responses

200 OK Success
{
  "id": 327,
  "title": "Exploits of a Mom",
  "image_url": "https://imgs.xkcd.com/comics/exploits_of_a_mom.png",
  "alt_text": "Her daughter is named Help I'm trapped in a driver's license factory.",
  "published_date": "2007-10-10"
}
400 BAD_REQUEST Invalid comic ID
404 NOT_FOUND Comic does not exist

Network & IP Diagnostics

Inspect your IP address, geolocation headers and some other metadata, use /ip/raw for plaintext output

View Docs

Responses

200 OK Success
{
  "ip": "203.0.113.195",
  "country": "IN",
  "user_agent": "curl/8.6.0",
  "edge_ray_id": "87c4f1a2e3b5d6",
  "timestamp": "2026-10-04T12:00:00.000Z"
}

Text & Reading Time Analyzer

Calculates word counts, character counts, sentences, estimated reading time (200 WPM), and speaking time (130 WPM).

View Docs

Parameters

text string Required

Raw text or markdown content to analyze

Example: Systems engineering is the art of understanding constraints.

Responses

200 OK Success
{
  "metrics": {
    "words": 8,
    "characters": 61,
    "characters_no_spaces": 54,
    "sentences": 1,
    "paragraphs": 1
  },
  "reading_time": {
    "minutes": 0.04,
    "formatted": "2s"
  },
  "speaking_time": {
    "minutes": 0.06,
    "formatted": "4s"
  }
}
400 BAD_REQUEST Request body must include a non-empty text string

List of Apis

List of Public Apis

View Docs

Responses

200 OK Success
{
  "ok": true,
  "data": {
    "city": "Sydney",
    "tempC": 21.4
  }
}
500 INTERNAL_SERVER_ERROR Internal server error

Hackclub AI

Api Required

An AI service available to only Hack Club Members.

View Docs

Parameters

model string Required

THe model of AI you want to use

Example: anthropic/claude-fable-5.1

messages array Required

The message you want to send to the AI

Example: {"role": "user", "content": "Hello!"}

temperature number

controsl randomness in model's response

Example: 3

max_tokens number

Max number of tokens to generate

Example:

stream boolean

Wheather to stream the response.

Example: true

Example:

Responses

200 OK Success
{
  "ok": true,
  "data": {
    "city": "Sydney",
    "tempC": 21.4
  }
}
400 BAD_REQUEST Invalid request body
400 MISSING_UPSTREAM_CREDENTIAL Hack Club AI upstream credential is missing
502 UPSTREAM_ERROR Hackclub AI Error
500 INTERNAL_SERVER_ERROR Internal server error

Search Airlines

Api Required

Search for any airline by name

View Docs

Parameters

airline string Required

Name of airline you are searching

Example: Qantas

Responses

200 OK Success
{
  "ok": true,
  "data": {
    "city": "Sydney",
    "tempC": 21.4
  }
}
400 MISSING_UPSTREAM_CREDENTIAL Aviationstack upstream credential is missing
502 UPSTREAM_ERROR Aviationstack returned a error
500 INTERNAL_SERVER_ERROR Internal server error

Search Flights

Api Required

Search for any airline by name

View Docs

Parameters

flightNumber string Required

The IATA flight number to search for.

Example: QF1

Responses

200 OK Success
{
  "ok": true,
  "data": {
    "city": "Sydney",
    "tempC": 21.4
  }
}
400 MISSING_UPSTREAM_CREDENTIAL Aviationstack upstream credential is missing
502 UPSTREAM_ERROR Aviationstack returned a error
500 INTERNAL_SERVER_ERROR Internal server error

Search Airports

Api Required

Search for any airport by name, IATA code, or ICAO code

View Docs

Parameters

airport string Required

The IATA or ICAO code

Example: SYD

Responses

200 OK Success
{
  "ok": true,
  "data": {
    "city": "Sydney",
    "tempC": 21.4
  }
}
400 MISSING_UPSTREAM_CREDENTIAL Aviationstack upstream credential is missing
502 UPSTREAM_ERROR Aviationstack returned a error
500 INTERNAL_SERVER_ERROR Internal server error

Search Aircraft

Api Required

Search for any aircraft by type, registration number, or ICAO code

View Docs

Parameters

airport string Required

The IATA or ICAO code

Example: SYD

Responses

200 OK Success
{
  "ok": true,
  "data": {
    "city": "Sydney",
    "tempC": 21.4
  }
}
400 MISSING_UPSTREAM_CREDENTIAL Aviationstack upstream credential is missing
502 UPSTREAM_ERROR Aviationstack returned a error
500 INTERNAL_SERVER_ERROR Internal server error