---
title: "Me"
method: GET
path: "/api/me"
tags: ["session"]
---

# Me

`GET /api/me`

## Request

- Base URL: `https://api.heymetra.com` (the document declares no server; this is the origin it was published from)
- URL: `https://api.heymetra.com/api/me`
- Auth: none declared

## Headers

- `authorization` string, nullable
- `x-workspace-id` string, nullable

## Response `200`

Successful Response

- SessionInfo
  - `user_id` string, required
  - `email` string, required
  - `first_name` string, nullable, required
  - `last_name` string, nullable, required
  - `tenant_id` string, uuid, required
  - `tenant_name` string, required
  - `role` 'owner' | 'member', required: Who somebody is in one workspace. Two, by the owner's decision of 2026-09-18, and the argument is the one he made: four roles that collapse to two predicates are not four roles. OWNER and ADMIN differed in two lines in the whole codebase; EDITOR and VIEWER in one. Worse, four roles plus per-connection grants meant the same fact could be stated twice and disagree — a role saying VIEWER while a grant said writer, with the winner decided across sixteen separate gates. One axis cannot express the contradiction. ``OWNER`` does everything: billing, team, connecting accounts, approving changes, and reading and writing on every connection. ``MEMBER`` does exactly what it was given, per connection, in ``connection_grants.level``. A member with no row anywhere can sign in and see that nothing has been shared with them yet, and that is all. Persisted as a plain string: VARCHAR(32), no CHECK constraint, no native Postgres type, so this is a code change and not a migration.
  - `plan` 'starter' | 'pro' | 'superior' | 'enterprise', required
  - `has_plan` boolean
  - `paused` boolean
  - `industry` string, nullable, required
  - `can_write` boolean, required
  - `can_administer` boolean, required
  - `needs_onboarding` boolean, required
  - `is_superadmin` boolean, required
  - `workspaces` WorkspaceMembership[]
    - `tenant_id` string, uuid, required
    - `name` string, required
    - `role` 'owner' | 'member', required: Who somebody is in one workspace. Two, by the owner's decision of 2026-09-18, and the argument is the one he made: four roles that collapse to two predicates are not four roles. OWNER and ADMIN differed in two lines in the whole codebase; EDITOR and VIEWER in one. Worse, four roles plus per-connection grants meant the same fact could be stated twice and disagree — a role saying VIEWER while a grant said writer, with the winner decided across sixteen separate gates. One axis cannot express the contradiction. ``OWNER`` does everything: billing, team, connecting accounts, approving changes, and reading and writing on every connection. ``MEMBER`` does exactly what it was given, per connection, in ``connection_grants.level``. A member with no row anywhere can sign in and see that nothing has been shared with them yet, and that is all. Persisted as a plain string: VARCHAR(32), no CHECK constraint, no native Postgres type, so this is a code change and not a migration.
    - `is_active` boolean, required
    - `paused` boolean

## Other responses

- `422`: Validation Error

---

[API](https://skmtc.dev/heymetra/apis/heymetra-api.md) · [All operations](https://skmtc.dev/heymetra/apis/heymetra-api/llms.txt) · [OpenAPI document](https://skmtc.dev/heymetra/apis/heymetra-api/revisions/877b0f87d6d0?raw)
