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

# Create Application

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

<Note>
  **Scope required:** `tracker:write` | **Rate limit:** 20 requests/min
</Note>

## Request

```bash theme={null}
POST /v1/tracker/applications
```

### Body Parameters

<ParamField body="jobTitle" type="string" required>
  Job title (max 200 characters)
</ParamField>

<ParamField body="company" type="string" required>
  Company name (max 200 characters)
</ParamField>

<ParamField body="location" type="string">
  Job location (max 200 characters)
</ParamField>

<ParamField body="jobUrl" type="string">
  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.
</ParamField>

<ParamField body="jobDescription" type="string">
  Full job description text (max 50,000 characters). Required if `autoPrepare` is `true` (minimum 500 characters).
</ParamField>

<ParamField body="jobListingId" type="string">
  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.
</ParamField>

<ParamField body="source" type="string" default="Other">
  Where the job was found. Options: `LinkedIn`, `CompanyWebsite`, `JobWebsite`, `Referral`, `Agency`, `Other`
</ParamField>

<ParamField body="autoPrepare" type="boolean" default="false">
  When `true`, Mokaru duplicates your default resume, tailors it to the job description, and queues it for AI processing. Requires:

  * **Plus plan** with auto-prep feature
  * A **default resume** set in your Mokaru account
  * A **job description** of at least 500 characters
</ParamField>

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

<ResponseField name="success" type="boolean">Whether the operation succeeded</ResponseField>
<ResponseField name="applicationId" type="string">The application ID</ResponseField>
<ResponseField name="existing" type="boolean">`true` if an application with the same `jobUrl` already existed</ResponseField>
<ResponseField name="autoPrepare" type="boolean">Whether auto-prep was triggered for this application</ResponseField>

### Success (with auto-prep)

```json theme={null}
{
  "success": true,
  "applicationId": "clx5678...",
  "existing": false,
  "autoPrepare": true
}
```

### Success (without auto-prep)

```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-prep.",
  "code": "NO_DEFAULT_RESUME"
}
```

**Plus plan required:**

```json theme={null}
{
  "error": "Auto-prep requires a Plus plan",
  "code": "PLAN_REQUIRED"
}
```

**Job description too short:**

```json theme={null}
{
  "error": "Auto-prep 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"]
  }
}
```

<Info>
  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.
</Info>
