[{"data":1,"prerenderedAt":76},["ShallowReactive",2],{"doc-me":3},{"blocks":4,"markdown":75},[5,66,69,73],{"kind":6,"method":7,"path":8,"operation":9,"example":18,"response":25,"errors":43,"authErrors":48},"endpoint","GET","\u002Fv1\u002Fme",{"method":7,"path":8,"summary":10,"description":11,"parameters":12,"body":13,"responses":14},"Whoami","Which organisation this key acts for, and what its plan allows.\n\nFree, for the same reason `\u002Foracles` is: it is an identity check, and a\ncaller should not have to spend a credit to discover they have none left.\n\nTHE ORG ID, NOT THE SLUG. A slug is a locator and `tables.Org` says it \"may\nbe changed deliberately\"; a service that scoped by one would keep working\nuntil somebody renamed their organisation. The id is immutable and means\nnothing outside this system, which is what a scope key should be.\n\n`requests_per_minute` is ADVISORY. `plans.Plan` calls it \"enforced in Redis\nrather than here\" and there is no Redis — nothing in this repository returns\na 429. It is published so a well-behaved client can pace itself against the\nsame number the plan is sold on, rather than hardcoding a copy of the\ncatalogue that drifts the first time a tier changes.\n\nA plan this build does not recognise yields `null` rather than an error:\n`Org.plan` carries no CHECK constraint, precisely so a tier can exist before\nevery service knows about it, and 500ing on one would make deploy order a\ncorrectness problem.",[],[],[15],{"status":16,"description":17},"200","The organisation this key belongs to.",{"status":19,"response":20},200,{"org_id":21,"plan":22,"requests_per_minute":23,"features":24},"org_01JBQ2X9…","pro",120,[],{"status":16,"description":17,"binary":26,"fields":27},false,[28,32,35,39],{"name":29,"type":30,"description":31},"org_id","string","The organisation this key acts for. Stable forever — use it as a scope key, not the slug, which can be renamed",{"name":33,"type":30,"description":34},"plan","The tier the organisation is on",{"name":36,"type":37,"description":38},"requests_per_minute","integer or null","What the plan is sold on. `null` if this build does not recognise the plan",{"name":40,"type":41,"description":42},"features","array of strings","Features turned on for this organisation beyond its plan. Usually empty",[44],{"status":45,"code":46,"when":47},404,"NOT_FOUND","No organisation for this key",[49,53,56,59,62],{"status":50,"code":51,"when":52},401,"KEY_MISSING","No `Authorization` header",{"status":50,"code":54,"when":55},"KEY_UNKNOWN","The key is not one we issued",{"status":50,"code":57,"when":58},"KEY_REVOKED","The key was revoked in the console",{"status":50,"code":60,"when":61},"KEY_EXPIRED","The key is past its expiry",{"status":63,"code":64,"when":65},403,"ORG_DISABLED","The key is fine; its organisation is not active",{"kind":67,"html":68},"html","\u003Cp>Use it to confirm a key works and to learn which organisation it belongs to.\nA service that accepts Forma keys from its own users — an MCP server, a CI\nstep, an internal tool — calls this to check a key and scope by organisation,\nrather than making a call that costs credits and reading the outcome.\u003C\u002Fp>\n\u003Ch2 id=\"response\">Response\u003C\u002Fh2>\n",{"kind":70,"lang":71,"code":72},"code","json","{\n  \"org_id\": \"org_01JBQ2X9V3K4M5N6P7R8S9T0UV\",\n  \"plan\": \"pro\",\n  \"requests_per_minute\": 120,\n  \"features\": []\n}",{"kind":67,"html":74},"\u003Ch2 id=\"free\">Free\u003C\u002Fh2>\n\u003Cp>Listing who you are costs no credits, for the same reason listing the\ncatalogue does not: you should not have to spend a credit to discover that you\nhave none left. A key with an empty balance still gets a \u003Ccode>200\u003C\u002Fcode> here.\u003C\u002Fp>\n\u003Ch2 id=\"requests-per-minute-is-advisory\">\u003Ccode>requests_per_minute\u003C\u002Fcode> is advisory\u003C\u002Fh2>\n\u003Cp>It is the number your plan is sold on, published so a client can pace itself\nagainst the same figure rather than keeping its own copy that drifts when a\ntier changes. Pace your calls to it; it may be enforced without notice. What\nlimits a call today is credits; running out returns \u003Ca href=\"\u002Flimits\">\u003Ccode>402\u003C\u002Fcode>\u003C\u002Fa>.\u003C\u002Fp>\n\u003Ch2 id=\"features\">\u003Ccode>features\u003C\u002Fcode>\u003C\u002Fh2>\n\u003Cp>Features turned on for your organisation beyond what your plan includes, by\nname. For most organisations it is empty. A tool can read it to decide what to\noffer, rather than trying a call and reading the refusal.\u003C\u002Fp>\n\u003Ch2 id=\"refusals\">Refusals\u003C\u002Fh2>\n\u003Cp>The usual key refusals apply, and this endpoint is the cheapest way to tell\nthem apart — \u003Ccode>KEY_REVOKED\u003C\u002Fcode> and \u003Ccode>KEY_EXPIRED\u003C\u002Fcode> are things a person can fix\nthemselves, if the tool asking on their behalf says which one happened. The\ncodes are in the Errors table above.\u003C\u002Fp>\n","# Who this key is\n\n> The organisation a key acts for, and what its plan allows. Free.\n\n`GET https:\u002F\u002Fapi.formalogic.io\u002Fv1\u002Fme`\n\nResponse 200: The organisation this key belongs to.\n\n| Field | Type | Present | Meaning |\n|---|---|---|---|\n| `org_id` | string | always | The organisation this key acts for. Stable forever — use it as a scope key, not the slug, which can be renamed |\n| `plan` | string | always | The tier the organisation is on |\n| `requests_per_minute` | integer or null | always | What the plan is sold on. `null` if this build does not recognise the plan |\n| `features` | array of strings | always | Features turned on for this organisation beyond its plan. Usually empty |\n\nErrors (plus 401 `KEY_MISSING`, `KEY_UNKNOWN`, `KEY_REVOKED`, `KEY_EXPIRED` and 403 `ORG_DISABLED` on every endpoint):\n\n| Status | Code | When |\n|---|---|---|\n| 404 | `NOT_FOUND` | No organisation for this key |\n\nUse it to confirm a key works and to learn which organisation it belongs to.\nA service that accepts Forma keys from its own users — an MCP server, a CI\nstep, an internal tool — calls this to check a key and scope by organisation,\nrather than making a call that costs credits and reading the outcome.\n\n## Response\n\n```json\n{\n  \"org_id\": \"org_01JBQ2X9V3K4M5N6P7R8S9T0UV\",\n  \"plan\": \"pro\",\n  \"requests_per_minute\": 120,\n  \"features\": []\n}\n```\n\n## Free\n\nListing who you are costs no credits, for the same reason listing the\ncatalogue does not: you should not have to spend a credit to discover that you\nhave none left. A key with an empty balance still gets a `200` here.\n\n## `requests_per_minute` is advisory\n\nIt is the number your plan is sold on, published so a client can pace itself\nagainst the same figure rather than keeping its own copy that drifts when a\ntier changes. Pace your calls to it; it may be enforced without notice. What\nlimits a call today is credits; running out returns [`402`](https:\u002F\u002Fdocs.formalogic.io\u002Flimits).\n\n## `features`\n\nFeatures turned on for your organisation beyond what your plan includes, by\nname. For most organisations it is empty. A tool can read it to decide what to\noffer, rather than trying a call and reading the refusal.\n\n## Refusals\n\nThe usual key refusals apply, and this endpoint is the cheapest way to tell\nthem apart — `KEY_REVOKED` and `KEY_EXPIRED` are things a person can fix\nthemselves, if the tool asking on their behalf says which one happened. The\ncodes are in the Errors table above.\n",1793819973843]