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

# API

> API reference for Remoet: every `remoet.api.*` operation with input and output types.

Every `remoet.api.*` operation is listed below with parameter shapes and return types from the plugin Zod schemas.

> [!NOTE]
>
> **New to Corsair?** See [API access](/concepts/api), [authentication](/concepts/auth), and [error handling](/concepts/error-handling).

## Companies

### get

`companies.get`

Get one Remoet company by slug, including its tech stack, perks and open-role counts; pass checkTechStack to see which technologies it uses

**Risk:** `read`

```ts theme={null}
await corsair.remoet.api.companies.get({ slug: 'starburst' });
```

**Input**

| Name | Type | Required | Description |
| - | - | - | - |
| `slug` | `string` | Yes | The company's slug, e.g. "stripe". |
| `checkTechStack` | `string[]` | No | Technologies to check against the company's full stack (max 50); matches come back in matchedTechStack. |

**Output**

| Name | Type | Required | Description |
| - | - | - | - |
| `id` | `string` | Yes | — |
| `name` | `string` | Yes | — |
| `slug` | `string` | Yes | — |
| `url` | `string` | No | — |
| `nbrOfStars` | `number` | No | — |
| `jobCount` | `number` | No | — |
| `techStack` | `string[]` | No | A preview capped by Remoet; techStackCount is the full size. |
| `matchedTechStack` | `string[]` | No | — |
| `techStackCount` | `number` | No | — |
| `experienceLevels` | `object` | No | — |
| `shortDescription` | `string` | No | — |
| `isStarred` | `boolean` | No | — |
| `jobPreview` | `string[]` | No | — |
| `about` | `string` | No | — |
| `careersUrl` | `string` | No | — |
| `verified` | `boolean` | No | — |
| `urls` | `object` | No | — |
| `perks` | `object[]` | No | — |
| `createdAt` | `string` | No | — |
| `updatedAt` | `string` | No | — |

> **experienceLevels full type**
>
> ```ts theme={null}
> {
>   junior?: number | null,
>   mid?: number | null,
>   senior?: number | null
> }
> ```

> **urls full type**
>
> ```ts theme={null}
> {
> }
> ```

> **perks full type**
>
> ```ts theme={null}
> {
>   id?: string | null,
>   title: string,
>   tags?: string[] | null,
>   description?: string | null,
>   category?: string | null
> }[]
> ```

***

### search

`companies.search`

Search Remoet's tech companies by name, description, tech stack or seniority, or set starred to list the companies the user has starred. Paginated with page and pageSize (max 100)

**Risk:** `read`

```ts theme={null}
await corsair.remoet.api.companies.search({});
```

**Input**

| Name | Type | Required | Description |
| - | - | - | - |
| `starred` | `boolean` | No | Set true to list every starred company instead of searching; the other filters and paging are ignored. |
| `searchQuery` | `string` | No | Search keyword: matches company name, description and about text. |
| `techStack` | `string[]` | No | — |
| `techStackMatch` | `any \| all` | No | How techStack combines: "any" (at least one) or "all" (every one required). |
| `experienceLevel` | `junior \| mid \| senior[]` | No | — |
| `sortBy` | `stars \| jobCount \| name` | No | — |
| `page` | `number` | No | Page number, starting from 1. |
| `pageSize` | `number` | No | Results per page, max 100. |

**Output**

| Name | Type | Required | Description |
| - | - | - | - |
| `listings` | `object[]` | Yes | — |
| `totalCount` | `number` | Yes | — |
| `page` | `number` | No | — |
| `pageSize` | `number` | No | — |
| `totalPages` | `number` | No | — |
| `hasNextPage` | `boolean` | No | — |
| `starred` | `boolean` | No | — |
| `hint` | `string` | No | — |
| `note` | `string` | No | — |

> **listings full type**
>
> ```ts theme={null}
> {
>   id: string,
>   name: string,
>   slug: string,
>   url?: string | null,
>   nbrOfStars?: number | null,
>   jobCount?: number | null,
>   techStack?: string[] | null,
>   matchedTechStack?: string[] | null,
>   techStackCount?: number | null,
>   experienceLevels?: {
>     junior?: number | null,
>     mid?: number | null,
>     senior?: number | null
>   } | null,
>   shortDescription?: string | null,
>   isStarred?: boolean | null,
>   jobPreview?: string[] | null
> }[]
> ```

***

## Education

### create

`education.create`

Add an education entry to the user's profile: institution is required

**Risk:** `write`

```ts theme={null}
await corsair.remoet.api.education.create({ institution: 'MIT' });
```

**Input**

| Name | Type | Required | Description |
| - | - | - | - |
| `institution` | `string` | Yes | Institution name, e.g. "MIT". |
| `institutionUrl` | `string` | No | Institution website URL. On update, '' clears it. |
| `studyLevel` | `HIGH_SCHOOL \| ASSOCIATE \| BACHELOR \| MASTER \| DOCTORATE \| BOOTCAMP \| OTHER` | No | Level of study. |
| `fieldOfStudy` | `string` | No | Field of study, e.g. "Computer Science". On update, '' clears it. |
| `startDate` | `string` | No | A date, e.g. "2024-01-15". |
| `endDate` | `string` | No | A date, e.g. "2024-01-15". |
| `isCurrent` | `boolean` | No | Whether currently studying here. |
| `description` | `string` | No | Description of studies and achievements. On update, '' clears it. |

**Output**

| Name | Type | Required | Description |
| - | - | - | - |
| `id` | `string` | Yes | — |
| `institution` | `string` | Yes | — |
| `institutionUrl` | `string` | No | — |
| `studyLevel` | `string` | No | — |
| `fieldOfStudy` | `string` | No | — |
| `startDate` | `string` | No | — |
| `endDate` | `string` | No | — |
| `isCurrent` | `boolean` | No | — |
| `description` | `string` | No | — |

***

### delete

`education.delete`

Permanently remove an education entry by its id

**Risk:** `destructive` · **Irreversible**

```ts theme={null}
await corsair.remoet.api.education.delete({ id: '65f0000000000000000000a3' });
```

**Input**

| Name | Type | Required | Description |
| - | - | - | - |
| `id` | `string` | Yes | — |

**Output**

| Name | Type | Required | Description |
| - | - | - | - |
| `deleted` | `boolean` | Yes | — |
| `id` | `string` | Yes | — |

***

### list

`education.list`

List the education entries on the user profile

**Risk:** `read`

```ts theme={null}
await corsair.remoet.api.education.list({});
```

**Input:** *empty object*

**Output:** `object[]`

> **Output full type**
>
> ```ts theme={null}
> {
>   id: string,
>   institution: string,
>   institutionUrl?: string | null,
>   studyLevel?: string | null,
>   fieldOfStudy?: string | null,
>   startDate?: string | null,
>   endDate?: string | null,
>   isCurrent?: boolean | null,
>   description?: string | null
> }[]
> ```

***

### update

`education.update`

Update an education entry by its id. Omit a field to leave it unchanged; set an optional text field to '' to clear it. startDate, endDate and isCurrent can only be replaced, never cleared

**Risk:** `write`

```ts theme={null}
await corsair.remoet.api.education.update({ id: '65f0000000000000000000a3', isCurrent: true });
```

**Input**

| Name | Type | Required | Description |
| - | - | - | - |
| `institution` | `string` | No | Institution name, e.g. "MIT". |
| `institutionUrl` | `string` | No | Institution website URL. On update, '' clears it. |
| `studyLevel` | `HIGH_SCHOOL \| ASSOCIATE \| BACHELOR \| MASTER \| DOCTORATE \| BOOTCAMP \| OTHER` | No | Level of study. |
| `fieldOfStudy` | `string` | No | Field of study, e.g. "Computer Science". On update, '' clears it. |
| `startDate` | `string` | No | A date, e.g. "2024-01-15". |
| `endDate` | `string` | No | A date, e.g. "2024-01-15". |
| `isCurrent` | `boolean` | No | Whether currently studying here. |
| `description` | `string` | No | Description of studies and achievements. On update, '' clears it. |
| `id` | `string` | Yes | — |

**Output**

| Name | Type | Required | Description |
| - | - | - | - |
| `id` | `string` | Yes | — |
| `institution` | `string` | Yes | — |
| `institutionUrl` | `string` | No | — |
| `studyLevel` | `string` | No | — |
| `fieldOfStudy` | `string` | No | — |
| `startDate` | `string` | No | — |
| `endDate` | `string` | No | — |
| `isCurrent` | `boolean` | No | — |
| `description` | `string` | No | — |

***

## Feed

### list

`feed.list`

List a page of the user's composed feed: their own item lane (new jobs, welcome, starred-company snapshots) merged with blog posts, job of the day and broadcasts, newest first. Paginated with pageSize (max 50) and cursor, taken from the previous page's nextCursor

**Risk:** `read`

```ts theme={null}
await corsair.remoet.api.feed.list({});
```

**Input**

| Name | Type | Required | Description |
| - | - | - | - |
| `pageSize` | `number` | No | Items per page, max 50. |
| `cursor` | `string` | No | nextCursor from the previous page. Omit for the newest page. |

**Output**

| Name | Type | Required | Description |
| - | - | - | - |
| `hasNextPage` | `boolean` | Yes | — |
| `filtersApplied` | `boolean` | Yes | — |
| `nextCursor` | `string` | No | — |
| `entries` | `object[]` | Yes | — |

> **entries full type**
>
> ```ts theme={null}
> {
>   id: string,
>   kind: string,
>   date: string,
>   item?: {
>     id: string,
>     type: string,
>     listingId?: string | null,
>     isStarred?: boolean | null,
>     listingName?: string | null,
>     listingSlug?: string | null,
>     listingImage?: string | null,
>     jobs: {
>       id: string,
>       isActive: boolean,
>       savedJobId?: string | null,
>       title: string,
>       url?: string | null,
>       remotePolicy?: string | null,
>       remoteRestrictions?: string | null,
>       techStack?: string[] | null,
>       salaryEnriched?: {
>         from?: number | null,
>         to?: number | null,
>         currency?: string | null,
>         period?: string | null
>       } | null,
>       experienceLevel?: string | null,
>       isOnPublishablePlatform?: boolean | null,
>       postingCount?: number | null,
>       matchesFilters: boolean
>     }[],
>     jobCount?: number | null,
>     createdAt: string
>   } | null,
>   blogPost?: {
>     id: string,
>     createdAt: string,
>     updatedAt: string,
>     publishedAt?: string | null,
>     isPublished: boolean,
>     isFeatured?: boolean | null,
>     views?: number | null,
>     image?: string | null,
>     title: string,
>     slug: string,
>     description: string,
>     tags?: string[] | null,
>     readingTime?: number | null,
>     audience?: string | null
>   } | null,
>   broadcast?: {
>     id: string,
>     title: string,
>     body: string,
>     createdAt: string
>   } | null,
>   jobOfTheDay?: {
>     id: string,
>     listingId: string,
>     listingName: string,
>     listingSlug?: string | null,
>     listingImage?: string | null,
>     job: {
>       id: string,
>       isActive: boolean,
>       savedJobId?: string | null,
>       title: string,
>       url?: string | null,
>       remotePolicy?: string | null,
>       remoteRestrictions?: string | null,
>       techStack?: string[] | null,
>       salaryEnriched?: {
>         from?: number | null,
>         to?: number | null,
>         currency?: string | null,
>         period?: string | null
>       } | null,
>       experienceLevel?: string | null,
>       isOnPublishablePlatform?: boolean | null,
>       postingCount?: number | null
>     },
>     nbrOfStars?: number | null,
>     createdAt: string
>   } | null
> }[]
> ```

***

## Job Context

### get

`jobContext.get`

Look up what Remoet knows about a job page URL: company, tech stack, salary, remote policy, reposts and how long ago Remoet first saw it (at least that old, not a posting date). Returns match null for untracked pages

**Risk:** `read`

```ts theme={null}
await corsair.remoet.api.jobContext.get({ url: 'https://job-boards.greenhouse.io/starburst/jobs/5432864008' });
```

**Input**

| Name | Type | Required | Description |
| - | - | - | - |
| `url` | `string` | Yes | Full URL of the job page, e.g. an ATS posting. |

**Output**

| Name | Type | Required | Description |
| - | - | - | - |
| `match` | `object` | No | — |

> **match full type**
>
> ```ts theme={null}
> {
>   company: string,
>   companySlug: string,
>   firstSeenAt: string,
>   daysSinceFirstSeen: number,
>   firstSeenAtIsCensored: boolean,
>   isActive: boolean,
>   deactivatedAt?: string | null,
>   reposts: {
>     removedAt: string,
>     repostedAt: string,
>     gapDays: number
>   }[],
>   otherOpenRoles: number,
>   isStarred: boolean,
>   techStack: string[],
>   remotePolicy?: string | null,
>   remoteRestrictions?: string | null,
>   salary?: {
>     from?: number | null,
>     to?: number | null,
>     currency?: string | null,
>     period?: string | null
>   } | null,
>   experienceLevel?: string | null,
>   summary?: string | null
> }
> ```

***

## Jobs

### search

`jobs.search`

Search Remoet's public tech job catalogue by keywords, tech stack, company, location, remote policy, seniority and salary floor. Each job's firstSeenAt is when Remoet first saw it, not when it was posted. Paginated with page and pageSize (max 50)

**Risk:** `read`

```ts theme={null}
await corsair.remoet.api.jobs.search({});
```

**Input**

| Name | Type | Required | Description |
| - | - | - | - |
| `searchQuery` | `string` | No | Free text, matched against the job title, summary and tech stack. Comma-separate keywords to require ALL of them. |
| `techStack` | `string[]` | No | Match roles carrying technologies from this list, e.g. \["React", "Go"]. |
| `techStackMatch` | `any \| all` | No | How techStack combines: "any" (at least one) or "all" (every one required). |
| `companySlug` | `string` | No | Restrict to one company by its Remoet slug, e.g. "stripe". |
| `remotePolicy` | `onsite \| hybrid \| remote \| remote-restricted[]` | No | — |
| `experienceLevel` | `junior \| mid \| senior[]` | No | — |
| `salaryMin` | `number` | No | Minimum salary. |
| `location` | `string[]` | No | Place names, e.g. \["Berlin"]. Each may itself contain a comma, e.g. "Portland, OR". |
| `sortBy` | `newest \| salary` | No | — |
| `sortOrder` | `asc \| desc` | No | — |
| `page` | `number` | No | Page number, starting from 1. |
| `pageSize` | `number` | No | Results per page, max 50. |

**Output**

| Name | Type | Required | Description |
| - | - | - | - |
| `jobs` | `object[]` | Yes | — |
| `totalCount` | `number` | Yes | — |
| `page` | `number` | Yes | — |
| `pageSize` | `number` | Yes | — |
| `totalPages` | `number` | Yes | — |
| `hasNextPage` | `boolean` | Yes | — |
| `hint` | `string` | No | Present on an empty result: which filter emptied it and what to try. |

> **jobs full type**
>
> ```ts theme={null}
> {
>   id: string,
>   title: string,
>   company: string,
>   companySlug: string,
>   url?: string | null,
>   applyUrl?: string | null,
>   companyUrl?: string | null,
>   location?: string | null,
>   remotePolicy?: string | null,
>   remoteRestrictions?: string | null,
>   experienceLevel?: string | null,
>   salary?: {
>     from?: number | null,
>     to?: number | null,
>     currency?: string | null,
>     period?: string | null
>   } | null,
>   techStack?: string[] | null,
>   summary?: string | null,
>   firstSeenAt: string,
>   lastVerifiedAt?: string | null,
>   duplicateCount?: number | null
> }[]
> ```

***

## Link Trees

### get

`linkTrees.get`

Get one of the user's link tree pages by slug

**Risk:** `read`

```ts theme={null}
await corsair.remoet.api.linkTrees.get({ slug: 'my-links' });
```

**Input**

| Name | Type | Required | Description |
| - | - | - | - |
| `slug` | `string` | Yes | The link tree's own slug, from linkTrees.list. |

**Output**

| Name | Type | Required | Description |
| - | - | - | - |
| `id` | `string` | Yes | — |
| `title` | `string` | Yes | — |
| `description` | `string` | No | — |
| `slug` | `string` | Yes | — |
| `links` | `object[]` | Yes | — |
| `createdAt` | `string` | Yes | — |
| `updatedAt` | `string` | Yes | — |

> **links full type**
>
> ```ts theme={null}
> {
>   id: string,
>   label: string,
>   url: string
> }[]
> ```

***

### list

`linkTrees.list`

List the user's shareable link tree pages

**Risk:** `read`

```ts theme={null}
await corsair.remoet.api.linkTrees.list({});
```

**Input:** *empty object*

**Output:** `object[]`

> **Output full type**
>
> ```ts theme={null}
> {
>   id: string,
>   title: string,
>   description?: string | null,
>   slug: string,
>   links: {
>     id: string,
>     label: string,
>     url: string
>   }[],
>   createdAt: string,
>   updatedAt: string
> }[]
> ```

***

## Profile

### get

`profile.get`

Get the signed-in user's whole Remoet profile: contact fields, work experience, projects, education and link trees

**Risk:** `read`

```ts theme={null}
await corsair.remoet.api.profile.get({});
```

**Input:** *empty object*

**Output**

| Name | Type | Required | Description |
| - | - | - | - |
| `createdAt` | `string` | Yes | — |
| `updatedAt` | `string` | Yes | — |
| `ghId` | `number` | No | Numeric GitHub user id; absent for users who never linked GitHub. |
| `email` | `string` | No | — |
| `profile` | `object` | Yes | — |
| `jobs` | `object[]` | Yes | — |
| `projects` | `object[]` | Yes | — |
| `linkTrees` | `object[]` | Yes | — |
| `education` | `object[]` | Yes | — |

> **profile full type**
>
> ```ts theme={null}
> {
>   updatedAt: string,
>   isPublic?: boolean | null,
>   slug?: string | null,
>   name?: {
>     value?: string | null,
>     isPublic: boolean
>   } | null,
>   avatarUrl?: {
>     value?: string | null,
>     isPublic: boolean
>   } | null,
>   phone?: {
>     value?: string | null,
>     isPublic: boolean
>   } | null,
>   url?: {
>     value?: string | null,
>     isPublic: boolean
>   } | null,
>   summary?: {
>     value?: string | null,
>     isPublic: boolean
>   } | null,
>   location?: {
>     value?: string | null,
>     isPublic: boolean
>   } | null,
>   githubUrl?: {
>     value?: string | null,
>     isPublic: boolean
>   } | null,
>   facebookUrl?: {
>     value?: string | null,
>     isPublic: boolean
>   } | null,
>   twitterUrl?: {
>     value?: string | null,
>     isPublic: boolean
>   } | null,
>   linkedinUrl?: {
>     value?: string | null,
>     isPublic: boolean
>   } | null,
>   youtubeUrl?: {
>     value?: string | null,
>     isPublic: boolean
>   } | null
> }
> ```

> **jobs full type**
>
> ```ts theme={null}
> {
>   id: string,
>   createdAt: string,
>   updatedAt: string,
>   userId?: string | null,
>   title: string,
>   startDate: string,
>   endDate?: string | null,
>   isCurrent?: boolean | null,
>   isPublic?: boolean | null,
>   companyName?: string | null,
>   technologies?: string[] | null,
>   description?: string | null,
>   isRemote?: boolean | null,
>   companyUrl?: string | null,
>   listingId?: string | null
> }[]
> ```

> **projects full type**
>
> ```ts theme={null}
> {
>   id: string,
>   title: string,
>   shortDescription?: string | null,
>   technologies?: string[] | null,
>   isCurrent?: boolean | null,
>   isRemote?: boolean | null,
>   isOpenSource?: boolean | null,
>   description?: string | null,
>   role?: string | null,
>   startDate?: string | null,
>   endDate?: string | null,
>   repoUrl?: string | null,
>   demoUrl?: string | null,
>   jobId?: string | null
> }[]
> ```

> **linkTrees full type**
>
> ```ts theme={null}
> {
>   id: string,
>   title: string,
>   description?: string | null,
>   slug: string,
>   links: {
>     id: string,
>     label: string,
>     url: string
>   }[],
>   createdAt: string,
>   updatedAt: string
> }[]
> ```

> **education full type**
>
> ```ts theme={null}
> {
>   id: string,
>   institution: string,
>   institutionUrl?: string | null,
>   studyLevel?: string | null,
>   fieldOfStudy?: string | null,
>   startDate?: string | null,
>   endDate?: string | null,
>   isCurrent?: boolean | null,
>   description?: string | null
> }[]
> ```

***

### getLinks

`profile.getLinks`

Get the user's public profile links (website, GitHub, LinkedIn and more); private links come back null

**Risk:** `read`

```ts theme={null}
await corsair.remoet.api.profile.getLinks({});
```

**Input:** *empty object*

**Output**

| Name | Type | Required | Description |
| - | - | - | - |
| `url` | `string` | No | — |
| `githubUrl` | `string` | No | — |
| `facebookUrl` | `string` | No | — |
| `twitterUrl` | `string` | No | — |
| `linkedinUrl` | `string` | No | — |
| `youtubeUrl` | `string` | No | — |

***

### update

`profile.update`

Update the user's Remoet profile: contact fields, name, avatarUrl, socials and summary (each may be set to null to clear it, 500 characters max, 5000 for summary), and visibility. Visibility controls who can see the profile in company candidate lists: NONE hides it from every company, STARRED shows it only to companies the user has starred, and ALL shows it to every company on Remoet

**Risk:** `write`

```ts theme={null}
await corsair.remoet.api.profile.update({ location: 'Stockholm' });
```

**Input**

| Name | Type | Required | Description |
| - | - | - | - |
| `phone` | `string \| null` | No | Phone number. Null clears it. |
| `url` | `string \| null` | No | Personal website URL. Null clears it. |
| `location` | `string \| null` | No | Location. Null clears it. |
| `githubUrl` | `string \| null` | No | GitHub profile URL. Null clears it. |
| `linkedinUrl` | `string \| null` | No | LinkedIn profile URL. Null clears it. |
| `name` | `string \| null` | No | Full name. Null clears it. |
| `avatarUrl` | `string \| null` | No | Avatar/photo URL. Null clears it. |
| `facebookUrl` | `string \| null` | No | Facebook profile URL. Null clears it. |
| `twitterUrl` | `string \| null` | No | Twitter/X profile URL. Null clears it. |
| `youtubeUrl` | `string \| null` | No | YouTube channel URL. Null clears it. |
| `summary` | `string \| null` | No | Brief professional summary or bio. Null clears it. |
| `visibility` | `NONE \| STARRED \| ALL` | No | Who can see the profile in company candidate lists. Not writable to null; leave it out to leave it unchanged. |

**Output**

| Name | Type | Required | Description |
| - | - | - | - |
| `updated` | `string[]` | Yes | — |

***

## Projects

### create

`projects.create`

Add a project entry to the user's profile: title and shortDescription are required

**Risk:** `write`

```ts theme={null}
await corsair.remoet.api.projects.create({ title: 'corsair-remoet', shortDescription: 'A Corsair plugin' });
```

**Input**

| Name | Type | Required | Description |
| - | - | - | - |
| `title` | `string` | Yes | Project title. |
| `shortDescription` | `string` | Yes | A one-line summary of the project. |
| `description` | `string` | No | Full project description. On update, '' clears it. |
| `role` | `string` | No | Role on the project. On update, '' clears it. |
| `technologies` | `string[]` | No | Technologies used, e.g. \["React", "Node.js"]. On update, \[] empties it. |
| `isCurrent` | `boolean` | No | Whether this is an ongoing project. |
| `isRemote` | `boolean` | No | Whether this was remote work. |
| `isOpenSource` | `boolean` | No | Whether this is open source. |
| `startDate` | `string` | No | A date, e.g. "2024-01-15". |
| `endDate` | `string` | No | A date, e.g. "2024-01-15". |
| `repoUrl` | `string` | No | Repository URL. On update, '' clears it. |
| `demoUrl` | `string` | No | Live demo URL. On update, '' clears it. |

**Output**

| Name | Type | Required | Description |
| - | - | - | - |
| `id` | `string` | Yes | — |
| `title` | `string` | Yes | — |
| `shortDescription` | `string` | No | — |
| `technologies` | `string[]` | No | — |
| `isCurrent` | `boolean` | No | — |
| `isRemote` | `boolean` | No | — |
| `isOpenSource` | `boolean` | No | — |
| `description` | `string` | No | — |
| `role` | `string` | No | — |
| `startDate` | `string` | No | — |
| `endDate` | `string` | No | — |
| `repoUrl` | `string` | No | — |
| `demoUrl` | `string` | No | — |
| `jobId` | `string` | No | Set when this project is linked to a work experience entry. |

***

### delete

`projects.delete`

Permanently remove a project entry by its id

**Risk:** `destructive` · **Irreversible**

```ts theme={null}
await corsair.remoet.api.projects.delete({ id: '65f0000000000000000000a2' });
```

**Input**

| Name | Type | Required | Description |
| - | - | - | - |
| `id` | `string` | Yes | — |

**Output**

| Name | Type | Required | Description |
| - | - | - | - |
| `deleted` | `boolean` | Yes | — |
| `id` | `string` | Yes | — |

***

### list

`projects.list`

List the projects on the user profile

**Risk:** `read`

```ts theme={null}
await corsair.remoet.api.projects.list({});
```

**Input:** *empty object*

**Output:** `object[]`

> **Output full type**
>
> ```ts theme={null}
> {
>   id: string,
>   title: string,
>   shortDescription?: string | null,
>   technologies?: string[] | null,
>   isCurrent?: boolean | null,
>   isRemote?: boolean | null,
>   isOpenSource?: boolean | null,
>   description?: string | null,
>   role?: string | null,
>   startDate?: string | null,
>   endDate?: string | null,
>   repoUrl?: string | null,
>   demoUrl?: string | null,
>   jobId?: string | null
> }[]
> ```

***

### update

`projects.update`

Update a project entry by its id. Omit a field to leave it unchanged; set an optional text field to '' to clear it or technologies to \[] to empty it. startDate, endDate and the booleans can only be replaced, never cleared

**Risk:** `write`

```ts theme={null}
await corsair.remoet.api.projects.update({ id: '65f0000000000000000000a2', isOpenSource: true });
```

**Input**

| Name | Type | Required | Description |
| - | - | - | - |
| `title` | `string` | No | Project title. |
| `shortDescription` | `string` | No | A one-line summary of the project. |
| `description` | `string` | No | Full project description. On update, '' clears it. |
| `role` | `string` | No | Role on the project. On update, '' clears it. |
| `technologies` | `string[]` | No | Technologies used, e.g. \["React", "Node.js"]. On update, \[] empties it. |
| `isCurrent` | `boolean` | No | Whether this is an ongoing project. |
| `isRemote` | `boolean` | No | Whether this was remote work. |
| `isOpenSource` | `boolean` | No | Whether this is open source. |
| `startDate` | `string` | No | A date, e.g. "2024-01-15". |
| `endDate` | `string` | No | A date, e.g. "2024-01-15". |
| `repoUrl` | `string` | No | Repository URL. On update, '' clears it. |
| `demoUrl` | `string` | No | Live demo URL. On update, '' clears it. |
| `id` | `string` | Yes | — |

**Output**

| Name | Type | Required | Description |
| - | - | - | - |
| `id` | `string` | Yes | — |
| `title` | `string` | Yes | — |
| `shortDescription` | `string` | No | — |
| `technologies` | `string[]` | No | — |
| `isCurrent` | `boolean` | No | — |
| `isRemote` | `boolean` | No | — |
| `isOpenSource` | `boolean` | No | — |
| `description` | `string` | No | — |
| `role` | `string` | No | — |
| `startDate` | `string` | No | — |
| `endDate` | `string` | No | — |
| `repoUrl` | `string` | No | — |
| `demoUrl` | `string` | No | — |
| `jobId` | `string` | No | Set when this project is linked to a work experience entry. |

***

## Saved Jobs

### create

`savedJobs.create`

Save a job to the user's saved jobs by its id, with an optional note (500 characters max)

**Risk:** `write`

```ts theme={null}
await corsair.remoet.api.savedJobs.create({ jobId: '65f0000000000000000000b1' });
```

**Input**

| Name | Type | Required | Description |
| - | - | - | - |
| `jobId` | `string` | Yes | Id of the job, e.g. from jobs.search or starredJobs.list. |
| `jobType` | `ai_job \| listing_job` | No | "ai\_job" (the default) or "listing\_job". |
| `note` | `string \| null` | No | Optional note about why this job is interesting. |

**Output**

| Name | Type | Required | Description |
| - | - | - | - |
| `id` | `string` | Yes | The saved-job entry id, used by savedJobs.update and savedJobs.delete. |
| `jobId` | `string` | Yes | — |
| `jobType` | `string` | Yes | — |
| `note` | `string` | No | — |
| `savedAt` | `string` | Yes | — |
| `job` | `object` | No | — |
| `locked` | `boolean` | No | — |
| `lockedReason` | `string` | No | — |

> **job full type**
>
> ```ts theme={null}
> {
>   title: string,
>   listingId?: string | null,
>   techStack?: string[] | null,
>   remotePolicy?: string | null,
>   experienceLevel?: string | null,
>   salaryMin?: number | null,
>   salaryMax?: number | null,
>   salaryCurrency?: string | null,
>   applicationUrl?: string | null,
>   isActive?: boolean | null,
>   deactivatedAt?: string | null
> }
> ```

***

### delete

`savedJobs.delete`

Permanently remove a saved-job entry by its saved-job id (not the job id)

**Risk:** `destructive` · **Irreversible**

```ts theme={null}
await corsair.remoet.api.savedJobs.delete({ savedJobId: '65f0000000000000000000b2' });
```

**Input**

| Name | Type | Required | Description |
| - | - | - | - |
| `savedJobId` | `string` | Yes | The saved-job entry id, not the job id. |

**Output**

| Name | Type | Required | Description |
| - | - | - | - |
| `deleted` | `boolean` | Yes | — |
| `id` | `string` | Yes | — |

***

### list

`savedJobs.list`

List the user's saved jobs with their notes. A locked entry has job null and a lockedReason saying how to unlock it, usually: star the company to see it again. Paginated with page and pageSize (max 50)

**Risk:** `read`

```ts theme={null}
await corsair.remoet.api.savedJobs.list({});
```

**Input**

| Name | Type | Required | Description |
| - | - | - | - |
| `page` | `number` | No | Page number, starting from 1. |
| `pageSize` | `number` | No | Results per page, max 50. |

**Output**

| Name | Type | Required | Description |
| - | - | - | - |
| `items` | `object[]` | Yes | — |
| `totalCount` | `number` | Yes | — |
| `page` | `number` | Yes | — |
| `pageSize` | `number` | Yes | — |
| `totalPages` | `number` | Yes | — |
| `hasNextPage` | `boolean` | Yes | — |

> **items full type**
>
> ```ts theme={null}
> {
>   id: string,
>   jobId: string,
>   jobType: string,
>   note?: string | null,
>   savedAt: string,
>   job?: {
>     title: string,
>     listingId?: string | null,
>     techStack?: string[] | null,
>     remotePolicy?: string | null,
>     experienceLevel?: string | null,
>     salaryMin?: number | null,
>     salaryMax?: number | null,
>     salaryCurrency?: string | null,
>     applicationUrl?: string | null,
>     isActive?: boolean | null,
>     deactivatedAt?: string | null
>   } | null,
>   locked?: boolean,
>   lockedReason?: string
> }[]
> ```

***

### update

`savedJobs.update`

Replace the note on a saved-job entry by its saved-job id (not the job id); null clears it

**Risk:** `write`

```ts theme={null}
await corsair.remoet.api.savedJobs.update({ savedJobId: '65f0000000000000000000b2', note: 'Great stack' });
```

**Input**

| Name | Type | Required | Description |
| - | - | - | - |
| `savedJobId` | `string` | Yes | The saved-job entry id, not the job id. |
| `note` | `string \| null` | Yes | The new note, or null to clear it. |

**Output**

| Name | Type | Required | Description |
| - | - | - | - |
| `id` | `string` | Yes | The saved-job entry id, used by savedJobs.update and savedJobs.delete. |
| `jobId` | `string` | Yes | — |
| `jobType` | `string` | Yes | — |
| `note` | `string` | No | — |
| `savedAt` | `string` | Yes | — |
| `job` | `object` | No | — |
| `locked` | `boolean` | No | — |
| `lockedReason` | `string` | No | — |

> **job full type**
>
> ```ts theme={null}
> {
>   title: string,
>   listingId?: string | null,
>   techStack?: string[] | null,
>   remotePolicy?: string | null,
>   experienceLevel?: string | null,
>   salaryMin?: number | null,
>   salaryMax?: number | null,
>   salaryCurrency?: string | null,
>   applicationUrl?: string | null,
>   isActive?: boolean | null,
>   deactivatedAt?: string | null
> }
> ```

***

## Starred Jobs

### list

`starredJobs.list`

List jobs at the companies the user has starred, filtered by keywords, location, tech stack, remote policy, seniority and salary floor. createdAt is when Remoet first saw a job, not when it was posted. Paginated with page and pageSize (max 50)

**Risk:** `read`

```ts theme={null}
await corsair.remoet.api.starredJobs.list({});
```

**Input**

| Name | Type | Required | Description |
| - | - | - | - |
| `searchQuery` | `string` | No | Search keywords for job title, summary or tech stack. |
| `locationQuery` | `string` | No | Filter by location or remote restrictions. |
| `techStack` | `string[]` | No | — |
| `techStackMatch` | `any \| all` | No | How techStack combines: "any" (at least one) or "all" (every one required). |
| `remotePolicy` | `onsite \| hybrid \| remote \| remote-restricted[]` | No | — |
| `experienceLevel` | `junior \| mid \| senior[]` | No | — |
| `salaryMin` | `number` | No | Minimum salary. |
| `sortBy` | `createdAt \| remotePolicy \| salaryEnriched.from \| experienceLevel` | No | — |
| `sortOrder` | `asc \| desc` | No | — |
| `page` | `number` | No | Page number, starting from 1. |
| `pageSize` | `number` | No | Results per page, max 50. |

**Output**

| Name | Type | Required | Description |
| - | - | - | - |
| `jobs` | `object[]` | Yes | — |
| `totalCount` | `number` | Yes | — |
| `totalPages` | `number` | Yes | — |
| `page` | `number` | Yes | — |
| `pageSize` | `number` | Yes | — |
| `hasNextPage` | `boolean` | Yes | — |
| `starsOverCap` | `object` | No | Present when the user holds more stars than the cap allows. |

> **jobs full type**
>
> ```ts theme={null}
> {
>   id: string,
>   title: string,
>   url?: string | null,
>   createdAt: string,
>   remotePolicy?: string | null,
>   remoteRestrictions?: string | null,
>   techStack?: string[] | null,
>   salaryEnriched?: {
>     from?: number | null,
>     to?: number | null,
>     currency?: string | null,
>     period?: string | null
>   } | null,
>   experienceLevel?: string | null,
>   benefits?: string[] | null,
>   summary?: string | null,
>   isOnPublishablePlatform?: boolean | null,
>   listing: {
>     id: string,
>     name: string,
>     slug: string
>   },
>   postingCount?: number | null,
>   postingLocations?: string[] | null
> }[]
> ```

> **starsOverCap full type**
>
> ```ts theme={null}
> {
>   surplusStars: number,
>   maxActiveStars: number,
>   starsPendingDeletionAt?: string | null,
>   note: string
> }
> ```

***

## Stars

### create

`stars.create`

Star a company on Remoet by its slug so its jobs reach the user feed. Stars are capped per user, and removing one spends from a limited unstar budget

**Risk:** `write`

```ts theme={null}
await corsair.remoet.api.stars.create({ companySlug: 'starburst' });
```

**Input**

| Name | Type | Required | Description |
| - | - | - | - |
| `companySlug` | `string` | Yes | Slug of an active Remoet company, e.g. from jobContext.get. |

**Output**

| Name | Type | Required | Description |
| - | - | - | - |
| `company` | `string` | Yes | — |

***

### delete

`stars.delete`

Unstar a company by its slug. Each unstar spends from a limited budget that resets every 30 days

**Risk:** `destructive`

```ts theme={null}
await corsair.remoet.api.stars.delete({ companySlug: 'starburst' });
```

**Input**

| Name | Type | Required | Description |
| - | - | - | - |
| `companySlug` | `string` | Yes | Slug of the company to unstar. |

**Output**

| Name | Type | Required | Description |
| - | - | - | - |
| `company` | `string` | Yes | — |

***

## Work Experience

### create

`workExperience.create`

Add a work experience entry to the user's profile: title and startDate are required

**Risk:** `write`

```ts theme={null}
await corsair.remoet.api.workExperience.create({
	title: 'Senior Engineer',
	companyName: 'Acme',
	startDate: '2023-04-01',
	technologies: ['TypeScript', 'Go'],
});
```

**Input**

| Name | Type | Required | Description |
| - | - | - | - |
| `title` | `string` | Yes | Job title. |
| `startDate` | `string` | Yes | A date, e.g. "2024-01-15". |
| `companyName` | `string` | No | Company name. On update, '' clears it. |
| `companyUrl` | `string` | No | Company website URL. On update, '' clears it. |
| `endDate` | `string` | No | A date, e.g. "2024-01-15". |
| `isCurrent` | `boolean` | No | Whether this is the current job. |
| `isRemote` | `boolean` | No | Whether this job is remote. |
| `technologies` | `string[]` | No | Technologies used, e.g. \["React", "Node.js"]. On update, \[] empties it. |
| `description` | `string` | No | Job description. On update, '' clears it. |

**Output**

| Name | Type | Required | Description |
| - | - | - | - |
| `id` | `string` | Yes | — |
| `createdAt` | `string` | Yes | — |
| `updatedAt` | `string` | Yes | — |
| `userId` | `string` | No | — |
| `title` | `string` | Yes | — |
| `startDate` | `string` | Yes | — |
| `endDate` | `string` | No | Null or absent for a current role. |
| `isCurrent` | `boolean` | No | — |
| `isPublic` | `boolean` | No | — |
| `companyName` | `string` | No | — |
| `technologies` | `string[]` | No | — |
| `description` | `string` | No | — |
| `isRemote` | `boolean` | No | — |
| `companyUrl` | `string` | No | — |
| `listingId` | `string` | No | Id of a Remoet company listing linked to this entry, when one is linked; usually null. Not evidence of a job match. |

***

### delete

`workExperience.delete`

Permanently remove a work experience entry by its id

**Risk:** `destructive` · **Irreversible**

```ts theme={null}
await corsair.remoet.api.workExperience.delete({ id: '65f0000000000000000000a1' });
```

**Input**

| Name | Type | Required | Description |
| - | - | - | - |
| `id` | `string` | Yes | — |

**Output**

| Name | Type | Required | Description |
| - | - | - | - |
| `deleted` | `boolean` | Yes | — |
| `id` | `string` | Yes | — |

***

### list

`workExperience.list`

List the user's work experience (their employment history, not job postings)

**Risk:** `read`

```ts theme={null}
await corsair.remoet.api.workExperience.list({});
```

**Input:** *empty object*

**Output:** `object[]`

> **Output full type**
>
> ```ts theme={null}
> {
>   id: string,
>   createdAt: string,
>   updatedAt: string,
>   userId?: string | null,
>   title: string,
>   startDate: string,
>   endDate?: string | null,
>   isCurrent?: boolean | null,
>   isPublic?: boolean | null,
>   companyName?: string | null,
>   technologies?: string[] | null,
>   description?: string | null,
>   isRemote?: boolean | null,
>   companyUrl?: string | null,
>   listingId?: string | null
> }[]
> ```

***

### update

`workExperience.update`

Update a work experience entry by its id. Omit a field to leave it unchanged; set an optional text field to '' to clear it or technologies to \[] to empty it. startDate, endDate and the booleans can only be replaced, never cleared

**Risk:** `write`

```ts theme={null}
await corsair.remoet.api.workExperience.update({ id: '65f0000000000000000000a1', isCurrent: false });
```

**Input**

| Name | Type | Required | Description |
| - | - | - | - |
| `title` | `string` | No | Job title. |
| `startDate` | `string` | No | A date, e.g. "2024-01-15". |
| `companyName` | `string` | No | Company name. On update, '' clears it. |
| `companyUrl` | `string` | No | Company website URL. On update, '' clears it. |
| `endDate` | `string` | No | A date, e.g. "2024-01-15". |
| `isCurrent` | `boolean` | No | Whether this is the current job. |
| `isRemote` | `boolean` | No | Whether this job is remote. |
| `technologies` | `string[]` | No | Technologies used, e.g. \["React", "Node.js"]. On update, \[] empties it. |
| `description` | `string` | No | Job description. On update, '' clears it. |
| `id` | `string` | Yes | — |

**Output**

| Name | Type | Required | Description |
| - | - | - | - |
| `id` | `string` | Yes | — |
| `createdAt` | `string` | Yes | — |
| `updatedAt` | `string` | Yes | — |
| `userId` | `string` | No | — |
| `title` | `string` | Yes | — |
| `startDate` | `string` | Yes | — |
| `endDate` | `string` | No | Null or absent for a current role. |
| `isCurrent` | `boolean` | No | — |
| `isPublic` | `boolean` | No | — |
| `companyName` | `string` | No | — |
| `technologies` | `string[]` | No | — |
| `description` | `string` | No | — |
| `isRemote` | `boolean` | No | — |
| `companyUrl` | `string` | No | — |
| `listingId` | `string` | No | Id of a Remoet company listing linked to this entry, when one is linked; usually null. Not evidence of a job match. |

***


This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.