# Authentication
Source: https://docs.mokaru.ai/api-reference/authentication
API keys, scopes, and rate limits
## API Keys
All API requests require an API key passed in the `Authorization` header:
```bash theme={null}
Authorization: Bearer mk_<64 hex characters>
```
### Creating an API Key
1. Go to **Settings → Integrations → API Keys** in the [Mokaru app](https://app.mokaru.ai/settings)
2. Click **Create API key**
3. Give it a name (e.g. "Claude Desktop") and select permissions
4. Copy the key immediately - it's only shown once
API keys require a **Plus plan**. You can have **1 active key** per account. Revoke the existing key to create a new one.
## Scopes
Each API key has scopes that control what it can access. Most resources have a `:read` and `:write` pair; some have additional verbs.
### Core scopes
| Scope | Description |
| ---------------- | --------------------------------------- |
| `jobs:search` | Search job listings |
| `tracker:read` | Read your applications |
| `tracker:write` | Create, update, and delete applications |
| `profile:read` | Read your career profile |
| `profile:write` | Update your career profile |
| `contacts:read` | Read your contacts |
| `contacts:write` | Create, update, and delete contacts |
| `resume:read` | List and read resumes |
| `resume:write` | Create, update, and delete resumes |
| `resume:export` | Export resumes as PDF |
### Resume section scopes
Each section of a resume has its own scope so you can grant fine-grained access.
| Scope | Description |
| ------------------------------------------------ | -------------------------------- |
| `experiences:read` / `experiences:write` | Work experiences |
| `education:read` / `education:write` | Education entries |
| `skills:read` / `skills:write` | Skills |
| `summaries:read` / `summaries:write` | Profile summary variants |
| `projects:read` / `projects:write` | Projects |
| `certificates:read` / `certificates:write` | Certificates |
| `awards:read` / `awards:write` | Awards |
| `publications:read` / `publications:write` | Publications |
| `interests:read` / `interests:write` | Interests |
| `custom-sections:read` / `custom-sections:write` | Custom resume sections and items |
If a request requires a scope the key doesn't have, the API returns `403 Forbidden`.
## Rate Limits
Rate limits are **per account** (not per key) using a sliding window. Most endpoints follow a predictable pattern by HTTP method:
| HTTP method | Default limit |
| -------------------------------------------- | --------------- |
| `GET` (list, e.g. `/v1/contacts`) | 60 requests/min |
| `GET` (single item, e.g. `/v1/contacts/:id`) | 30 requests/min |
| `POST` (create) | 20 requests/min |
| `PATCH` (update) | 20 requests/min |
| `DELETE` | 10 requests/min |
A few endpoints deviate from the default:
| Endpoint | Limit |
| -------------------------------- | --------------- |
| `POST /v1/jobs/search` | 30 requests/min |
| `POST /v1/resume` | 10 requests/min |
| `POST /v1/resume/:id/export/pdf` | 5 requests/min |
| `GET /v1/profile` | 30 requests/min |
Every response includes rate limit headers:
```
X-RateLimit-Limit: 30
X-RateLimit-Remaining: 29
X-RateLimit-Reset: 1710504000000
```
When rate limited, the response status is `429` and the body includes a `Retry-After` indication.
The `/mcp` endpoint uses a slightly different scheme: 100 requests per 10 seconds per IP and 60 per minute per OAuth client, with RFC-draft `RateLimit-*` headers. Tools called via MCP still hit the underlying `/v1/*` rate limits on top of those, so heavy automation can be capped on either layer.
## Error Responses
| Status | Meaning |
| ------ | --------------------------------------------- |
| `400` | Bad request - missing or invalid fields |
| `401` | Missing, invalid, expired, or revoked API key |
| `403` | API key lacks required scope |
| `429` | Rate limit exceeded |
| `500` | Internal server error |
All errors return JSON:
```json theme={null}
{
"error": "Invalid or expired API key"
}
```
## Security
* Keys are **SHA-256 hashed** before storage - plain keys are never stored
* **256-bit entropy** (32 random bytes) - cryptographically secure
* Keys can be **revoked instantly** from Settings
* **Standalone auth** - not tied to your browser session, designed for machine-to-machine access
# Create Application
Source: https://docs.mokaru.ai/api-reference/endpoint/create-application
POST https://api.mokaru.ai/v1/tracker/applications
Add a job to your application tracker
## Overview
The Create Application endpoint adds a job to your Mokaru application tracker. It is the second step in the typical automation workflow: search for jobs, create applications for the ones that match, then list your applications to track progress.
**Typical workflow:**
1. **Search** - use the [Search Jobs](/api-reference/endpoint/search-jobs) endpoint to find relevant positions
2. **Create** - use this endpoint to add the best matches to your tracker
3. **List** - use the [List Applications](/api-reference/endpoint/list-applications) endpoint to review and export your pipeline
**Common use cases:**
* **AI agent pipelines** - let OpenClaw, Claude Code, or another AI agent review job listings and automatically add promising ones to your tracker. With `autoPrepare`, the agent can also tailor your resume for each job.
* **n8n and Make automations** - build a workflow that watches an RSS feed, email inbox, or Slack channel for job leads, then creates applications automatically.
* **Browser extension integration** - capture jobs while browsing LinkedIn, Indeed, or company career pages and push them to your tracker with a single click.
The endpoint includes built-in duplicate detection. If you provide a `jobUrl` that already exists in your tracker, the API returns the existing application ID with `"existing": true` instead of creating a duplicate.
When you pass a `jobListingId` from the Search Jobs endpoint, salary data and publisher information are automatically linked to the application.
**Scope required:** `tracker:write` | **Rate limit:** 20 requests/min
## Request
```bash theme={null}
POST /v1/tracker/applications
```
### Body Parameters
Job title (max 200 characters)
Company name (max 200 characters)
Job location (max 200 characters)
Link to the job posting (max 2000 characters). Used for deduplication - if an application with the same URL already exists, the existing ID is returned.
Full job description text (max 50,000 characters). Required if `autoPrepare` is `true` (minimum 500 characters).
ID from the Search Jobs endpoint. Links salary data and publisher info automatically. If `jobDescription` is not provided, the description from the listing is used.
Where the job was found. Options: `LinkedIn`, `CompanyWebsite`, `JobWebsite`, `Referral`, `Agency`, `Other`
When `true`, Mokaru duplicates your default resume, tailors it to the job description, and queues it for AI processing. Requires:
* **Plus plan** with auto-prepare feature
* A **default resume** set in your Mokaru account
* A **job description** of at least 500 characters
### Example
```bash theme={null}
curl -X POST "https://api.mokaru.ai/v1/tracker/applications" \
-H "Authorization: Bearer mk_your_key" \
-H "Content-Type: application/json" \
-d '{
"jobTitle": "Senior Software Engineer",
"company": "Acme Corp",
"location": "San Francisco, CA",
"jobUrl": "https://acme.com/careers/123",
"jobListingId": "clx1234...",
"autoPrepare": true
}'
```
## Response
Whether the operation succeededThe application ID`true` if an application with the same `jobUrl` already existedWhether auto-prepare was triggered for this application
### Success (with auto-prepare)
```json theme={null}
{
"success": true,
"applicationId": "clx5678...",
"existing": false,
"autoPrepare": true
}
```
### Success (without auto-prepare)
```json theme={null}
{
"success": true,
"applicationId": "clx5678...",
"existing": false,
"autoPrepare": false
}
```
### Duplicate Detection
If you provide a `jobUrl` that already exists in your tracker:
```json theme={null}
{
"success": true,
"applicationId": "clx5678...",
"existing": true
}
```
### Error Responses
**No default resume set:**
```json theme={null}
{
"error": "No default resume found. Set a default resume in Mokaru before using auto-prepare.",
"code": "NO_DEFAULT_RESUME"
}
```
**Plus plan required:**
```json theme={null}
{
"error": "Auto-prepare requires a Plus plan",
"code": "PLAN_REQUIRED"
}
```
**Job description too short:**
```json theme={null}
{
"error": "Auto-prepare requires a job description of at least 500 characters.",
"code": "JOB_DESCRIPTION_TOO_SHORT"
}
```
**Validation errors:**
```json theme={null}
{
"error": "Validation failed",
"details": {
"jobTitle": ["Required"],
"jobUrl": ["Invalid url"]
}
}
```
When `autoPrepare` is `true`, the application is created with status `preparing`. Mokaru's AI pipeline will process it in the background - typically within 30 seconds. The application status changes to `watchlist` once processing is complete. You can check the status via the [List Applications](/api-reference/endpoint/list-applications) endpoint.
# Create Award
Source: https://docs.mokaru.ai/api-reference/endpoint/create-award
POST https://api.mokaru.ai/v1/awards
Add a new award or honor to your career profile
## Overview
Add a new award or honor to the authenticated user's base resume.
**Common use cases:**
* **AI agent profile building** - automatically add awards extracted from a resume or LinkedIn.
* **Career tracking** - log a new award when received.
* **Bulk import** - add multiple honors from a spreadsheet.
**Scope required:** `awards:write` | **Rate limit:** 20 requests/min
## Request
```bash theme={null}
POST /v1/awards
Content-Type: application/json
```
### Body Parameters
Award name (max 200 characters)
Issuing organisation (max 200 characters)
Free-text description
ISO 8601 date string when the award was received (e.g. "2024-12-01")
### Query Parameters
Target a specific resume by its id (from `list-resumes`). Omit to use your base/default resume; the resume must be self-contained.
## Response
```json theme={null}
{
"success": true,
"id": "clx..."
}
```
Always true on successful creation
The created award id
# Create Certificate
Source: https://docs.mokaru.ai/api-reference/endpoint/create-certificate
POST https://api.mokaru.ai/v1/certificates
Add a new certificate to your career profile
## Overview
Add a new certificate or credential to the authenticated user's base resume.
**Common use cases:**
* **AI agent profile building** - extract certifications from a LinkedIn export.
* **Career tracking** - log a freshly earned certificate.
* **Verification** - link to the issuing authority's verification page.
**Scope required:** `certificates:write` | **Rate limit:** 20 requests/min
## Request
```bash theme={null}
POST /v1/certificates
Content-Type: application/json
```
### Body Parameters
Certificate name (max 200 characters)
Issuing organisation (max 200 characters)
Free-text description
ISO 8601 date string when the certificate was issued
ISO 8601 date string when the certificate expires (omit if no expiry)
Credential ID from the issuer (max 200 characters)
URL to verify the certificate (max 500 characters)
### Query Parameters
Target a specific resume by its id (from `list-resumes`). Omit to use your base/default resume; the resume must be self-contained.
## Response
```json theme={null}
{
"success": true,
"id": "clx..."
}
```
# Create Contact
Source: https://docs.mokaru.ai/api-reference/endpoint/create-contact
POST https://api.mokaru.ai/v1/contacts
Create a new contact
## Overview
The Create Contact endpoint lets you add a new networking contact to your Mokaru account.
**Common use cases:**
* **AI agent contact capture** - save contacts from LinkedIn conversations or email threads automatically.
* **Post-interview logging** - record interviewer details after a call.
* **Bulk import** - add contacts from a spreadsheet or CRM via automation.
**Scope required:** `contacts:write` | **Rate limit:** 20 requests/min
## Request
```bash theme={null}
POST /v1/contacts
```
### Body Parameters
First name (max 100 characters)
Last name (max 100 characters)
Contact's job title (max 200 characters)
Company name (max 200 characters)
Relationship type. One of: `RECRUITER`, `HIRING_MANAGER`, `HR_MANAGER`, `TEAM_LEAD`, `DEPARTMENT_HEAD`, `CEO_FOUNDER`, `COLLEAGUE`, `FRIEND`, `REFERRAL`, `OTHER`
Email address (max 200 characters)
Phone number (max 50 characters)
LinkedIn profile URL (max 500 characters)
### Example
```bash theme={null}
curl -X POST "https://api.mokaru.ai/v1/contacts" \
-H "Authorization: Bearer mk_your_key" \
-H "Content-Type: application/json" \
-d '{
"firstName": "Sarah",
"lastName": "Jones",
"jobTitle": "Engineering Manager",
"company": "Acme Corp",
"relationship": "HIRING_MANAGER",
"email": "sarah@acme.com"
}'
```
## Response
Whether the contact was createdThe new contact's unique ID
```json theme={null}
{
"success": true,
"id": "clx1234..."
}
```
# Create Cover Letter
Source: https://docs.mokaru.ai/api-reference/endpoint/create-cover-letter
POST https://api.mokaru.ai/v1/cover-letter
Create a cover letter attached to a resume
## Overview
Create a cover letter and link it to a resume. A cover letter cannot exist on its own: `cvId` is **required** and must reference an existing resume the caller owns. If the user has no resumes yet, create one first via `POST /v1/resume`. A resume can have **at most one** cover letter (the `cvId` link is unique). If one already exists, this endpoint returns `409 Conflict` with the existing id - use `PATCH /v1/cover-letter/{id}` to update instead.
**Plus plan only.** This endpoint returns `403 Forbidden` with `{ requiresUpgrade: true }` if the user is on the free plan. The free read/list/delete endpoints stay available so downgraded users can still see and clean up their existing cover letters.
**Scope required:** `cover-letter:write` | **Rate limit:** 10 requests/min
## Request
```bash theme={null}
POST /v1/cover-letter
```
### Body Parameters
Resume id this cover letter belongs to. Must be owned by the caller.
Cover letter title (max 200 chars).
Body text. Markdown allowed - the builder renders it.
Optional cover letter template id.
Mark as the user's default cover letter (unsets any existing default).
Template-variable map, e.g. `{ "company": "Acme", "contactPerson": "Jane Doe" }`. Values are strings.
Header: show name.Header: show email.Header: show phone.Header: show address.`left | center | right`.Font family.Font size in pt.Line spacing.
### Example
```bash theme={null}
curl -X POST "https://api.mokaru.ai/v1/cover-letter" \
-H "Authorization: Bearer mk_your_key" \
-H "Content-Type: application/json" \
-d '{
"cvId": "clx1234",
"title": "Stripe - Backend Engineer",
"content": "Dear hiring team,\n\nI am applying for ...",
"variables": { "company": "Stripe", "contactPerson": "Jane Doe" }
}'
```
## Response
Whether the cover letter was created.The new cover letter's unique ID.
```json theme={null}
{ "success": true, "id": "clx_cl_abc" }
```
### Error: cover letter already exists
```json theme={null}
{
"error": "Cover letter already exists for this resume",
"existingId": "clx_cl_existing"
}
```
Status: `409 Conflict`.
# Create Custom Section
Source: https://docs.mokaru.ai/api-reference/endpoint/create-custom-section
POST https://api.mokaru.ai/v1/custom-sections
Create a new user-defined CV section
## Overview
Create a new custom section definition. After creation, add items via `POST /v1/custom-sections/:id/items`.
**Scope required:** `custom-sections:write` | **Rate limit:** 20 requests/min
## Request
```bash theme={null}
POST /v1/custom-sections
Content-Type: application/json
```
### Body Parameters
Section title shown in the CV (e.g. "Volunteer Work")
Which fields items can use. At least one required. Allowed values: `"title"`, `"subtitle"`, `"organization"`, `"location"`, `"description"`, `"startDate"`, `"endDate"`, `"url"`
Lucide icon name shown next to the section
### Query Parameters
Target a specific resume by its id (from `list-resumes`). Omit to use your base/default resume; the resume must be self-contained.
## Response
```json theme={null}
{
"success": true,
"id": "clx..."
}
```
# Create Custom Section Item
Source: https://docs.mokaru.ai/api-reference/endpoint/create-custom-section-item
POST https://api.mokaru.ai/v1/custom-sections/{id}/items
Add an item to a custom CV section
## Overview
Add an entry to a custom section. Only fields enabled in the section definition are persisted - other fields are silently dropped.
**Scope required:** `custom-sections:write` | **Rate limit:** 20 requests/min
## Request
```bash theme={null}
POST /v1/custom-sections/{sectionId}/items
Content-Type: application/json
```
### Path Parameters
Section definition id
### Body Parameters
All fields are optional. Use only those listed in the parent section's `enabledFields`.
Item title (max 200 characters)
Item subtitle (max 200 characters)
Organisation (max 200 characters)
Location (max 200 characters)
Free-text description
Free-text date or YYYY-MM-DD (max 20 characters)
Free-text date or YYYY-MM-DD (max 20 characters)
URL (max 500 characters)
### Query Parameters
Target a specific resume by its id (from `list-resumes`). Omit to use your base/default resume; the resume must be self-contained.
## Response
```json theme={null}
{
"success": true,
"id": "cli..."
}
```
# Create Education
Source: https://docs.mokaru.ai/api-reference/endpoint/create-education
POST https://api.mokaru.ai/v1/education
Create a new education entry
## Overview
The Create Education endpoint lets you add a new education entry to your Mokaru account.
**Common use cases:**
* **AI agent profile building** - automatically add education extracted from a LinkedIn profile or resume.
* **Profile completion** - add education details to strengthen your career profile.
* **Bulk import** - add education entries from a spreadsheet or external system.
**Scope required:** `education:write` | **Rate limit:** 20 requests/min
## Request
```bash theme={null}
POST /v1/education
```
### Body Parameters
School or institution name (max 200 characters)
Degree type, e.g. "Bachelor of Science" (max 200 characters)
Field of study, e.g. "Computer Science" (max 200 characters)
Location of the institution (max 200 characters)
ISO 8601 datetime, e.g. "2018-09-01T00:00:00Z"
ISO 8601 datetime (null or omit if currently enrolled)
Whether currently enrolled (default: false)
Additional details
Grade or classification (max 50 characters)
GPA value
### Query Parameters
Target a specific resume by its id (from `list-resumes`). Omit to use your base/default resume; the resume must be self-contained.
### Example
```bash theme={null}
curl -X POST "https://api.mokaru.ai/v1/education" \
-H "Authorization: Bearer mk_your_key" \
-H "Content-Type: application/json" \
-d '{
"institution": "Stanford University",
"degree": "Bachelor of Science",
"fieldOfStudy": "Computer Science",
"startDate": "2018-09-01",
"endDate": "2022-06-15",
"description": "Graduated with honors"
}'
```
## Response
Whether the education was createdThe new education entry's unique ID
```json theme={null}
{
"success": true,
"id": "clx1234..."
}
```
# Create Experience
Source: https://docs.mokaru.ai/api-reference/endpoint/create-experience
POST https://api.mokaru.ai/v1/experiences
Create a new work experience
## Overview
The Create Experience endpoint lets you add a new work experience to your Mokaru account.
**Common use cases:**
* **AI agent profile building** - automatically add work experiences extracted from a LinkedIn profile or resume.
* **Career tracking** - log a new position when you start a new role.
* **Bulk import** - add work experiences from a spreadsheet or external system.
**Scope required:** `experiences:write` | **Rate limit:** 20 requests/min
## Request
```bash theme={null}
POST /v1/experiences
```
### Body Parameters
Job title / role at this employer (max 200 characters)
Company name (max 200 characters)
Work location (max 200 characters)
ISO 8601 datetime, e.g. "2022-01-01T00:00:00Z"
ISO 8601 datetime (null or omit for current position)
True if still employed here (endDate ignored).
Role description
List of responsibilities
List of achievements
### Query Parameters
Target a specific resume by its id (from `list-resumes`). Omit to use your base/default resume; the resume must be self-contained.
### Example
```bash theme={null}
curl -X POST "https://api.mokaru.ai/v1/experiences" \
-H "Authorization: Bearer mk_your_key" \
-H "Content-Type: application/json" \
-d '{
"jobTitle": "Senior Software Engineer",
"company": "Acme Corp",
"location": "San Francisco, CA",
"startDate": "2022-07-01",
"isCurrent": true,
"description": "Building and maintaining the core platform",
"responsibilities": ["Led frontend architecture"],
"achievements": ["Reduced bundle size by 40%"]
}'
```
## Response
Whether the experience was createdThe new experience's unique ID
```json theme={null}
{
"success": true,
"id": "clx1234..."
}
```
# Create Interest
Source: https://docs.mokaru.ai/api-reference/endpoint/create-interest
POST https://api.mokaru.ai/v1/interests
Add a new interest or hobby to your career profile
## Overview
Add a new interest or hobby to the authenticated user's base resume.
**Scope required:** `interests:write` | **Rate limit:** 20 requests/min
## Request
```bash theme={null}
POST /v1/interests
Content-Type: application/json
```
### Body Parameters
Interest name (max 200 characters)
Free-text description
### Query Parameters
Target a specific resume by its id (from `list-resumes`). Omit to use your base/default resume; the resume must be self-contained.
## Response
```json theme={null}
{
"success": true,
"id": "clx..."
}
```
# Create Project
Source: https://docs.mokaru.ai/api-reference/endpoint/create-project
POST https://api.mokaru.ai/v1/projects
Add a new project to your career profile
## Overview
Add a new project to the authenticated user's base resume.
**Scope required:** `projects:write` | **Rate limit:** 20 requests/min
## Request
```bash theme={null}
POST /v1/projects
Content-Type: application/json
```
### Body Parameters
Project name (max 200 characters)
Project description
Organisation behind the project (max 200 characters)
ISO 8601 date string
ISO 8601 date string (omit for ongoing projects)
Set to true for ongoing projects
Project URL (max 500 characters)
### Query Parameters
Target a specific resume by its id (from `list-resumes`). Omit to use your base/default resume; the resume must be self-contained.
## Response
```json theme={null}
{
"success": true,
"id": "clx..."
}
```
# Create Publication
Source: https://docs.mokaru.ai/api-reference/endpoint/create-publication
POST https://api.mokaru.ai/v1/publications
Add a new publication to your career profile
## Overview
Add a new publication to the authenticated user's base resume.
**Scope required:** `publications:write` | **Rate limit:** 20 requests/min
## Request
```bash theme={null}
POST /v1/publications
Content-Type: application/json
```
### Body Parameters
Publication title (max 300 characters)
Publisher name (max 200 characters)
ISO 8601 publication date
URL to the publication (max 500 characters)
Free-text description
### Query Parameters
Target a specific resume by its id (from `list-resumes`). Omit to use your base/default resume; the resume must be self-contained.
## Response
```json theme={null}
{
"success": true,
"id": "clx..."
}
```
# Create Resume
Source: https://docs.mokaru.ai/api-reference/endpoint/create-resume
POST https://api.mokaru.ai/v1/resume
Create a new resume
## Overview
The Create Resume endpoint lets you create a new resume in Mokaru. Each resume owns its own content. A new resume starts as a copy of your base (default) resume's content (experiences, education, skills, certificates, projects, awards, publications and interests); editing the base afterwards doesn't change resumes you already created. Use this endpoint for the CV-level shell (name, template, design) and to hide items on the CV via `hiddenItems`.
**Common use cases:**
* **AI agent resume creation** - create a tailored resume for a specific job by hiding items that aren't relevant.
* **Bulk resume generation** - create multiple resume variants with different `hiddenItems` selections.
* **Set defaults** - create the user's first resume, copied from the base resume's content.
**Self-contained model:** sections (experiences, education, skills, certificates, projects, awards, publications, interests, customSections) are managed via the dedicated content endpoints (e.g. `POST /v1/experiences`), not via `cvData`. Arrays under these keys in `cvData` are silently dropped to prevent the resume thumbnail from drifting from what the builder shows. The new resume's content is copied from the base resume at create time; use `hiddenItems` to hide items on this specific CV.
**Scope required:** `resume:write` | **Rate limit:** 10 requests/min
## Request
```bash theme={null}
POST /v1/resume
```
### Body Parameters
Resume name (max 200 characters)
CV-level job title shown in the header (max 150 chars). Overrides the shared identity job title for this CV. Pass `null` to clear and fall back to the identity value.
Template ID (e.g. "classic", "modern", "minimal")
Set as the default resume (unsets any existing default)
CV-level overrides for personal info and `summary`. Section arrays (`experiences`, `education`, `skills`, `certificates`, `projects`, `awards`, `publications`, `interests`, `customSections`) are silently ignored - use the dedicated content endpoints to manage them, and `hiddenItems` to hide them per-CV.
Per-section blacklist of the resume's item IDs to hide on this CV. Items not listed are visible. Keys: `experiences`, `education`, `skills`, `certificates`, `projects`, `awards`, `publications`, `interests`, or `customSection:`. Each value is an array of the resume's item IDs (from the content endpoints / `GET /v1/profile`).
Per-CV content override. Only `summary` takes effect - it overrides the selected summary for this CV (pass `null` to clear). Identity fields (name, email, phone, address, links, photo) are shared profile-level and cannot be overridden per resume; edit them via the profile endpoint. The per-CV job title is the top-level `jobTitle` field, not `personalOverrides`.
Per-section ordering map. Keys are section names (`experiences`, `education`, `skills`, `certificates`, `projects`, `awards`, `publications`, `interests`, `skillCategories`); values are arrays of the resume's item IDs in the desired order. Items not listed fall back to the default order.
ID of the summary this resume shows (from `GET /v1/summaries`). Set to `null` to render no summary.
Visual styling: colors, fonts, spacing, margins
Show/hide toggles for optional fields like phone, address, photo
Order of resume sections (e.g. \["summary", "experiences", "education", "skills"])
### Example
Create a resume that hides two of the resume's experiences and one project:
```bash theme={null}
curl -X POST "https://api.mokaru.ai/v1/resume" \
-H "Authorization: Bearer mk_your_key" \
-H "Content-Type: application/json" \
-d '{
"name": "Backend Engineer Resume",
"template": "classic",
"isDefault": false,
"cvData": {
"jobTitle": "Backend Engineer"
},
"hiddenItems": {
"experiences": ["clx_exp_oldjob1", "clx_exp_oldjob2"],
"projects": ["clx_proj_sidegig"]
}
}'
```
## Response
Whether the resume was createdThe new resume's unique ID
```json theme={null}
{
"success": true,
"id": "clx1234..."
}
```
# Create Resume Share
Source: https://docs.mokaru.ai/api-reference/endpoint/create-resume-share
POST https://api.mokaru.ai/v1/resume/{id}/share
Create a public share link for a resume
## Overview
Generate a public share link for a resume. The endpoint **snapshots** the resume's current cvData, design settings, section order and optional fields into a `EmpResumeShare` row so the shared page renders the state at share-creation time, independent of later edits to the underlying resume.
If a share already exists for this resume, the existing link is returned (upsert behaviour).
**Common use cases:**
* **Send your CV without a PDF** - share a live web URL instead of attaching a file.
* **Privacy-respecting share** - blur company names, institutions, LinkedIn, etc. via `blurOptions`.
* **AI agent application flow** - autofill the recruiter's contact form with a Mokaru share link.
**Scope required:** `resume:share` | **Rate limit:** 10 requests/min
## Request
```bash theme={null}
POST /v1/resume/{id}/share
```
### Path Parameters
Resume id to share.
### Body Parameters
Privacy toggles. Each truthy key blurs the corresponding field on the public view.
Blur the LinkedIn URL.Blur the website URL.Blur the portfolio URL.Blur every company name on the CV.Blur every school / institution name.
### Example
```bash theme={null}
curl -X POST "https://api.mokaru.ai/v1/resume/clx1234/share" \
-H "Authorization: Bearer mk_your_key" \
-H "Content-Type: application/json" \
-d '{ "blurOptions": { "blurCompanies": true } }'
```
## Response
Whether the share was created (or returned).Share row ID (used in the URL).Public URL, e.g. `https://app.mokaru.ai/share/abc123`.ISO 8601 timestamp of when this share was originally created.`true` if an existing share for this resume was returned instead of creating a new one.
```json theme={null}
{
"success": true,
"shareId": "clx_share_abc",
"shareUrl": "https://app.mokaru.ai/share/clx_share_abc",
"createdAt": "2026-05-21T10:00:00.000Z",
"reused": false
}
```
# Create Skill
Source: https://docs.mokaru.ai/api-reference/endpoint/create-skill
POST https://api.mokaru.ai/v1/skills
Create a new skill
## Overview
The Create Skill endpoint lets you add a new skill to your Mokaru account.
**Common use cases:**
* **AI agent skill extraction** - automatically add skills extracted from a job description or resume.
* **Profile enrichment** - add newly acquired skills to your career profile.
* **Bulk import** - add skills from an external source or assessment platform.
**Scope required:** `skills:write` | **Rate limit:** 20 requests/min
## Request
```bash theme={null}
POST /v1/skills
```
### Body Parameters
Skill name (max 200 characters)
Skill category. One of: TECHNICAL, SOFT, or LANGUAGE
Free-text level label, e.g. "Expert", "Intermediate". (max 50 characters)
Numeric proficiency 1-5.
### Query Parameters
Target a specific resume by its id (from `list-resumes`). Omit to use your base/default resume; the resume must be self-contained.
### Example
```bash theme={null}
curl -X POST "https://api.mokaru.ai/v1/skills" \
-H "Authorization: Bearer mk_your_key" \
-H "Content-Type: application/json" \
-d '{
"name": "TypeScript",
"category": "TECHNICAL",
"level": "expert",
"score": 5
}'
```
## Response
Whether the skill was createdThe new skill's unique ID
```json theme={null}
{
"success": true,
"id": "clx1234..."
}
```
# Create Summary
Source: https://docs.mokaru.ai/api-reference/endpoint/create-summary
POST https://api.mokaru.ai/v1/summaries
Add a new professional summary to your career profile
## Overview
Add a new professional summary to the authenticated user's base resume. Summaries are reusable - one resume can pick which summary to display.
**Scope required:** `summaries:write` | **Rate limit:** 20 requests/min
## Request
```bash theme={null}
POST /v1/summaries
Content-Type: application/json
```
### Body Parameters
The actual summary text shown on the CV.
Internal label for the summary (e.g. "Backend role"). (max 100 characters)
### Query Parameters
Target a specific resume by its id (from `list-resumes`). Omit to use your base/default resume; the resume must be self-contained.
## Response
```json theme={null}
{
"success": true,
"id": "clx..."
}
```
# Delete Application
Source: https://docs.mokaru.ai/api-reference/endpoint/delete-application
DELETE https://api.mokaru.ai/v1/tracker/applications/{id}
Delete an application from the tracker
## Overview
The Delete Application endpoint permanently removes an application from your tracker, including its timeline entries.
**Common use cases:**
* **Cleanup** - remove duplicate or outdated applications from your tracker.
* **Automation** - automatically remove applications for jobs that are no longer available.
* **Bulk management** - programmatically clean up your application pipeline.
**Scope required:** `tracker:write` | **Rate limit:** 10 requests/min
## Request
```bash theme={null}
DELETE /v1/tracker/applications/{id}
```
### Path Parameters
Application id to delete
### Example
```bash theme={null}
curl -X DELETE "https://api.mokaru.ai/v1/tracker/applications/clx1234" \
-H "Authorization: Bearer mk_your_key"
```
## Response
Whether the application was deleted
```json theme={null}
{
"success": true
}
```
This action is permanent. The application and its timeline entries will be removed. Any linked resume will be unlinked but not deleted.
# Delete Award
Source: https://docs.mokaru.ai/api-reference/endpoint/delete-award
DELETE https://api.mokaru.ai/v1/awards/{id}
Delete an award from your career profile
## Overview
Permanently delete an award. This is a hard delete - the record is removed and cannot be recovered.
**Scope required:** `awards:write` | **Rate limit:** 10 requests/min
## Request
```bash theme={null}
DELETE /v1/awards/clx...
```
### Path Parameters
Award id
### Query Parameters
Target a specific resume by its id (from `list-resumes`). Omit to use your base/default resume; the resume must be self-contained.
## Response
```json theme={null}
{
"success": true
}
```
Returns `404` if the award does not exist or does not belong to the authenticated user.
# Delete Certificate
Source: https://docs.mokaru.ai/api-reference/endpoint/delete-certificate
DELETE https://api.mokaru.ai/v1/certificates/{id}
Delete a certificate from your career profile
## Overview
Permanently delete a certificate. This is a hard delete - the record is removed and cannot be recovered.
**Scope required:** `certificates:write` | **Rate limit:** 10 requests/min
## Request
```bash theme={null}
DELETE /v1/certificates/clx...
```
### Path Parameters
Certificate id
### Query Parameters
Target a specific resume by its id (from `list-resumes`). Omit to use your base/default resume; the resume must be self-contained.
## Response
```json theme={null}
{
"success": true
}
```
Returns `404` if the certificate does not exist or does not belong to the authenticated user.
# Delete Contact
Source: https://docs.mokaru.ai/api-reference/endpoint/delete-contact
DELETE https://api.mokaru.ai/v1/contacts/{id}
Delete a contact
## Overview
The Delete Contact endpoint permanently removes a contact from your account.
**Scope required:** `contacts:write` | **Rate limit:** 10 requests/min
## Request
```bash theme={null}
DELETE /v1/contacts/{id}
```
### Path Parameters
Contact id to delete
### Example
```bash theme={null}
curl -X DELETE "https://api.mokaru.ai/v1/contacts/clx1234" \
-H "Authorization: Bearer mk_your_key"
```
## Response
Whether the contact was deleted
```json theme={null}
{
"success": true
}
```
This action is permanent. The contact and its associations with applications and interviews will be removed.
# Delete Cover Letter
Source: https://docs.mokaru.ai/api-reference/endpoint/delete-cover-letter
DELETE https://api.mokaru.ai/v1/cover-letter/{id}
Permanently delete a cover letter
## Overview
Permanently delete a cover letter. The parent resume is unaffected. Cannot be undone - confirm with the user before calling.
**Scope required:** `cover-letter:write` | **Rate limit:** 10 requests/min
## Request
```bash theme={null}
DELETE /v1/cover-letter/{id}
```
### Path Parameters
Cover letter id to delete
### Example
```bash theme={null}
curl -X DELETE "https://api.mokaru.ai/v1/cover-letter/clx_cl_abc" \
-H "Authorization: Bearer mk_your_key"
```
## Response
Whether the cover letter was deleted.
```json theme={null}
{ "success": true }
```
# Delete Custom Section
Source: https://docs.mokaru.ai/api-reference/endpoint/delete-custom-section
DELETE https://api.mokaru.ai/v1/custom-sections/{id}
Delete a custom CV section and all its items
## Overview
Permanently delete a custom section and all its items. This is a hard delete.
**Scope required:** `custom-sections:write` | **Rate limit:** 10 requests/min
## Request
```bash theme={null}
DELETE /v1/custom-sections/clx...
```
### Path Parameters
Section definition id to delete (cascades to its items)
### Query Parameters
Target a specific resume by its id (from `list-resumes`). Omit to use your base/default resume; the resume must be self-contained.
## Response
```json theme={null}
{
"success": true
}
```
# Delete Custom Section Item
Source: https://docs.mokaru.ai/api-reference/endpoint/delete-custom-section-item
DELETE https://api.mokaru.ai/v1/custom-section-items/{id}
Delete an item from a custom CV section
## Overview
Permanently delete an item from a custom section. This is a hard delete.
**Scope required:** `custom-sections:write` | **Rate limit:** 10 requests/min
## Request
```bash theme={null}
DELETE /v1/custom-section-items/cli...
```
### Path Parameters
Custom section item id to delete
### Query Parameters
Target a specific resume by its id (from `list-resumes`). Omit to use your base/default resume; the resume must be self-contained.
## Response
```json theme={null}
{
"success": true
}
```
# Delete Education
Source: https://docs.mokaru.ai/api-reference/endpoint/delete-education
DELETE https://api.mokaru.ai/v1/education/{id}
Delete an education entry
## Overview
The Delete Education endpoint permanently removes an education entry from your account.
**Scope required:** `education:write` | **Rate limit:** 10 requests/min
## Request
```bash theme={null}
DELETE /v1/education/{id}
```
### Path Parameters
The education entry's unique ID
### Query Parameters
Target a specific resume by its id (from `list-resumes`). Omit to use your base/default resume; the resume must be self-contained.
### Example
```bash theme={null}
curl -X DELETE "https://api.mokaru.ai/v1/education/clx1234" \
-H "Authorization: Bearer mk_your_key"
```
## Response
Whether the education was deleted
```json theme={null}
{
"success": true
}
```
This action is permanent. The education entry will be removed from your base resume.
# Delete Experience
Source: https://docs.mokaru.ai/api-reference/endpoint/delete-experience
DELETE https://api.mokaru.ai/v1/experiences/{id}
Delete a work experience
## Overview
The Delete Experience endpoint permanently removes a work experience from your account.
**Scope required:** `experiences:write` | **Rate limit:** 10 requests/min
## Request
```bash theme={null}
DELETE /v1/experiences/{id}
```
### Path Parameters
The experience's unique ID
### Query Parameters
Target a specific resume by its id (from `list-resumes`). Omit to use your base/default resume; the resume must be self-contained.
### Example
```bash theme={null}
curl -X DELETE "https://api.mokaru.ai/v1/experiences/clx1234" \
-H "Authorization: Bearer mk_your_key"
```
## Response
Whether the experience was deleted
```json theme={null}
{
"success": true
}
```
This action is permanent. The work experience will be removed from your base resume.
# Delete Interest
Source: https://docs.mokaru.ai/api-reference/endpoint/delete-interest
DELETE https://api.mokaru.ai/v1/interests/{id}
Delete an interest from your career profile
## Overview
Permanently delete an interest. This is a hard delete.
**Scope required:** `interests:write` | **Rate limit:** 10 requests/min
## Request
```bash theme={null}
DELETE /v1/interests/clx...
```
### Path Parameters
Interest id
### Query Parameters
Target a specific resume by its id (from `list-resumes`). Omit to use your base/default resume; the resume must be self-contained.
## Response
```json theme={null}
{
"success": true
}
```
# Delete Project
Source: https://docs.mokaru.ai/api-reference/endpoint/delete-project
DELETE https://api.mokaru.ai/v1/projects/{id}
Delete a project from your career profile
## Overview
Permanently delete a project. This is a hard delete.
**Scope required:** `projects:write` | **Rate limit:** 10 requests/min
## Request
```bash theme={null}
DELETE /v1/projects/clx...
```
### Path Parameters
The project's unique ID
### Query Parameters
Target a specific resume by its id (from `list-resumes`). Omit to use your base/default resume; the resume must be self-contained.
## Response
```json theme={null}
{
"success": true
}
```
# Delete Publication
Source: https://docs.mokaru.ai/api-reference/endpoint/delete-publication
DELETE https://api.mokaru.ai/v1/publications/{id}
Delete a publication from your career profile
## Overview
Permanently delete a publication. This is a hard delete.
**Scope required:** `publications:write` | **Rate limit:** 10 requests/min
## Request
```bash theme={null}
DELETE /v1/publications/clx...
```
### Path Parameters
Publication id
### Query Parameters
Target a specific resume by its id (from `list-resumes`). Omit to use your base/default resume; the resume must be self-contained.
## Response
```json theme={null}
{
"success": true
}
```
# Delete Resume
Source: https://docs.mokaru.ai/api-reference/endpoint/delete-resume
DELETE https://api.mokaru.ai/v1/resume/{id}
Delete a resume and unlink from applications
## Overview
The Delete Resume endpoint permanently removes a resume. Applications linked to this resume are unlinked (their `cvId` is set to null) but not deleted. If the deleted resume was the default, another resume is automatically promoted.
**Scope required:** `resume:write` | **Rate limit:** 10 requests/min
## Request
```bash theme={null}
DELETE /v1/resume/{id}
```
### Path Parameters
Resume id to delete
### Example
```bash theme={null}
curl -X DELETE "https://api.mokaru.ai/v1/resume/clx1234" \
-H "Authorization: Bearer mk_your_key"
```
## Response
Whether the resume was deleted
```json theme={null}
{
"success": true
}
```
This action is permanent. The resume and its associated cover letter are deleted. Applications that were linked to this resume will have their CV reference removed but will not be deleted.
# Revoke Resume Share
Source: https://docs.mokaru.ai/api-reference/endpoint/delete-resume-share
DELETE https://api.mokaru.ai/v1/share/{shareId}
Revoke a public resume share link
## Overview
Revoke a public share link. The public viewer at `https://app.mokaru.ai/share/{shareId}` returns 404 immediately after.
**Scope required:** `resume:share` | **Rate limit:** 10 requests/min
## Request
```bash theme={null}
DELETE /v1/share/{shareId}
```
### Path Parameters
Share id to revoke (from Create or List Resume Shares)
### Example
```bash theme={null}
curl -X DELETE "https://api.mokaru.ai/v1/share/clx_share_abc" \
-H "Authorization: Bearer mk_your_key"
```
## Response
Whether the share was revoked.
```json theme={null}
{ "success": true }
```
# Delete Skill
Source: https://docs.mokaru.ai/api-reference/endpoint/delete-skill
DELETE https://api.mokaru.ai/v1/skills/{id}
Delete a skill
## Overview
The Delete Skill endpoint permanently removes a skill from your account.
**Scope required:** `skills:write` | **Rate limit:** 10 requests/min
## Request
```bash theme={null}
DELETE /v1/skills/{id}
```
### Path Parameters
The skill's unique ID
### Query Parameters
Target a specific resume by its id (from `list-resumes`). Omit to use your base/default resume; the resume must be self-contained.
### Example
```bash theme={null}
curl -X DELETE "https://api.mokaru.ai/v1/skills/clx1234" \
-H "Authorization: Bearer mk_your_key"
```
## Response
Whether the skill was deleted
```json theme={null}
{
"success": true
}
```
This action is permanent. The skill will be removed from your base resume.
# Delete Summary
Source: https://docs.mokaru.ai/api-reference/endpoint/delete-summary
DELETE https://api.mokaru.ai/v1/summaries/{id}
Delete a professional summary from your career profile
## Overview
Permanently delete a professional summary. This is a hard delete.
**Scope required:** `summaries:write` | **Rate limit:** 10 requests/min
## Request
```bash theme={null}
DELETE /v1/summaries/clx...
```
### Path Parameters
The summary's unique ID
### Query Parameters
Target a specific resume by its id (from `list-resumes`). Omit to use your base/default resume; the resume must be self-contained.
## Response
```json theme={null}
{
"success": true
}
```
# Duplicate Resume
Source: https://docs.mokaru.ai/api-reference/endpoint/duplicate-resume
POST https://api.mokaru.ai/v1/resume/{id}/duplicate
Duplicate an existing resume into a new CV
## Overview
Create a new resume that copies every CV-level setting from a source resume: template, design settings, section order, optional fields, hidden items, personal overrides, item order, and the cvData snapshot. The duplicate is never the default. The duplicate also gets its own independent copy of the source's content (experiences, education, skills, etc.) - editing one doesn't affect the other.
**Common use cases:**
* **Variant creation** - duplicate a base CV and tweak `hiddenItems` / `personalOverrides` for a different role.
* **Backup before edits** - keep a known-good snapshot before letting an agent rewrite a CV.
* **A/B testing** - keep two near-identical CVs and tweak one design dimension.
**Scope required:** `resume:write` | **Rate limit:** 10 requests/min
## Request
```bash theme={null}
POST /v1/resume/{id}/duplicate
```
### Path Parameters
Source resume id to duplicate.
### Body Parameters
Name for the new copy (max 200 chars). Defaults to ` - copy`.
### Example
```bash theme={null}
curl -X POST "https://api.mokaru.ai/v1/resume/clx1234/duplicate" \
-H "Authorization: Bearer mk_your_key" \
-H "Content-Type: application/json" \
-d '{ "name": "Backend Engineer - Stripe variant" }'
```
## Response
Whether the duplicate succeeded.The new resume's unique ID.
```json theme={null}
{
"success": true,
"id": "clx9876..."
}
```
# Export Resume as PDF
Source: https://docs.mokaru.ai/api-reference/endpoint/export-resume-pdf
POST https://api.mokaru.ai/v1/resume/{id}/export/pdf
Export a resume as a professionally formatted PDF
## Overview
The Export Resume as PDF endpoint generates a professionally formatted PDF of a resume using the user's chosen template and design settings. The PDF is rendered server-side using Playwright and returned as a binary file.
**Common use cases:**
* **AI agent job applications** - export a tailored resume as PDF and attach it to a job application.
* **Automated delivery** - generate PDFs on demand and send via email or upload to a job portal.
* **Archiving** - save PDF snapshots of resumes at different stages of your job search.
**Scope required:** `resume:export` | **Rate limit:** 5 requests/min
## Request
```bash theme={null}
POST /v1/resume/{id}/export/pdf
```
### Path Parameters
Resume id to export
### Body Parameters
Locale for date formatting. One of: `en`, `nl`
### Example
```bash theme={null}
curl -X POST "https://api.mokaru.ai/v1/resume/clx1234/export/pdf" \
-H "Authorization: Bearer mk_your_key" \
-H "Content-Type: application/json" \
-d '{}' \
-o resume.pdf
```
## Response
The response is a binary PDF file, not JSON.
**Headers:**
* `Content-Type: application/pdf`
* `Content-Disposition: attachment; filename="FirstName_LastName_JobTitle.pdf"`
* `Cache-Control: private, max-age=0`
This endpoint returns a binary file. Use `-o filename.pdf` with curl or handle the response as a blob/buffer in your code. The PDF is rendered with the resume's template and design settings.
PDF generation takes 5-15 seconds depending on resume complexity. The rate limit is 5 per minute to prevent overload.
If the resume is currently being tailored by auto-prepare, the endpoint returns `409 Conflict` with code `RESUME_PROCESSING`. Wait a few seconds and retry.
# Get Application
Source: https://docs.mokaru.ai/api-reference/endpoint/get-application
GET https://api.mokaru.ai/v1/tracker/applications/{id}
Get full application detail with timeline and interviews
## Overview
The Get Application endpoint returns the full detail of a single application, including its status timeline and scheduled interviews with contact info.
**Common use cases:**
* **AI agent interview prep** - read the application's job description, interview schedule, and contact info to prepare the user for upcoming interviews.
* **Application deep dive** - get the full picture of an application: timeline of status changes, salary details, and notes.
* **Workflow triggers** - check the status and details of an application before deciding on next steps in an automation.
**Scope required:** `tracker:read` | **Rate limit:** 60 requests/min
## Request
```bash theme={null}
GET /v1/tracker/applications/{id}
```
### Path Parameters
Application id (from List Applications)
### Example
```bash theme={null}
curl "https://api.mokaru.ai/v1/tracker/applications/clx1234" \
-H "Authorization: Bearer mk_your_key"
```
## Response
Application detail
Unique application IDJob titleCompany nameJob locationJob posting URLFull job descriptionCurrent statusApplication sourcePriority (1-5)Free-text notesMinimum salaryMaximum salarySalary periodDate appliedLinked resume IDCreation dateLast update dateStatus change history (most recent first, max 20)Scheduled interviews with contact info
```json theme={null}
{
"data": {
"id": "clx1234...",
"jobTitle": "Frontend Engineer",
"company": "Acme Corp",
"location": "New York, NY",
"jobUrl": "https://acme.com/careers/frontend",
"status": "interviewed",
"isArchived": false,
"priority": 5,
"notes": "Great conversation with hiring manager",
"salaryMin": 120000,
"salaryMax": 160000,
"salaryPeriod": "yearly",
"cvId": "clx5678...",
"timeline": [
{
"id": "tl1",
"status": "interviewed",
"description": "status_changed",
"createdAt": "2026-03-15T10:00:00.000Z"
}
],
"interviews": [
{
"id": "int1",
"round": 1,
"type": "video",
"date": "2026-03-14T10:00:00.000Z",
"notes": "Technical interview",
"contact": {
"id": "ct1",
"firstName": "Sarah",
"lastName": "Jones",
"jobTitle": "Engineering Manager"
}
}
]
}
}
```
# Get Award
Source: https://docs.mokaru.ai/api-reference/endpoint/get-award
GET https://api.mokaru.ai/v1/awards/{id}
Get a single award by id
## Overview
Retrieve a single award by id.
**Scope required:** `awards:read` | **Rate limit:** 30 requests/min
## Request
```bash theme={null}
GET /v1/awards/clx...
```
### Path Parameters
Award id (from `list-awards`)
### Query Parameters
Target a specific resume by its id (from the list endpoint). Omit to use your base/default resume.
## Response
```json theme={null}
{
"data": {
"id": "clx...",
"name": "Best Engineer of the Year",
"organisation": "ACM",
"description": "Annual recognition for outstanding contributions",
"date": "2024-12-01T00:00:00.000Z",
"createdAt": "2026-01-15T10:00:00.000Z",
"updatedAt": "2026-01-15T10:00:00.000Z"
}
}
```
Returns `404` if the award does not exist or does not belong to the authenticated user.
# Get Certificate
Source: https://docs.mokaru.ai/api-reference/endpoint/get-certificate
GET https://api.mokaru.ai/v1/certificates/{id}
Get a single certificate by id
## Overview
Retrieve a single certificate by id.
**Scope required:** `certificates:read` | **Rate limit:** 30 requests/min
## Request
```bash theme={null}
GET /v1/certificates/clx...
```
### Path Parameters
Certificate id (from `list-certificates`)
### Query Parameters
Target a specific resume by its id (from the list endpoint). Omit to use your base/default resume.
## Response
```json theme={null}
{
"data": {
"id": "clx...",
"name": "AWS Solutions Architect Professional",
"issuer": "Amazon Web Services",
"description": "...",
"issueDate": "2024-03-15T00:00:00.000Z",
"expiryDate": "2027-03-15T00:00:00.000Z",
"credentialId": "AWS-SAP-12345",
"verificationUrl": "https://aws.amazon.com/verification/...",
"createdAt": "2026-01-15T10:00:00.000Z",
"updatedAt": "2026-01-15T10:00:00.000Z"
}
}
```
Returns `404` if the certificate does not exist or does not belong to the authenticated user.
# Get Contact
Source: https://docs.mokaru.ai/api-reference/endpoint/get-contact
GET https://api.mokaru.ai/v1/contacts/{id}
Get full contact detail
## Overview
The Get Contact endpoint returns the full details of a specific contact.
**Common use cases:**
* **Interview prep** - pull up the interviewer's details before a call.
* **Email drafting** - use contact info to personalize outreach emails.
* **Application context** - check who you know at a company before applying.
**Scope required:** `contacts:read` | **Rate limit:** 30 requests/min
## Request
```bash theme={null}
GET /v1/contacts/{id}
```
### Example
```bash theme={null}
curl "https://api.mokaru.ai/v1/contacts/clx1234" \
-H "Authorization: Bearer mk_your_key"
```
## Response
Contact detail
Unique contact IDFirst nameLast nameContact's job titleCompany nameRelationship typeEmail addressPhone numberLinkedIn profile URLISO 8601 creation dateISO 8601 last update date
```json theme={null}
{
"data": {
"id": "clx1234...",
"firstName": "Sarah",
"lastName": "Jones",
"jobTitle": "Engineering Manager",
"company": "Acme Corp",
"relationship": "HIRING_MANAGER",
"email": "sarah@acme.com",
"phone": "+1 555-0200",
"linkedIn": "https://linkedin.com/in/sarahjones",
"createdAt": "2026-03-10T10:00:00.000Z",
"updatedAt": "2026-03-15T14:30:00.000Z"
}
}
```
# Get Cover Letter
Source: https://docs.mokaru.ai/api-reference/endpoint/get-cover-letter
GET https://api.mokaru.ai/v1/cover-letter/{id}
Get full content of one cover letter
## Overview
Returns the full cover letter row: title, body content, template variables, header visibility settings, typography, and the linked resume id.
**Scope required:** `cover-letter:read` | **Rate limit:** 30 requests/min
## Request
```bash theme={null}
GET /v1/cover-letter/{id}
```
### Path Parameters
Cover letter id
### Example
```bash theme={null}
curl "https://api.mokaru.ai/v1/cover-letter/clx_cl_abc" \
-H "Authorization: Bearer mk_your_key"
```
## Response
Cover letter detail.
Cover letter ID.Linked resume ID.Title.Body text.Optional cover letter template id.Marked as the user's default cover letter.Template-variable map, e.g. `{ company: "Acme", contactPerson: "Jane" }`.Header: show name.Header: show email.Header: show phone.Header: show address.`left | center | right`.Font family.Font size (pt).Line spacing.Cached PDF URL if generated.ISO 8601.ISO 8601.
# Get Custom Section
Source: https://docs.mokaru.ai/api-reference/endpoint/get-custom-section
GET https://api.mokaru.ai/v1/custom-sections/{id}
Get a single custom CV section with its items
## Overview
Retrieve a single custom section definition with its items.
**Scope required:** `custom-sections:read` | **Rate limit:** 30 requests/min
## Request
```bash theme={null}
GET /v1/custom-sections/clx...
```
### Path Parameters
Section definition id
### Query Parameters
Target a specific resume by its id (from the list endpoint). Omit to use your base/default resume.
## Response
```json theme={null}
{
"data": {
"id": "clx...",
"sectionTitle": "Volunteer Work",
"icon": "heart",
"enabledFields": ["title", "organization", "description"],
"displayOrder": 0,
"items": [/* ... */],
"createdAt": "2026-01-15T10:00:00.000Z",
"updatedAt": "2026-01-15T10:00:00.000Z"
}
}
```
# Get Education
Source: https://docs.mokaru.ai/api-reference/endpoint/get-education
GET https://api.mokaru.ai/v1/education/{id}
Get full education detail
## Overview
The Get Education endpoint returns the full details of a specific education entry.
**Common use cases:**
* **Resume tailoring** - pull specific education details to customize for a job application.
* **Qualification matching** - check if your degree matches a job's requirements.
* **Profile review** - review education details before updating.
**Scope required:** `education:read` | **Rate limit:** 30 requests/min
## Request
```bash theme={null}
GET /v1/education/{id}
```
### Path Parameters
The education entry ID.
### Query Parameters
Target a specific resume by its id (from the list endpoint). Omit to use your base/default resume.
### Example
```bash theme={null}
curl "https://api.mokaru.ai/v1/education/clx1234" \
-H "Authorization: Bearer mk_your_key"
```
## Response
Education detail
Unique education IDSchool or institution nameDegree typeField of studyISO 8601 start dateISO 8601 end date (null if current)Whether currently enrolledAdditional detailsISO 8601 creation dateISO 8601 last update date
```json theme={null}
{
"data": {
"id": "clx1234...",
"school": "Stanford University",
"degree": "Bachelor of Science",
"field": "Computer Science",
"startDate": "2018-09-01T00:00:00.000Z",
"endDate": "2022-06-15T00:00:00.000Z",
"isCurrent": false,
"description": "Graduated with honors, focus on distributed systems",
"createdAt": "2026-01-10T10:00:00.000Z",
"updatedAt": "2026-03-15T14:30:00.000Z"
}
}
```
# Get Experience
Source: https://docs.mokaru.ai/api-reference/endpoint/get-experience
GET https://api.mokaru.ai/v1/experiences/{id}
Get full work experience detail
## Overview
The Get Experience endpoint returns the full details of a specific work experience.
**Common use cases:**
* **Resume tailoring** - pull specific experience details to customize for a job application.
* **Cover letter generation** - use experience data to write targeted cover letters.
* **Career coaching** - review a specific role's responsibilities and achievements.
**Scope required:** `experiences:read` | **Rate limit:** 30 requests/min
## Request
```bash theme={null}
GET /v1/experiences/{id}
```
### Path Parameters
The experience ID.
### Query Parameters
Target a specific resume by its id (from the list endpoint). Omit to use your base/default resume.
### Example
```bash theme={null}
curl "https://api.mokaru.ai/v1/experiences/clx1234" \
-H "Authorization: Bearer mk_your_key"
```
## Response
Work experience detail
Unique experience IDJob titleCompany nameWork locationISO 8601 start dateISO 8601 end date (null if current)Whether this is the current positionRole descriptionList of responsibilitiesList of achievementsISO 8601 creation dateISO 8601 last update date
```json theme={null}
{
"data": {
"id": "clx1234...",
"jobTitle": "Senior Software Engineer",
"company": "Acme Corp",
"location": "San Francisco, CA",
"startDate": "2022-07-01T00:00:00.000Z",
"endDate": null,
"isCurrent": true,
"description": "Building and maintaining the core platform",
"responsibilities": ["Led frontend architecture", "Mentored junior developers"],
"achievements": ["Reduced bundle size by 40%", "Shipped design system v2"],
"createdAt": "2026-01-10T10:00:00.000Z",
"updatedAt": "2026-03-15T14:30:00.000Z"
}
}
```
# Get Interest
Source: https://docs.mokaru.ai/api-reference/endpoint/get-interest
GET https://api.mokaru.ai/v1/interests/{id}
Get a single interest by id
## Overview
Retrieve a single interest/hobby by id.
**Scope required:** `interests:read` | **Rate limit:** 30 requests/min
## Request
```bash theme={null}
GET /v1/interests/clx...
```
### Path Parameters
Interest id (from `list-interests`)
### Query Parameters
Target a specific resume by its id (from the list endpoint). Omit to use your base/default resume.
## Response
```json theme={null}
{
"data": {
"id": "clx...",
"name": "Photography",
"description": "Landscape and street photography",
"createdAt": "2026-01-15T10:00:00.000Z",
"updatedAt": "2026-01-15T10:00:00.000Z"
}
}
```
# Get Profile
Source: https://docs.mokaru.ai/api-reference/endpoint/get-profile
GET https://api.mokaru.ai/v1/profile
Retrieve your full career profile in one call
## Overview
Returns the entire career profile in a single call. Useful for AI agents that need full context (cover letter writing, interview prep, profile analysis) without having to fetch each section separately.
**Includes**:
* Scalar fields: name, contact info, summary, sector, social links, plus a `jobTitle` derived from the user's default resume
* Collections: `skills`, `workExperiences`, `educations`, plus **8 sections**: `summaries`, `projects`, `certificates`, `awards`, `publications`, `interests`, `jobTitles`, `customSections`
The collections return your base (default) resume's content - the canonical content that new resumes are copied from. To read another resume's content, fetch it via `GET /v1/resume/:id`.
**Scope required:** `profile:read` | **Rate limit:** 30 requests/min
## Request
```bash theme={null}
GET /v1/profile
```
### Example
```bash theme={null}
curl "https://api.mokaru.ai/v1/profile" \
-H "Authorization: Bearer mk_your_key"
```
## Response
The response is wrapped in `{ data: {...} }`.
```json theme={null}
{
"data": {
"firstName": "Jane",
"lastName": "Smith",
"email": "jane@example.com",
"phone": "+1 555-123-4567",
"address": "San Francisco, CA",
"country": "US",
"province": "California",
"jobTitle": "Software Engineer",
"summary": "Experienced full-stack developer...",
"sector": "Technology",
"linkedIn": "https://linkedin.com/in/janesmith",
"website": "https://janesmith.dev",
"portfolio": "https://github.com/janesmith",
"skills": [
{ "name": "TypeScript", "category": "TECHNICAL", "level": "Expert" }
],
"workExperiences": [
{
"jobTitle": "Software Engineer",
"company": "Tech Corp",
"location": "San Francisco, CA",
"startDate": "2022-07-01T00:00:00.000Z",
"endDate": null,
"isCurrent": true,
"description": "...",
"responsibilities": ["..."],
"achievements": ["..."]
}
],
"educations": [
{
"school": "Stanford University",
"degree": "Bachelor of Science",
"field": "Computer Science",
"startDate": "2018-09-01T00:00:00.000Z",
"endDate": "2022-06-15T00:00:00.000Z",
"isCurrent": false
}
],
"summaries": [
{ "title": "Technical", "content": "...", "displayOrder": 0 }
],
"projects": [
{
"name": "Open Source CRM",
"organisation": "Self-initiated",
"description": "...",
"startDate": "2023-01-01T00:00:00.000Z",
"endDate": null,
"isCurrent": true,
"url": "https://github.com/..."
}
],
"certificates": [
{
"name": "AWS Solutions Architect Professional",
"issuer": "Amazon Web Services",
"description": "...",
"issueDate": "2024-03-15T00:00:00.000Z",
"expiryDate": "2027-03-15T00:00:00.000Z",
"credentialId": "AWS-SAP-12345",
"verificationUrl": "https://aws.amazon.com/verification/...",
"skills": ["AWS", "Architecture"]
}
],
"awards": [
{
"name": "Best Engineer of the Year",
"organisation": "ACM",
"description": "...",
"date": "2024-12-01T00:00:00.000Z"
}
],
"publications": [
{
"name": "Scaling React Apps to Millions of Users",
"publisher": "Smashing Magazine",
"date": "2024-05-10T00:00:00.000Z",
"url": "https://...",
"description": "..."
}
],
"interests": [
{ "name": "Photography", "description": "Landscape and street" }
],
"jobTitles": [
{ "title": "Senior Software Engineer", "displayOrder": 0 }
],
"customSections": [
{
"sectionTitle": "Volunteer Work",
"icon": "heart",
"enabledFields": ["title", "organization", "description"],
"displayOrder": 0,
"items": [
{
"title": "Mentor",
"organization": "Code Academy",
"description": "...",
"startDate": "2023-01",
"endDate": null,
"url": null,
"displayOrder": 0
}
]
}
]
}
}
```
### Notes
* `jobTitle` (singular) comes from the user's **default resume**'s `jobTitle` field. Use `jobTitles` (plural) for the multi-title career-identity list.
* All collections return your **base (default) resume's** content - the canonical content that new resumes are copied from. Other resumes own their own content - fetch via `GET /v1/resume/:id`.
* Dates are ISO 8601 strings.
* `customSections.items.startDate` and `.endDate` are free-form YYYY-MM strings (not ISO datetime).
# Get Project
Source: https://docs.mokaru.ai/api-reference/endpoint/get-project
GET https://api.mokaru.ai/v1/projects/{id}
Get a single project by id
## Overview
Retrieve a single project by id.
**Scope required:** `projects:read` | **Rate limit:** 30 requests/min
## Request
```bash theme={null}
GET /v1/projects/clx...
```
### Path Parameters
Project id (from `list-projects`)
### Query Parameters
Target a specific resume by its id (from the list endpoint). Omit to use your base/default resume.
## Response
```json theme={null}
{
"data": {
"id": "clx...",
"name": "Open Source CRM",
"organisation": "Self-initiated",
"description": "...",
"startDate": "2023-01-01T00:00:00.000Z",
"endDate": null,
"isCurrent": true,
"url": "https://github.com/user/crm",
"createdAt": "2026-01-15T10:00:00.000Z",
"updatedAt": "2026-01-15T10:00:00.000Z"
}
}
```
# Get Publication
Source: https://docs.mokaru.ai/api-reference/endpoint/get-publication
GET https://api.mokaru.ai/v1/publications/{id}
Get a single publication by id
## Overview
Retrieve a single publication by id.
**Scope required:** `publications:read` | **Rate limit:** 30 requests/min
## Request
```bash theme={null}
GET /v1/publications/clx...
```
### Path Parameters
Publication id (from `list-publications`)
### Query Parameters
Target a specific resume by its id (from the list endpoint). Omit to use your base/default resume.
## Response
```json theme={null}
{
"data": {
"id": "clx...",
"name": "Scaling React Apps to Millions of Users",
"publisher": "Smashing Magazine",
"date": "2024-05-10T00:00:00.000Z",
"url": "https://smashingmagazine.com/...",
"description": "...",
"createdAt": "2026-01-15T10:00:00.000Z",
"updatedAt": "2026-01-15T10:00:00.000Z"
}
}
```
# Get Resume
Source: https://docs.mokaru.ai/api-reference/endpoint/get-resume
GET https://api.mokaru.ai/v1/resume/{id}
Get full resume detail including content data
## Overview
The Get Resume endpoint returns the full content of a specific resume, including all personal info, work experiences, education, skills, and design settings.
**Common use cases:**
* **AI agent career coaching** - read the user's resume content to provide tailored feedback, suggest improvements, or compare against a job description.
* **Cross-platform sync** - pull resume data into external tools like Notion, Google Docs, or a custom portfolio site.
* **Cover letter generation** - use the resume content as context for generating tailored cover letters.
**Scope required:** `resume:read` | **Rate limit:** 30 requests/min
## Request
```bash theme={null}
GET /v1/resume/{id}
```
### Path Parameters
Resume id (from List Resumes)
### Example
```bash theme={null}
curl "https://api.mokaru.ai/v1/resume/clx1234" \
-H "Authorization: Bearer mk_your_key"
```
## Response
Resume detail
Unique resume IDResume nameTemplate IDWhether this is the default resumeCV-level snapshot data (personal info, jobTitle, summary). Sections (experiences, education, skills, etc.) are this resume's own content, managed via the dedicated content endpoints; use `hiddenItems` below to know which of the resume's items are hidden on this CV.Visual styling (colors, fonts, spacing)Show/hide toggles for optional fieldsOrder of resume sectionsPer-section blacklist of the resume's item IDs hidden on this CV. Items not listed are visible. Keys: `experiences`, `education`, `skills`, `certificates`, `projects`, `awards`, `publications`, `interests`, or `customSection:`.Per-CV personal-info overrides (firstName, lastName, email, jobTitle, etc.). Keys present here override the shared identity value for this CV only.Per-section ordering map. Keys are section names, values are arrays of the resume's item IDs in the desired order. Items not listed fall back to default order.ID of the summary rendered on this CV. May be null.ISO 8601 creation dateISO 8601 last update date
```json theme={null}
{
"data": {
"id": "clx1234...",
"name": "Software Engineer Resume",
"template": "classic",
"isDefault": true,
"cvData": {
"firstName": "Jane",
"lastName": "Doe",
"email": "jane@example.com",
"jobTitle": "Software Engineer",
"experiences": [
{
"id": "exp1",
"company": "Tech Corp",
"position": "Senior Developer",
"startDate": "2022-01-01",
"endDate": null,
"isCurrent": true,
"description": "Building the core platform"
}
],
"education": [
{
"id": "edu1",
"institution": "MIT",
"degree": "BSc Computer Science",
"startDate": "2018-09-01",
"endDate": "2022-06-15"
}
],
"skills": [
{ "id": "sk1", "name": "React", "category": "TECHNICAL" },
{ "id": "sk2", "name": "TypeScript", "category": "TECHNICAL" }
]
},
"designSettings": { "accentColor": "#059669", "fontFamily": "inter" },
"sectionOrder": ["personal", "experience", "education", "skills"],
"createdAt": "2026-01-15T10:00:00.000Z",
"updatedAt": "2026-03-20T14:30:00.000Z"
}
}
```
# Get Skill
Source: https://docs.mokaru.ai/api-reference/endpoint/get-skill
GET https://api.mokaru.ai/v1/skills/{id}
Get full skill detail
## Overview
The Get Skill endpoint returns the full details of a specific skill.
**Common use cases:**
* **Skill verification** - check the details and proficiency level of a specific skill.
* **Resume customization** - pull skill details to include on a targeted resume.
* **Profile review** - review skill categorization before updating.
**Scope required:** `skills:read` | **Rate limit:** 30 requests/min
## Request
```bash theme={null}
GET /v1/skills/{id}
```
### Path Parameters
The skill ID.
### Query Parameters
Target a specific resume by its id (from the list endpoint). Omit to use your base/default resume.
### Example
```bash theme={null}
curl "https://api.mokaru.ai/v1/skills/clx1234" \
-H "Authorization: Bearer mk_your_key"
```
## Response
Skill detail
Unique skill IDSkill nameSkill categoryProficiency levelISO 8601 creation dateISO 8601 last update date
```json theme={null}
{
"data": {
"id": "clx1234...",
"name": "TypeScript",
"category": "Frontend",
"level": "expert",
"createdAt": "2026-01-10T10:00:00.000Z",
"updatedAt": "2026-03-15T14:30:00.000Z"
}
}
```
# Get Summary
Source: https://docs.mokaru.ai/api-reference/endpoint/get-summary
GET https://api.mokaru.ai/v1/summaries/{id}
Get a single professional summary by id
## Overview
Retrieve a single professional summary by id.
**Scope required:** `summaries:read` | **Rate limit:** 30 requests/min
## Request
```bash theme={null}
GET /v1/summaries/clx...
```
### Path Parameters
Summary id (from `list-summaries`)
## Response
```json theme={null}
{
"data": {
"id": "clx...",
"title": "Technical Leadership",
"content": "Senior engineer with 10+ years...",
"displayOrder": 0,
"createdAt": "2026-01-15T10:00:00.000Z",
"updatedAt": "2026-01-15T10:00:00.000Z"
}
}
```
# List Applications
Source: https://docs.mokaru.ai/api-reference/endpoint/list-applications
GET https://api.mokaru.ai/v1/tracker/applications
View your tracked applications
## Overview
The List Applications endpoint retrieves your tracked job applications from Mokaru. Use it to sync your application pipeline to external tools, build custom dashboards, or let an AI agent review your progress.
**Common use cases:**
* **Notion and Airtable sync** - set up an n8n or Make workflow that polls this endpoint on a schedule and upserts rows into your Notion database or Airtable base. Keep your preferred workspace in sync without manual copy-pasting.
* **Spreadsheet export** - pull all your applications into Google Sheets or Excel for custom filtering, pivot tables, or sharing with a career coach.
* **AI agent review** - let an AI agent fetch your current applications, identify stale ones (applied weeks ago with no response), and suggest follow-up actions.
* **Custom dashboards** - build a personal analytics view showing application volume by week, conversion rates by source, or salary range distribution.
* **Slack and email digests** - create a daily or weekly summary of new applications, status changes, and upcoming interviews.
You can filter results by status to focus on a specific stage of your pipeline. Use `limit` and `offset` for pagination when you have more applications than fit in a single response.
### Application Statuses
Each application has a status that reflects where it is in your pipeline. Statuses split into **active** (still in progress) and **archived** (terminal - no further action expected):
| Status | Group | Description |
| --------------------- | ------------ | ------------------------------------------------------ |
| `watchlist` | active | Saved for later - you have not applied yet |
| `preparing` | active | Actively preparing your application materials |
| `applied` | active | Application submitted and waiting for a response |
| `response` | active | You received a response from the company |
| `screening` | active | Initial screening stage (phone screen, recruiter call) |
| `interview_scheduled` | active | An interview has been scheduled |
| `interviewed` | active | Interview completed, waiting for feedback |
| `offer` | active | You received a job offer |
| `negotiating` | active | Negotiating terms or compensation |
| `accepted` | **archived** | You accepted an offer for this position |
| `rejected` | **archived** | The application was rejected |
| `withdrawn` | **archived** | You withdrew your application |
| `no_response` | **archived** | No response received after a reasonable period |
To **archive** an application, update its status (via `PATCH /v1/tracker/applications/:id`) to one of the archived values. To **un-archive**, update back to any active status.
**Scope required:** `tracker:read` | **Rate limit:** 60 requests/min
## Request
```bash theme={null}
GET /v1/tracker/applications
```
### Query Parameters
Filter by exact status: `watchlist`, `preparing`, `applied`, `response`, `screening`, `interview_scheduled`, `interviewed`, `offer`, `negotiating`, `accepted`, `rejected`, `withdrawn`, `no_response`
Filter by archive bucket. `true` returns only archived applications (accepted, rejected, withdrawn, no\_response). `false` returns only active ones. Ignored when `status` is also provided.
Results per page (max 100)
Pagination offset
### Example
```bash theme={null}
curl "https://api.mokaru.ai/v1/tracker/applications?status=applied&limit=10" \
-H "Authorization: Bearer mk_your_key"
```
## Response
Array of applications
Application IDJob titleCompany nameJob locationLink to the job postingCurrent statusWhere the job was foundPriority (1-5)Minimum salaryMaximum salaryISO 8601 dateISO 8601 dateISO 8601 dateDerived: true when status is accepted, rejected, withdrawn, or no\_responseTotal matching applicationsWhether more results are availableResults per pageCurrent offset
```json theme={null}
{
"data": [
{
"id": "clx5678...",
"jobTitle": "Senior Software Engineer",
"company": "Acme Corp",
"location": "San Francisco, CA",
"jobUrl": "https://acme.com/careers/123",
"status": "applied",
"source": "Other",
"priority": 3,
"salaryMin": 150000,
"salaryMax": 200000,
"appliedDate": "2026-03-15T00:00:00.000Z",
"createdAt": "2026-03-15T12:00:00.000Z",
"updatedAt": "2026-03-15T12:00:00.000Z",
"isArchived": false
}
],
"total": 42,
"hasMore": true,
"limit": 25,
"offset": 0
}
```
# List Awards
Source: https://docs.mokaru.ai/api-reference/endpoint/list-awards
GET https://api.mokaru.ai/v1/awards
List awards and honors on your career profile
## Overview
Retrieve all awards and honors on the authenticated user's base resume.
**Scope required:** `awards:read` | **Rate limit:** 60 requests/min
## Request
```bash theme={null}
GET /v1/awards?limit=25&offset=0
```
### Query Parameters
Results per page (max 100)
Pagination offset
Target a specific resume by its id (from `list-resumes`). Omit to use your base/default resume; the resume must be self-contained.
## Response
```json theme={null}
{
"data": [
{
"id": "clx...",
"name": "Best Engineer of the Year",
"organisation": "ACM",
"description": "Annual recognition for outstanding contributions",
"date": "2024-12-01T00:00:00.000Z",
"createdAt": "2026-01-15T10:00:00.000Z",
"updatedAt": "2026-01-15T10:00:00.000Z"
}
],
"total": 3,
"hasMore": false,
"limit": 25,
"offset": 0
}
```
Array of award objects (sorted by date descending)
Total awards matching the query
Whether more pages are available
# List Certificates
Source: https://docs.mokaru.ai/api-reference/endpoint/list-certificates
GET https://api.mokaru.ai/v1/certificates
List certificates on your career profile
## Overview
Retrieve all certificates on the authenticated user's base resume.
**Scope required:** `certificates:read` | **Rate limit:** 60 requests/min
## Request
```bash theme={null}
GET /v1/certificates?limit=25&offset=0
```
### Query Parameters
Results per page (max 100)
Pagination offset
Target a specific resume by its id (from `list-resumes`). Omit to use your base/default resume; the resume must be self-contained.
## Response
```json theme={null}
{
"data": [
{
"id": "clx...",
"name": "AWS Solutions Architect Professional",
"issuer": "Amazon Web Services",
"description": "Validated expertise in designing distributed systems on AWS",
"issueDate": "2024-03-15T00:00:00.000Z",
"expiryDate": "2027-03-15T00:00:00.000Z",
"credentialId": "AWS-SAP-12345",
"verificationUrl": "https://aws.amazon.com/verification/...",
"createdAt": "2026-01-15T10:00:00.000Z",
"updatedAt": "2026-01-15T10:00:00.000Z"
}
],
"total": 5,
"hasMore": false,
"limit": 25,
"offset": 0
}
```
# List Contacts
Source: https://docs.mokaru.ai/api-reference/endpoint/list-contacts
GET https://api.mokaru.ai/v1/contacts
List all contacts for the authenticated user
## Overview
The List Contacts endpoint returns all contacts in your Mokaru account. Use this to find contacts by name, company, or relationship type.
**Common use cases:**
* **AI agent networking** - let your AI agent look up contacts at a company before you apply for a job.
* **Contact search** - find recruiters, hiring managers, or referrals across your network.
* **CRM sync** - export your Mokaru contacts to an external CRM or spreadsheet.
**Scope required:** `contacts:read` | **Rate limit:** 60 requests/min
## Request
```bash theme={null}
GET /v1/contacts
```
### Query Parameters
Results per page (max 100)
Number of results to skip for pagination
Filter by relationship type. One of: `RECRUITER`, `HIRING_MANAGER`, `HR_MANAGER`, `TEAM_LEAD`, `DEPARTMENT_HEAD`, `CEO_FOUNDER`, `COLLEAGUE`, `FRIEND`, `REFERRAL`, `OTHER`
Search by first name, last name, company, or email (case-insensitive)
### Example
```bash theme={null}
curl "https://api.mokaru.ai/v1/contacts?search=Acme&limit=10" \
-H "Authorization: Bearer mk_your_key"
```
## Response
Array of contacts
Unique contact IDFirst nameLast nameContact's job titleCompany nameRelationship typeEmail addressPhone numberLinkedIn profile URLISO 8601 creation dateISO 8601 last update dateTotal number of contactsWhether more pages are availableCurrent page sizeCurrent offset
```json theme={null}
{
"data": [
{
"id": "clx1234...",
"firstName": "Sarah",
"lastName": "Jones",
"jobTitle": "Engineering Manager",
"company": "Acme Corp",
"relationship": "HIRING_MANAGER",
"email": "sarah@acme.com",
"phone": "+1 555-0200",
"linkedIn": "https://linkedin.com/in/sarahjones",
"createdAt": "2026-03-10T10:00:00.000Z",
"updatedAt": "2026-03-15T14:30:00.000Z"
}
],
"total": 12,
"hasMore": true,
"limit": 10,
"offset": 0
}
```
# List Cover Letters
Source: https://docs.mokaru.ai/api-reference/endpoint/list-cover-letters
GET https://api.mokaru.ai/v1/cover-letter
List the user's cover letters
## Overview
Returns the user's cover letters with their CV link, title, default flag, and timestamps. Each cover letter belongs to exactly one resume (one-to-one).
**Scope required:** `cover-letter:read` | **Rate limit:** 60 requests/min
## Request
```bash theme={null}
GET /v1/cover-letter
```
### Query Parameters
Filter to the cover letter for a specific resume. Returns at most one row.
Page size (max 100).
Page offset.
### Example
```bash theme={null}
curl "https://api.mokaru.ai/v1/cover-letter?cvId=clx1234" \
-H "Authorization: Bearer mk_your_key"
```
## Response
Cover letter list.
Cover letter ID.Resume this cover letter belongs to.Cover letter title.Marked as the user's default cover letter.Optional template ID.ISO 8601.ISO 8601.Total matching cover letters.Whether more pages exist.
# List Custom Sections
Source: https://docs.mokaru.ai/api-reference/endpoint/list-custom-sections
GET https://api.mokaru.ai/v1/custom-sections
List user-defined CV sections (e.g. "Volunteer Work", "Patents")
## Overview
Custom sections are user-defined CV blocks (e.g. "Volunteer Work", "Patents", "Languages"). Each section has a definition (title, icon, enabled fields) and zero or more items. List returns all section definitions with their items inline.
**Scope required:** `custom-sections:read` | **Rate limit:** 60 requests/min
## Request
```bash theme={null}
GET /v1/custom-sections?limit=25&offset=0
```
### Query Parameters
Results per page (max 100)
Pagination offset
Target a specific resume by its id (from `list-resumes`). Omit to use your base/default resume; the resume must be self-contained.
## Response
```json theme={null}
{
"data": [
{
"id": "clx...",
"sectionTitle": "Volunteer Work",
"icon": "heart",
"enabledFields": ["title", "organization", "description", "startDate", "endDate"],
"displayOrder": 0,
"items": [
{
"id": "cli...",
"title": "Mentor",
"organization": "Code Academy",
"description": "Mentoring junior developers",
"startDate": "2023-01",
"endDate": null,
"url": null,
"displayOrder": 0
}
],
"createdAt": "2026-01-15T10:00:00.000Z",
"updatedAt": "2026-01-15T10:00:00.000Z"
}
],
"total": 2,
"hasMore": false,
"limit": 25,
"offset": 0
}
```
# List Education
Source: https://docs.mokaru.ai/api-reference/endpoint/list-education
GET https://api.mokaru.ai/v1/education
List all education entries for the authenticated user
## Overview
The List Education endpoint returns all education entries in your Mokaru account. Use this to review your education history or sync data with external tools.
**Common use cases:**
* **AI agent career review** - let your AI agent consider your education when recommending jobs.
* **Resume building** - pull education data to populate resumes or applications.
* **Profile sync** - export education history to an external tool or spreadsheet.
**Scope required:** `education:read` | **Rate limit:** 60 requests/min
## Request
```bash theme={null}
GET /v1/education
```
### Query Parameters
Results per page (max 100)
Number of results to skip for pagination
Target a specific resume by its id (from `list-resumes`). Omit to use your base/default resume; the resume must be self-contained.
### Example
```bash theme={null}
curl "https://api.mokaru.ai/v1/education?limit=10" \
-H "Authorization: Bearer mk_your_key"
```
## Response
Array of education entries
Unique education IDSchool or institution nameDegree type (e.g. Bachelor of Science)Field of studyISO 8601 start dateISO 8601 end date (null if current)Whether currently enrolledAdditional detailsISO 8601 creation dateISO 8601 last update dateTotal number of education entriesWhether more pages are availableCurrent page sizeCurrent offset
```json theme={null}
{
"data": [
{
"id": "clx1234...",
"school": "Stanford University",
"degree": "Bachelor of Science",
"field": "Computer Science",
"startDate": "2018-09-01T00:00:00.000Z",
"endDate": "2022-06-15T00:00:00.000Z",
"isCurrent": false,
"description": "Graduated with honors, focus on distributed systems",
"createdAt": "2026-01-10T10:00:00.000Z",
"updatedAt": "2026-03-15T14:30:00.000Z"
}
],
"total": 2,
"hasMore": false,
"limit": 10,
"offset": 0
}
```
# List Experiences
Source: https://docs.mokaru.ai/api-reference/endpoint/list-experiences
GET https://api.mokaru.ai/v1/experiences
List all work experiences for the authenticated user
## Overview
The List Experiences endpoint returns all work experiences in your Mokaru account. Use this to review career history or sync experience data with external tools.
**Common use cases:**
* **AI agent career review** - let your AI agent analyze your work history to suggest better job matches.
* **Resume building** - pull experience data to populate resumes or cover letters.
* **Career timeline** - export your work history to an external tool or spreadsheet.
**Scope required:** `experiences:read` | **Rate limit:** 60 requests/min
## Request
```bash theme={null}
GET /v1/experiences
```
### Query Parameters
Results per page (max 100)
Number of results to skip for pagination
Target a specific resume by its id (from `list-resumes`). Omit to use your base/default resume; the resume must be self-contained.
### Example
```bash theme={null}
curl "https://api.mokaru.ai/v1/experiences?limit=10" \
-H "Authorization: Bearer mk_your_key"
```
## Response
Array of work experiences
Unique experience IDJob titleCompany nameWork locationISO 8601 start dateISO 8601 end date (null if current)Whether this is the current positionRole descriptionList of responsibilitiesList of achievementsISO 8601 creation dateISO 8601 last update dateTotal number of experiencesWhether more pages are availableCurrent page sizeCurrent offset
```json theme={null}
{
"data": [
{
"id": "clx1234...",
"jobTitle": "Senior Software Engineer",
"company": "Acme Corp",
"location": "San Francisco, CA",
"startDate": "2022-07-01T00:00:00.000Z",
"endDate": null,
"isCurrent": true,
"description": "Building and maintaining the core platform",
"responsibilities": ["Led frontend architecture", "Mentored junior developers"],
"achievements": ["Reduced bundle size by 40%", "Shipped design system v2"],
"createdAt": "2026-01-10T10:00:00.000Z",
"updatedAt": "2026-03-15T14:30:00.000Z"
}
],
"total": 4,
"hasMore": false,
"limit": 10,
"offset": 0
}
```
# List Interests
Source: https://docs.mokaru.ai/api-reference/endpoint/list-interests
GET https://api.mokaru.ai/v1/interests
List interests and hobbies on your career profile
## Overview
Retrieve all interests/hobbies on the authenticated user's base resume.
**Scope required:** `interests:read` | **Rate limit:** 60 requests/min
## Request
```bash theme={null}
GET /v1/interests?limit=25&offset=0
```
### Query Parameters
Results per page (max 100)
Pagination offset
Target a specific resume by its id (from `list-resumes`). Omit to use your base/default resume; the resume must be self-contained.
## Response
```json theme={null}
{
"data": [
{
"id": "clx...",
"name": "Photography",
"description": "Landscape and street photography",
"createdAt": "2026-01-15T10:00:00.000Z",
"updatedAt": "2026-01-15T10:00:00.000Z"
}
],
"total": 4,
"hasMore": false,
"limit": 25,
"offset": 0
}
```
# List Projects
Source: https://docs.mokaru.ai/api-reference/endpoint/list-projects
GET https://api.mokaru.ai/v1/projects
List projects on your career profile
## Overview
Retrieve all projects on the authenticated user's base resume.
**Scope required:** `projects:read` | **Rate limit:** 60 requests/min
## Request
```bash theme={null}
GET /v1/projects?limit=25&offset=0
```
### Query Parameters
Results per page (max 100)
Pagination offset
Target a specific resume by its id (from `list-resumes`). Omit to use your base/default resume; the resume must be self-contained.
## Response
```json theme={null}
{
"data": [
{
"id": "clx...",
"name": "Open Source CRM",
"organisation": "Self-initiated",
"description": "A modern CRM built with Next.js and Postgres",
"startDate": "2023-01-01T00:00:00.000Z",
"endDate": null,
"isCurrent": true,
"url": "https://github.com/user/crm",
"createdAt": "2026-01-15T10:00:00.000Z",
"updatedAt": "2026-01-15T10:00:00.000Z"
}
],
"total": 3,
"hasMore": false,
"limit": 25,
"offset": 0
}
```
# List Publications
Source: https://docs.mokaru.ai/api-reference/endpoint/list-publications
GET https://api.mokaru.ai/v1/publications
List publications on your career profile
## Overview
Retrieve all publications on the authenticated user's base resume.
**Scope required:** `publications:read` | **Rate limit:** 60 requests/min
## Request
```bash theme={null}
GET /v1/publications?limit=25&offset=0
```
### Query Parameters
Results per page (max 100)
Pagination offset
Target a specific resume by its id (from `list-resumes`). Omit to use your base/default resume; the resume must be self-contained.
## Response
```json theme={null}
{
"data": [
{
"id": "clx...",
"name": "Scaling React Apps to Millions of Users",
"publisher": "Smashing Magazine",
"date": "2024-05-10T00:00:00.000Z",
"url": "https://smashingmagazine.com/...",
"description": "Patterns for code splitting and lazy loading",
"createdAt": "2026-01-15T10:00:00.000Z",
"updatedAt": "2026-01-15T10:00:00.000Z"
}
],
"total": 2,
"hasMore": false,
"limit": 25,
"offset": 0
}
```
# List Resume Shares
Source: https://docs.mokaru.ai/api-reference/endpoint/list-resume-shares
GET https://api.mokaru.ai/v1/resume/{id}/share
List the public share links for a resume
## Overview
Returns the public share links for a specific resume. In practice the in-app upsert behaviour means at most one share per resume exists, but the schema does not enforce uniqueness so this endpoint returns an array for forward-compatibility.
**Scope required:** `resume:share` | **Rate limit:** 30 requests/min
## Request
```bash theme={null}
GET /v1/resume/{id}/share
```
### Path Parameters
Resume id to list share links for
### Example
```bash theme={null}
curl "https://api.mokaru.ai/v1/resume/clx1234/share" \
-H "Authorization: Bearer mk_your_key"
```
## Response
Share list.
Share row ID.Public URL.Privacy toggles snapshotted at create time.ISO 8601.ISO 8601.Total shares for this resume.
# List Resumes
Source: https://docs.mokaru.ai/api-reference/endpoint/list-resumes
GET https://api.mokaru.ai/v1/resume
List all resumes for the authenticated user
## Overview
The List Resumes endpoint returns all resumes in your Mokaru account. Use this to find the right resume before exporting or updating it.
**Common use cases:**
* **AI agent resume selection** - let your AI agent browse your resumes and pick the best one for a specific job application.
* **Resume inventory** - see all your resumes at a glance with their templates and which one is set as default.
* **Automation workflows** - fetch your resume list in n8n or Make, then trigger exports or updates based on conditions.
**Scope required:** `resume:read` | **Rate limit:** 60 requests/min
## Request
```bash theme={null}
GET /v1/resume
```
### Query Parameters
Results per page (max 100)
Number of results to skip for pagination
### Example
```bash theme={null}
curl "https://api.mokaru.ai/v1/resume?limit=10" \
-H "Authorization: Bearer mk_your_key"
```
## Response
Array of resumes
Unique resume IDResume nameTemplate ID (e.g. "classic", "modern")Whether this is the default resumeISO 8601 creation dateISO 8601 last update dateTotal number of resumesWhether more pages are availableCurrent page sizeCurrent offset
```json theme={null}
{
"data": [
{
"id": "clx1234...",
"name": "Software Engineer Resume",
"template": "classic",
"isDefault": true,
"createdAt": "2026-01-15T10:00:00.000Z",
"updatedAt": "2026-03-20T14:30:00.000Z"
}
],
"total": 3,
"hasMore": false,
"limit": 25,
"offset": 0
}
```
# List Skills
Source: https://docs.mokaru.ai/api-reference/endpoint/list-skills
GET https://api.mokaru.ai/v1/skills
List all skills for the authenticated user
## Overview
The List Skills endpoint returns all skills in your Mokaru account. Use this to review your skill inventory or sync with external tools.
**Common use cases:**
* **AI agent skill matching** - let your AI agent compare your skills against job requirements.
* **Resume optimization** - identify which skills to highlight for a specific role.
* **Skill gap analysis** - export skills to analyze gaps against target job descriptions.
**Scope required:** `skills:read` | **Rate limit:** 60 requests/min
## Request
```bash theme={null}
GET /v1/skills
```
### Query Parameters
Results per page (max 100)
Number of results to skip for pagination
Target a specific resume by its id (from `list-resumes`). Omit to use your base/default resume; the resume must be self-contained.
### Example
```bash theme={null}
curl "https://api.mokaru.ai/v1/skills?limit=50" \
-H "Authorization: Bearer mk_your_key"
```
## Response
Array of skills
Unique skill IDSkill nameSkill category (e.g. Frontend, Backend, Design)Proficiency level (e.g. beginner, intermediate, advanced, expert)ISO 8601 creation dateISO 8601 last update dateTotal number of skillsWhether more pages are availableCurrent page sizeCurrent offset
```json theme={null}
{
"data": [
{
"id": "clx1234...",
"name": "TypeScript",
"category": "Frontend",
"level": "expert",
"createdAt": "2026-01-10T10:00:00.000Z",
"updatedAt": "2026-03-15T14:30:00.000Z"
},
{
"id": "clx5678...",
"name": "React",
"category": "Frontend",
"level": "advanced",
"createdAt": "2026-01-10T10:00:00.000Z",
"updatedAt": "2026-03-15T14:30:00.000Z"
}
],
"total": 12,
"hasMore": false,
"limit": 50,
"offset": 0
}
```
# List Summaries
Source: https://docs.mokaru.ai/api-reference/endpoint/list-summaries
GET https://api.mokaru.ai/v1/summaries
List professional summaries on your career profile
## Overview
Retrieve all professional summaries on the authenticated user's base resume. Users can have multiple summaries (e.g. "Technical", "Leadership") and pick which one appears on each resume.
**Scope required:** `summaries:read` | **Rate limit:** 60 requests/min
## Request
```bash theme={null}
GET /v1/summaries?limit=25&offset=0
```
### Query Parameters
Results per page (max 100)
Pagination offset
Target a specific resume by its id (from `list-resumes`). Omit to use your base/default resume; the resume must be self-contained.
## Response
```json theme={null}
{
"data": [
{
"id": "clx...",
"title": "Technical Leadership",
"content": "Senior engineer with 10+ years building scalable distributed systems...",
"displayOrder": 0,
"createdAt": "2026-01-15T10:00:00.000Z",
"updatedAt": "2026-01-15T10:00:00.000Z"
}
],
"total": 3,
"hasMore": false,
"limit": 25,
"offset": 0
}
```
# Search Jobs
Source: https://docs.mokaru.ai/api-reference/endpoint/search-jobs
POST https://api.mokaru.ai/v1/jobs/search
Search job listings in the Mokaru database
## Overview
The Search Jobs endpoint lets you programmatically query job listings from the Mokaru database. It is the starting point for most automation workflows - search for relevant positions, then pipe the results into your application tracker or external tools.
**Common use cases:**
* **AI agent job hunting** - connect Claude Desktop, GPT, or any AI agent to search for jobs on your behalf. The agent can evaluate listings against your preferences and automatically create applications for the best matches.
* **n8n and Make workflows** - build automated pipelines that search for new jobs on a schedule, filter by your criteria, and push results to Slack, Notion, or a spreadsheet.
* **Custom job boards** - pull listings into your own interface or internal tool. Combine multiple searches (different roles, locations) into a single view.
* **Market research** - track hiring trends by querying specific job titles or locations over time. Monitor how many positions a company has open or how salary ranges shift.
Each search returns up to 25 results per page. To paginate, pass the `nextCursor` from a response back as `cursor` on the next request (opaque token - do not construct it yourself). The `hasMore` field tells you whether additional pages are available.
Free-tier users receive results from the Mokaru database, which is refreshed daily with popular job titles. Plus users get additional results from external providers (JSearch, Fantastic.jobs), giving broader coverage for niche roles or less common locations.
The response includes an `id` field for each listing. Pass this as `jobListingId` when creating an application to automatically link salary data and publisher information.
**Scope required:** `jobs:search` | **Rate limit:** 30 requests/min
## Request
```bash theme={null}
POST /v1/jobs/search
```
### Body Parameters
Job search keywords (e.g. "software engineer", "product manager")
City, state, or country (e.g. "San Francisco", "Remote")
Two-letter ISO country code (e.g. `DE`, `US`, `GB`) for strict country filtering
Legacy shortcut for `workArrangement: "remote"`. Prefer `workArrangement(s)`
Work model: `remote`, `hybrid`, or `onsite`
Multi-select work model (OR). Takes precedence over `workArrangement`
Filter by type: `FULLTIME`, `PARTTIME`, `CONTRACTOR`, `INTERN`
Multi-select employment type (OR). Takes precedence over `employmentType`
Filter by recency: `day`, `3days`, `week`, `month`
Minimum annual salary in the job currency. Only matches jobs with disclosed salary
Annualised salary bands (OR), open-ended allowed: `"30000-50000"`, `"150000-"`
Only return jobs that disclose a salary
Require these benefits to be present (e.g. `["remote work", "health insurance"]`)
Restrict results to these company names (case-insensitive substring match)
Hide listings from these companies (case-insensitive substring match)
Require all of these keywords to appear in title or description
Exclude jobs whose title or description contains any of these keywords
At least one of these substrings must appear in the job title
None of these substrings may appear in the job title
Seniority inferred from the title (OR): `entry`, `junior`, `mid`, `senior`, `lead`
Restrict to specific ATS providers by exact source key (e.g. `greenhouse`, `ashby`, `workday`)
Required job languages by English name (OR), e.g. `["English", "German"]`
Minimum years of required experience stated by the job
Maximum years of required experience stated by the job
Only jobs that explicitly offer visa sponsorship
Match jobs that explicitly require a security clearance
Only jobs whose apply-link points to the employer's own ATS
Hide likely-stale "ghost" jobs (posted 60+ days ago or repeatedly recycled)
Results per page (max 100)
Opaque pagination cursor from the previous response's `nextCursor`. Omit on the first page; pass it back unchanged
### Example
```bash theme={null}
curl -X POST "https://api.mokaru.ai/v1/jobs/search" \
-H "Authorization: Bearer mk_your_key" \
-H "Content-Type: application/json" \
-d '{
"query": "software engineer",
"location": "San Francisco",
"remote": true,
"datePosted": "week"
}'
```
## Response
Array of job listings
Unique job ID (use for `jobListingId` when creating applications)Job titleCompany nameCompany logo URLCompany website URLJob locationCityState or provinceCountry codeWhether the job is remoteEmployment typeDirect application URLWhether the apply link goes directly to the employerSource publisher (e.g. LinkedIn, Indeed)Full job description (HTML)Qualifications, responsibilities, and other highlightsList of job benefitsMinimum salaryMaximum salarySalary period (yearly, monthly, hourly)ISO 8601 posting date the results sort by (newest first). From the employer/ATS when provided, otherwise when Mokaru first saw the jobISO 8601 date Mokaru first indexed the listing (useful for spotting recycled/reposted jobs)How many times the posting date was bumped forward (recycled-listing signal)ATS provider key the job was ingested from (e.g. `greenhouse`, `ashby`, `workday`)Number of jobs returned in this page (same as `data.length`, max 25)Alias of `count` for shape uniformity - NOT the grand total across all pagesWhether more pages are availableOpaque cursor for the next page. Pass back as `cursor`. `null` when `hasMore` is false
```json theme={null}
{
"data": [
{
"id": "clx1234...",
"title": "Senior Software Engineer",
"company": "Acme Corp",
"companyLogo": "https://...",
"companyWebsite": "https://...",
"location": "San Francisco, CA",
"city": "San Francisco",
"state": "CA",
"country": "US",
"isRemote": true,
"employmentType": "Full-time",
"applyLink": "https://acme.com/careers/123",
"applyIsDirect": false,
"publisher": "LinkedIn",
"description": "
We are looking for a Senior Software Engineer...
",
"highlights": { "qualifications": ["..."], "responsibilities": ["..."] },
"benefits": ["Health insurance", "401k"],
"salaryMin": 150000,
"salaryMax": 200000,
"salaryPeriod": "yearly",
"postedAt": "2026-03-10T00:00:00.000Z"
}
],
"total": 142,
"hasMore": true,
"page": 1,
"source": "database"
}
```
**Plus users** get results from external job providers (JSearch, Fantastic.jobs) in addition to the Mokaru database. The database is refreshed daily with the top 35 most popular job titles.
# Update Application
Source: https://docs.mokaru.ai/api-reference/endpoint/update-application
PATCH https://api.mokaru.ai/v1/tracker/applications/{id}
Update a tracked application in your pipeline
## Overview
The Update Application endpoint lets you modify an existing application in your Mokaru tracker. Use it to change the status as you progress through your pipeline, adjust priority, add notes, or correct job details.
**Common use cases:**
* **AI agent pipeline management** - let an AI agent monitor your email for interview invitations or rejections, then automatically update the corresponding application status. For example, when a recruiter email arrives, the agent can move the application from "applied" to "screening" or "interview\_scheduled".
* **n8n and Make automations** - build a workflow that listens for calendar events (interviews) and automatically updates the application status to "interview\_scheduled". After the interview date passes, move it to "interviewed".
* **Bulk status updates** - mark all stale applications as "no\_response" after a configurable period by combining the List Applications endpoint with this one.
* **Notes and context tracking** - append notes from meetings, phone screens, or research to keep all context in one place.
When you change the `status` field, a timeline entry is automatically created in the application history. This gives you a complete audit trail of status changes, whether made manually in the app or through the API.
**Scope required:** `tracker:write` | **Rate limit:** 20 requests/min
## Request
```bash theme={null}
PATCH /v1/tracker/applications/:id
```
### Path Parameters
The application ID (returned by the Create Application or List Applications endpoint)
### Body Parameters
All body parameters are optional. Include only the fields you want to update.
Application status. Changing this creates a timeline entry automatically.
**Active values** (still in progress): `watchlist`, `preparing`, `applied`, `response`, `screening`, `interview_scheduled`, `interviewed`, `offer`, `negotiating`.
**Archived values** (terminal - no further action): `accepted`, `rejected`, `withdrawn`, `no_response`. Setting one of these **archives** the application; setting an active value un-archives it.
Priority level (1-5)
Free-text notes about the application
Job title (max 200 characters)
Company name (max 200 characters)
Job location (max 200 characters)
### Example
```bash theme={null}
curl -X PATCH "https://api.mokaru.ai/v1/tracker/applications/clx5678..." \
-H "Authorization: Bearer mk_your_key" \
-H "Content-Type: application/json" \
-d '{
"status": "interview_scheduled",
"priority": 5,
"notes": "Phone screen with hiring manager on March 20"
}'
```
## Response
Returns the full updated application object.
Application IDJob titleCompany nameJob locationLink to the job postingCurrent statusWhere the job was foundPriority (1-5)Application notesMinimum salaryMaximum salaryISO 8601 dateISO 8601 dateISO 8601 date
```json theme={null}
{
"id": "clx5678...",
"jobTitle": "Senior Software Engineer",
"company": "Acme Corp",
"location": "San Francisco, CA",
"jobUrl": "https://acme.com/careers/123",
"status": "interview_scheduled",
"source": "Other",
"priority": 5,
"notes": "Phone screen with hiring manager on March 20",
"salaryMin": 150000,
"salaryMax": 200000,
"appliedDate": "2026-03-15T00:00:00.000Z",
"createdAt": "2026-03-15T12:00:00.000Z",
"updatedAt": "2026-03-18T09:30:00.000Z"
}
```
### Validation Errors
```json theme={null}
{
"error": "Validation failed",
"details": {
"status": ["Invalid status value"],
"priority": ["Must be between 1 and 5"]
}
}
```
# Update Award
Source: https://docs.mokaru.ai/api-reference/endpoint/update-award
PATCH https://api.mokaru.ai/v1/awards/{id}
Update an existing award or honor
## Overview
Update an existing award. Only provided fields are modified. Pass `null` to clear an optional field.
**Scope required:** `awards:write` | **Rate limit:** 20 requests/min
## Request
```bash theme={null}
PATCH /v1/awards/clx...
Content-Type: application/json
```
### Path Parameters
Award id
### Body Parameters
All fields are optional. Omit a field to leave it unchanged, set to `null` to clear it.
Award name (max 200 characters)
Issuing organisation (max 200 characters, nullable)
Free-text description (nullable)
ISO 8601 date string (nullable)
### Query Parameters
Target a specific resume by its id (from `list-resumes`). Omit to use your base/default resume; the resume must be self-contained.
## Response
```json theme={null}
{
"success": true,
"id": "clx..."
}
```
# Update Certificate
Source: https://docs.mokaru.ai/api-reference/endpoint/update-certificate
PATCH https://api.mokaru.ai/v1/certificates/{id}
Update an existing certificate
## Overview
Update an existing certificate. Only provided fields are modified. Pass `null` to clear an optional field.
**Scope required:** `certificates:write` | **Rate limit:** 20 requests/min
## Request
```bash theme={null}
PATCH /v1/certificates/clx...
Content-Type: application/json
```
### Path Parameters
Certificate id
### Body Parameters
All fields are optional. Omit a field to leave it unchanged, set to `null` to clear it.
Certificate name (max 200 characters)
Issuing organisation (max 200 characters)
Free-text description (nullable)
ISO 8601 date string (nullable)
ISO 8601 date string (nullable)
Credential ID (max 200, nullable)
Verification URL (max 500, nullable)
### Query Parameters
Target a specific resume by its id (from `list-resumes`). Omit to use your base/default resume; the resume must be self-contained.
## Response
```json theme={null}
{
"success": true,
"id": "clx..."
}
```
# Update Contact
Source: https://docs.mokaru.ai/api-reference/endpoint/update-contact
PATCH https://api.mokaru.ai/v1/contacts/{id}
Update a contact
## Overview
The Update Contact endpoint lets you modify an existing contact's details. Only include the fields you want to change. Pass `null` for optional fields to clear them.
**Scope required:** `contacts:write` | **Rate limit:** 20 requests/min
## Request
```bash theme={null}
PATCH /v1/contacts/{id}
```
### Path Parameters
Contact id
### Body Parameters
All fields are optional, but at least one must be provided.
First name (max 100 characters, null to clear)
Last name (max 100 characters, null to clear)
Contact's job title (max 200 characters, null to clear)
Company name (max 200 characters, null to clear)
Relationship type (see Create Contact for values, null to clear)
Email address (max 200 characters, null to clear)
Phone number (max 50 characters, null to clear)
LinkedIn profile URL (max 500 characters, null to clear)
### Example
```bash theme={null}
curl -X PATCH "https://api.mokaru.ai/v1/contacts/clx1234" \
-H "Authorization: Bearer mk_your_key" \
-H "Content-Type: application/json" \
-d '{
"phone": "+1 555-0201",
"relationship": "TEAM_LEAD"
}'
```
## Response
Whether the contact was updatedThe contact's ID
```json theme={null}
{
"success": true,
"id": "clx1234..."
}
```
# Update Cover Letter
Source: https://docs.mokaru.ai/api-reference/endpoint/update-cover-letter
PATCH https://api.mokaru.ai/v1/cover-letter/{id}
Update a cover letter - only provided fields change
## Overview
Update any field on a cover letter. Only fields you include in the request are modified.
**Plus plan only.** Returns `403` with `{ requiresUpgrade: true }` if the user is on the free plan.
**Scope required:** `cover-letter:write` | **Rate limit:** 20 requests/min
## Request
```bash theme={null}
PATCH /v1/cover-letter/{id}
```
### Path Parameters
Cover letter id
### Body Parameters
All fields are optional. At least one must be provided.
Cover letter title.Body text.Cover letter template id. Pass `null` to clear.Promote to default cover letter (unsets any existing default).Template-variable map. Pass `null` to clear all variables.Header: show name.Header: show email.Header: show phone.Header: show address.`left | center | right`.Font family.Font size in pt.Line spacing.
### Example
```bash theme={null}
curl -X PATCH "https://api.mokaru.ai/v1/cover-letter/clx_cl_abc" \
-H "Authorization: Bearer mk_your_key" \
-H "Content-Type: application/json" \
-d '{ "variables": { "company": "Stripe", "contactPerson": "John Smith" } }'
```
## Response
Whether the update succeeded.The cover letter ID.
```json theme={null}
{ "success": true, "id": "clx_cl_abc" }
```
# Update Custom Section
Source: https://docs.mokaru.ai/api-reference/endpoint/update-custom-section
PATCH https://api.mokaru.ai/v1/custom-sections/{id}
Update a custom CV section definition
## Overview
Update an existing custom section definition (rename, change icon, change enabled fields).
**Scope required:** `custom-sections:write` | **Rate limit:** 20 requests/min
## Request
```bash theme={null}
PATCH /v1/custom-sections/clx...
Content-Type: application/json
```
### Path Parameters
Section definition id
### Body Parameters
Section title
Updated list of enabled fields (at least one). Allowed values: `"title"`, `"subtitle"`, `"organization"`, `"location"`, `"description"`, `"startDate"`, `"endDate"`, `"url"`
Lucide icon name
### Query Parameters
Target a specific resume by its id (from `list-resumes`). Omit to use your base/default resume; the resume must be self-contained.
## Response
```json theme={null}
{
"success": true,
"id": "clx..."
}
```
# Update Custom Section Item
Source: https://docs.mokaru.ai/api-reference/endpoint/update-custom-section-item
PATCH https://api.mokaru.ai/v1/custom-section-items/{id}
Update an item within a custom CV section
## Overview
Update an existing item. Only provided fields are modified. Pass `null` to clear a field.
**Scope required:** `custom-sections:write` | **Rate limit:** 20 requests/min
## Request
```bash theme={null}
PATCH /v1/custom-section-items/cli...
Content-Type: application/json
```
### Path Parameters
Item id
### Body Parameters
All fields are optional and nullable.
Item title
Item subtitle
Organisation
Location
Description
Free-text date or YYYY-MM-DD
Free-text date or YYYY-MM-DD
URL
### Query Parameters
Target a specific resume by its id (from `list-resumes`). Omit to use your base/default resume; the resume must be self-contained.
## Response
```json theme={null}
{
"success": true,
"id": "cli..."
}
```
# Update Education
Source: https://docs.mokaru.ai/api-reference/endpoint/update-education
PATCH https://api.mokaru.ai/v1/education/{id}
Update an education entry
## Overview
The Update Education endpoint lets you modify an existing education entry's details. Only include the fields you want to change. Pass `null` for optional fields to clear them.
**Scope required:** `education:write` | **Rate limit:** 20 requests/min
## Request
```bash theme={null}
PATCH /v1/education/{id}
```
### Path Parameters
The education entry's unique ID
### Body Parameters
All fields are optional, but at least one must be provided.
School or institution name (max 200 characters)
Degree type (max 200 characters)
Field of study (max 200 characters) (nullable)
Location of the institution (max 200 characters) (nullable)
ISO 8601 datetime (nullable)
ISO 8601 datetime (nullable)
Whether currently enrolled (nullable)
Additional details (nullable)
Grade or classification (max 50 characters) (nullable)
GPA value (nullable)
### Query Parameters
Target a specific resume by its id (from `list-resumes`). Omit to use your base/default resume; the resume must be self-contained.
### Example
```bash theme={null}
curl -X PATCH "https://api.mokaru.ai/v1/education/clx1234" \
-H "Authorization: Bearer mk_your_key" \
-H "Content-Type: application/json" \
-d '{
"degree": "Master of Science",
"field": "Machine Learning"
}'
```
## Response
Whether the education was updatedThe education entry's ID
```json theme={null}
{
"success": true,
"id": "clx1234..."
}
```
# Update Experience
Source: https://docs.mokaru.ai/api-reference/endpoint/update-experience
PATCH https://api.mokaru.ai/v1/experiences/{id}
Update a work experience
## Overview
The Update Experience endpoint lets you modify an existing work experience's details. Only include the fields you want to change. Pass `null` for optional fields to clear them.
**Scope required:** `experiences:write` | **Rate limit:** 20 requests/min
## Request
```bash theme={null}
PATCH /v1/experiences/{id}
```
### Path Parameters
The experience's unique ID
### Body Parameters
All fields are optional, but at least one must be provided.
Job title (max 200 characters)
Company name (max 200 characters)
Work location (max 200 characters) (nullable)
ISO 8601 datetime (nullable)
ISO 8601 datetime (nullable)
Whether this is the current position (nullable)
Role description (nullable)
List of responsibilities (nullable)
List of achievements (nullable)
### Query Parameters
Target a specific resume by its id (from `list-resumes`). Omit to use your base/default resume; the resume must be self-contained.
### Example
```bash theme={null}
curl -X PATCH "https://api.mokaru.ai/v1/experiences/clx1234" \
-H "Authorization: Bearer mk_your_key" \
-H "Content-Type: application/json" \
-d '{
"isCurrent": false,
"endDate": "2026-03-15",
"achievements": ["Reduced bundle size by 40%", "Shipped design system v2"]
}'
```
## Response
Whether the experience was updatedThe experience's ID
```json theme={null}
{
"success": true,
"id": "clx1234..."
}
```
# Update Interest
Source: https://docs.mokaru.ai/api-reference/endpoint/update-interest
PATCH https://api.mokaru.ai/v1/interests/{id}
Update an existing interest or hobby
## Overview
Update an existing interest. Only provided fields are modified.
**Scope required:** `interests:write` | **Rate limit:** 20 requests/min
## Request
```bash theme={null}
PATCH /v1/interests/clx...
Content-Type: application/json
```
### Path Parameters
Interest id
### Body Parameters
Interest name (max 200)
Description (nullable)
### Query Parameters
Target a specific resume by its id (from `list-resumes`). Omit to use your base/default resume; the resume must be self-contained.
## Response
```json theme={null}
{
"success": true,
"id": "clx..."
}
```
# Update Profile
Source: https://docs.mokaru.ai/api-reference/endpoint/update-profile
PATCH https://api.mokaru.ai/v1/profile
Update your career profile
## Overview
The Update Profile endpoint lets you modify your career profile. The scalar identity and contact fields (name, email, phone, address, links, and the profile scalars below) are shared and appear on every resume - editing them here propagates to all resumes. The collection arrays (`summaries`, `projects`, `certificates`, etc.) write your base (default) resume's content, which is the canonical content that new resumes are copied from.
**Common use cases:**
* **AI agent profile management** - keep your profile up to date as your career evolves.
* **Bulk updates** - update multiple fields at once after a job change.
* **LinkedIn sync** - pull data from LinkedIn and push it to your Mokaru profile.
**Scope required:** `profile:write` | **Rate limit:** 20 requests/min
## Request
```bash theme={null}
PATCH /v1/profile
```
### Body Parameters
All fields are optional. Only include the fields you want to change. Pass `null` to clear a field.
First name (max 100 characters)
Last name (max 100 characters)
Email address (max 254 characters)
Phone number (max 50 characters, null to clear)
Address (max 200 characters, null to clear)
Country (max 100 characters, null to clear)
Province or state (max 100 characters, null to clear)
Current job title (max 200 characters, null to clear)
Professional summary (max 2000 characters, null to clear)
Industry sector (max 100 characters, null to clear)
Nationality (max 100 characters, null to clear)
Pronouns (max 50 characters, null to clear)
LinkedIn username or URL (max 500 characters, null to clear)
Personal website URL (max 500 characters, null to clear)
Portfolio URL (max 500 characters, null to clear)
GitHub URL (max 500 characters, null to clear)
### Collection fields (replace-list semantics)
These accept full arrays. **Passing an array REPLACES the entire collection.** To add one item without losing existing entries, first call `GET /v1/profile`, append to the returned array, then send the full updated array back. Omit the field to leave the collection unchanged; pass `[]` to clear it. Hard cap of 100 items per collection (50 for `jobTitles`).
Professional summary versions: `{ title?: string, content: string }[]`
Projects: `{ name, description, organisation?, startDate?, endDate?, isCurrent?, url? }[]`
Certificates: `{ name, issuer, description?, issueDate?, expiryDate?, credentialId?, verificationUrl? }[]`
Awards: `{ name, organisation?, description?, date? }[]`
Publications: `{ name, publisher?, date?, url?, description? }[]`
Interests: `{ name, description? }[]`
Career-identity job titles: `{ title: string }[]`
### Example
```bash theme={null}
curl -X PATCH "https://api.mokaru.ai/v1/profile" \
-H "Authorization: Bearer mk_your_key" \
-H "Content-Type: application/json" \
-d '{
"firstName": "Jane",
"lastName": "Smith",
"jobTitle": "Senior Software Engineer",
"linkedIn": "jane-smith",
"sector": "Technology"
}'
```
## Response
Whether the profile was updated
```json theme={null}
{
"success": true
}
```
LinkedIn usernames are automatically converted to full URLs. For example, `"jane-smith"` becomes `"https://linkedin.com/in/jane-smith"`. Website and portfolio URLs have `https://` prepended if no protocol is specified.
# Update Project
Source: https://docs.mokaru.ai/api-reference/endpoint/update-project
PATCH https://api.mokaru.ai/v1/projects/{id}
Update an existing project
## Overview
Update an existing project. Only provided fields are modified. Pass `null` to clear an optional field.
**Scope required:** `projects:write` | **Rate limit:** 20 requests/min
## Request
```bash theme={null}
PATCH /v1/projects/clx...
Content-Type: application/json
```
### Path Parameters
The project's unique ID
### Body Parameters
Project name (max 200)
Description
Organisation (max 200) (nullable)
ISO 8601 datetime (nullable)
ISO 8601 datetime (nullable)
Ongoing flag (nullable)
Project URL (max 500) (nullable)
### Query Parameters
Target a specific resume by its id (from `list-resumes`). Omit to use your base/default resume; the resume must be self-contained.
## Response
```json theme={null}
{
"success": true,
"id": "clx..."
}
```
# Update Publication
Source: https://docs.mokaru.ai/api-reference/endpoint/update-publication
PATCH https://api.mokaru.ai/v1/publications/{id}
Update an existing publication
## Overview
Update an existing publication. Only provided fields are modified. Pass `null` to clear an optional field.
**Scope required:** `publications:write` | **Rate limit:** 20 requests/min
## Request
```bash theme={null}
PATCH /v1/publications/clx...
Content-Type: application/json
```
### Path Parameters
Publication id
### Body Parameters
Publication title (max 300)
Publisher (max 200, nullable)
ISO 8601 date string (nullable)
Publication URL (max 500, nullable)
Description (nullable)
### Query Parameters
Target a specific resume by its id (from `list-resumes`). Omit to use your base/default resume; the resume must be self-contained.
## Response
```json theme={null}
{
"success": true,
"id": "clx..."
}
```
# Update Resume
Source: https://docs.mokaru.ai/api-reference/endpoint/update-resume
PATCH https://api.mokaru.ai/v1/resume/{id}
Update a resume - only provided fields are modified
## Overview
The Update Resume endpoint lets you modify any aspect of a resume. Only fields you include in the request are updated - everything else stays unchanged.
**Common use cases:**
* **AI agent resume tailoring** - update `jobTitle`, `summary` or `hiddenItems` to match a specific job description.
* **Rename or reorganize** - change the resume name, switch templates, or reorder sections.
* **Set as default** - promote a resume to be the default for auto-prepare applications.
**Self-contained model:** experiences, education, skills, certificates, projects, awards, publications, interests and customSections are managed via the dedicated content endpoints (e.g. `PATCH /v1/experiences/:id`), not via `cvData`. Arrays under these keys in `cvData` are silently dropped. Use those endpoints to edit the resume's items, and `hiddenItems` to hide items on this CV.
**Scope required:** `resume:write` | **Rate limit:** 20 requests/min
## Request
```bash theme={null}
PATCH /v1/resume/{id}
```
### Path Parameters
Resume id
### Body Parameters
All fields are optional. At least one must be provided.
Resume name (max 200 characters)
Template ID
Set as the default resume (unsets any existing default)
CV-level job title override (max 150 chars). Pass `null` to clear and fall back to the shared identity job title.
CV-level overrides (personal info, `summary`). Replaces the stored cvData. Section arrays (`experiences`, `education`, `skills`, `certificates`, `projects`, `awards`, `publications`, `interests`, `customSections`) are silently dropped - use the dedicated content endpoints + `hiddenItems` instead.
Per-section blacklist of the resume's item IDs to hide on this CV. Replaces any existing value. Pass `null` to clear. Keys: `experiences`, `education`, `skills`, `certificates`, `projects`, `awards`, `publications`, `interests`, or `customSection:`.
Per-CV content override. Replaces any existing value; pass `null` to clear all overrides. Only `summary` takes effect - it overrides the selected summary for this CV (set it to `null` inside the object to clear just that one). Identity fields (name, email, phone, address, links, photo) are shared profile-level and cannot be overridden per resume; edit them via the profile endpoint. The per-CV job title is the top-level `jobTitle` field, not `personalOverrides`.
Per-section ordering map. Replaces any existing value. Pass `null` to clear and fall back to default order. Keys: `experiences`, `education`, `skills`, `certificates`, `projects`, `awards`, `publications`, `interests`, `skillCategories`; values are arrays of the resume's item IDs.
ID of the summary this resume shows. Pass `null` to clear.
Visual styling
Show/hide toggles
Section order
### Example
Tailor the CV for a specific role by hiding off-topic experiences and adjusting the headline:
```bash theme={null}
curl -X PATCH "https://api.mokaru.ai/v1/resume/clx1234" \
-H "Authorization: Bearer mk_your_key" \
-H "Content-Type: application/json" \
-d '{
"name": "Backend Engineer - Stripe",
"cvData": { "jobTitle": "Senior Backend Engineer" },
"hiddenItems": {
"experiences": ["clx_exp_internship", "clx_exp_unrelated"],
"skills": ["clx_skill_photoshop"]
}
}'
```
## Response
Whether the resume was updatedThe resume ID
```json theme={null}
{
"success": true,
"id": "clx1234..."
}
```
# Update Skill
Source: https://docs.mokaru.ai/api-reference/endpoint/update-skill
PATCH https://api.mokaru.ai/v1/skills/{id}
Update a skill
## Overview
The Update Skill endpoint lets you modify an existing skill's details. Only include the fields you want to change. Pass `null` for optional fields to clear them.
**Scope required:** `skills:write` | **Rate limit:** 20 requests/min
## Request
```bash theme={null}
PATCH /v1/skills/{id}
```
### Path Parameters
The skill's unique ID
### Body Parameters
All fields are optional, but at least one must be provided.
Skill name (max 200 characters)
Skill category. One of: TECHNICAL, SOFT, or LANGUAGE
Free-text level label, e.g. "Expert", "Intermediate". (max 50 characters) (nullable)
Numeric proficiency 1-5. (nullable)
Visibility flag on the skill itself - false hides the skill outright. To hide it on just one resume, use hiddenItems on that resume instead.
Sort order of the skill
### Query Parameters
Target a specific resume by its id (from `list-resumes`). Omit to use your base/default resume; the resume must be self-contained.
### Example
```bash theme={null}
curl -X PATCH "https://api.mokaru.ai/v1/skills/clx1234" \
-H "Authorization: Bearer mk_your_key" \
-H "Content-Type: application/json" \
-d '{
"level": "expert",
"category": "Programming Languages"
}'
```
## Response
Whether the skill was updatedThe skill's ID
```json theme={null}
{
"success": true,
"id": "clx1234..."
}
```
# Update Summary
Source: https://docs.mokaru.ai/api-reference/endpoint/update-summary
PATCH https://api.mokaru.ai/v1/summaries/{id}
Update an existing professional summary
## Overview
Update an existing professional summary. Only provided fields are modified.
**Scope required:** `summaries:write` | **Rate limit:** 20 requests/min
## Request
```bash theme={null}
PATCH /v1/summaries/clx...
Content-Type: application/json
```
### Path Parameters
The summary's unique ID
### Body Parameters
Internal label for the summary (e.g. "Backend role"). (max 100 characters) (nullable)
The actual summary text shown on the CV.
### Query Parameters
Target a specific resume by its id (from `list-resumes`). Omit to use your base/default resume; the resume must be self-contained.
## Response
```json theme={null}
{
"success": true,
"id": "clx..."
}
```
# API Reference
Source: https://docs.mokaru.ai/api-reference/introduction
Connect AI agents, n8n, Make, and other automation tools to Mokaru
## Overview
The Mokaru API lets AI agents and automation platforms search jobs and manage applications on your behalf. Build custom job search workflows, automate application tracking, or let your AI assistant handle the heavy lifting.
### Popular integrations
Claude Desktop, OpenAI GPTs, OpenClaw (via ClawdHub skill), custom AI assistants, LangChain agents
n8n, Make (Integromat), Zapier, Pipedream, ActivePieces
Any HTTP client, Python scripts, browser extensions, CLI tools
API keys require a **Plus plan**. [Upgrade here](https://app.mokaru.ai/billing).
## Base URL
```
https://api.mokaru.ai
```
All endpoints are prefixed with `/v1`.
## Quick Start
### Using curl
```bash theme={null}
curl -X POST "https://api.mokaru.ai/v1/jobs/search" \
-H "Authorization: Bearer mk_your_api_key_here" \
-H "Content-Type: application/json" \
-d '{"query": "software engineer"}'
```
### Using Python
```python theme={null}
import requests
headers = {"Authorization": "Bearer mk_your_api_key_here"}
# Search for jobs
jobs = requests.post(
"https://api.mokaru.ai/v1/jobs/search",
headers=headers,
json={"query": "data scientist", "remote": True}
).json()
# Save a job to your tracker
for job in jobs["data"][:5]:
requests.post(
"https://api.mokaru.ai/v1/tracker/applications",
headers=headers,
json={
"jobTitle": job["title"],
"company": job["company"],
"jobUrl": job["applyLink"],
"jobListingId": job["id"]
}
)
```
### Using n8n
1. Add an **HTTP Request** node
2. Set method to `POST` and URL to `https://api.mokaru.ai/v1/jobs/search`
3. Add header: `Authorization: Bearer mk_your_api_key_here`
4. Set body to JSON with your search query
5. Connect to your workflow (e.g. daily job search, Slack notifications, spreadsheet export)
### Using OpenClaw
Mokaru is available as a skill on [ClawdHub](https://clawdhub.com). Install the Mokaru skill in OpenClaw to search jobs and manage applications directly from your AI agent.
## Endpoints
Search job listings from the Mokaru database
Add a job to your application tracker
View your tracked applications
Manage your networking contacts
Manage your work experiences
Manage your education history
Manage your skills
API keys, scopes, and rate limits
## Use Cases
Set up a Claude Desktop, OpenAI GPT, or OpenClaw agent to search for jobs matching your criteria every morning and add the best matches to your tracker automatically. The Mokaru skill on ClawdHub makes this a one-click setup.
Build an n8n workflow that searches for new jobs daily, filters by salary and location, sends matches to Slack, and saves them to your Mokaru tracker.
Use the API to build a personal job aggregator that pulls from Mokaru's database of thousands of listings and combines them with other sources.
Keep an external spreadsheet or Notion database in sync with your Mokaru application tracker using the List Applications endpoint.
# What is an ATS?
Source: https://docs.mokaru.ai/ats
An Applicant Tracking System (ATS) is the database recruiters use to receive, search, and rank resumes. It is not an AI that rejects you - here is what it actually does and how to write a resume it can read.
## In short
An **Applicant Tracking System (ATS)** is the software that companies use to receive, store, search, and filter job applications. When you apply through a careers portal, your resume almost always lands in an ATS first. The recruiter only sees the candidates the system surfaces.
Common ATS platforms: **Workday, Greenhouse, Lever, Ashby, SmartRecruiters, iCIMS, Oracle Taleo**.
An ATS is not an AI that decides to reject you. In its core, it is a database. Your resume is broken down into structured fields - job titles, companies, dates, skills - and recruiters search and filter that data based on keywords. Think of it as a Google Sheet with a powerful search bar.
## How an ATS actually works
The portal takes your PDF or DOCX and extracts structured data: name, contact, work history, skills, education. Fancy layouts (columns, icons, text in images) often parse incorrectly, which means data ends up in the wrong fields or missing entirely.
Your application becomes one row among many. Most ATSs display candidates in **chronological order by default** - newest first.
Recruiters run keyword queries with Boolean logic - `React AND AWS NOT junior`, for example. If your resume does not contain the words they filter on, you simply do not appear in the result set.
Recruiters typically stop scrolling after the top results. If you applied late, or your keywords do not match, you are functionally invisible.
## Common myths
No. There is no AI silently throwing your resume in the bin. Most rejections come from:
* **Knock-out questions** (work authorization, required certifications, location, shift availability) - one wrong answer and you are out instantly.
* **No keyword match** for the recruiter's search query, so you never enter the result set in the first place.
* **Recruiter never scrolled far enough** - if your application sits at position 87, no one ever opened it.
No. There is no standardised ATS score and no official ATS certification. When people say a resume is "ATS-friendly", they just mean: the parser can read it correctly, and a recruiter can skim it quickly.
Still no. Enterprise ATSs (Workday, Oracle, iCIMS, SmartRecruiters) increasingly add semantic layers that:
* Normalise skills (mapping synonyms like "HR Advisor" → "HR Consultant")
* Calculate similarity scores between your profile and the role
* Surface ML-based match scores ("matches 72% of the role")
* Recommend candidates from the existing talent pool
But this layer is used for **ranking and sorting**, not silent auto-rejection. Boolean + keyword search is still the backbone of how sourcing actually works. Keywords decide who enters the result set; semantic matching mainly decides who ranks higher.
The opposite. Multi-column layouts, sidebars, text inside images, custom fonts, and decorative graphics frequently break the parser. A plain Word or Google Docs resume works perfectly fine for virtually all ATS systems. Avoid Canva for ATS submissions.
## What "ATS-friendly" actually means
Top-to-bottom reading order so the parser does not reshuffle content.
Use **Work Experience**, **Education**, **Skills** - exactly as ATS systems expect.
No images for text. No icon fonts in the parsed body. Real characters only.
Mirror the language of the job posting (skills, tools, certifications) where it is honestly applicable. No keyword stuffing.
## Practical takeaways
* **Write for two readers**: the parser and a human skim-reader. If either one cannot extract the relevant info in a few seconds, you lose.
* **Use keywords in context**, never as a stuffed list. Prove them in your experience section.
* **Make skills explicit**. If the posting says "TypeScript", do not write "TS". Match the wording.
* **Take knock-out questions seriously**. They reject far more candidates than any AI ever does.
* **Apply early when you can**. Chronological ordering is the default in many ATSs, so being near the top of the list helps - but only if your resume also matches the recruiter's filters.
## How Mokaru helps
Templates marked with the **ATS** badge use single-column, parser-safe layouts. 7 of our 8 templates are ATS-friendly.
Paste a job description and Mokaru suggests the keywords from that posting that fit your background - so the ATS search ranks you higher for that specific role, without inventing things you cannot back up in an interview.
Build once, fork per application. Each tailored version optimises wording and keywords for that role without losing the source data on your profile.
The useful tools keep the layout intentionally boring, help you align your real experience with the job description, and make sure the right keywords are present.
## Related
Build, tailor, and export ATS-friendly resumes.
Track every application from submitted to offer.
# Autopilot
Source: https://docs.mokaru.ai/features/autopilot
Run AI job-search agents that scan job boards daily, score matches against your profile, and either notify you or auto-prepare a tailored resume
## Overview
Autopilot turns your job hunt into a background process. You define a search once - keywords, location, filters, the kind of jobs you actually want - and an Autopilot agent runs it for you every day. Each new posting is scored against your profile, and you choose what happens next: a notification, or a fully tailored resume waiting in your tracker.
Autopilot is a **Plus** feature. Free users can preview the editor but cannot launch an agent. **Auto-prepare** as an action additionally requires a complete base resume - the app tells you what's missing if not.
## Where to find it
Autopilot lives next to the Search tab on the **Jobs** page. The page has two tabs:
* **Search** - one-off job searches
* **Autopilot** - your running agents and their match feed
You can also go directly to `/autopilot`.
## Key Features
Run up to 3 Autopilot agents in parallel - one per role type, region, or industry.
Every match has a 0-100 score combining how well the job fits your filters and how similar it is to your profile.
Choose to be notified for review, or have Mokaru duplicate and tailor your base resume automatically.
See matches per agent or aggregated, with a 30-day trend chart for matches and near-misses.
## Creating an Autopilot Agent
The Autopilot editor walks you through 4 steps. You can move between steps freely - nothing is saved until you click **Launch**.
Define the **query** (e.g. "Product Manager"), **location**, **work arrangement** (remote / hybrid / onsite), and **employment type**. A preview panel shows the kind of jobs your search would surface today.
Add include/exclude keywords, include/exclude companies, country, salary minimum, posting recency, and benefits. Use these to cut out roles you don't want before scoring even runs.
Like or dislike example jobs to teach the agent what "good" looks like for you. These preferences feed into the similarity score on every future match.
Set the **match threshold** and **similarity threshold** (default 50 each). Give the agent a **name** and a **max applications per day** cap (1-10). Pick the action:
* **Notify** - new matches appear in your review feed with a notification.
* **Auto-prepare** - Mokaru duplicates your base resume and tailors it to each new match automatically. Requires a complete base resume.
Matches below either threshold show up as "near misses" instead of full matches.
Start with **Notify** for the first day or two to confirm the agent is finding the right jobs. Switch to **Auto-prepare** once you trust its picks.
## Scoring and Thresholds
Each match has two scores:
| Score | What it measures |
| -------------------- | ------------------------------------------------------------------------------ |
| **Match score** | How well the job matches your filters, keywords, and preferences (0-100) |
| **Similarity score** | How similar the job description is to your profile and past liked jobs (0-100) |
A job becomes a **full match** when both scores meet their thresholds. Otherwise it lands in **Near misses**, which you can still browse - useful for tuning thresholds or spotting borderline-good jobs.
## Match Feed
The match feed shows new jobs per agent, or aggregated across all your agents. Each row shows the job title, company, location, score, and posting date.
From the feed you can:
* **Save to tracker** - adds the job as an application (with the same Auto-prepare option as elsewhere).
* **Skip** - removes it from the queue without saving.
* **Rate** - mark a match as helpful or not, refining future scoring.
Even after a job listing is hard-deleted from our database (90 days after posting), the row in your match feed keeps rendering with its snapshot - so you never lose past matches.
## Insights
The insights panel sits next to the agent list and shows three metrics at a glance plus a chart:
* **Matches** - 30-day total of jobs that crossed both thresholds
* **Near misses** - jobs that hit one but not both thresholds
* **Daily trend** - matched vs near-miss volume per day for the last 30 days
Use insights to tune your agent. Lots of near-misses but few matches usually means thresholds are too tight, or filters are too narrow.
## Managing Agents
From the Autopilot page you can:
* **Pause** - stop scoring without losing history. Resume later.
* **Edit** - reopen the 5-step editor and adjust anything except the originating CV link.
* **Delete** - remove the agent and clear its match queue.
Each agent card shows its name, query, status, total matches, and the linked resume.
## Notifications
When an agent is set to **Notify**, you get an in-app notification each time the daily run produces new matches. If you've connected your email, the daily digest of new matches lands in your inbox too.
## Limits and Gating
| Resource | Free | Plus |
| ----------------------- | ---- | ---------------------------------------- |
| Active Autopilot agents | - | Up to 3 |
| Auto-prepare action | - | Included (requires complete base resume) |
| Match scoring | - | Unlimited |
## Related Features
Autopilot output feeds straight into your [Tracker](/features/job-tracker) (as applications) and your [Resume Builder](/features/resume-builder) (when Auto-prepare is on). The same scoring logic powers manual saves from [Jobs](/features/job-search) and the [Browser Extension](/features/browser-extension).
# Browser Extension
Source: https://docs.mokaru.ai/features/browser-extension
Save jobs from LinkedIn, Indeed, Glassdoor, Monster, and Hiring.cafe, autofill application forms, and detect recruiter emails - all from your Chrome browser
## Overview
The Mokaru browser extension brings your job search tools right into your browser. Save jobs from any supported job board, autofill job applications with your resume data, and track your progress - without ever leaving the page you're on.
## Key Features
Detect and save job postings from LinkedIn, Indeed, Glassdoor, Monster, and Hiring.cafe with a single click.
Fill out job application forms on any site using your Mokaru resume data.
Spot job-related emails in Gmail and link them to your tracked applications.
Import LinkedIn profiles to quickly build or update your resume.
## Getting Started
Download and install the Mokaru Chrome extension from the Chrome Web Store.
Make sure you are signed in to your Mokaru account at [app.mokaru.ai](https://app.mokaru.ai). The browser extension shares your session automatically - no separate login needed.
Click the Mokaru icon in your browser toolbar to open the side panel. You will see your job search stats and any detected jobs on the current page.
The extension requires an active Mokaru account. Sign in to the main app first, and the extension will pick up your session automatically.
## Saving Jobs
When you visit a job posting on a supported job board, the extension automatically detects the listing and shows a banner in the side panel with the job title, company, and location.
Click **Save to Tracker** to add the job to your Mokaru Tracker. The extension captures:
* Job title and company name
* Location
* Job description
* A link back to the original posting
This works on individual job listing pages. Just browse jobs as you normally would, and Mokaru will detect them for you.
## Supported Job Boards
The extension detects job postings on these platforms:
| Job Board | Coverage |
| --------------- | ------------------------------------------------------------------------------------------------------------------------------------ |
| **LinkedIn** | linkedin.com (all regions) |
| **Indeed** | indeed.com, indeed.co.uk, indeed.ca, indeed.de, indeed.fr, indeed.nl, indeed.be, indeed.in, indeed.com.au |
| **Glassdoor** | glassdoor.com, glassdoor.co.uk, glassdoor.ca, glassdoor.de, glassdoor.fr, glassdoor.nl, glassdoor.be, glassdoor.in, glassdoor.com.au |
| **Monster** | monster.com, monster.co.uk, monster.de, monster.fr, monster.nl, monster.be, monster.ca, monster.in |
| **Hiring.cafe** | hiring.cafe |
Many job boards use structured data (JSON-LD) on their pages. Even if a site is not listed above, the extension may still detect job postings if the site follows the standard JobPosting schema.
## Application Autofill
The job application autofill feature saves you time by filling out application forms using data from your Mokaru resume.
### How it works
1. Navigate to any job application form
2. The extension detects fillable fields on the page
3. Open the side panel and click **Autofill** to populate the form with your resume data
4. Review the filled fields and submit your application
### Choosing a resume for autofill
If you have multiple resumes in Mokaru, you can select which one the extension uses for autofill. Open the side panel and go to the autofill settings to pick your preferred resume.
Set a default resume in your Mokaru settings so the extension always knows which resume to use for autofill.
## Gmail Detection
When you open Gmail, the extension scans your email threads for job-related messages and links them to your tracked applications. This helps you:
* Keep all communication tied to the right application
* Quickly find emails related to a specific job
* Stay on top of recruiter messages and interview invitations
You can dismiss any detected email if it is not relevant.
For full Outlook two-way email sync (sending, inbox notifications, AI status suggestions), connect Outlook via [Email Integration](/features/email-integration) in Settings. That uses OAuth, not the extension.
## LinkedIn Profile Import
When you visit a LinkedIn profile, the extension detects the profile data and gives you the option to import it into Mokaru. This is useful for quickly pulling in professional details when building or updating your resume.
## Tips
**Keep the side panel open while browsing jobs.** The extension re-scans automatically when you switch tabs or navigate to a new page, so you always see the latest detected job.
**Privacy first.** The extension reads page data on supported job boards, Gmail, and any page where you trigger autofill. It does not track your browsing history or collect data from unrelated websites.
## Related Features
Jobs saved with the extension appear in your [Tracker](/features/job-tracker). From there, [tailor your resume](/features/resume-builder) for the role and [generate a cover letter](/features/cover-letters) to strengthen your application. For continuous background discovery, set up an [Autopilot](/features/autopilot) agent.
# Calendar Integration
Source: https://docs.mokaru.ai/features/calendar-integration
Sync interviews, follow-ups, and deadlines with Google Calendar or Outlook using two-way calendar sync
## Overview
Mokaru's calendar integration keeps your job search schedule and your personal calendar in sync. Connect Google Calendar or Outlook and your interviews, follow-ups, and deadlines appear automatically - no manual entry needed.
Calendar sync is a **Plus** feature. Free users can preview the integration, but connecting a calendar requires a Plus subscription.
## Key Features
Connect your Google Calendar to sync interviews and follow-up events in both directions.
Use Outlook or Microsoft 365? Connect your Outlook Calendar for the same seamless experience.
Interviews you schedule in Mokaru automatically appear on your calendar with reminders.
Changes made in your calendar sync back to Mokaru, and changes in Mokaru sync to your calendar.
## Connecting Your Calendar
Go to **Settings** and select the **Integrations** tab.
Click **Connect** next to either Google Calendar or Outlook Calendar.
Sign in to your Google or Microsoft account and grant Mokaru permission to read and write calendar events.
Once connected, Mokaru automatically syncs your calendar. Your upcoming events will appear within moments.
You can connect both Google Calendar and Outlook at the same time if you use multiple calendars for different purposes.
## How Calendar Sync Works
### Automatic background sync
Mokaru syncs your calendar automatically whenever you open your dashboard or tracker. Events from the past 7 days and the next 60 days are kept in sync, so you always have an up-to-date view of your schedule.
### Interview scheduling
When you schedule an interview in Mokaru, it is automatically pushed to your connected calendar with all the relevant details - company name, interview type, video call link, and location. If you reschedule or cancel, your calendar updates too.
### Follow-up events
Create a follow-up action in the tracker (such as "Send thank-you email" or "Check in with recruiter") and it appears on your calendar as a reminder. Never let a follow-up slip through the cracks.
### Two-way sync
Calendar sync works in both directions:
* **Mokaru to Calendar** - interviews and follow-ups you create in Mokaru appear on your calendar
* **Calendar to Mokaru** - events from your calendar appear in the Mokaru dashboard agenda, giving you a complete view of your day alongside your job search activity
## Where Calendar Events Appear
| Location | What you see |
| --------------------------- | ---------------------------------------------------------------------------------------- |
| **Dashboard** | The agenda column shows today's calendar events alongside your interviews and follow-ups |
| **Tracker** | Calendar events appear as dots on the date picker so you can avoid scheduling conflicts |
| **Settings → Integrations** | Manage your connections, see sync status, and trigger a manual sync if needed |
## Managing Your Connection
### Manual sync
Your calendar syncs automatically, but you can trigger a manual sync anytime from **Settings > Integrations** if you want to see the latest changes immediately.
### Disconnecting
To disconnect a calendar, go to **Settings > Integrations** and click **Disconnect** next to the calendar you want to remove. Your synced events will be removed from Mokaru, but your external calendar is not affected.
If you downgrade from Plus to Free, your calendar connection stays saved but syncing pauses. Upgrade again and syncing resumes automatically - no need to reconnect.
## Privacy and Security
Your calendar data is handled with care:
* **Encrypted tokens** - your calendar credentials are encrypted at rest using AES-256 encryption
* **Minimal permissions** - Mokaru only requests access to read and write calendar events, nothing else
* **No data sharing** - your calendar data is never shared with third parties
* **Instant revocation** - disconnect at any time from Settings, or revoke access directly from your Google or Microsoft account
## Related Features
Pair calendar sync with [Email Integration](/features/email-integration) to keep your entire communication and scheduling workflow in one place. Manage all integration connections from [Settings](/features/settings).
# Contacts
Source: https://docs.mokaru.ai/features/contacts
Manage recruiters, hiring managers, and professional contacts with email tracking, application linking, and activity timelines
## Overview
The Contacts feature in Mokaru helps you manage your professional network during your job search. Keep track of every recruiter, hiring manager, and connection you interact with - all linked to your job applications.
Contacts live as a tab inside the [Tracker](/features/job-tracker). They share the same tag system and search bar as your applications.
## Key Features
Store contact details for every recruiter and hiring manager you interact with.
Connect contacts to one or more job applications so you always know who to follow up with.
See your full email conversation history with each contact in one place.
View a chronological timeline of emails, interviews, and application updates per contact.
## Managing Contacts
### Adding a New Contact
Navigate to the **Tracker** and switch to the **Contacts** tab.
Click the **Add Contact** button to open the contact form.
Enter the contact's first and last name, job title, company, email, phone number, and LinkedIn profile. Only the name is required - you can fill in the rest later.
Choose the relationship type that best describes this contact (see below).
The Mokaru browser extension can automatically detect contacts from job postings and save them to your networking tracker with a single click.
### Relationship Types
Categorize your contacts to keep your networking tracker organized:
| Type | When to use |
| ------------------- | ----------------------------------------------------------- |
| **Recruiter** | External or agency recruiters reaching out about roles |
| **Hiring Manager** | The person who would be your direct manager |
| **HR Manager** | Internal HR representatives handling the process |
| **Team Lead** | Lead of the team you'd be joining (not your direct manager) |
| **Department Head** | Department- or function-level leadership |
| **CEO / Founder** | Direct contact with company leadership |
| **Colleague** | Current or former colleagues |
| **Friend** | A personal connection at the company |
| **Referral** | Someone who referred you or whom you were referred to |
| **Other** | Any contact that does not fit the categories above |
### Editing a Contact
Click on any contact to open their detail page. All fields can be edited inline - just click on the value you want to change.
## Linking Contacts to Applications
One of the most powerful features of the networking tracker is linking contacts to your job applications. A single recruiter contact can be linked to multiple applications, giving you a clear picture of who is involved in each opportunity.
### How to Link
You can create links in two ways:
* **From an application**: Open a job application and add a contact in the contacts section. You can pick an existing contact or create a new one.
* **From a contact**: The Jobs section on a contact's detail page shows all linked applications.
Linking contacts to applications helps you track which recruiter or hiring manager is responsible for each role. This is especially useful when working with multiple agencies or interviewing at large companies.
## Contact Detail Page
Click on any contact to see their full detail page with all related information.
### Details Sidebar
The left sidebar shows the contact's information at a glance:
* Name, job title, and company
* Email, phone, and LinkedIn
* Relationship type
* Metadata such as when the contact was added, and counts for linked jobs, emails, and interviews
### Emails Section
If you have connected your mailbox, Mokaru automatically matches incoming emails to your contacts. The Emails section shows:
* Email subject and sender
* Date received
* A preview of the email body (expandable to read the full message)
* Badges showing which application each email is linked to
### Jobs Section
A list of all job applications linked to this contact. Each entry shows the company, job title, application status, and the date you applied. Click any job to jump directly to that application.
### Timeline
The timeline in the left sidebar combines all activity related to a contact in chronological order:
* Emails received
* Upcoming and past interviews
* Application status changes
This gives you a complete history of your interactions, making it easy to prepare for follow-ups and interviews.
## Tags and Filtering
Contacts share the same tagging system as your job applications. You can:
* Assign tags to contacts for custom organization (e.g., "Tech companies", "Priority")
* Filter both jobs and contacts by the same tag simultaneously
* Use the search bar to quickly find contacts by name, company, or job title
Use tags to group hiring manager contacts and recruiter contacts by industry or job search campaign. Filtering by tag shows matching jobs and contacts together, so you can see the full picture at once.
## Related Features
Contacts integrate with the [Tracker](/features/job-tracker) for linking people to applications, [Tags](/features/tags) for cross-entity organization, and [Email Integration](/features/email-integration) for automatic email matching.
# Cover Letters
Source: https://docs.mokaru.ai/features/cover-letters
Generate tailored, professional cover letters with AI that match your resume to each job description for stronger applications
## Overview
Mokaru's AI cover letter generator creates personalized cover letters based on your resume and the job description. Each letter is tailored to highlight the experience and skills that matter most for the role you are applying to.
The cover letter lives **inside the resume builder** as a dedicated section, so your letter and resume share the same job link, design header, and export pipeline.
Cover letters are available on the **Plus** plan. See [Pricing & Plans](/features/pricing) for details.
## Key Features
Generate a complete, job-tailored cover letter in seconds using your resume data and the job description.
Choose from five tone levels - from very casual to highly professional - to match the company culture.
Direct the AI to emphasize skills, experience, achievements, or personality - or keep it balanced.
Use dynamic placeholders like and that auto-fill from your tracker data.
Download your cover letter as a professionally formatted PDF, ready to attach to applications.
See your cover letter update in real time as you edit, with a pixel-perfect A4 page preview.
## How It Works
In the resume builder, link a job from your tracker to the resume you are working on. The AI uses the job description, company name, and role title to tailor your cover letter.
Before generating, choose your preferred tone, length, and focus area. These settings shape the style and content of the letter.
Click the generate button. The AI analyzes your resume and the job posting to produce a cover letter that highlights your most relevant qualifications.
Use the built-in rich text editor to make any changes. Add personal touches, adjust wording, or restructure paragraphs to make the letter your own.
Click **Finalize & export** in the toolbar. Choose to export your cover letter as PDF, print it, or email it. You can export the resume and cover letter together.
## Tone Settings
The cover letter builder offers five tone levels so you can match the voice of your letter to the company you are applying to:
| Level | Style | Best for |
| ----------------------- | --------------------------- | ---------------------------- |
| 1 - Very Casual | Friendly and conversational | Startups, creative roles |
| 2 - Casual | Relaxed but professional | Modern companies, tech roles |
| 3 - Neutral | Balanced and approachable | Most applications |
| 4 - Professional | Formal and business-like | Corporate roles, finance |
| 5 - Highly Professional | Executive-level language | Senior positions, consulting |
## Length Options
Choose how detailed your cover letter should be:
* **Short** (150-200 words) - Concise and to the point. Great for online applications with character limits.
* **Medium** (250-350 words) - Standard length with a balanced structure. Works for most situations.
* **Long** (400-500 words) - Comprehensive and detailed. Ideal when you want to tell a fuller story.
## Focus Areas
Direct the AI to emphasize what matters most for your application:
* **Balanced** - A well-rounded letter covering skills, experience, and personality equally.
* **Skills** - Highlights technical competencies, tools, and certifications.
* **Experience** - Emphasizes your work history, projects, and professional growth.
* **Achievements** - Leads with concrete results, metrics, and impact.
* **Personality** - Focuses on cultural fit, soft skills, and motivation.
## Smart Placeholders
The cover letter editor supports dynamic placeholders that make it easy to reuse and customize letters. Type `/` in the editor to insert a placeholder from the quick menu.
Available placeholders:
| Placeholder | Description | Auto-filled from |
| ------------ | ------------------- | ---------------- |
| `{company}` | Company name | Linked job |
| `{position}` | Job title | Linked job |
| `{contact}` | Hiring manager name | Job contacts |
| `{date}` | Current date | Auto-generated |
| `{location}` | Job location | Linked job |
| `{salary}` | Salary range | Linked job |
When you link a job from your tracker, placeholders are automatically filled with the job details. You can always edit them manually in the placeholders panel.
## Exporting Your Cover Letter
Click **Finalize & export** in the toolbar to open the export wizard. In the export step, toggle **Cover Letter** on (and optionally **Resume** to export both at once).
Export formats:
* **PDF** - download a professionally formatted A4 document ready to attach to applications
* **Print** - send directly to your printer
* **Email** - send the cover letter PDF to any email address
The exported PDF includes your personal header (name, email, phone, address) which you can toggle on or off and align left, center, or right.
## Tips for Better Cover Letters
**Always link a job first.** The AI produces much better results when it has a job description to work with. The more detail in the job posting, the more tailored your letter will be.
**Match the tone to the company.** Read the job posting carefully. A startup using casual language calls for a different tone than a law firm posting a formal listing.
**Edit after generating.** AI gives you a strong starting point, but adding a personal anecdote or specific detail about why you want to work at the company makes a real difference.
## Settings Defaults
Set default tone, length, and focus area in [Settings → Applications → Cover Letter Defaults](/features/settings). Auto-prepare and any new cover letter you create will start with those defaults.
## Related Features
Need to build or update your resume first? Head to the [Resume Builder](/features/resume-builder) to create an ATS-optimized resume. You can also [track your applications](/features/job-tracker) and let [Autopilot](/features/autopilot) auto-prepare cover letters for new matches.
# Dashboard
Source: https://docs.mokaru.ai/features/dashboard
Your Mokaru home screen - pipeline KPIs, weekly application goal, recent activity, and an agenda of upcoming interviews and follow-ups
## Overview
The Dashboard is your home screen in Mokaru - the page you land on when you open the app. It pulls together the numbers that matter (active pipeline, monthly trend, weekly goal), surfaces what's happening next (interviews, follow-ups, calendar events), and gives you one-click jump-offs to recent jobs and resumes.
## Layout
The dashboard has two columns on desktop:
* **Main area** - KPIs, actions, recent activity, and weekly goal
* **Right column** - Agenda with interviews, applications, actions, and calendar events
On mobile, the agenda collapses into an inline section below the main content.
## Main Area
### Hero Pipeline
The hero card shows your **active applications** - everything currently in Watchlist, Applied, or any interview stage. Below the count, you see the **month-over-month trend** so you know whether your activity is picking up, holding steady, or dropping off.
A direct **Open tracker** link takes you to the full Tracker pipeline.
### Secondary KPIs
A strip of three smaller KPI tiles surfaces additional numbers:
* **This month** - applications sent this month, with a trend indicator vs last month
* **Response rate** - percentage of applications that got any response
* **Interviews** - upcoming scheduled interviews
### Weekly Application Goal
Set a target for how many applications you want to send each week. The goal card shows your progress as a ring or bar that fills as you move applications into the **Applied** column. The week resets every Monday.
Most successful job searches average 5-10 applications per week of focused, tailored applications. Volume only works if quality stays up.
### Actions Card
A "what to do next" card that surfaces actionable items:
* Upcoming interviews
* Follow-up actions due
* Recent jobs that match your default resume
* Email suggestions (pending status updates from connected mailbox)
Each row links to the relevant page so you can act in one click.
### Recent Jobs
A small widget showing recent jobs that match your default job title. Each row links into the Jobs page or saves straight to the tracker.
### Recent Resumes
A compact table of your most recently edited resumes with one-click access back to the builder.
## Right Column - Agenda
The agenda groups everything time-relevant into one column:
| Section | What you see |
| ------------------- | ----------------------------------------------------- |
| **Interviews** | Upcoming scheduled interviews with company and date |
| **Applications** | Applications with date-based actions due |
| **Follow-ups** | Auto-generated and manual follow-up tasks |
| **Calendar events** | Events from your connected Google or Outlook calendar |
If you haven't connected a calendar yet, the agenda includes a **Connect** prompt for Google or Outlook.
The agenda only syncs from your connected calendar when **Calendar Sync** is enabled (Plus feature). Each sync fetches events 7 days back and 60 days forward.
## Promos and Onboarding
A few cards rotate in based on your state:
* **MCP Server promo** - shows once if you're Plus and haven't connected an AI agent yet
* **Browser extension promo** - shows if you haven't installed the Chrome extension
* **Plus promo** - shows for Free users with a feature highlight
These dismiss once acted on.
## Customizing the Dashboard
The dashboard's central area also exposes an editable widget grid. Click the **Edit** button to enter edit mode, then:
* Drag widgets to reorder them
* Resize widgets between small/medium/large
* Click an empty cell or use **Add widget** to choose from available widgets
Available widgets today: **Application Funnel** and the **Plus promo card**. More widgets are rolling out over time.
Your layout is saved per account, so it stays consistent across devices.
## Auto-Sync Behavior
A few things refresh automatically when you open the dashboard:
* **Calendar** - if it's been more than an hour since the last sync, Mokaru fetches updates in the background
* **Email** - new emails are linked to applications and contacts in real time (when Email Integration is on)
* **Stats** - all KPI numbers are computed on each load, no manual refresh needed
## Related Features
The Dashboard pulls data from across the app: applications and statuses from the [Tracker](/features/job-tracker), interviews from the [Calendar Integration](/features/calendar-integration), suggestions from [Email Integration](/features/email-integration), and your weekly goal from settings.
# Email Integration
Source: https://docs.mokaru.ai/features/email-integration
Connect your Outlook email to send application emails, track recruiter responses, and get AI-powered status suggestions directly from Mokaru
## Overview
The Mokaru Email Integration connects your email account to your job search workflow. Send application emails, track recruiter replies, and get AI-powered suggestions when your application status changes - all without leaving Mokaru.
Email Integration is a **Plus** feature. [Upgrade your plan](/features/pricing) to get started.
## Key Features
Compose and send job application emails using your own email address - no need to switch between apps.
Get notified inside Mokaru when new emails arrive, so you never miss a recruiter response.
Recruiter emails are automatically linked to your contacts and applications for easy reference.
AI analyzes incoming emails and suggests status updates for your applications - like marking an interview invite or rejection.
## Connecting Your Email
Currently, Mokaru supports **Microsoft Outlook** (including Outlook.com, Hotmail, and Microsoft 365 work accounts). Gmail support is coming soon.
Navigate to **Settings** and select the **Integrations** tab.
Click **Connect Outlook**. You will be redirected to Microsoft to sign in and grant permissions.
Microsoft will ask you to approve the following permissions:
* **Send mail** - so Mokaru can send emails on your behalf
* **Read mail** - so Mokaru can notify you about new messages
* **Read your profile** - so Mokaru knows which email address to use
Make sure to approve all requested permissions. If you skip any, the integration will not work correctly and you will need to reconnect.
You will be redirected back to Mokaru. Your email is now connected and ready to use.
## Sending Emails
Once your mailbox is connected, you can send emails directly from Mokaru. Emails are sent from your own Outlook address, so recipients see your real email - not a generic Mokaru address.
You can send emails from:
* **Contact pages** - reach out to recruiters and hiring managers you have saved
* **Application details** - follow up on specific job applications
## Email Tracking
When your mailbox is connected, Mokaru automatically links incoming emails from your saved contacts to their contact profiles. This gives you a complete conversation history for each recruiter or hiring manager.
Tracked emails appear in:
* **Contact detail pages** - see all emails from a specific contact
* **Contact timeline** - emails shown alongside interviews and application events
* **Application details** - emails linked to specific job applications
Add recruiter email addresses to your contacts so Mokaru can automatically match incoming emails to the right person.
## Inbox Notifications
Your Mokaru dashboard shows a notification when new emails arrive in your inbox. This works in real time - no need to refresh. Click the notification to open your email, or dismiss it to clear the alert.
## Smart Email Suggestions
Mokaru uses AI to analyze incoming recruiter emails and suggest application status updates. For example:
| Email Type | Suggested Status |
| -------------------- | ------------------------------------------- |
| Rejection email | Mark application as **Rejected** |
| Interview invitation | Mark application as **Interview Scheduled** |
| Job offer | Mark application as **Offer** |
Suggestions appear on your dashboard. You can accept or dismiss each one with a single click. Only high-confidence suggestions are shown, so you stay in control of your application statuses.
## Disconnecting Your Email
To disconnect your email account:
1. Go to **Settings** and select the **Integrations** tab
2. Click **Disconnect** on your connected email provider
3. Mokaru will remove your email connection and stop tracking new emails
Disconnecting does not delete previously tracked emails or suggestions. Your existing data stays intact.
## Troubleshooting
If your email integration stops working, check the **Diagnostics** panel in Settings under the Integrations tab. Common issues include:
* **Expired permissions** - reconnect your account to refresh access
* **Missing permissions** - disconnect and reconnect, making sure to approve all requested permissions
* **Subscription inactive** - use the retry button in Diagnostics to restore real-time notifications
## Privacy and Security
Your email data is handled with care:
* **Your credentials are encrypted** - OAuth tokens are encrypted with AES-256-GCM and stored securely
* **Mokaru never stores your password** - the integration uses Microsoft's OAuth protocol
* **Limited access** - Mokaru only reads inbox messages for notification purposes and sends emails you explicitly compose
* **You stay in control** - disconnect at any time to revoke all access
## Related Features
Combine email integration with [Calendar Integration](/features/calendar-integration) to sync both your schedule and communications. Manage all connections from [Settings](/features/settings), and link emails to your [Contacts](/features/contacts) for a complete activity timeline.
# Jobs
Source: https://docs.mokaru.ai/features/job-search
Search thousands of job listings by title, company, or keyword with filters for location, work arrangement, employment type, salary, and date posted
## Overview
The Jobs page is your job-search hub. Search Mokaru's database by title, company, or keywords, narrow results with filters, and save anything interesting to the [Tracker](/features/job-tracker). The same page hosts your [Autopilot](/features/autopilot) agents on a second tab.
## Tabs
The Jobs page has two tabs:
* **Search** - one-off job searches with filters
* **Autopilot** - your saved Autopilot agents and their daily match feed. Count badge shows new matches across all agents. See [Autopilot](/features/autopilot) for the full reference.
## Key Features
Search by job title, company name, or keywords across thousands of listings.
Narrow results by location, work arrangement, employment type, salary, and posting date.
Found a job you like? Save it directly with one click - with optional Auto-prepare.
Our job database is updated daily so you always see fresh listings.
## Searching for Jobs
Type a job title, company name, or keyword into the search bar. For example: "Product Manager", "Google", or "frontend developer".
Use the filter dropdown to narrow your results. You can combine multiple filters at once.
Results are sorted by posting date, with the newest listings first. Each result shows the job title, company, location, salary (when available), and employment type.
Click **Save** to add a job to your tracker, or click **Apply** to go directly to the application page.
## Filters
Use filters to find exactly what you're looking for:
| Filter | Options |
| --------------------- | -------------------------------------------------- |
| **Location** | Any city, region, or country (with autocomplete) |
| **Work arrangement** | Remote / Hybrid / On-site |
| **Employment type** | Full-time, Part-time, Contract, Internship |
| **Date posted** | 24 hours, 3 days, Week, Month, Any time |
| **Salary range** | Predefined salary brackets |
| **Include companies** | Only show jobs from these companies |
| **Exclude companies** | Hide jobs from these companies |
| **Include keywords** | Require these keywords in the title or description |
| **Exclude keywords** | Hide jobs containing these keywords |
| **Show hidden** | Re-surface jobs you previously dismissed |
Active filters show as removable pills above the results.
**Combine work arrangement = Remote with a country filter** to find remote jobs hiring in your time zone. This is helpful when companies hire remotely but only within specific regions.
## Daily Database Refresh
Mokaru automatically refreshes its job database every day. The system looks at the most popular job titles across all users and fetches the latest listings, so trending roles are always up to date.
You do not need to do anything for this - fresh jobs appear automatically when you search.
## Free vs. Plus
Search Mokaru's job database, which is refreshed daily with listings from across the web.
Get results from additional external job board providers in real time, on top of the standard database. More sources means more listings and faster access to newly posted jobs.
All users have access to the full job search experience, including all filters and the ability to save jobs. Plus unlocks additional sources for broader coverage.
## Saving Jobs to Your Tracker
When you save a job from Jobs, it lands in your [Tracker](/features/job-tracker) Watchlist with all the original details from the listing - title, company, location, salary, posting URL.
Toggle **Auto-prepare** when saving and Mokaru duplicates your base resume and tailors it for the role automatically (Plus + complete base resume required).
## Want it on autopilot?
If you find yourself running the same search every day, set it up once as an [Autopilot](/features/autopilot) agent. Mokaru will scan for matching jobs daily, score them against your profile, and either notify you or auto-prepare a tailored resume.
## Before You Apply
Before applying, [tailor your resume](/features/resume-builder) to match the job description using AI keyword matching. You can also [generate a cover letter](/features/cover-letters) for the role.
# Tracker
Source: https://docs.mokaru.ai/features/job-tracker
Track job applications from watchlist to offer with a Kanban pipeline, automatic follow-up reminders, Auto-prepare resume tailoring, and contacts linking
## Overview
The Mokaru Tracker is your central hub for managing every job application. Whether you are applying to five roles or fifty, the Tracker gives you a visual pipeline, automatic reminders, and a contacts tab so nothing slips through the cracks.
The Tracker is the page at `/tracker` in the sidebar. Your top-level pipeline KPIs and weekly goal live on the [Dashboard](/features/dashboard).
## Key Features
See every application at a glance on a drag-and-drop Kanban board or switch to list view.
Automatic follow-up reminders are created when you apply, so you never forget to check in.
Let AI prepare your application materials the moment you save a job.
Manage recruiters and hiring managers linked to each application from the same page.
## Tabs
The Tracker page has two top-level tabs:
* **Jobs** - the application pipeline (Kanban or list)
* **Contacts** - recruiters, hiring managers, and other people tied to your applications. See [Contacts](/features/contacts) for the full reference.
## Application Pipeline
### Viewing Your Applications
You can view applications in two ways:
* **Kanban board** - drag-and-drop cards between status columns. Great for a visual overview.
* **List view** - a compact table with sorting and filtering. Ideal when you have many applications.
Your preferred view is remembered automatically.
Use the search bar to filter applications instantly. You can search by job title, company name, or tag - and combine multiple terms to narrow results.
### Application Statuses
Every application flows through these statuses. Move applications forward by dragging them on the Kanban board or updating the status inside the application detail view.
Jobs you are interested in but have not applied to yet. This is your shortlist.
Auto-prepare is working on your application materials (resume tailoring, research). This status is set automatically.
You have submitted your application. A follow-up reminder is created automatically (14 days by default).
The company has responded to your application.
You are going through an initial screening round (phone screen, recruiter call).
An interview has been booked. Add the date and it syncs to your calendar.
You have completed an interview round. If there is another round, move it back to Interview Scheduled.
You have received a job offer. Record salary, benefits, and other details.
You are negotiating the terms of the offer.
Congratulations - you have accepted the offer.
Applications can also be marked as **Rejected**, **Withdrawn**, or **No Response** at any point. These move to an archive view so they don't clutter the active pipeline.
### Undo Status Changes
Made a mistake? Every status change can be undone within 5 minutes. Look for the undo option in the application timeline.
## Adding Applications
Use the **Add Application** button at the top of the tracker.
Fill in the job title, company name, and optionally a link to the job posting.
Toggle Auto-prepare on and Mokaru will automatically tailor a copy of your base resume to the role.
Your application is added to the Watchlist (or Preparing if Auto-prepare is enabled) and you are ready to go.
Already have the Mokaru browser extension installed? You can save jobs directly from job boards like LinkedIn and Indeed with one click - no need to copy and paste URLs.
### Duplicate Detection
If you try to add a job with the same URL as an existing application, Mokaru takes you to the existing one instead of creating a duplicate.
## Auto-prepare
When you add an application with Auto-prepare enabled, Mokaru does the heavy lifting for you:
1. **Duplicates your base resume** and creates a tailored version for the specific role
2. **Analyzes the job posting** to identify key requirements
3. **Optimizes your resume** with relevant keywords and (optionally) generates a cover letter
Your application moves from Watchlist to Preparing while this runs, and you will see live progress updates on the application detail page.
You can tune which pipeline steps run from [Settings → Applications](/features/settings).
For continuous, hands-off application prep, set up an [Autopilot](/features/autopilot) agent. It auto-prepares matches as they come in, every day.
## Auto Follow-Ups
Staying on top of follow-ups is one of the most effective job search strategies. Mokaru makes this effortless.
* When you move an application to **Applied**, a follow-up reminder is automatically scheduled for 14 days later
* Follow-ups appear in your [Dashboard agenda](/features/dashboard) and sync to your connected calendar
* When the application status changes (for example, the company responds), the old follow-up is automatically removed
* You can turn auto follow-ups off globally in [Settings → Applications](/features/settings)
## Application Detail View
Click any application to see its full detail view. This is where you manage everything about a specific job.
View and edit the job title, company, URL, salary range, and location. All fields are editable inline.
Add private notes to each application. Use these to jot down interview prep, conversation highlights, or anything you want to remember.
See a full history of every status change, with timestamps. This helps you understand how long each stage took and spot bottlenecks.
Access the resume and cover letter attached to this application. If you used Auto-prepare, the tailored resume lives here.
Link recruiters, hiring managers, and other contacts to the application. Keep all your networking details organized.
See upcoming interviews and deadlines. Events from your connected Google or Outlook calendar are shown here too.
When you receive an offer, record the salary, currency, benefits, and other terms to compare across multiple opportunities.
## Tags & Filtering
Organize your applications with custom tags. Tag by industry, location, priority, source, or anything else that makes sense.
* Tags are shared between Jobs and Contacts tabs, so filtering by a tag shows relevant items across both
* Use the filter bar to narrow your pipeline by status, tag, or archive state
* Combine tag filters with search for precise results
See [Tags](/features/tags) for the full reference.
## Bulk Operations
When managing many applications at once, you can:
* **Archive** applications that are no longer active to keep your pipeline clean
* **Delete** applications you added by mistake
* **Filter by status** to focus on a specific stage of the pipeline
Archived applications are not deleted. You can always view them by toggling the archive filter in the filter bar.
## Tips for an Effective Job Search
Aim to have applications in multiple stages at once. If everything is stuck in Applied, it might be time to follow up or adjust your approach.
Create tags like "Top Choice", "Remote", or "Referral" to quickly filter and prioritize your applications.
Check the [Dashboard](/features/dashboard) funnel and weekly activity. Patterns in your data - like low response rates - can signal that your resume or targeting needs adjustment.
Write a quick note after every call, email, or interview while details are fresh. These notes are invaluable when preparing for follow-up conversations.
## Related Features
Pipeline KPIs and the weekly goal live on the [Dashboard](/features/dashboard). Tag your applications and contacts with [Tags](/features/tags), manage recruiter relationships in the [Contacts](/features/contacts) tab, and [generate tailored cover letters](/features/cover-letters) for any tracked job.
# Pricing & Plans
Source: https://docs.mokaru.ai/features/pricing
Compare Mokaru Free and Plus plans - unlimited resume exports, AI writing, cover letters, calendar sync, email integration, and more for job seekers
## Overview
Mokaru offers two plans to support your job search - a Free plan to get started and a Plus plan for job seekers who want every advantage. Both plans give you access to the core resume builder and job tracker.
For the latest pricing and billing options, visit [mokaru.ai/pricing](https://mokaru.ai/pricing). Mokaru Plus is available with weekly, monthly, quarterly, and yearly billing.
## Free vs Plus
| Feature | Free | Plus |
| ------------------------------------------- | ------------------- | ------------------------------------------------------- |
| Resume Builder | 1 export/month | Unlimited exports |
| Resume Export Pages | 1 page max | Unlimited pages |
| AI Writing Assistance | 10 credits/month | Unlimited |
| Tracker | 5 applications | Unlimited |
| Keyword Matcher | Top 25% of keywords | Full keyword analysis |
| Cover Letters | - | Included |
| Email Templates | - | Included |
| Resume Score Analysis | - | Included |
| Calendar Sync | - | Included |
| Email Integration | - | Included |
| External Job Sources | - | Real-time results from extra job boards |
| Autopilot Agents | - | Up to 3 active agents |
| Premium Resume Sections | - | Certificates, Interests, Projects, Publications, Awards |
| Resume Design (background, decorative bars) | Basic only | Full customization |
| Auto-prepare | Costs 5 AI credits | Included |
| Tags | 1 tag | Unlimited |
| API Keys | - | Included |
| MCP for AI Agents | - | Included |
| Priority Support | - | Included |
## What's Included in Free
The Free plan is a great starting point for building your resume and tracking your first applications.
Build a professional, ATS-optimized resume with 1 PDF export per month (single-page).
Get 10 AI credits per month to improve descriptions, optimize keywords, and more.
Track up to 5 active job applications with status updates and notes.
Save jobs from supported job boards and autofill applications.
The Free plan is perfect for trying out Mokaru. When you're ready to apply to more positions, upgrade to Plus for unlimited access.
## What's Included in Plus
Plus removes all limits and unlocks every feature so you can focus on landing your next role.
No monthly cap on AI-powered resume writing, keyword optimization, and other AI features.
Track as many job applications as you need with no restrictions.
Export your resume to PDF as often as you like, with no page limit - perfect for tailoring to each application.
See every keyword from the job description and exactly how your resume matches up.
Generate tailored cover letters that match each job posting.
Access professional email templates for follow-ups, thank-you notes, negotiations, and more.
Get a detailed breakdown of how your resume scores and specific tips to improve it.
Sync interviews and deadlines to your calendar and connect your email for seamless tracking.
Up to 3 AI agents that scan job boards daily, score matches, and notify you or auto-prepare resumes.
Connect Claude, Cursor, and other MCP-compatible AI agents via OAuth - no API keys to manage.
### Premium Resume Sections
Plus users can add extra sections to their resume that help them stand out:
* **Certificates** - List professional certifications, licenses, and courses
* **Interests** - Show personal interests and hobbies relevant to the role
* **Projects** - Showcase portfolio work, side projects, or open source contributions
* **Publications** - List research papers, articles, or blog posts
* **Awards** - Highlight honors, scholarships, and achievements
## Feature Limits at a Glance
| Resource | Free | Plus |
| ------------------- | -------- | --------- |
| AI credits | 10/month | Unlimited |
| Job applications | 5 | Unlimited |
| Resume exports | 1/month | Unlimited |
| Resume export pages | 1 page | Unlimited |
| Tags | 1 | Unlimited |
| Keyword visibility | 25% | 100% |
## How to Upgrade
Upgrading to Plus takes less than a minute:
1. Open the **user menu** in the top-right and click **Billing** (or go to [app.mokaru.ai/billing](https://app.mokaru.ai/billing))
2. Choose your preferred billing period (weekly, monthly, quarterly, or yearly)
3. Complete checkout through Stripe
Your Plus features activate immediately after payment. If you upgrade mid-period, your AI credit limit is adjusted based on remaining days in the billing period.
Choose quarterly or yearly billing for the best value. Visit [mokaru.ai/pricing](https://mokaru.ai/pricing) for current rates.
## Managing Your Subscription
From the **Billing** page (`/billing`) you can:
* **View your current plan** and billing period
* **Upgrade your billing period** (e.g. weekly to monthly) with prorated credit
* **Cancel your subscription** - you keep Plus access until the end of your current billing period
* **Reactivate** a cancelled subscription before it expires
* **Open the Stripe Customer Portal** to update your card or download invoices
If you cancel, your data is never deleted. You simply return to Free plan limits when your billing period ends. You can resubscribe at any time to regain Plus access.
# Resume Builder
Source: https://docs.mokaru.ai/features/resume-builder
Build ATS-optimized resumes with AI writing assistance, keyword matching, professional templates, and real-time PDF preview to land more interviews
## Overview
The Mokaru AI resume builder helps you create professional, ATS-optimized resumes that get past applicant tracking systems and land interviews. Build once, tailor for every application - each resume owns its own content, while your identity and contact details stay shared across all your resumes.
## Key Features
Improve your work experience descriptions with AI-powered suggestions that use action verbs and quantifiable achievements.
Analyze job descriptions and get keyword recommendations so your resume passes ATS filters.
Choose from 8 professionally designed resume templates - 7 are fully ATS-friendly.
See every change reflected instantly in a real-time PDF preview as you edit.
Your work is saved automatically as you type. No more lost progress.
Adjust colors, fonts, spacing, and content through a conversational AI assistant right inside the builder.
## Getting Started
From the **Resumes** page, click **New Resume**. You can start from a blank resume, import an existing resume, or copy the content from your base (default) resume to start.
Pick a template from the gallery. All templates are customizable - you can always switch later without losing content.
Fill in your sections using the editor on the left. The live preview on the right updates as you type.
Connect a job posting to get keyword suggestions, then use AI features to strengthen your descriptions.
Click **Finalize & export** in the toolbar. The export wizard guides you through any last improvements before downloading your PDF.
## Resume Sections
Your resume can include any combination of these sections. Reorder, show, or hide them per resume.
| Section | What to include |
| ------------------- | -------------------------------------------------------------------- |
| **Personal Info** | Name, contact details, LinkedIn, portfolio URL |
| **Job Title** | Headline shown under your name |
| **Summary** | A brief professional summary or objective statement |
| **Work Experience** | Job titles, companies, dates, and achievement-focused descriptions |
| **Education** | Degrees, institutions, graduation dates, and honors |
| **Skills** | Technical and soft skills relevant to your target role |
| **Projects** | Side projects, open source contributions, or portfolio pieces (Plus) |
| **Certificates** | Professional certifications, licenses, and courses (Plus) |
| **Awards** | Recognitions, honors, and achievements (Plus) |
| **Publications** | Articles, papers, or other published work (Plus) |
| **Interests** | Optional section for personal interests (Plus) |
| **Custom Sections** | Add freeform sections for languages, volunteering, references, etc. |
You do not need to use every section. Focus on what is most relevant to the job you are applying for. Hide sections that do not add value for a specific application.
## Templates
Mokaru offers 8 resume templates with two layout styles.
**Classic**, **Professional**, **Executive**, **Harvard**, **Beacon**, **Minimal**, and **LaTeX Classic** - all ATS-friendly and ideal for most industries.
**Modern** - a sidebar layout with a contemporary look. Best for creative roles where visual design matters.
Every template supports full design customization:
* **Colors** - accent color, background, text, and per-section color overrides
* **Typography** - font family, size, weight, and line spacing
* **Spacing** - margins, section gaps, and content density
* **Decorations** - section title styles, dividers, and accent bars
* **Layout** - section order, alignment, and bullet styles
If you are applying through an ATS (most large companies), choose one of the seven single-column templates. They are designed to be parsed correctly by applicant tracking systems. The two-column Modern template works best for direct applications or creative roles.
## Your Base Resume
Your base resume is the foundation for all your job applications. It contains your complete career profile - every experience, skill, and qualification you have. When you use features like **Auto-prepare**, Mokaru takes your base resume and automatically tailors it for a specific job posting by adjusting your summary, reordering sections, and highlighting the most relevant skills and experience.
Think of it as your "master" version:
* **Set it once** - mark any resume as your base by clicking the star icon on the Resumes page
* **Keep it complete** - include all your experience, skills, and certifications, even if they would not all appear on a single application
* **Auto-prepare uses it** - when you save a job and enable Auto-prepare, Mokaru creates a tailored copy from your base resume, optimized for that specific role
* **Keep it current** - update your base resume whenever you gain new experience or skills, and every new resume you create afterwards starts from that updated content (resumes you already created keep their own copy)
Your base resume does not need to be perfect for any one job. Its purpose is to be comprehensive. The tailoring happens automatically when you apply.
## One Base, Multiple Resumes
Each resume owns its own content. A new resume starts as a copy of your base (default) resume; editing the base afterwards doesn't change resumes you already created. Content you add lands on your base resume, so it flows into every new resume you create next. Identity and contact details (name, email, phone, links, photo) are shared and appear on every resume.
Each resume controls its own:
* **Visibility** - hide specific experiences, skills, or sections that are not relevant to a particular role
* **Section order** - arrange sections in the order that best highlights your strengths for each job
* **Summary and job title** - select different summary variants and job titles per resume
* **Design** - each resume can use a different template and color scheme
Create a "master" resume with all your experience, then duplicate it and hide irrelevant sections for each application. This is faster than building from scratch every time.
## AI Features
Paste a basic job description and the AI rewrites it to be more impactful - adding action verbs, quantifiable results, and stronger phrasing.
Connect a job posting to your resume. The AI analyzes the job description and suggests keywords to include so your ATS resume scores higher.
Catch grammar issues, passive voice, and inconsistent formatting before you submit.
Type natural language requests like "make the headings larger" or "use a blue accent color" and the AI adjusts your resume design instantly.
Generate professional summary variants tailored to different roles or industries. Save multiple versions and select the best one per resume.
Link a job posting and let Auto-prepare tailor your entire resume to match the role - adjusting your summary, highlighting relevant skills, and reordering sections.
## Exporting Your Resume
Click **Finalize & export** in the top-right toolbar to start the export wizard. The wizard walks you through a few steps before exporting:
If your resume has a score, the wizard shows it along with actionable advice. You can connect a job posting for keyword matching or skip ahead.
When a job posting is connected, the wizard highlights any missing keywords from the job description so you can add them before exporting.
Pick what to export (resume, cover letter, or both) and how:
* **PDF** - download a print-ready, professionally formatted PDF
* **Print** - send directly to your printer
* **Email** - send the PDF to any email address
After exporting, you can save the job as an application in your Tracker to keep track of your progress.
Free plan users have limited exports. Upgrade to **Plus** for unlimited exports, cover letters, Auto-prepare, and full keyword matching.
## Tips for a Strong Resume
Generic resumes get filtered out. Use the visibility toggles and keyword matcher to customize your resume for each job posting.
Instead of "Responsible for managing a team," write "Led a team of 8 engineers, delivering 3 major releases ahead of schedule." Use the AI rewriter to help.
For most professionals, one to two pages is ideal. Use the hide feature to remove older or less relevant experience.
The template system handles this for you - consistent fonts, spacing, and bullet styles across all sections.
Many companies use ATS software to filter resumes by keywords. Connect a job posting and use the keyword matcher to make sure you are not missing critical terms.
Avoid using images, graphics, or unusual formatting in your resume. Most applicant tracking systems cannot read them, which may cause your resume to be rejected before a human ever sees it.
## What's Next?
Once your resume is ready, [generate a tailored cover letter](/features/cover-letters) to pair with your application. You can also [search for jobs](/features/job-search) or set up an [Autopilot](/features/autopilot) agent to find matches daily, then save them to your [Tracker](/features/job-tracker).
# Settings
Source: https://docs.mokaru.ai/features/settings
Configure notifications, default resume, application pipeline preferences, integrations, API keys, and MCP connections in Mokaru
## Overview
Settings is organized into 4 sections, navigable from the left rail on desktop or a section picker on mobile. **Billing lives on its own page** (`/billing`), not inside Settings.
| Section | What you configure |
| ----------------- | ------------------------------------------------------------ |
| **Notifications** | Marketing/system/feature email toggles, weekly digest |
| **Resumes** | Default resume language and default template |
| **Applications** | Auto-follow-up, auto-prepare pipeline, cover letter defaults |
| **Integrations** | Calendar sync, email integration, API keys, MCP connections |
## Notifications
Control which emails Mokaru sends you.
Product news, tips, and updates about new features.
Important account messages - security, billing, and policy changes. We recommend keeping this on.
Notifications when features you use get major updates.
A summary of your job search activity sent once a week.
## Resumes
Defaults that the resume builder uses when you create new resumes.
### Resume Language
This setting controls the language of all AI-generated content - resume bullet points, summaries, cover letters, and keyword suggestions. It's **separate from the interface language**, so you can use Mokaru in English while writing resumes in Dutch, German, French, or any of 35+ supported languages.
Set this to the language of the country you're applying in, not your native language. If you're in Belgium applying for jobs in French, use French.
### Default Template
Pick which of the 8 resume templates is used when you create a new resume without explicitly choosing one. You can always switch templates after creation.
## Applications
Configure how Mokaru handles your application pipeline.
### Auto-Follow-Up
When enabled, every application moved to **Applied** gets an automatic follow-up reminder 14 days later. The reminder appears in your agenda and syncs to your calendar. Turn off if you prefer manual reminders.
### Auto-Prepare Pipeline
Auto-prepare runs when you save a job with the **Auto-prepare** toggle on (or when an Autopilot agent is set to auto-prepare). It duplicates your base resume and tailors it for that specific role. The pipeline is configurable in 4 steps:
Pull keywords from the job description. Always on if Auto-prepare is on.
Where to inject those keywords into your resume. Toggle per section:
* **Summary**
* **Work experience**
* **Education**
* **Skills**
Run grammar, style, and conciseness checks on the tailored output.
Generate a cover letter for the role using your defaults (tone, length, focus - see below).
### Cover Letter Defaults
Set the defaults used when Auto-prepare generates a cover letter:
| Setting | Options |
| ---------- | ----------------------------------------------------------- |
| **Tone** | 1 (very casual) - 5 (highly professional) |
| **Length** | Short / Medium / Long |
| **Focus** | Balanced / Skills / Experience / Achievements / Personality |
You can still override these per cover letter in the resume builder.
Auto-prepare and Cover Letters are **Plus** features. The toggles are visible to Free users but flip to a paywall on save.
## Integrations
All third-party connections live here.
### Calendar Sync
Connect Google Calendar or Outlook to sync interviews, follow-ups, and view external events inside the Mokaru agenda.
To connect:
1. Click **Connect** next to Google Calendar or Outlook Calendar.
2. Sign in and grant Mokaru permission to read and write calendar events.
3. Sync starts automatically. Each provider card shows the connected email, last sync time, and a **Sync now** button.
You can connect both providers at once.
Calendar Sync is a **Plus** feature. See [Calendar Integration](/features/calendar-integration) for the full workflow.
### Email Integration
Connect Outlook to send application emails from your own address, get inbox notifications inside Mokaru, and let AI suggest status updates from incoming recruiter messages.
To connect:
1. Click **Connect Outlook**.
2. Approve send-mail, read-mail, and read-profile permissions.
3. A diagnostics panel shows subscription status and any reconnection prompts.
Email Integration is a **Plus** feature. See [Email Integration](/features/email-integration) for tracking and suggestions details. Gmail support is on the roadmap.
### API Keys
Generate `mk_...` keys to use the [Mokaru REST API](/api-reference/introduction) from automation tools, scripts, or custom integrations. Keys can be named, listed, and revoked individually.
A direct install card for the **OpenClaw / ClawhHub** skill sits in the same section if you want to plug Mokaru into the OpenClaw agent without writing code.
API Keys are a **Plus** feature.
### MCP Connections
Authorized AI agents (Claude.ai, Claude Desktop, Cursor, Continue, Zed, custom) connect via OAuth - no API key copy/paste. The MCP Connections card shows every active connection with the client name and last-used timestamp, and a **Revoke** button per connection.
For setup steps, see [MCP for AI Agents](/integrations/mcp).
MCP integration is a **Plus** feature.
## Account, Password, and Delete
Account-level actions (change password, delete account, view account ID) live in the user menu in the top-right or footer of the app, opened from your avatar. Password changes redirect to your authentication provider; account deletion requires explicit confirmation and is permanent.
## Billing
Billing is on its own page at **/billing** - access it via the user menu or any "Manage subscription" link. See [Pricing & Plans](/features/pricing) for plan details and what each plan unlocks.
## Related Pages
* [Calendar Integration](/features/calendar-integration) - full setup and sync behavior
* [Email Integration](/features/email-integration) - sending, tracking, and AI suggestions
* [Browser Extension](/features/browser-extension) - install and use the Chrome extension
* [MCP for AI Agents](/integrations/mcp) - connect Claude, Cursor, and other MCP clients
* [API Reference](/api-reference/introduction) - REST API for automation tools
# Tags
Source: https://docs.mokaru.ai/features/tags
Organize job applications, contacts, and resumes with custom color-coded tags and cross-entity filtering
## Overview
Tags let you organize job applications, contacts, and resumes with custom, color-coded labels. Create tags like "Top Choice", "Referred", or "Tech Industry" to categorize and filter everything in one place.
Whether you are tracking dozens of applications or managing a large network of contacts, tags give you a flexible system to slice through information and focus on what matters most.
## Creating Tags
You can create tags from anywhere you see the tag picker - on an application, contact, or resume. Each tag has:
* **Name** - a short label (up to 50 characters)
* **Color** - choose from green, purple, blue, orange, pink, cyan, or a custom hex color
Tag names are unique across your account, so the same tag can be used everywhere. You can also reorder tags to control which ones appear first in pickers and filters.
## Applying Tags
Tags work across all major sections of Mokaru:
Tag applications in your tracker to categorize by priority, source, or industry.
Tag networking contacts to group them by company, relationship, or follow-up status.
Tag resumes to organize different versions by role type or target company.
When you tag a job application, Mokaru automatically applies the same tag to linked resumes. This keeps everything connected without extra work. If you later remove the tag from the application, it is also removed from linked items - as long as no other tagged application still references them.
## Filtering by Tags
Use the tag filter in your [Tracker](/features/job-tracker) or [contacts](/features/contacts) view to instantly narrow down what you see. Select one or more tags to show only matching items. Your filter selections are saved between sessions, so you pick up right where you left off.
Combining tags with other filters (like application status or date range) lets you drill down even further. For example, filter by "Top Choice" and "Interview Stage" to see only your highest-priority applications that have interviews scheduled.
## Tag Detail View
Click any tag to open its detail page - a cross-entity workspace that shows all applications, contacts, and resumes with that tag in one view. This is a great way to see everything related to a specific opportunity or category at a glance.
The tag detail page also surfaces follow-up actions for tagged applications, so you never lose track of next steps.
## Tag Strategies
Here are a few approaches to get the most out of tags. You can mix and match strategies to fit your workflow.
### By Priority
Assign priority levels to applications so you always know where to focus your energy.
* **Top Choice** - your dream companies
* **Backup** - solid options that you would be happy with
* **Long Shot** - aspirational roles worth a try
### By Industry
Group applications and contacts by sector to keep related opportunities together.
* **Tech** / **Finance** / **Healthcare** / **Education** - organize by industry
* **Startup** / **Enterprise** - differentiate by company size
### By Application Stage
Track where things stand across your pipeline without relying solely on the kanban board status.
* **Referred** - applications where you have an internal referral
* **Follow Up** - items that need your attention this week
* **Offer Received** - positions where you are comparing offers
### By Work Style
Filter for the type of role you are looking for.
* **Remote** - fully remote positions
* **Hybrid** - mix of remote and on-site
* **Relocation** - roles that require moving to a new city
### By Source
Remember how you found each opportunity or contact.
* **LinkedIn** - sourced through LinkedIn
* **Referral** - came through your network
* **Job Board** - found on a job board or aggregator
The **Free** plan includes a limited number of tags. Upgrade to **Plus** for unlimited tags.
## Related Features
Tags work best alongside the [Tracker](/features/job-tracker) for organizing applications and the [Contacts](/features/contacts) tab for managing recruiter relationships. Both share the same tagging system for seamless filtering.
# MCP for AI Agents
Source: https://docs.mokaru.ai/integrations/mcp
Connect Claude, Cursor, and any MCP-compatible AI agent to your Mokaru account in one click
## What is MCP?
[Model Context Protocol (MCP)](https://modelcontextprotocol.io/) is an open standard that lets AI agents securely connect to external services. Once you connect Mokaru to your AI agent, it can search jobs, manage your applications, edit your resume, and update your profile - all using natural language.
MCP integration requires a **Plus plan**. Connecting and OAuth are free; tool calls use the same per-account rate limits as the REST API.
## What you can do
Out of the box, your AI agent can:
Search the Mokaru job database by query, location, work arrangement, employment type, and more.
List, create, update, and view applications. Auto-prepare tailored resumes from the default CV.
List, read, create, update, and export resumes as PDF.
Read and update your career profile. Manage your professional contacts.
See the [full tool reference](/integrations/mcp-tools) for every available action.
## Example prompts
Once connected, try these in your AI agent to see what Mokaru can do:
> "Search Mokaru for senior product manager roles in Amsterdam posted this week, remote-friendly. For the top three matches that pay above €80k, save them to my tracker and auto-prepare a tailored resume for each."
Calls: `mokaru_search_jobs` → `mokaru_create_application` (with `autoPrepare: true`) for each match. Mokaru's AI duplicates your default resume and rewrites it for the job (keyword optimization, rephrased experience, focused summary) in \~30 seconds.
> "Show me the resume I tailored for the Acme Corp role, then give me a link to export it as PDF."
Calls: `mokaru_list_resumes` → `mokaru_get_resume` → `mokaru_export_resume_pdf`. The tool returns a clickable link to the Mokaru web app with the Export section open; the user clicks "Export PDF" inside Mokaru to download the file. Direct inline PDF download via MCP is coming soon.
> "I just earned my AWS Solutions Architect Professional certification (credential AWS-SAP-12345). Add it to my certificates and update my summary to mention it."
Calls: `mokaru_get_profile` (to read current certificates array) → `mokaru_update_profile` (with the updated array + new summary). The profile bundle returns/accepts all 8 sections (summaries, projects, certificates, awards, publications, interests, jobTitles, customSections) in one call.
> "Show me all my applications in 'interview\_scheduled' status. For each one, list the company and the interview date if I've already scheduled it."
Calls: `mokaru_list_applications` (with status filter) → `mokaru_get_application` per item (returns timeline + interviews).
## Quick start
**Server URL** (for every client): `https://api.mokaru.ai/mcp`
No client to install, no API keys to copy - the first time your AI agent uses a Mokaru tool, it opens a Mokaru login in your browser to authorize the connection.
For step-by-step setup in each client, see **[Connect MCP clients](/integrations/mcp-clients)** - covers Claude.ai web, Claude Desktop, Claude Code, Cursor, Gemini CLI, OpenClaw, Continue, Zed, and custom agents built on the MCP SDK.
## How it works
1. Your MCP client discovers Mokaru's OAuth metadata at `/.well-known/oauth-authorization-server`.
2. It registers itself with `POST /oauth/register` (Dynamic Client Registration, RFC 7591) and receives a `client_id`.
3. It opens your browser to `/oauth/authorize`, which redirects to the Mokaru consent screen.
4. You sign in to Mokaru (or are already signed in) and click **Allow access**.
5. The browser is redirected back to your MCP client with an authorization code.
6. Your client exchanges the code for an access token via `/oauth/token` (PKCE-protected).
7. Every MCP tool call uses that token, which expires after 1 hour and is refreshed automatically.
Access tokens are JWT-signed and never grant access to other users' data. The connection can be revoked any time from Mokaru → Settings → Connections.
## MCP vs REST API
| | **MCP** | **[REST API](/api-reference/introduction)** |
| -------------- | --------------------------------------- | ------------------------------------------- |
| Best for | AI agents (Claude, Cursor, custom GPTs) | Automation tools (n8n, Make), scripts |
| Auth | OAuth 2.1 (browser login) | API key (`mk_...`) |
| Setup | One URL, no install | Generate key in Settings, paste into config |
| Token lifetime | 1 hour access, 30 day refresh | Until manually revoked |
| Surface | 70 tools (LLM-optimised descriptions) | 30+ endpoints (full CRUD) |
| Rate limits | Per-account, shared with API key | Per-account, shared with MCP |
Both can be used simultaneously - they share the same underlying data and rate-limit buckets.
## Security
* **OAuth 2.1 + PKCE**: no client secrets, no browser-leakable tokens.
* **Plus-gated consent**: only Plus users can issue MCP tokens.
* **Short-lived tokens**: access tokens expire after 1 hour; refresh tokens rotate (single-use detection triggers full session revocation).
* **Per-call ownership checks**: tokens are bound to one account - no cross-account access is possible.
* **No PII in logs**: server logs contain account id, tool name, duration, and status only.
* **Revocable**: any user can revoke all MCP connections from Mokaru → Settings → Connections.
For OAuth implementation details (relevant if you're building your own MCP client), see the [OAuth flow reference](/integrations/mcp-oauth).
## Report security issues
Found a security issue in the MCP integration (or anywhere in Mokaru)? Email [security@mokaru.ai](mailto:security@mokaru.ai). We respond within 48 hours and follow [coordinated disclosure](/security). Good-faith researchers are protected by our safe-harbor policy.
# Connect MCP clients
Source: https://docs.mokaru.ai/integrations/mcp-clients
Step-by-step setup for Claude, Cursor, Gemini, OpenClaw, and other MCP-compatible AI agents
This page covers every common MCP client. Pick yours below.
**Server URL** for all clients: `https://api.mokaru.ai/mcp`
**Auth**: OAuth in browser, the first time you use a tool. **Requires a Plus plan.**
## Claude.ai (web)
Anthropic's web app supports remote MCP servers via the Connectors feature.
Go to [claude.ai/settings/connectors](https://claude.ai/settings/connectors).
Click **Add custom connector** at the bottom of the page.
* **Name**: `Mokaru`
* **Remote MCP server URL**: `https://api.mokaru.ai/mcp`
Click **Add**.
Claude opens a Mokaru sign-in page in a new tab. Sign in (or you're already signed in), click **Allow access**, and you're redirected back.
Start a new chat. Mokaru appears in the connectors picker. Try:
> Search Mokaru for remote product manager jobs posted this week.
Custom connectors require **Claude Pro, Max, Team, or Enterprise**. Free tier users see the Connectors page but cannot add custom servers.
## Claude Desktop
The native macOS/Windows app. Setup is via JSON config.
* **macOS**: `~/Library/Application Support/Claude/claude_desktop_config.json`
* **Windows**: `%APPDATA%\Claude\claude_desktop_config.json`
* **Linux**: `~/.config/Claude/claude_desktop_config.json`
Create it if it doesn't exist.
```json theme={null}
{
"mcpServers": {
"mokaru": {
"url": "https://api.mokaru.ai/mcp"
}
}
}
```
If you already have other `mcpServers`, add `"mokaru"` alongside them.
Quit and reopen the app. Mokaru should appear in the tools picker (the little plug icon near the message input).
The first time Claude calls a Mokaru tool, your browser opens to sign in and approve. The token is then cached locally until it expires.
## Cursor
Cursor (the AI-first editor) has built-in MCP support.
**Cursor Settings → Features → MCP** (or `Cmd/Ctrl + Shift + J` then search "MCP").
Click **Add new MCP server**. Fill in:
* **Name**: `Mokaru`
* **Type**: `URL` (or `streamable-http` depending on Cursor version)
* **URL**: `https://api.mokaru.ai/mcp`
Click **Save**. Restart Cursor.
In Cursor's chat panel, the Mokaru tools become available alongside Cursor's built-in coding tools. Try:
> List my Mokaru job applications and their status.
## Claude Code (CLI)
Anthropic's command-line agent.
```bash theme={null}
claude mcp add mokaru --transport http https://api.mokaru.ai/mcp
```
This writes the config to `~/.claude.json`.
Start a Claude Code session: `claude`. On the first Mokaru tool call, your browser opens for OAuth. Approve, return to the terminal.
Inside a session, type:
```
/mcp
```
You should see `mokaru` listed as connected.
## Gemini CLI
Google's command-line agent (npm package `@google/gemini-cli`).
`~/.gemini/settings.json`. Create it if it doesn't exist.
```json theme={null}
{
"mcpServers": {
"mokaru": {
"httpUrl": "https://api.mokaru.ai/mcp"
}
}
}
```
Run `gemini` in your terminal. The first call to a Mokaru tool opens your browser for OAuth.
Gemini Code Assist (the JetBrains / VS Code extension) reads the same `~/.gemini/settings.json` for agent mode, so the same config works in both.
## OpenClaw / ClawHub
Mokaru maintains an official skill on [ClawHub](https://clawhub.ai/VNDCK/auto-apply) - this is the easiest path if you use OpenClaw.
Visit [clawhub.ai/VNDCK/auto-apply](https://clawhub.ai/VNDCK/auto-apply) and click **Install** to add it to your OpenClaw agent.
If you want the full MCP toolset instead of the curated skill, add Mokaru as a custom MCP server in OpenClaw's settings:
```json theme={null}
{
"mcpServers": {
"mokaru": {
"url": "https://api.mokaru.ai/mcp"
}
}
}
```
## Continue (VS Code / JetBrains)
Open-source AI assistant for editors.
Edit `~/.continue/config.yaml` (or `config.json` in older versions).
```yaml theme={null}
mcpServers:
- name: Mokaru
url: https://api.mokaru.ai/mcp
```
Reload the Continue extension. Mokaru's tools become available in agent mode.
## Zed
The Zed editor supports MCP via Context Servers.
`Cmd + ,` (macOS) or `Ctrl + ,` (Linux) → opens `settings.json`.
```json theme={null}
{
"context_servers": {
"mokaru": {
"source": "custom",
"url": "https://api.mokaru.ai/mcp"
}
}
}
```
## Custom MCP clients
Building your own agent? The MCP TypeScript and Python SDKs handle the full OAuth + transport flow when you point them at the Mokaru server URL.
```ts TypeScript theme={null}
import { Client } from '@modelcontextprotocol/sdk/client/index.js';
import { StreamableHTTPClientTransport } from '@modelcontextprotocol/sdk/client/streamableHttp.js';
const transport = new StreamableHTTPClientTransport(
new URL('https://api.mokaru.ai/mcp')
);
const client = new Client({ name: 'my-agent', version: '1.0.0' });
await client.connect(transport);
const { tools } = await client.listTools();
console.log(tools.map(t => t.name));
const result = await client.callTool({
name: 'mokaru_search_jobs',
arguments: { query: 'product manager', location: 'Amsterdam' }
});
```
```python Python theme={null}
from mcp.client.streamable_http import streamablehttp_client
from mcp import ClientSession
async with streamablehttp_client("https://api.mokaru.ai/mcp") as (read, write, _):
async with ClientSession(read, write) as session:
await session.initialize()
tools = await session.list_tools()
print([t.name for t in tools.tools])
result = await session.call_tool(
"mokaru_search_jobs",
{"query": "product manager", "location": "Amsterdam"},
)
```
Both SDKs auto-discover the OAuth endpoints, handle Dynamic Client Registration, run the browser flow, and refresh tokens. You don't need to implement any of it yourself - just provide the URL.
For the low-level OAuth wire protocol (if you're building an MCP client from scratch), see the [OAuth flow reference](/integrations/mcp-oauth).
## Troubleshooting
Your Mokaru account is on the Free plan. MCP integration requires Plus. [Upgrade](https://app.mokaru.ai/billing) and try again.
Access tokens last 1 hour; refresh tokens last 30 days. If you haven't used the connection in over a month, the refresh chain is dead. Disconnect from Mokaru → Settings → MCP connections and re-authorize.
You need to fully quit and restart the app - reload-from-settings isn't enough for MCP servers. On macOS that means `Cmd + Q`, not just closing the window.
Yes - each MCP client instance is a separate OAuth client and gets its own connection. Claude Desktop on your laptop and Claude Desktop on your work machine appear as two entries in Mokaru → Settings → MCP connections. You can revoke them independently.
The MCP endpoint enforces two limits: 100 requests per 10 seconds per IP, and 60 requests per minute per OAuth client. Individual `/v1/*` endpoints also have their own rate limits. Wait the `Retry-After` seconds returned in the `RateLimit-Reset` header.
Mokaru → **Settings → Integrations → MCP connections**. Click **Disconnect** on the agent you want to revoke. All access tokens for that agent stop working immediately.
## Don't see your client?
Any MCP-compatible client that supports the **streamable HTTP transport** and **OAuth 2.1** works against `https://api.mokaru.ai/mcp`. If your client only supports stdio transport, it cannot connect to a remote MCP server.
Found a client that should be listed here? Email us at [support@mokaru.ai](mailto:support@mokaru.ai) and we'll add setup steps.
# MCP OAuth Flow
Source: https://docs.mokaru.ai/integrations/mcp-oauth
OAuth 2.1 + Dynamic Client Registration for building custom MCP clients against Mokaru
This page is only relevant if you're **building** an MCP client. End users don't need to know any of this - their MCP client handles the OAuth flow automatically.
## Overview
Mokaru's MCP server implements OAuth 2.1 (RFC 6749, RFC 9700) with:
* **PKCE** (RFC 7636, S256 only - `plain` is rejected)
* **Dynamic Client Registration** (RFC 7591)
* **Authorization Server Metadata** (RFC 8414)
* **Refresh Token Rotation** with reuse detection
## Discovery
```http theme={null}
GET https://api.mokaru.ai/.well-known/oauth-protected-resource
```
Returns:
```json theme={null}
{
"resource": "https://api.mokaru.ai/mcp",
"authorization_servers": ["https://api.mokaru.ai"],
"bearer_methods_supported": ["header"]
}
```
Then:
```http theme={null}
GET https://api.mokaru.ai/.well-known/oauth-authorization-server
```
Returns:
```json theme={null}
{
"issuer": "https://api.mokaru.ai",
"authorization_endpoint": "https://api.mokaru.ai/oauth/authorize",
"token_endpoint": "https://api.mokaru.ai/oauth/token",
"registration_endpoint": "https://api.mokaru.ai/oauth/register",
"scopes_supported": ["mcp"],
"response_types_supported": ["code"],
"grant_types_supported": ["authorization_code", "refresh_token"],
"token_endpoint_auth_methods_supported": ["none"],
"code_challenge_methods_supported": ["S256"]
}
```
## Step 1: Register your client
```http theme={null}
POST https://api.mokaru.ai/oauth/register
Content-Type: application/json
{
"client_name": "My MCP Client",
"redirect_uris": ["https://my-client.example.com/oauth/callback"],
"grant_types": ["authorization_code", "refresh_token"],
"response_types": ["code"]
}
```
Returns:
```json theme={null}
{
"client_id": "mcp_abc123...",
"client_name": "My MCP Client",
"redirect_uris": ["..."],
"grant_types": ["authorization_code", "refresh_token"],
"response_types": ["code"],
"token_endpoint_auth_method": "none",
"client_id_issued_at": 1716220800
}
```
**Allowed redirect URIs**: `https://` URIs or `http://localhost` / `http://127.0.0.1` loopback. No `http://` on public hosts.
## Step 2: Authorize
Generate a PKCE pair:
```js theme={null}
const codeVerifier = base64UrlEncode(crypto.randomBytes(32)); // 43 chars
const codeChallenge = base64UrlEncode(sha256(codeVerifier)); // 43 chars
```
Redirect the user's browser to:
```
https://api.mokaru.ai/oauth/authorize?
response_type=code
&client_id=mcp_abc123...
&redirect_uri=https://my-client.example.com/oauth/callback
&code_challenge=
&code_challenge_method=S256
&scope=mcp
&state=
```
Mokaru shows the consent screen. After the user approves:
```
https://my-client.example.com/oauth/callback?code=&state=
```
**Errors**: If the request is malformed or the user is not on a Plus plan, Mokaru shows an HTML error page (does not redirect, per OAuth 2.1).
## Step 3: Exchange code for tokens
```http theme={null}
POST https://api.mokaru.ai/oauth/token
Content-Type: application/x-www-form-urlencoded
grant_type=authorization_code
&code=
&redirect_uri=https://my-client.example.com/oauth/callback
&client_id=mcp_abc123...
&code_verifier=
```
Returns:
```json theme={null}
{
"access_token": "eyJhbGc...",
"token_type": "Bearer",
"expires_in": 3600,
"refresh_token": "eyJhbGc...",
"scope": "mcp"
}
```
## Step 4: Call /mcp
Use the access token as a Bearer:
```http theme={null}
POST https://api.mokaru.ai/mcp
Authorization: Bearer eyJhbGc...
Content-Type: application/json
{
"jsonrpc": "2.0",
"id": 1,
"method": "tools/list"
}
```
## Step 5: Refresh
```http theme={null}
POST https://api.mokaru.ai/oauth/token
Content-Type: application/x-www-form-urlencoded
grant_type=refresh_token
&refresh_token=eyJhbGc...
&client_id=mcp_abc123...
```
Returns a new access + refresh token pair. The old refresh token is invalidated immediately.
**Reuse detection**: If you try to use a refresh token that has already been rotated, Mokaru detects this as a possible compromise and **revokes every refresh token for that account**. Treat your refresh tokens like passwords.
## Token format
Access and refresh tokens are JWTs (HS256) with these claims:
```json theme={null}
{
"iss": "mokaru-api",
"aud": "mokaru-mcp",
"sub": "",
"client_id": "mcp_abc123...",
"scope": "mcp",
"token_use": "access",
"iat": 1716220800,
"exp": 1716224400
}
```
**Do not attempt to verify the signature client-side** - the signing key is server-only. Treat tokens as opaque.
## Error responses
OAuth errors follow RFC 6749:
```json theme={null}
{ "error": "invalid_grant", "error_description": "PKCE verification failed" }
```
Common error codes:
| Code | Meaning |
| --------------------------- | ----------------------------------------------------------- |
| `invalid_request` | Missing or malformed parameter |
| `invalid_client` | Unknown `client_id` |
| `invalid_grant` | Code/refresh expired, consumed, or PKCE failed |
| `unauthorized_client` | Client cannot use this grant type |
| `unsupported_grant_type` | Only `authorization_code` and `refresh_token` are supported |
| `unsupported_response_type` | Only `code` is supported |
## Reference implementations
* [MCP TypeScript SDK](https://github.com/modelcontextprotocol/typescript-sdk) handles all of this automatically when given just the server URL.
* [MCP Python SDK](https://github.com/modelcontextprotocol/python-sdk) ditto.
* Claude Desktop, Claude.ai, Cursor, Continue: built-in MCP OAuth support.
# MCP Tools
Source: https://docs.mokaru.ai/integrations/mcp-tools
Reference for every Mokaru MCP tool an AI agent can call
## Overview
The Mokaru MCP server exposes 70 tools. Each one wraps a single REST API endpoint, so behaviour, rate limits, and error responses match the [REST API](/api-reference/introduction) exactly.
Tool descriptions in this reference match what the AI agent sees via `tools/list`. AI agents pick which tool to call based on these descriptions - they're written for LLM consumption.
## Jobs
### `mokaru_search_jobs`
Search the Mokaru job database (refreshed daily). Returns listings with title, company, location, salary, and apply URL. Use cursor pagination to fetch more pages.
| Parameter | Type | Required | Description |
| ------------------ | ---------------------------------------------------- | -------- | ------------------------------------------------- |
| `query` | string | yes | Job search keywords |
| `location` | string | no | City, state, or country |
| `workArrangement` | "remote" \| "hybrid" \| "onsite" | no | Filter by work arrangement |
| `employmentType` | "FULLTIME" \| "PARTTIME" \| "CONTRACTOR" \| "INTERN" | no | Filter by employment type |
| `datePosted` | "day" \| "3days" \| "week" \| "month" | no | How recent the posting should be |
| `excludeCompanies` | string\[] | no | Company names to exclude |
| `excludeKeywords` | string\[] | no | Keywords to exclude from title/description |
| `cursor` | string | no | Pagination cursor from previous page's `postedAt` |
Underlying endpoint: `POST /v1/jobs/search`.
## Applications
### `mokaru_list_applications`
List the user's job applications. Returns id, title, company, status, and dates.
| Parameter | Type | Description |
| --------- | -------------- | ----------------------------------------------------------------- |
| `status` | enum | Filter by status (watchlist, applied, interview\_scheduled, etc.) |
| `limit` | number (1-100) | Results per page (default 25) |
| `offset` | number | Pagination offset |
### `mokaru_get_application`
Get full details for one application, including timeline events, interviews, and notes. After `mokaru_tailor_resume`, poll this tool and watch `processingStatus` (`pending` / `processing` / `completed` / `failed`) to know when the tailored resume is ready; `processingError` holds the reason on failure.
| Parameter | Type | Required | Description |
| --------- | ------ | -------- | ---------------------------------------------- |
| `id` | string | yes | Application id from `mokaru_list_applications` |
### `mokaru_tailor_resume`
**The auto-prep feature.** The tool to use whenever the user wants a resume made or tailored **for a specific job**. Duplicates the user's default (base) resume and AI-tailors the copy to the job (keyword optimization, rephrased experience bullets, focused summary). Do **not** hand-build a resume with `mokaru_create_resume` for this - that bypasses the real tailoring engine. Because a tailored resume is owned by a tracker application, this also adds the job to the tracker.
Runs asynchronously (\~30s). The response returns immediately with the new `cvId` and `processingStatus: "pending"`. Poll `mokaru_get_application` with the returned `id` until `processingStatus` is `completed`, then fetch/export the resume by its `cvId`.
Requirements: Plus plan (else `PLAN_REQUIRED`), a default resume (else `NO_DEFAULT_RESUME`), and a job description >= 500 chars (else `JOB_DESCRIPTION_TOO_SHORT`). Costs 1 AI credit (unlimited on Plus).
| Parameter | Type | Required | Description |
| ---------------- | ------ | ----------- | --------------------------------------------------------------------------------------- |
| `jobTitle` | string | yes | Target job title (max 200) |
| `company` | string | yes | Hiring company name (max 200) |
| `jobDescription` | string | conditional | Full posting text (>= 500 chars). Optional when `jobListingId` has a stored description |
| `jobListingId` | string | no | ID from `mokaru_search_jobs` - hydrates the description and salary server-side |
| `location` | string | no | Job location (max 200) |
| `jobUrl` | string | no | URL to the job posting (used for de-duplication) |
| `source` | enum | no | LinkedIn, CompanyWebsite, JobWebsite, Referral, Agency, Other |
### `mokaru_create_application`
Save a job to Mokaru's tracker. Pass `autoPrepare: true` to also AI-tailor a resume in the same step (same engine as `mokaru_tailor_resume`). If the user's intent is primarily to get a tailored resume rather than to track the application, prefer `mokaru_tailor_resume`.
| Parameter | Type | Required | Description |
| ---------------- | ------- | ----------- | --------------------------------------------------------------------------------------------------------- |
| `jobTitle` | string | yes | Job title (max 200) |
| `company` | string | yes | Company name (max 200) |
| `location` | string | no | Job location (max 200) |
| `jobUrl` | string | no | URL to the job posting |
| `jobDescription` | string | conditional | Full description (>= 500 chars required for `autoPrepare`) |
| `jobListingId` | string | no | ID from `mokaru_search_jobs` (links salary data) |
| `source` | enum | no | LinkedIn, CompanyWebsite, JobWebsite, Referral, Agency, Other |
| `autoPrepare` | boolean | no | When true, duplicates default resume and queues AI tailoring (\~30s). Returns `cvId` + `processingStatus` |
### `mokaru_update_application`
Update an application: change status, edit notes, adjust priority. Status change creates a timeline entry.
| Parameter | Type | Description |
| --------------------------------- | ------------ | --------------- |
| `id` | string | Application id |
| `status` | enum | New status |
| `priority` | number (1-5) | Priority level |
| `notes` | string | Free-text notes |
| `jobTitle`, `company`, `location` | string | Edit metadata |
### `mokaru_delete_application`
Soft-delete an application (recoverable via support). Confirm with the user before calling.
| Parameter | Type | Required | Description |
| --------- | ------ | -------- | -------------- |
| `id` | string | yes | Application id |
## Resumes
### `mokaru_list_resumes`
List the user's resumes (id, name, template, default flag, timestamps).
### `mokaru_get_resume`
Get full resume content for one resume - `cvData`, `designSettings`, `sectionOrder`, and metadata.
### `mokaru_create_resume`
Create a new resume. Only `name` is required. The new resume starts as a copy of the user's **base (default) resume** content - experiences, education, skills, certificates, projects, awards, publications and interests - as an independent snapshot; editing the base afterwards doesn't change this resume. To hide some of those on this CV pass `hiddenItems`; to customise personal info per-CV pass `personalOverrides`; to reorder items within a section pass `itemOrder`.
| Parameter | Type | Required | Description |
| ------------------- | -------------- | -------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `name` | string | yes | Resume name shown in the dashboard |
| `jobTitle` | string \| null | no | CV-level job title shown in the header. Overrides the profile job title for this CV |
| `template` | string | no | Template slug (e.g. "classic", "modern") |
| `isDefault` | boolean | no | Mark as the default resume |
| `cvData` | object | no | CV-level overrides for personal info / `summary`. Section arrays (`experiences`, `education`, `skills`, etc.) are silently dropped - use `hiddenItems` for visibility and the per-section MCP tools for data |
| `hiddenItems` | object | no | Map of section -> array of the resume's item IDs (from the per-section `list_*` tools - `mokaru_get_profile` returns content without item IDs) to hide on this CV. Keys: `experiences`, `education`, `skills`, `certificates`, `projects`, `awards`, `publications`, `interests`, or `customSection:` |
| `personalOverrides` | object | no | Per-CV personal-info overrides (`firstName`, `lastName`, `email`, `phone`, `address`, `jobTitle`, `seniority`, `summary`, `website`, `linkedin`, `portfolio`, `birthDate`, `driverLicense`, `profilePhoto`). Each key overrides the profile value for this CV only; null clears that key |
| `itemOrder` | object | no | Per-section ordering. Keys are section names (`experiences`, `education`, `skills`, ..., `skillCategories`); values are arrays of the resume's item IDs in the desired order. Items not listed fall back to the resume's default order |
| `selectedSummaryId` | string \| null | no | ID of the summary to render on this CV (from `mokaru_list_summaries`). Null = no summary |
| `designSettings` | object | no | Visual styling (colors, fonts, spacing, margins) |
| `optionalFields` | object | no | Show/hide toggles for optional personal fields (phone, address, birthDate, photo, etc.) |
| `sectionOrder` | array | no | Order of CV sections (e.g. `["summary", "experiences", "education", "skills"]`) |
### `mokaru_update_resume`
Update a resume. Only provided fields are modified. To toggle which of this resume's items show on the CV, set `hiddenItems` (replaces the existing value; pass `null` to clear). Same null-to-clear semantics for `personalOverrides`, `itemOrder`, `selectedSummaryId`, and `jobTitle`.
| Parameter | Type | Required | Description |
| ------------------- | -------------- | -------- | --------------------------------------------------------------------- |
| `id` | string | yes | Resume id |
| `name` | string | no | New name |
| `jobTitle` | string \| null | no | CV-level job title (or null to clear) |
| `template` | string | no | Template slug |
| `isDefault` | boolean | no | Mark/unmark as default |
| `cvData` | object | no | CV-level overrides (section arrays ignored, see create) |
| `designSettings` | object | no | Visual styling |
| `optionalFields` | object | no | Show/hide toggles for optional personal fields |
| `sectionOrder` | array | no | Order of CV sections |
| `hiddenItems` | object \| null | no | Per-section blacklist (see create). Pass `null` to clear |
| `personalOverrides` | object \| null | no | Per-CV personal-info overrides (see create). Pass `null` to clear all |
| `itemOrder` | object \| null | no | Per-section ordering (see create). Pass `null` to clear |
| `selectedSummaryId` | string \| null | no | Summary id to use, or null |
### `mokaru_duplicate_resume`
Duplicate an existing resume. Copies every CV-level setting (template, design, hidden items, personal overrides, item order, etc.) into a new resume. The duplicate is never the default. The duplicate gets its own independent copy of the source's content (experiences, skills, etc.) - editing one doesn't affect the other.
| Parameter | Type | Required | Description |
| --------- | ------ | -------- | ------------------------------------------------------ |
| `id` | string | yes | Source resume id |
| `name` | string | no | Name for the new copy (default ` - copy`) |
### `mokaru_delete_resume`
Delete a resume permanently. If the default is deleted, another resume is auto-promoted to default. Unlinks from any linked applications. Cannot be undone - confirm with the user.
| Parameter | Type | Required | Description |
| --------- | ------ | -------- | ----------- |
| `id` | string | yes | Resume id |
### `mokaru_export_resume_pdf`
Returns a **deep-link** that opens the resume in the Mokaru web app with the Export section already active. The user clicks the link, signs in to Mokaru if needed (usually already signed in via the same browser as Claude.ai), and downloads through the standard Export PDF button.
The URL pattern is `{appBaseUrl}/{locale}/resumes/builder?cvId={id}&tab=export` - for example `https://app.mokaru.ai/en/resumes/builder?cvId=clx...&tab=export`.
**Why a link instead of an inline file?** The MCP web client (claude.ai) currently cannot reliably render binary content blocks (PDFs in particular) as downloads - it rejects them as un-renderable images. Returning a link works in every MCP client (Claude.ai web, Claude Desktop, Cursor, Gemini CLI, custom agents). Direct inline PDF download via MCP is on the roadmap and will ship once client support stabilises.
| Parameter | Type | Required | Description |
| --------- | ------------ | -------- | -------------------------------------------- |
| `id` | string | yes | Resume id to open in the export view |
| `locale` | "en" \| "nl" | no | Locale segment used in the URL (default: en) |
## Profile
### `mokaru_get_profile`
Get the user's career profile in one call. Returns scalar fields (name, contact, summary, sector, links) PLUS the base (default) resume's content collections (the canonical content that new resumes are copied from):
* `skills`, `workExperiences`, `educations`
* `summaries` (professional summary versions)
* `projects`
* `certificates`
* `awards`
* `publications`
* `interests`
* `jobTitles` (career-identity titles)
* `customSections` (with their items inline)
One call returns the entire profile - no need to fetch each section separately.
`mokaru_get_profile` returns content **without item IDs**. To get the IDs needed for `mokaru_update_*` / `mokaru_delete_*` or for a resume's `hiddenItems` / `itemOrder`, use the per-section `list_*` tools - they are the canonical ID source.
### `mokaru_update_profile`
Update profile **scalars** (name, contact, summary, etc.) and several of the base (default) resume's content collections in bulk. For granular edits prefer the per-section CRUD tools described below (`mokaru_create/update/delete_experience`, `_education`, `_skill`, etc.) - they target one row at a time and never clobber other items.
This tool still supports **replace-list** writes for `summaries`, `projects`, `certificates`, `awards`, `publications`, `interests`, `jobTitles`: passing an array REPLACES the entire collection. The pattern to add one item is fetch → append → send the full array back.
`workExperiences`, `educations` and `skills` cannot be written here - use the dedicated per-item tools.
| Parameter | Type | Description |
| ------------------------------------------------------------------------------------------------------------------------------------------------ | --------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `firstName`, `lastName`, `email`, `phone`, `address`, `country`, `province`, `jobTitle`, `summary`, `sector`, `linkedIn`, `website`, `portfolio` | string | Scalar fields (pass null to clear) |
| `summaries` | array (max 100) | Replace-list of summaries |
| `projects` | array (max 100) | Replace-list of projects |
| `certificates` | array (max 100) | Replace-list of certificates |
| `awards` | array (max 100) | Replace-list of awards |
| `publications` | array (max 100) | Replace-list of publications |
| `interests` | array (max 100) | Replace-list of interests |
| `jobTitles` | array (max 50) | **Legacy** - job titles now live per-resume on `EmpCV.jobTitle` (set via `mokaru_create_resume` / `mokaru_update_resume`). Kept for backwards compatibility |
## Profile sections (per-item CRUD)
Each profile section exposes a 4-tool shape: `list_*`, `create_*`, `update_*`, `delete_*`. These are the **preferred** way to mutate individual items; they avoid the replace-list footgun of `mokaru_update_profile`. (There is no per-item `get_*` - `list_*` already returns every item with its full fields and ID, so a single-item fetch would add nothing.)
**Targeting a specific resume (`cvId`).** Every per-section tool (and the custom-section item tools) accepts an optional `cvId`. Omit it and the tool reads/writes your **base (default) resume**'s content. Pass a resume id (from `mokaru_list_resumes`) to target that specific resume instead - e.g. rewrite a bullet on a tailored CV. Call `list_*` with the same `cvId` first to get that resume's item IDs, then `update_*` / `delete_*` with the matching `cvId`. The resume must belong to you and be self-contained (a non-self-contained/legacy resume returns 400; an unknown or unowned id returns 404).
The tool inputs mirror the underlying v1 REST endpoint schema (see API Reference per section for the exact field list). The behaviour is identical: only provided fields change, pass `null` on a nullable field in update to clear it.
| Section | Tools | v1 endpoint |
| ---------------------------- | ----------------------------------------------------------------------------------------------------------- | ----------------------------------------------------------------- |
| Work experiences | `mokaru_list_experiences`, `_create_experience`, `_update_experience`, `_delete_experience` | `/v1/experiences` |
| Education | `mokaru_list_education`, `_create_education`, `_update_education`, `_delete_education` | `/v1/education` |
| Skills | `mokaru_list_skills`, `_create_skill`, `_update_skill`, `_delete_skill` | `/v1/skills` |
| Certificates | `mokaru_list_certificates`, `_create_certificate`, `_update_certificate`, `_delete_certificate` | `/v1/certificates` |
| Projects | `mokaru_list_projects`, `_create_project`, `_update_project`, `_delete_project` | `/v1/projects` |
| Awards | `mokaru_list_awards`, `_create_award`, `_update_award`, `_delete_award` | `/v1/awards` |
| Publications | `mokaru_list_publications`, `_create_publication`, `_update_publication`, `_delete_publication` | `/v1/publications` |
| Interests | `mokaru_list_interests`, `_create_interest`, `_update_interest`, `_delete_interest` | `/v1/interests` |
| Summaries | `mokaru_list_summaries`, `_create_summary`, `_update_summary`, `_delete_summary` | `/v1/summaries` |
| Custom sections (definition) | `mokaru_list_custom_sections`, `_create_custom_section`, `_update_custom_section`, `_delete_custom_section` | `/v1/custom-sections` |
| Custom section items | `mokaru_create_custom_section_item`, `_update_custom_section_item`, `_delete_custom_section_item` | `/v1/custom-sections/{id}/items`, `/v1/custom-section-items/{id}` |
Common idioms:
* **Add a single item** without touching the rest: `mokaru_create_`. No need to fetch the existing list first.
* **Edit one field** on an existing item: `mokaru_update_` with `{ id, : }`. Other fields stay untouched.
* **Hide one of a resume's items on that CV** (without deleting it): use `mokaru_update_resume` with `hiddenItems`, not the delete tool.
* **Select which summary appears on a CV**: `mokaru_create_summary` to add the variant, then `mokaru_update_resume` with `selectedSummaryId` set to that summary's id.
## Resume sharing (public links)
### `mokaru_create_resume_share`
Create a public share link for a resume. Snapshots the resume's current `cvData`, design settings, section order and optional fields into a `EmpResumeShare` row so the shared page renders the state at share-creation time, independent of later edits. If a share already exists for this resume, the existing link is returned (upsert).
| Parameter | Type | Required | Description |
| ------------- | ------ | -------- | --------------------------------------------------------------------------------------------------------------------- |
| `resumeId` | string | yes | Resume to share |
| `blurOptions` | object | no | Privacy toggles: `blurLinkedIn`, `blurWebsite`, `blurPortfolio`, `blurCompanies`, `blurInstitutions` (each a boolean) |
Returns `{ success, shareId, shareUrl, createdAt, reused }`. The public URL pattern is `https://app.mokaru.ai/share/{shareId}`.
### `mokaru_list_resume_shares`
List the share links for a resume. Returns each share with its public URL.
| Parameter | Type | Required | Description |
| ---------- | ------ | -------- | ----------- |
| `resumeId` | string | yes | Resume id |
### `mokaru_delete_resume_share`
Revoke a public share link. The public viewer at `/share/{shareId}` 404s immediately after.
| Parameter | Type | Required | Description |
| --------- | ------ | -------- | ----------- |
| `shareId` | string | yes | Share id |
## Cover letters
**Plus plan only** for `create` and `update`. Returns `403` with `{ requiresUpgrade: true }` if the user is on the free plan. `list`, `get` and `delete` are available on any plan so users can still see and clean up their existing cover letters after downgrading.
A cover letter is always linked one-to-one to a resume (`cvId` is required and unique). To "add a cover letter to a resume" first check whether one exists via `mokaru_list_cover_letters` with `cvId`; if it does, call `mokaru_update_cover_letter`; if not, call `mokaru_create_cover_letter`. Create returns `409` if a cover letter already exists for that resume.
If the user has no resume yet, you can't create a cover letter at all - first call `mokaru_list_resumes`; if empty call `mokaru_create_resume` to make one, then use its id as `cvId`.
### `mokaru_list_cover_letters`
List the user's cover letters.
| Parameter | Type | Description |
| ----------------- | ------ | ----------------------------------------- |
| `cvId` | string | Filter to the cover letter for one resume |
| `limit`, `offset` | number | Pagination |
### `mokaru_get_cover_letter`
Get the full content of one cover letter (title, body, variables, styling).
| Parameter | Type | Required | Description |
| --------- | ------ | -------- | --------------- |
| `id` | string | yes | Cover letter id |
### `mokaru_create_cover_letter`
Create a cover letter for a resume.
| Parameter | Type | Required | Description |
| --------------------------------------------------- | ------------------------- | -------- | ------------------------------------------------------------------------ |
| `cvId` | string | yes | Resume to attach to (must be owned by the caller; unique) |
| `title` | string | yes | Cover letter title (max 200) |
| `content` | string | yes | Body text (markdown allowed) |
| `templateId` | string \| null | no | Optional cover letter template id |
| `isDefault` | boolean | no | Mark as user's default cover letter |
| `variables` | object | no | Template-variable map, e.g. `{ company: "Acme", contactPerson: "Jane" }` |
| `showName`, `showEmail`, `showPhone`, `showAddress` | boolean | no | Header visibility toggles |
| `headerAlignment` | `left \| center \| right` | no | Header alignment |
| `fontFamily` | string | no | Font family (default `Inter`) |
| `fontSize` | number | no | Font size in pt (default 11) |
| `lineSpacing` | number | no | Line spacing (default 1.6) |
### `mokaru_update_cover_letter`
Update a cover letter. Only provided fields are modified. Pass `null` on nullable fields to clear.
| Parameter | Type | Description |
| --------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------- | ------------------------------------------ |
| `id` | string | Cover letter id |
| `title`, `content`, `templateId`, `isDefault`, `variables`, `showName`, `showEmail`, `showPhone`, `showAddress`, `headerAlignment`, `fontFamily`, `fontSize`, `lineSpacing` | various | Same shape as `mokaru_create_cover_letter` |
### `mokaru_delete_cover_letter`
Permanently delete a cover letter. The parent resume is unaffected.
| Parameter | Type | Required | Description |
| --------- | ------ | -------- | --------------- |
| `id` | string | yes | Cover letter id |
## Contacts
### `mokaru_list_contacts`
List professional contacts (recruiters, hiring managers, colleagues, etc.).
| Parameter | Type | Description |
| -------------- | -------------- | --------------------------------- |
| `relationship` | enum | Filter by relationship type |
| `search` | string | Search by name, company, or email |
| `limit` | number (1-100) | Results per page |
| `offset` | number | Pagination offset |
### `mokaru_create_contact`
Create a new contact.
| Parameter | Type | Required | Description |
| ---------------------------- | ------ | -------- | -------------------------------- |
| `firstName`, `lastName` | string | yes | Contact name |
| `jobTitle`, `company` | string | no | Role and company |
| `relationship` | enum | no | RECRUITER, HIRING\_MANAGER, etc. |
| `email`, `phone`, `linkedIn` | string | no | Contact details |
### `mokaru_update_contact`
Update a contact. Only provided fields are modified. Pass `null` to clear a field.
| Parameter | Type | Description |
| -------------------------------------------------------------------------------------------- | ------ | --------------- |
| `id` | string | Contact id |
| `firstName`, `lastName`, `jobTitle`, `company`, `relationship`, `email`, `phone`, `linkedIn` | string | Editable fields |
### `mokaru_delete_contact`
Permanently delete a contact. Cannot be undone - confirm with the user.
| Parameter | Type | Required | Description |
| --------- | ------ | -------- | ----------- |
| `id` | string | yes | Contact id |
## Error handling
Every tool returns errors as MCP error content blocks (`isError: true` with a text explanation). Errors map from the underlying REST API:
| HTTP | MCP tool message |
| ---- | ----------------------------------------------------------------- |
| 400 | `Invalid request.` |
| 401 | `Your MCP session has expired. Please re-authorize Mokaru.` |
| 403 | `Permission denied. This action requires: {scopes}` |
| 404 | `Not found.` |
| 409 | `Resource is currently being processed - retry in a few seconds.` |
| 429 | `Rate limited. Retry after {seconds}s.` |
| 5xx | `Mokaru API error ({status}). Try again later.` |
Unexpected internal tool errors are returned as a generic failure message while detailed diagnostics stay in server logs.
# Introduction
Source: https://docs.mokaru.ai/introduction
Mokaru is an AI-powered career platform for building resumes, searching jobs, running Autopilot agents, tracking applications, and writing cover letters
## What is Mokaru?
Mokaru is an AI-powered career platform that helps job seekers create professional resumes, find roles, run Autopilot job agents, track applications, and write cover letters - all in one place.
Mokaru speaks MCP. Plug your AI agent into your resume and job search in one OAuth click - no API keys to copy. See [AI Agents (MCP)](/integrations/mcp).
## Core Features
Your home screen - pipeline KPIs, weekly goal, recent activity, and an agenda of upcoming interviews
Create ATS-optimized resumes with AI keyword matching and 8 professional templates
Search thousands of job listings and save them directly to your tracker
Set up AI agents that find matching jobs daily and notify you or auto-prepare tailored resumes
Track every application from watchlist to offer with a Kanban pipeline and follow-up reminders
Generate tailored cover letters that match each job description
## Stay Organized
Manage recruiter and hiring manager relationships
Sync interviews and follow-ups with Google or Outlook Calendar
Send and track emails directly from Mokaru
Color-coded labels that span applications, contacts, and resumes
Save jobs and auto-fill applications from any job board
Notifications, integrations, API keys, and MCP connections
## Why Mokaru?
Mokaru analyzes job descriptions and tailors your resume to match what employers are looking for. The AI extracts keywords, rewrites bullet points, and helps you get past ATS systems.
Define a search once and Mokaru runs it for you every day. Each Autopilot agent scores incoming jobs against your profile and either notifies you or auto-prepares a tailored resume.
No more juggling multiple tools. Mokaru combines resume building, job search, application tracking, cover letters, and networking in one seamless experience.
Enter your experience once and create unlimited tailored resume versions. Each version can be optimized for a different job - without retyping anything.
Your data stays yours. We do not sell your information to recruiters or third parties. You can export or delete your data at any time.
## Getting Started
Set up your account and create your first resume in 5 minutes
Connect Claude, Cursor, Claude Code, and other MCP clients via OAuth
Compare Free and Plus plans to find the right fit
# Quick Start
Source: https://docs.mokaru.ai/quickstart
Create your account, import your resume, and start applying to jobs in under 5 minutes with Mokaru
## Create Your Account
Head to [app.mokaru.ai](https://app.mokaru.ai) and create a free account with your email or Google.
Select your **experience level** (Junior, Senior, Manager, etc.) and enter your current or desired **job title**. Mokaru uses this to personalize your resume and job recommendations.
Pick the option that works best for you:
* **Upload existing resume** - Import a PDF of your current resume. Mokaru's AI extracts your work experience, education, skills, and more automatically.
* **Start fresh** - Build from scratch with full guidance. You will pick your top skills from AI-generated suggestions tailored to your role.
Uploading an existing resume is the fastest way to get started. Mokaru pulls in your experience, education, skills, certifications, and more - so you do not have to type it all again.
## Build Your First Resume
After onboarding, you land directly in the **Resume Builder**.
The template gallery opens automatically. Choose from 8 professionally designed, ATS-friendly templates. You can always switch later.
Your imported (or starter) data is already filled in. Edit sections like Work Experience, Education, and Skills. Use the AI assistant to rewrite bullet points or generate new content.
Paste a job description and let Mokaru's AI analyze how well your resume matches. It suggests improvements to align your resume with what the employer is looking for.
Export as a polished PDF, ready to send. Your resume is saved automatically, so you can come back and edit anytime.
## Find Jobs
You can discover jobs two ways from the **Jobs** page.
Enter a job title or keyword, pick a location, filter by remote/employment type/date, and browse results from major job boards.
Set up an Autopilot agent once. It scans for matching jobs daily and either notifies you or auto-prepares a tailored resume.
Save anything interesting to the Tracker with one click.
## Track Your Applications
The **Tracker** keeps all your applications organized in one place.
* Add applications manually or save them from Jobs/Autopilot
* Move applications through stages: Watchlist, Applied, Interview, Offer, and more
* Add notes, set follow-up reminders, and never lose track of where you stand
You can also generate **cover letters** for any tracked job - powered by AI and tailored to the specific role.
## Next Steps
Pipeline KPIs, weekly goal, and your daily agenda
Explore templates, AI writing, and job matching
Manage your applications from search to offer
Generate tailored cover letters in seconds
Let AI agents discover matching jobs daily
Save jobs and autofill applications from anywhere
# Security
Source: https://docs.mokaru.ai/security
How to report security vulnerabilities in Mokaru
We take security seriously. If you've found a vulnerability, please report it to us so we can fix it before bad actors can exploit it.
## Contact
**Email**: [security@mokaru.ai](mailto:security@mokaru.ai)
We respond within **48 hours** on business days. Critical vulnerabilities (anything affecting user data, authentication, or payment processing) are triaged immediately.
## Scope
We accept reports for vulnerabilities in any of these:
| Asset | Scope |
| --------------------------------- | ---------------------------- |
| `mokaru.ai` | Marketing site |
| `app.mokaru.ai` | Main web application |
| `api.mokaru.ai` | Public REST API + MCP server |
| `docs.mokaru.ai` | This documentation site |
| Mokaru mobile app (iOS / Android) | When released |
| Mokaru browser extension | Chrome / Firefox |
**Out of scope**:
* Third-party services we use (Stripe, Clerk, Azure, Upstash, etc.) - report those directly to the vendor
* Social engineering of Mokaru employees
* Physical attacks
* Denial of service attacks (please don't run load tests on our production environment)
* Self-XSS / clickjacking on pages without sensitive actions
* Issues that require physical access to a user's device
## What to include
A good report contains:
1. **Description** of the vulnerability and its impact
2. **Steps to reproduce** - clear enough that our engineers can verify it
3. **Affected URL(s)** or component(s)
4. **Proof of concept** if applicable (screenshots, video, code)
5. Your **contact information** for follow-up questions
If the vulnerability is severe, please **encrypt sensitive details** using our PGP key (available on request) and only send proof-of-concept code via a private channel.
## Disclosure policy
* We follow **coordinated disclosure**.
* Please give us reasonable time to fix the issue before going public - typically 90 days, or sooner if we've already patched and notified affected users.
* We will publicly credit you in this page's hall of fame (below) unless you prefer to stay anonymous.
## Good-faith safe harbor
We will not pursue legal action against researchers who:
* Make a good-faith effort to avoid privacy violations, data destruction, or service interruption
* Only access the minimum data necessary to demonstrate the vulnerability
* Don't disclose the issue publicly before it's fixed
* Don't exploit the vulnerability for personal gain or to harm Mokaru users
If you accidentally access user data while testing, **stop immediately** and contact us. We treat accidental access reported in good faith as part of the disclosure, not as a separate incident.
## What we ask you not to do
* Don't access, modify, or delete data that isn't yours
* Don't run automated scanners against `app.mokaru.ai` or `api.mokaru.ai` without coordinating with us first
* Don't perform any test that could degrade service for other users
* Don't pivot to other systems or services through a vulnerability
## Hall of fame
Researchers who have responsibly disclosed vulnerabilities to us will be listed here once we have our first valid disclosure. (Be the first!)