Free Public REST APIs

Utility endpoints for time, randomness, encoding, hashing, web lookups, webhooks and crypto - with no API key, no sign-up and no cost. Drop a URL into curl, Python, JavaScript or an LLM tool definition and it works.

Base URL: https://aisenseapi.com/services/v1 - Open source client libraries and tests: github.com/aisenseapi/aisense-free-public-rest-apis

Connecting an AI agent?

Use the free remote MCP server at https://aisenseapi.com/mcp. It gives an agent nine tools for human approval, webhooks, temporary storage, short links, time and UUIDs.

See the MCP tool list and client examples.

Detailed API guides

Each guide includes request formats, response fields, curl examples and common errors.

Before you write a client

Three service-wide behaviours decide how your error handling has to look. Every response format on this page was verified by calling the live service.

The response key is named after the endpoint.
There is no generic data or result wrapper. /md5_hash returns md5_hash, /ping returns ping, /random_color returns random_color. Each endpoint below states its key.
Errors are {"error": "message"} with a real HTTP status.
One rule across the whole surface: 400 is your mistake, 404 an unknown id or endpoint, 429 the rate limit, 500 our failure, 502 and 504 an upstream. Branch on the status or on the error key - both are trustworthy, and a path matching no route is a plain 404 in the same shape.
Not everything is JSON.
The three decoders return application/octet-stream unless you send Accept: application/json.

Time

See the time API guide for datetime, timestamp and timezone examples.

Datetime REST API Endpoint

GET /datetime[/{offset}]

Current date and time in ISO 8601. The optional offset is a four-digit UTC offset with an optional sign - +0200, -0530 or 0100. An hour-only value such as 1 is not a valid route.

curl https://aisenseapi.com/services/v1/datetime/+0200

{ "datetime": "2026-08-16T11:44:35+02:00" }

Timestamp REST API Endpoint

GET /timestamp

Current Unix timestamp in seconds. Response key: timestamp.

{ "timestamp": 1786873261 }

Microtimestamp REST API Endpoint

GET /microtimestamp

Unix timestamp with microsecond precision. Response key: microtimestamp.

{ "microtimestamp": 1786873474.745043 }

Timezones REST API Endpoint

GET /timezones[/{offset}]

All available timezones, optionally filtered by a four-digit offset. The list contains objects, not strings.

{
  "timezones": [
    { "timezone": "Africa/Abidjan",  "offset": "+0000" },
    { "timezone": "Africa/Blantyre", "offset": "+0200" }
  ]
}

Swatchinternettime REST API Endpoint

GET /swatchinternettime

Swatch Internet Time. The day is divided into 1000 .beats of 86.4 seconds each, based on Biel Meantime, with no time zones. beat is a string with a leading @, not a number.

{ "beat": "@444", "date": "2026-08-16" }

Timestamp Convert REST API Endpoint

POST /timestamp_convert

One time value in, every representation out. Accepts unix seconds, unix milliseconds (13 digits and up, the Date.now() format, detected automatically), ISO 8601, RFC 2822, or "now". The optional offset uses the same four digit form as /datetime. Bad input returns HTTP 400.

Request:  { "data": "1700000000123", "offset": "+0100" }

Response: { "input": "1700000000123", "detected": "unix_ms", "timestamp": 1700000000,
  "datetime": "2023-11-14T23:13:20+01:00", "rfc2822": "Tue, 14 Nov 2023 23:13:20 +0100",
  "utc_datetime": "2023-11-14T22:13:20+00:00" }

Random

See the random generator API guide for UUID, GUID, password, number and color endpoints.

Random Number REST API Endpoint

GET /random_number[/{from}[/{to}]]

Random integer, inclusive of both bounds. No arguments gives 1 - 6. A single argument is treated as the upper bound with the lower bound fixed at 1.

curl https://aisenseapi.com/services/v1/random_number/1/100

{ "random_number": 73, "range": { "from": 1, "to": 100 } }

Random Color REST API Endpoint

GET /random_color

Random hex colour, always six digits. Response key: random_color.

{ "random_color": "#9b6bbf" }

UUID REST API Endpoint

GET /uuid

Generate a UUID version 4. Response key: uuid.

{ "uuid": "429151ee-82a1-4438-b2f1-b6b9c9e4a41f" }

GUID REST API Endpoint

GET /guid

Generate a GUID. Response key: guid.

{ "guid": "750dd9a6-a507-4a89-b4ec-8cd71fc115b7" }

Password REST API Endpoint

GET /password[/{length}]

Random password including punctuation, twelve characters by default.

curl https://aisenseapi.com/services/v1/password/16

{ "password": "jFehS]AKGx9wl[jp", "password_length": 16 }

Transform

All Transform endpoints are POST and accept JSON, plain text with Content-Type: text/plain, or a file upload.

Use the encoding API guide for Base32, Base58 and Base64. The QR code API guide covers image encoding and decoding.

Base64 Encode REST API Endpoint

POST /base64_encode

{ "data": "Hello world" }

{ "base64_encoded_data": "SGVsbG8gd29ybGQ=" }

Base64 Decode REST API Endpoint

POST /base64_decode

Returns the decoded bytes as application/octet-stream - the payload and nothing else. Send Accept: application/json to get a typed envelope instead.

# default: raw bytes
Request:  { "data": "SGVsbG8gd29ybGQ=" }
Response: Hello world

# with Accept: application/json
{ "data": "eyJrZXkiOiJ2YWx1ZSJ9" }
Response: { "type": "json", "decoded_data": { "key": "value" } }

# non-JSON content, with Accept: application/json
Response: { "type": "binary", "encoding": "base64", "decoded_data": "iVBORw0KGgo..." }

Base58 Encode REST API Endpoint

POST /base58_encode

Request:  { "data": "Hello" }
Response: { "base58_encoded_data": "9Ajdvzr" }

Base58 Decode REST API Endpoint

POST /base58_decode

Same Accept behaviour as Base64 Decode. An invalid Base58 character returns HTTP 400 with {"error": "Invalid Base58 input."}.

Request:  { "data": "9Ajdvzr" }
Response: Hello

Base32 Encode REST API Endpoint

POST /base32_encode

Request:  { "data": "Hello" }
Response: { "base32_encoded_data": "JBSWY3DP" }

Base32 Decode REST API Endpoint

POST /base32_decode

Same Accept behaviour as Base64 Decode.

Request:  { "data": "JBSWY3DP" }
Response: Hello

Slugify REST API Endpoint

POST /slugify

Text to URL slug. Scandinavian letters and common Latin diacritics are transliterated by a fixed table, so the same input gives the same slug on every machine. Input with no sluggable characters returns HTTP 400 rather than an empty slug.

{ "data": "Blåbærsyltetøy på Ås!" }   ->   { "slug": "blabaersyltetoy-pa-as" }

JWT Encode REST API Endpoint

POST /jwt_encode

Encodes claims into an HS256 JSON Web Token. data takes the claims as a JSON object directly, or as a string containing JSON - both forms produce the same token. A string that does not parse as JSON returns HTTP 400.

{ "data": { "user": "alice" }, "secret": "your_secret_key" }          # object form
{ "data": "{\"user\":\"alice\"}", "secret": "your_secret_key" }      # string form, same token

{ "jwt": "eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJ1c2VyIjoiYWxpY2UifQ..." }

Also accepts plain text with an X-Secret header, or a file upload in a jwt_data field.

JWT Decode REST API Endpoint

POST /jwt_decode

{ "data": "eyJ0eXAiOiJKV1Qi...", "secret": "your_secret_key" }

{ "decoded_payload": { "user": "alice" } }

QR Code Encode REST API Endpoint

POST /qrcode_encode

Generates a QR code as a Base64 PNG. Encodes URLs, plain text, vCards, Wi-Fi credentials and calendar events. The request field is payload, with data accepted as an alias.

{ "payload": "https://aisenseapi.com/" }

{ "qrcode_image": "iVBORw0KGgoAAAANSUhEUg...", "image_type": "png" }

QR Code Decode REST API Endpoint

POST /qrcode_decode

Accepts a Base64 image in the payload field, or a file upload in a qrcode_image field.

{ "payload": "iVBORw0KGgoAAAANSUhEUg..." }

{ "qrcode_content": "https://aisenseapi.com/" }

Hash

All hash endpoints are POST and accept JSON, plain text or a file upload. Each returns a key named after the algorithm - never hash.

See the hashing API guide for all five algorithms and input formats.

Hash endpoints, response keys and example digests
EndpointResponse keyDigest of "Hello"
/md5_hashmd5_hash8b1a9953c4611296a827abf8c47804d7
/sha1_hashsha1_hashf7ff9e8b7bb2e09b70935a5d785e0cc5d9d0abf0
/sha256_hashsha256_hash185f8db32271fe25f561a6fc938b2e26...
/sha512_hashsha512_hash3615f80c9d293ed7402687f94b22d58e...
/crc32_checksumcrc32_checksum4157704578

MD5, SHA1, SHA256 and SHA512 Hash REST API Endpoints

POST /md5_hash - /sha1_hash - /sha256_hash - /sha512_hash

curl -X POST https://aisenseapi.com/services/v1/sha256_hash \
  -H "Content-Type: application/json" -d '{"data": "Hello"}'

{ "sha256_hash": "185f8db32271fe25f561a6fc938b2e264306ec304eda518007d1764826381969" }

CRC32 Checksum REST API Endpoint

POST /crc32_checksum

Returns an integer, not a hex string.

Request:  { "data": "Hello" }
Response: { "crc32_checksum": 4157704578 }

Hash Verify REST API Endpoint

POST /hash_verify

Verify data against a hash from any endpoint above. The algorithm is recognized from the hash itself: an integer means crc32, hex strings map by length (8 crc32, 32 md5, 40 sha1, 64 sha256, 128 sha512). A mismatch is a result with match: false, and computed is always included so the difference is visible. JSON only.

Request:  { "data": "Hello", "hash": "185f8db32271fe25f561a6fc938b2e26..." }

Response: { "match": true, "algorithm": "sha256", "computed": "185f8db3..." }

Web

Ping REST API Endpoint

GET /ping

Connectivity check. Response key: ping.

{ "ping": "pong" }

Health REST API Endpoint

GET /health

Service health with a high-precision timestamp. The second key is microtimestamp, not timestamp.

{ "status": "ok", "microtimestamp": 1786873258.589068 }

Client IP REST API Endpoint

GET /client_ip

The public IP address of the caller.

{ "ip": "203.0.113.42" }

User Agent REST API Endpoint

GET /user_agent

{ "user_agent": "curl/8.5.0" }

IP Reverse Lookup REST API Endpoint

GET /ip_reverse_lookup/{ip}

Geolocates an IP address. city and place are frequently null, and the coordinates fall back to the country centroid when the city is unknown. Latitude and longitude are strings.

curl https://aisenseapi.com/services/v1/ip_reverse_lookup/8.8.8.8

{
  "ip": "8.8.8.8",
  "country": "United States",
  "city": null,
  "location": { "lat": "37.751000", "lng": "-97.822000" },
  "place": null,
  "timezone": "America/Chicago"
}

Domain IP Lookup REST API Endpoint

GET /domain_ip_lookup/{domain}

{ "domain": "example.com", "ip": "104.20.23.154" }

Email Validate REST API Endpoint

POST /email_validate

Syntax check, then DNS through the host resolver - nothing goes to a third party. has_mx means the domain publishes MX records; has_address_record covers the RFC 5321 fallback, so a missing MX alone does not prove an address dead. A failing address is a result with valid_syntax: false, and the endpoint never opens an SMTP conversation.

Request:  { "data": "test@gmail.com" }

Response: { "email": "test@gmail.com", "valid_syntax": true, "domain": "gmail.com",
  "has_mx": true, "mx_hosts": ["gmail-smtp-in.l.google.com", "..."], "has_address_record": true }

Validate REST API Endpoint

POST /validate/{type}

Check-digit validation for iban, card, orgnr, kontonummer and phone. Pure arithmetic - nothing is looked up, so valid means well-formed with a correct check digit. An invalid value is a result with valid: false, and the card number is never echoed back. Full details.

POST /validate/iban   { "data": "NO9386011117947" }
  ->  { "type": "iban", "valid": true, "country": "NO", "checksum_ok": true }

Storage REST API Endpoint

POST /storage - GET /storage/{storage_id}

Temporary key-value storage for JSON, text or files. Post any body, get a UUID, retrieve it from anywhere - another machine, a later pipeline step, a different agent call. No database and no credentials.

The body is stored verbatim: whatever you send is exactly what comes back, with no wrapper added or removed. Everything expires after 24 hours.

curl -X POST https://aisenseapi.com/services/v1/storage \
  -H "Content-Type: application/json" -d '{"result": 42}'

{ "storage_id": "123e4567-e89b-12d3-a456-426614174000", "expire_timestamp": 1738457158 }

curl https://aisenseapi.com/services/v1/storage/123e4567-e89b-12d3-a456-426614174000
Response: {"result": 42}

URL Shortener REST API Endpoint

GET /url_shortener/{url}

The target URL goes inline in the path. Links expire after 24 hours.

curl "https://aisenseapi.com/services/v1/url_shortener/https://example.com/some/long/path"

{ "short_url": "https://307.fi/KtNshX2B", "expire_timestamp": 1786959715 }

Webhook Capture REST API Endpoint

POST /webhook_capture - GET /webhook_capture/{capture_id}

Create a capture session, get a unique URL, point any external service at it - Stripe, GitHub, Shopify - and read back the full inbound request: method, headers, query parameters, client IP and parsed body. No ngrok, no local tunnel, no server. Expires after 24 hours.

# 1. create
curl -X POST https://aisenseapi.com/services/v1/webhook_capture
{ "ok": true, "capture_id": "6f8c9e52-...", "update_url": ".../update", "read_url": "...", "expire_timestamp": ... }

# 2. point any HTTP method at update_url

# 3. read it back
{
  "ok": true,
  "capture_id": "6f8c9e52-...",
  "captured_at_datetime": "2026-08-16T09:41:56Z",
  "request": {
    "method": "POST",
    "headers": { "content-type": "application/json" },
    "client_ip": "203.0.113.10",
    "body": { "json": { "event": "payment.created" }, "text": null, "base64": null, "raw_length": 28 }
  }
}

Webhook Action REST API Endpoint

POST /webhook_action - GET /webhook_action/{action_id}

Human-in-the-loop for automated pipelines. When a process needs a person to decide before it continues, this handles the whole pattern with no backend of your own: post a form definition, send the resulting form_url to a human, and poll result_url until status becomes answered.

Field types are radio, select, text, textarea and checkbox. options accepts plain strings or {"value": ..., "label": ...} objects. Expires after 24 hours.

{
  "title": "Approve deployment to production?",
  "fields": [
    { "type": "radio", "name": "decision", "label": "Decision", "required": true,
      "options": [ { "value": "approve", "label": "Approve" },
                   { "value": "reject",  "label": "Reject"  } ] },
    { "type": "textarea", "name": "comment", "label": "Notes" }
  ]
}

{ "ok": true, "action_id": "9e0e6d3b-...", "form_url": ".../form", "result_url": "...",
  "expire_timestamp": ..., "expire_datetime": "2026-08-17T09:45:12Z" }
# poll the result
{ "ok": true, "action_id": "9e0e6d3b-...", "status": "answered",
  "answered_at_datetime": "2026-08-16T15:13:20Z",
  "response": { "decision": "approve", "comment": "Looks good" } }

Webhook Schedule REST API Endpoint

POST /webhook_schedule - GET /webhook_schedule/{schedule_id}

The timer an agent does not have. POST a URL and payload with delay_seconds or fire_at, and the payload is delivered at that time with one retry. The horizon is one minute to 24 hours, and delivery lands on the next whole minute after the job falls due rather than at the exact second. The target must resolve to a public address; private, loopback and reserved ranges are refused at creation and again at delivery, and redirects are never followed. Full details.

POST /webhook_schedule   { "url": "https://example.com/hook", "delay_seconds": 1200, "payload": { "job": 42 } }
  ->  { "ok": true, "schedule_id": "1f1d7b8b-...", "status": "scheduled", "result_url": "..." }

GET  /webhook_schedule/{id}
  ->  { "status": "fired", "attempts": 1, "http_status": 200 }

Crypto

Wallet generation is for development and testing only. A private key produced by a public HTTP endpoint has crossed a network you do not control. Never fund a wallet generated this way.

Solana Generate New Wallet REST API Endpoint

GET /solana/generate_new_wallet

{ "private_key": "...", "public_address": "..." }

Bitcoin Generate New Wallet REST API Endpoint

GET /bitcoin/generate_new_wallet

Follows Bitcoin's secp256k1 standard, with the private key in hexadecimal and WIF form.

{ "private_key": "...", "private_key_wif": "...", "public_address": "..." }

Ethereum Generate New Wallet REST API Endpoint

GET /ethereum/generate_new_wallet

{ "private_key": "0x...", "public_address": "0x..." }

Solana, Bitcoin and Ethereum Balance REST API Endpoints

GET /{chain}/balance/{address}

Ethereum returns both balances as strings, because Wei routinely exceeds 253 - the largest integer a JSON number survives in a JavaScript client. Bitcoin and Solana return numbers. Their smallest units stay inside the safe range.

/solana/balance/{address}
{ "wallet": "So1111...", "balance_sol": 1694.799038633, "balance_lamports": 1694799038633 }

/bitcoin/balance/{address}
{ "wallet": "1A1zP1...", "final_balance_btc": 107.36719456, "final_balance_sats": 10736719456 }

/ethereum/balance/{address}
{ "wallet": "0xd8dA...", "balance_eth": "6.634527787345637061", "balance_wei": "6634527787345637061" }

Quick start

curl

curl https://aisenseapi.com/services/v1/uuid

Python

Zero dependencies, standard library only.

from aisense_api import AISenseAPI
api = AISenseAPI()

print(api.get_uuid()["uuid"])
print(api.hash_sha256("Hello")["sha256_hash"])
print(api.ip_reverse_lookup("8.8.8.8")["country"])

JavaScript

Node 18 or later, and every modern browser. Native fetch, no dependencies.

import { AISenseAPI } from './aisense-api.js'
const api = new AISenseAPI()

console.log((await api.getUUID()).uuid)
console.log((await api.hashSHA256('Hello')).sha256_hash)

LLM function calling

The repository includes openai-tools.json with tool definitions for any model that supports function calling, and SKILL.md for Claude.

import json
from openai import OpenAI

with open("openai-tools.json") as f:
    tools = json.load(f)

client = OpenAI()
response = client.chat.completions.create(
    model="gpt-4o", tools=tools,
    messages=[{"role": "user", "content": "Generate a UUID and hash Hello with SHA256"}]
)

Client libraries, tool definitions and a test suite that verifies every response format against production: github.com/aisenseapi/aisense-free-public-rest-apis

Endpoint guides

Every endpoint has its own page with worked examples, response fields, the edge cases that matter and what the thing is actually good for.

Transform

Hash

Random

Time

Web

Crypto

All endpoints

Relative to https://aisenseapi.com/services/v1. Storage, URL Shortener, Webhook Capture and Webhook Action all expire after 24 hours.

CategoryEndpointMethodResponse key(s)
Time/datetime[/{offset}]GETdatetime
Time/timestampGETtimestamp
Time/microtimestampGETmicrotimestamp
Time/timezones[/{offset}]GETtimezones
Time/swatchinternettimeGETbeat, date
Time/timestamp_convertPOSTdetected, timestamp, datetime, rfc2822, utc_datetime
Random/random_number[/{from}[/{to}]]GETrandom_number, range
Random/random_colorGETrandom_color
Random/uuidGETuuid
Random/guidGETguid
Random/password[/{length}]GETpassword, password_length
Transform/base64_encodePOSTbase64_encoded_data
Transform/base64_decodePOSTraw bytes, or type + decoded_data
Transform/base58_encodePOSTbase58_encoded_data
Transform/base58_decodePOSTraw bytes, or type + decoded_data
Transform/base32_encodePOSTbase32_encoded_data
Transform/base32_decodePOSTraw bytes, or type + decoded_data
Transform/slugifyPOSTslug
Transform/jwt_encodePOSTjwt
Transform/jwt_decodePOSTdecoded_payload
Transform/qrcode_encodePOSTqrcode_image, image_type
Transform/qrcode_decodePOSTqrcode_content
Hash/md5_hashPOSTmd5_hash
Hash/sha1_hashPOSTsha1_hash
Hash/sha256_hashPOSTsha256_hash
Hash/sha512_hashPOSTsha512_hash
Hash/crc32_checksumPOSTcrc32_checksum
Hash/hash_verifyPOSTmatch, algorithm, computed
Web/pingGETping
Web/healthGETstatus, microtimestamp
Web/client_ipGETip
Web/user_agentGETuser_agent
Web/ip_reverse_lookup/{ip}GETcountry, city, location, timezone
Web/domain_ip_lookup/{domain}GETdomain, ip
Web/email_validatePOSTvalid_syntax, has_mx, mx_hosts
Web/webhook_schedulePOST / GETschedule_id, status, attempts, http_status
Web/validate/{type}POSTtype, valid, per-check fields
Web/storagePOST / GETstorage_id, expire_timestamp
Web/url_shortener/{url}GETshort_url, expire_timestamp
Web/webhook_capturePOST / GETcapture_id, update_url, read_url
Web/webhook_actionPOST / GETaction_id, form_url, result_url
Crypto/solana/generate_new_walletGETprivate_key, public_address
Crypto/solana/balance/{address}GETbalance_sol, balance_lamports
Crypto/bitcoin/generate_new_walletGETprivate_key, private_key_wif, public_address
Crypto/bitcoin/balance/{address}GETfinal_balance_btc, final_balance_sats
Crypto/ethereum/generate_new_walletGETprivate_key, public_address
Crypto/ethereum/balance/{address}GETbalance_eth, balance_wei (strings)