Your tenant, your tier, your ceiling, your keys.
const url = 'https://testnet.permafrost.live/me';const options = {method: 'GET', headers: {Authorization: 'Bearer <token>'}};
try { const response = await fetch(url, options); const data = await response.json(); console.log(data);} catch (error) { console.error(error);}curl --request GET \ --url https://testnet.permafrost.live/me \ --header 'Authorization: Bearer <token>'Key lane only. This route authenticates the caller’s own pf_sk_
itself rather than trusting context resolved elsewhere, so a tenant that
arrived through a signed token has no key to present here and is
answered 401. Everything about such a tenant is visible on the
operator surface on request instead.
Only active keys are listed, and each is shown by prefix and id — the
key itself is never returned by any route except the one that minted it.
The entry that made this request carries current: true.
rate_limit_rps is the tenant’s own requests-per-second ceiling: the
number the per-tenant bucket is sized by. usage is operational — reads
and bytes — and carries no price. credit is null when no prepaid
credit is configured, and stays null rather than failing the route
when the balance cannot be read.
Authorizations
Section titled “Authorizations”Responses
Section titled “Responses”The calling tenant’s own record.
The calling tenant’s own record, scoped to that one tenant.
object
The Sui address that is this tenant.
This tenant’s own requests-per-second ceiling — what its bucket is sized by.
The tenant’s active keys.
One active key, by prefix and id. The key itself is not here.
object
The first characters of the key — enough to recognise it, not enough to use it.
True for the key that authenticated this request.
Operational usage, accumulated from the edge’s own access record. No price, no bill.
object
Prepaid credit standing, read on chain. null when no credit is
configured, and also null rather than an error when the balance
cannot be read.
object
Example
{ "tenant_address": "0x2c4f6a8b0d1e3f5a7b9c0d2e4f6a8b1c3d5e7f9a0b2c4d6e8f0a1b3c5d7e9f10", "display_name": "Northwind Media", "tier": "free", "rate_limit_rps": 10, "keys": [ { "key_id": "5e2b9a71-4c08-4d3f-91b6-7a0d2f8c1e34", "key_prefix": "pf_sk_5e2b9", "permissions": [ "read", "write" ], "status": "active", "created_at": "2026-09-01T09:14:03Z", "last_used_at": "2026-09-13T11:47:52Z", "current": true } ], "usage": { "total_reads": 1842, "total_bytes": 734003200, "first_seen": "2026-09-01T09:20:11Z", "last_settled": null }, "credit": { "balance": "0", "pool_id": "0x423ccb5f81e003e15ef6768c7d44360933f52f00490515479547413e1404779d" }}No usable pf_sk_ on the request. Absent, malformed, unknown, revoked,
or belonging to a tenant that is no longer active — one answer for all
of them. A caller on the token lane lands here too: this route
authenticates by key, and a token holder has no key to present.
The refusal shape. detail is present on a few routes and deliberately
absent from the custody surface, where a detail string could carry an
internal path.
object
The code, or a short fixed sentence.
A human-readable note, where a route carries one.
Example
{ "error": "invalid or inactive API key"}Permafrost runs on Sui testnet and Walrus testnet. Everything here describes a shipped testnet instance, not a production service.