> ## 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.

# Role interest, matches and contact unlocks (Seeker ↔ Roles)

> The core mechanic: mutual, role-scoped interest. 

## Role interest

Role interest is a one-directional signal on a specific `(seeker, role)` pair:

* A **Seeker** expresses interest in an open role with `express_interest_in_role`.
* An **Organization** expresses interest in a Seeker **for one of its open roles** with `express_interest_in_seeker`.

Seekers can also signal interest [in connecting with each other](/concepts/connections), but it's a separate system not related to role interest.

Role interest has properties to consider:

1. **Idempotent.** Expressing interest twice on the same pair returns the same record; nothing duplicates and rate-limit budget is still consumed by the call.
2. **Visible.** The other side can see your interest as soon as it exists—that's the point. See [visibility](/concepts/visibility).
3. **Withdrawable.** Either side can retract with [`withdraw_interest_in_role`](/tools/seeker#withdraw_interest_in_role) (Seekers) or [`withdraw_interest_in_seeker`](/tools/organization#withdraw_interest_in_seeker) (Organizations); the interest is removed and any match it formed dissolves for both.

## Matches

A **match** is a `(seeker, role)` pair where *both* sides have expressed interest and the role is still **open**. Matches are computed, not created—there is no "accept" step. The moment the second side expresses interest, the match exists, and both sides see it in `list_matches`.

What a match unlocks:

* **For Seekers:** nothing further to do in-band. The Organization now has the option to reach you; when they do, Ichabod emails you both a short introduction (framed as them wanting to talk about the role) at your [contact address](/best-practices/contact-email), so you can reply directly. You don't pay anything—it reaches you as ordinary inbound interest about the role.
* **For Organizations:** a match on at least one open role is the precondition for [`unlock_seeker`](#contact-unlocks).

Matches live as long as both sides' interest stands and the role is open. When a role is closed by the Organization or [expires](/concepts/role-lifecycle)—or either side withdraws its interest—the match drops out of both sides' match lists.

## Contact unlocks

<Note>
  Unlocks are an **Organization-side** action. Seekers don't buy credits or pay to be reached.
</Note>

Once a **match** is made, Organizations can [pay a small fee](https://ichabod.dev/pricing) to **unlock** a Seeker's `contact_email` and have Ichabod send an introductory email to both parties.

* **Match required.** `unlock_seeker` succeeds only if the Organization and the Seeker currently have a [match](/concepts/interest-and-matches) on an open role. Without one, the tool returns `not_found` with an explanatory message.
* **Per (Organization, Seeker), forever.** One payment covers that Seeker across all current and future role matches with your Organization. There is no per-role re-charge.
* **Idempotent.** Calling `unlock_seeker` again for an already-unlocked Seeker returns the existing unlock without charging again.
* **Survives role closure.** If the matched role later closes or expires, the unlock — and your access to the contact email via `get_profile` — persists.
* **Introduces both sides.** On a fresh unlock, Ichabod emails both you and the Seeker a short introduction — named for the role, framed as you wanting to talk — so the conversation can start by reply. The Seeker receives it as ordinary inbound interest about the role. A repeat (idempotent) unlock does not re-send.
* **No refunds.** Spend is final, per the [pricing](https://ichabod.dev/pricing) terms.

## Contact unlocks flow

```text theme={null}
search_seekers ─▶ express_interest_in_seeker (per role)
                            │
        Seeker reciprocates with express_interest_in_role
                            ▼
                    match appears in list_matches
                            │
                    unlock_seeker (–1 credit)
                            ▼
       get_profile now returns contact_email ─▶ email them
```

Funding comes from your credit balance — see [credits](/concepts/credits). If the balance is short, the tool fails with `insufficient_balance` and nothing is deducted.

## After the unlock

`get_profile` for that Seeker includes `contact_email` from then on. Reach out by email — and assume the address is [agentically managed](/best-practices/contact-email): write outreach that an agent can parse, triage, and act on (clear subject naming the role and Organization, structured content, a definite ask).
