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

# CRM tools

> Twelve tools over the companies you are talking to and the people at them, including their own timelines and ping dates.

`get_company` before writing anything about a company, so you add to the research rather
than replacing it — `update_company` replaces the `notes` field it is passed.

A company's `website` is their **own** domain, not a job-board link. Nothing else depends
on it, but it is what puts their logo on the pipeline, so it is worth setting whenever you
learn it.

<Note>
  `log_activity` takes either an `applicationId` or a `contactId`, never both. With a
  contact id it becomes that person's history — their page shows it and their "last
  touched" date moves. `update_contact`'s `nextFollowUpAt` is where "ping them in two
  weeks" lives, and due pings surface in `list_follow_ups` alongside due applications.
</Note>

[How companies and contacts work →](/concepts/crm)

<Note>
  The descriptions below are quoted **verbatim** from what the server sends a connected
  assistant, which is why they address it rather than you. They are reproduced rather than
  rewritten so this page cannot drift from what your assistant actually receives.
</Note>

### `list_companies`

*List companies*

Every company on file, with how many applications and contacts each one has, plus lastAppliedAt (when you last applied there) and openApplications (how many are still live). Use this to answer 'who have I applied to', to find a companyId before calling get\_company, or to spot companies missing a website — the website is what makes their logo appear in the pipeline. Pass search to match on name, industry, location or notes; pass filter to cut the list: 'active' = something still in flight, 'applied' = ever applied, 'never-applied' = researched but never sent anything, 'with-contacts' = you know someone there.

| Argument | Type   |                                                                                                                             |
| -------- | ------ | --------------------------------------------------------------------------------------------------------------------------- |
| `search` | string | Match name, industry, location or notes                                                                                     |
| `filter` | enum   | Cut the list: active \| applied \| never-applied \| with-contacts  `active` · `applied` · `never-applied` · `with-contacts` |

### `get_company`

*Get a company*

Everything on file for one company: website, industry, size, location, your research notes, every application you have with them, and every person on file who represents it — someone can represent more than one company, so a name here is not necessarily their day job. This is the tool to call before writing anything about a company, so you add to what is known rather than replacing it.

| Argument | Type   |                           |
| -------- | ------ | ------------------------- |
| `id`     | string | **required** — Company id |

### `create_company`

*Create a company*

Add a company before you have applied to them — somewhere to keep research while you decide. Applications create their company automatically, so reach for this only when there is no application yet. Names are unique per person; creating one that already exists is an error rather than a silent merge.

| Argument   | Type   |                                                                    |
| ---------- | ------ | ------------------------------------------------------------------ |
| `name`     | string | **required** — Company name                                        |
| `website`  | string | Their own site, e.g. stripe.com. This is what the logo comes from. |
| `industry` | string | e.g. 'Fintech', 'Developer tools'                                  |
| `size`     | string | e.g. '200-500', 'Series B'                                         |
| `location` | string | Headquarters or main office                                        |
| `notes`    | string | Anything you have learned about them                               |

### `update_company`

*Update a company*

Change what you know about a company. Only the fields you pass are touched, but each one REPLACES what was there — notes especially, so call get\_company first and write back the whole thing if you are adding to research rather than replacing it. Setting website is the single thing that makes their logo show in the pipeline; a job board URL is not their website.

**Overwrites or deletes.**

| Argument   | Type   |                                         |
| ---------- | ------ | --------------------------------------- |
| `id`       | string | **required** — Company id               |
| `name`     | string | Company name                            |
| `website`  | string | Their own site, e.g. stripe.com         |
| `industry` | string | Industry                                |
| `size`     | string | Headcount or funding stage              |
| `location` | string | Headquarters                            |
| `notes`    | string | Research notes — replaces what is there |

### `delete_company`

*Delete a company*

Remove a company record. Refuses while applications still point at it — move or delete those first, so tidying up a company can never take an application with it. Contacts survive and simply lose their employer.

**Overwrites or deletes.**

| Argument | Type   |                           |
| -------- | ------ | ------------------------- |
| `id`     | string | **required** — Company id |

### `preview_company_merge`

*Preview merging two companies*

What merging one company into another WOULD do, without doing any of it. Call this first, every time — merge\_companies is irreversible and takes an argument order that is easy to get backwards. Returns how many applications and contacts would move, which of them by role title, which blank fields on the survivor would be filled from the duplicate, and whether the duplicate's notes would be appended. Show that to the person before you merge. Read-only.

| Argument   | Type   |                                                                  |
| ---------- | ------ | ---------------------------------------------------------------- |
| `keep_id`  | string | **required** — Company id that SURVIVES the merge, with its name |
| `merge_id` | string | **required** — Company id that is folded in and then DELETED     |

### `merge_companies`

*Merge one company into another*

Fix the same employer being on file twice — 'Stripe', 'Stripe, Inc.' and 'stripe' each holding a slice of the pipeline. Every application and contact on merge\_id moves to keep\_id, blank fields on keep\_id are filled from the duplicate, the duplicate's notes are APPENDED to the survivor's under a line saying where they came from, and then the duplicate row is deleted. DESTRUCTIVE and IRREVERSIBLE: the company at merge\_id ceases to exist, its page stops resolving, and nothing records afterwards which applications came from which side. Call preview\_company\_merge first and let the person confirm. The direction matters and is not guessable — keep\_id is the name that lives on. Nothing is de-duplicated: two identical role titles on the survivor is the correct result, not a bug. Note that a later create\_application naming the old spelling will simply create it again as an empty company.

**Overwrites or deletes.**

| Argument   | Type   |                                                              |
| ---------- | ------ | ------------------------------------------------------------ |
| `keep_id`  | string | **required** — Company id that SURVIVES, keeping its name    |
| `merge_id` | string | **required** — Company id that is folded in and then DELETED |

### `list_contacts`

*List contacts*

Recruiters, hiring managers and referrals. Narrow by application, by company, by a search across name, title, email, notes and employer, or by filter: 'ping-due' = their follow-up date has arrived, 'with-application' = attached to an application, 'no-company' = nowhere on file. Returns each person with `companies` — a list, because someone can be a founder at one place and an advisor at another — and the application they are attached to. companyId matches anyone linked to that company, not only those whose main job it is.

| Argument        | Type   |                                                                                                          |
| --------------- | ------ | -------------------------------------------------------------------------------------------------------- |
| `applicationId` | string | Limit to one application                                                                                 |
| `companyId`     | string | Limit to people linked to one company                                                                    |
| `search`        | string | Match name, title, email, notes or company                                                               |
| `filter`        | enum   | Cut the list: ping-due \| with-application \| no-company  `ping-due` · `with-application` · `no-company` |

### `get_contact`

*Get a contact*

One person in full, with every company they represent (`companies`) and the application they belong to. Call this before update\_contact so you know what you are about to overwrite. Also returns their timeline — every call, coffee and reply logged with log\_activity, newest first — so 'when did I last talk to them' is answered from here.

| Argument | Type   |                           |
| -------- | ------ | ------------------------- |
| `id`     | string | **required** — Contact id |

### `update_contact`

*Update a contact*

Change a person's details. Only the fields you pass are touched, and each REPLACES what was there — read first with get\_contact if you are adding to notes, otherLinks or companies rather than replacing them. A person can represent several companies at once, so `companies` is a list and REPLACES the whole set: to add one, read the current list, append, and pass it all back. An empty list detaches them from every company. applicationId works the same way, with an empty string to detach.

**Overwrites or deletes.**

| Argument         | Type      |                                                                                                                                                                                                                                        |
| ---------------- | --------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `id`             | string    | **required** — Contact id                                                                                                                                                                                                              |
| `name`           | string    | Their name                                                                                                                                                                                                                             |
| `title`          | string    | Their job title                                                                                                                                                                                                                        |
| `email`          | string    | Email                                                                                                                                                                                                                                  |
| `phone`          | string    | Phone                                                                                                                                                                                                                                  |
| `linkedin`       | string    | LinkedIn URL                                                                                                                                                                                                                           |
| `twitter`        | string    | X / Twitter — a URL or an @handle                                                                                                                                                                                                      |
| `instagram`      | string    | Instagram — a URL or an @handle                                                                                                                                                                                                        |
| `github`         | string    | GitHub profile URL                                                                                                                                                                                                                     |
| `website`        | string    | Their own site, blog or portfolio                                                                                                                                                                                                      |
| `otherLinks`     | string\[] | Anywhere else they are reachable that has no field of its own — Bluesky, Mastodon, a Substack. REPLACES the whole list, so read the current one from get\_contact first.                                                               |
| `relationship`   | string    | e.g. 'recruiter', 'hiring manager', 'referral'                                                                                                                                                                                         |
| `notes`          | string    | Notes — replaces what is there                                                                                                                                                                                                         |
| `companyIds`     | string\[] | Company ids. Exact; wins over companies. REPLACES the whole set.                                                                                                                                                                       |
| `companies`      | string\[] | Company names — everywhere this person represents. REPLACES the whole set; a name nothing matches is created.                                                                                                                          |
| `company`        | string    | Legacy single-company spelling. WARNING: this also REPLACES the whole set with just this one — read the current list from get\_contact first, or use companies. Empty string detaches every company. Ignored when companies is passed. |
| `applicationId`  | string    | Application to attach to, or empty string to detach                                                                                                                                                                                    |
| `nextFollowUpAt` | string    | ISO date to next get in touch — 'ping Sarah in two weeks' lives here. Empty string clears it. Due pings surface in list\_follow\_ups and on the dashboard.                                                                             |

### `delete_contact`

*Delete a contact*

Remove a person. The companies they represented and any application they were attached to stay.

**Overwrites or deletes.**

| Argument | Type   |                           |
| -------- | ------ | ------------------------- |
| `id`     | string | **required** — Contact id |

### `create_contact`

*Create a contact*

Save a person: recruiter, hiring manager, referral, friend at the company. Record every way you can reach them — linkedin, twitter, instagram, github, website, and otherLinks for anything else — because the one that matters is whichever they actually answer on, and a name with no way to contact it is a dead row. Pass `companies` for everywhere they represent, not just their day job: an angel who also advises two of your targets is three links, and each one is created if it does not exist yet.

| Argument        | Type      |                                                                                                                                                                          |
| --------------- | --------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
| `name`          | string    | **required** — Their name                                                                                                                                                |
| `title`         | string    | Their job title                                                                                                                                                          |
| `email`         | string    | Email                                                                                                                                                                    |
| `phone`         | string    | Phone                                                                                                                                                                    |
| `linkedin`      | string    | LinkedIn URL                                                                                                                                                             |
| `twitter`       | string    | X / Twitter — a URL or an @handle                                                                                                                                        |
| `instagram`     | string    | Instagram — a URL or an @handle                                                                                                                                          |
| `github`        | string    | GitHub profile URL                                                                                                                                                       |
| `website`       | string    | Their own site, blog or portfolio                                                                                                                                        |
| `otherLinks`    | string\[] | Anywhere else they are reachable that has no field of its own — Bluesky, Mastodon, a Substack. REPLACES the whole list, so read the current one from get\_contact first. |
| `relationship`  | string    | e.g. 'recruiter', 'hiring manager', 'referral'                                                                                                                           |
| `notes`         | string    | Notes                                                                                                                                                                    |
| `companyIds`    | string\[] | Company ids, when you already have them. Wins over companies.                                                                                                            |
| `companies`     | string\[] | Every company they represent, by name. Any that do not exist yet are created.                                                                                            |
| `company`       | string    | Legacy single-company spelling. Ignored when companies is passed.                                                                                                        |
| `applicationId` | string    | Attach to this application                                                                                                                                               |
