Need a public file proof?
Verifyum creates free file proofs on Solana Mainnet over HTTP or MCP. The original file stays local, and the service receives only a privacy-preserving commitment.
An agent can anchor one local decision record containing its instructions, prompt, model, parameters, tool calls and output. The proof shows that the record existed unchanged by the block time. It does not prove that the agent ran with the recorded settings.
The Solana transaction is the primary evidence. OpenTimestamps on Bitcoin, a qualified EU timestamp, witness-cosigned Sigsum and Certificate Transparency provide independent corroboration. Verifyum's signature, GitHub, Software Heritage and Internet Archive are operator or availability records. Check the public receipt before describing a channel as confirmed.
New finalized proofs are announced on Telegram and in the Atom feed. These announcements are excluded from the evidence records.
Read about Verifyum or inspect the Witness Layer.
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 }
Passphrase REST API Endpoint
GET /passphrase[/{groups}]
Pronounceable passphrase, four hyphen separated groups by default, 2 to 12 allowed. The argument counts groups, not characters.
curl https://aisenseapi.com/services/v1/passphrase/4
{ "passphrase": "hudil-rosi4-Zerzo-Coze#", "groups": 4, "length": 23, "entropy_bits": 91.4 }
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" }
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 }
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}
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 }
POST /webhook_capture - GET /webhook_capture/{capture_id}
Create a capture session, point a sender at its unique URL and read back the first inbound request. The result includes method, headers, client IP and parsed body. Wait for up to 25 seconds or ask for one completion signal. No tunnel or server is needed. 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 }
}
}
POST /webhook_action - GET /webhook_action/{action_id}
Post a form definition and send the returned link to one person. Set respondents from 2 to 20 for separate one-use links and an aggregate result. Read immediately, wait for up to 25 seconds or add notify_url for one completion signal.
Field types are radio, select, text, textarea and checkbox. Group status moves through pending, partial and answered. 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" } }
POST /webhook_schedule - GET /webhook_schedule/{schedule_id}
POST a URL and payload with delay_seconds or fire_at. Add every for a recurring job. Read, wait for or cancel it through the returned bearer URL. Delivery runs once a minute. Public-address checks run at creation and delivery, and redirects are not 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 }
POST /agent_wake - GET /agent_wake/{task_id}
Create one durable wait state for a webhook, a person or a time. The first matching event completes the task. REST clients may wait up to 25 seconds for a terminal result, and MCP clients use the Tasks extension.
POST /agent_wake { "event_type": "webhook", "timeout_seconds": 3600 }
-> { "resultType": "task", "taskId": "2eb1a08d-...", "status": "working",
"_meta": { "com.aisenseapi/agentWake": { "wakeUrl": ".../wake" } } }
GET /agent_wake/{task_id}
-> { "resultType": "complete", "status": "completed", "result": { ... } }
POST /heartbeat - POST /heartbeat/{heartbeat_id}/ping
Watch a process that should check in on a fixed rhythm. The first missed deadline fires one public webhook or wakes an Agent Wake task. A ping moves the next expected time but never moves the fixed 24-hour expiry.
POST /heartbeat
{ "expect_every_seconds": 300, "grace_seconds": 60,
"on_miss": { "url": "https://example.com/agent-offline",
"payload": { "agent": "worker-7" } } }
POST /heartbeat/{heartbeat_id}/ping
-> { "status": "armed", "ping_count": 1, "next_expected_at_datetime": "..." }
The heartbeat ID is a bearer secret. Webhook destinations are checked for SSRF at creation and again at delivery. Miss actions run once with no retry. Read the Heartbeat guide.
POST /lease - POST /lease/complete
Let one worker claim a shared key. The winner receives an owner token and a monotonic fencing token. Other workers get HTTP 409 while it is held. A completed JSON result can be returned to later callers with the same key and fingerprint.
POST /lease/namespace {}
-> { "namespace": "ns_...", "entropy_bits": 256 }
POST /lease
{ "namespace": "ns_...", "key": "invoice:2026-09-05",
"ttl_seconds": 60, "fingerprint": "charge-order-501" }
-> { "status": "held", "owner_token": "own_...", "fencing_token": 184 }
A lease can be renewed, released or completed. The absolute lifecycle ends 24 hours after its first acquisition and cannot be extended. Read the Lease guide.
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