> ## Documentation Index
> Fetch the complete documentation index at: https://docs.ichabod.dev/llms.txt
> Use this file to discover all available pages before exploring further.

# Data dictionary

> Every entity and field in the marketplace, with visibility rules.

Field-level reference for the objects you'll see in tool results. *Exposure* says who can ever see the field through MCP or the web.

## Profile

One per Seeker or Organization. Read with `get_profile`; written with `update_profile`.

| Field                           | Type      | Notes                                                                                                                                                                     | Exposure                                                                                                                |
| ------------------------------- | --------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------- |
| `id`                            | uuid      | Stable profile ID (the `seeker_id` Organizations use).                                                                                                                    | Counterparties                                                                                                          |
| `type`                          | enum      | `seeker` \| `organization`. Fixed at signup.                                                                                                                              | Counterparties                                                                                                          |
| `name`                          | text      | Person or Organization name; 1–60 chars.                                                                                                                                  | Counterparties + public web                                                                                             |
| `tagline`                       | text?     | Seeker only; ≤140 chars, short summary.                                                                                                                                   | Counterparties + public web                                                                                             |
| `description`                   | text?     | Organization only; ≤6,000 chars.                                                                                                                                          | Counterparties + public web                                                                                             |
| `signup_email`                  | text      | Sign-in, receipts.                                                                                                                                                        | Owner only — never via MCP or web                                                                                       |
| `contact_email`                 | text?     | The match-payoff address.                                                                                                                                                 | Owner; Organizations post-[unlock](/concepts/interest-and-matches#contact-unlocks); connected Seekers (free, both ways) |
| `organization_domain`           | text?     | Organization only; derived from the website declared at signup, and the signup email must match it. Immutable — the trust anchor.                                         | Counterparties                                                                                                          |
| `handle`                        | text      | 3–30 chars, `a–z 0–9 -`. First-come, permanent. Public page at `/s/[handle]` (Seekers) or `/o/[handle]` (Organizations).                                                  | Public                                                                                                                  |
| `website`                       | url?      | Single [website link](/best-practices/profile); http(s), ≤140 chars. Optional for Seekers; required for Organizations and always on their verified `organization_domain`. | Counterparties + public web                                                                                             |
| `created_at` / `last_edited_at` | timestamp |                                                                                                                                                                           | Counterparties                                                                                                          |

## Seeker content

One per Seeker. Written with `update_experience` and `update_what_is_next`; the owner reads both back from `get_profile`, and Organizations and peer Seekers see both via `get_profile`.

| Field          | Type      | Notes                                                                                                                                                          | Exposure                               |
| -------------- | --------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------- | -------------------------------------- |
| `experience`   | text?     | ≤6,000 chars. Freeform prose — education, professional history, skillset.                                                                                      | Counterparties + public web            |
| `what_is_next` | text?     | ≤6,000 chars. Freeform prose — the roles and Organizations you'd want next. Organizations and other Seekers see it over MCP; **never** on the public web page. | Counterparties + MCP, never public web |
| `updated_at`   | timestamp |                                                                                                                                                                | Counterparties + public web            |

Search over these blobs is plain keyword/text matching — no structured filters.

## Role

Posted by Organizations; public while open.

| Field                      | Type      | Notes                                                                             |
| -------------------------- | --------- | --------------------------------------------------------------------------------- |
| `id`                       | uuid      |                                                                                   |
| `organization_id`          | uuid      | Owning Organization profile.                                                      |
| `name`                     | text      | 1–60 chars.                                                                       |
| `description`              | text      | ≤6,000 chars.                                                                     |
| `what_we_are_looking_for`  | text?     | ≤6,000 chars. The ideal-Seeker blob.                                              |
| `location`                 | text?     | ≤60 chars, free text.                                                             |
| `model`                    | enum?     | `distributed` \| `hybrid` \| `in-person`.                                         |
| `status`                   | enum      | `open` \| `closed` \| `expired` — see [role lifecycle](/concepts/role-lifecycle). |
| `posted_at` / `expires_at` | timestamp | Expiry is 30 days from posting.                                                   |

Public role pages live at `/o/[org]/[role]`.

## Interest

One row per `(seeker, role, side)` — unique, so interest is idempotent and per-side.

| Field                   | Type      | Notes                                          |
| ----------------------- | --------- | ---------------------------------------------- |
| `id`                    | uuid      | Returned as `interest_id` in lists.            |
| `seeker_id` / `role_id` | uuid      | The pair.                                      |
| `side`                  | enum      | `seeker` \| `organization` — who expressed it. |
| `created_at`            | timestamp | `interested_at` in lists.                      |

## Match

Computed, never stored: both sides' interest rows exist for the same `(seeker, role)` **and** the role is open.

| Field                                       | Type      | Notes                                   |
| ------------------------------------------- | --------- | --------------------------------------- |
| `seeker_id` / `role_id` / `organization_id` | uuid      | The matched pair and role owner.        |
| `matched_at`                                | timestamp | When the second side's interest landed. |

## Connection interest / Connection (Seeker ↔ Seeker)

A directed `connection_interest` row per `(from_seeker, to_seeker)`. A **connection** is computed: both directions exist. On connection, both Seekers' `contact_email`s are shared **for free** — no credits, no unlock.

| Field                             | Type      | Notes                                           |
| --------------------------------- | --------- | ----------------------------------------------- |
| `from_seeker_id` / `to_seeker_id` | uuid      | The directed edge; `from ≠ to`.                 |
| `created_at`                      | timestamp |                                                 |
| `connected_seeker_id`             | uuid      | On a mutual connection (in `list_connections`). |

Public Seeker profiles show a connection **count** (never identities).

## Unlock (Organization)

| Field                           | Type      | Notes                              |
| ------------------------------- | --------- | ---------------------------------- |
| `id`                            | uuid      |                                    |
| `organization_id` / `seeker_id` | uuid      | Unique pair — one lifetime unlock. |
| `credits_spent`                 | integer   | 1 (\$1).                           |
| `unlocked_at`                   | timestamp |                                    |

## Credits (Organization)

| Field     | Type    | Notes                                                                                                                                                                                    |
| --------- | ------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `balance` | integer | Credits (\$1 = 1 credit); `balance` in `get_credit_balance`. Never negative. Starts at 20 for a new Organization — the [Early Access welcome grant](/concepts/credits#starting-balance). |

## API key

| Field          | Type      | Notes                                                                          |
| -------------- | --------- | ------------------------------------------------------------------------------ |
| key            | `ick_…`   | Shown once at creation; only a hash is stored. Rotate/revoke in the dashboard. |
| `last_used_at` | timestamp | Updated on every authenticated request; visible in the dashboard.              |
