Token导航 LogoToken导航TokenDH.com
研究检索敏感数据clawhub未标认证来源可访问clear审计通过

auto-apply自动应用

Agent Skill

auto-apply 用于查找、检索和筛选相关信息,适合在 OpenClaw 中需要根据关键词、任务场景或来源线索快速定位候选结果时使用。可结合来源仓库、安装命令和原始 README 继续核验具体用法。安装前建议确认权限范围、维护状态,以及是否会触发联网、命令执行或文件读写。

总安装

10,392

周安装

433

GitHub Stars

公开资料未说明

下载量

3,464
OpenClaw

安装说明

本站只整理中文说明和来源信息,不托管安装包,也不代用户安装。

GitHub

来源数

2

许可证

MIT-0

最后核验

2026-05-01

来源状态

来源可访问

安装方式

通过对话安装

复制提示词发给支持本地命令或 Skills 的 AI 助手,先确认命令和权限,再让它执行。

请帮我安装这个 Agent Skill:auto-apply(自动应用)
来源仓库:https://github.com/vndck/auto-apply
安装命令:
openclaw skills install auto-apply
安装前请先检查当前环境是否支持对应 CLI,并向我确认将要执行的命令、安装目录、联网范围和文件读写权限;确认后再执行。

命令行安装

复制命令到本机终端执行。该命令会通过 OpenClaw 从第三方来源获取 Skill;本站只展示命令,不托管安装包,也不自动执行。

ClawHubOpenClaw
openclaw skills install auto-apply

简介

自动化求职申请流程,批量搜索职位并定制简历投递。

  • 集成 Mokaru 平台跟踪申请进度,优化候选人与岗位匹配度。
  • 支持按关键词筛选机会,生成个性化回复与跟进提醒。
  • 安装后用于职业规划阶段,需授权访问招聘平台账户。
  • 建议核实数据来源合法性,避免违反平台使用条款。auto-apply 属于研究检索类 Skill,可作为该场景下的辅助能力补充。

SKILL.md

name
auto-apply
version
2.0.0
description
Automate your job search and application process with Mokaru. Search thousands of jobs, tailor your resume to each role, track applications through your pipeline, and get AI-powered career coaching. Supports remote and on-site roles across all industries. Use when users ask about job hunting, career search, applying for jobs, resume optimization, interview prep, or application tracking.
requires
env
bins

Mokaru Job Search & Application Tracker

You can search for jobs, save and track job applications, and read the user's career profile through the Mokaru API.

Important: This skill does NOT submit job applications on behalf of the user. It helps with the preparation: finding jobs, saving them to a tracker, updating application status, and reviewing the user's profile. The user (or their browser agent) must visit the applyLink from search results to actually apply. When the user says "apply", save the job to their tracker and provide the apply link so they can complete the application themselves.

Authentication

Every request requires a Bearer token. The token is stored in the MOKARU_API_KEY environment variable and starts with mk_.

Include this header on all requests:

Authorization: Bearer $MOKARU_API_KEY

Base URL

https://api.mokaru.ai

All endpoints are under /v1/.


Endpoints

1. Search Jobs

When to use: The user wants to find job listings. They might say "find me React jobs in New York" or "search for remote marketing roles."

Method: POST /v1/jobs/search

Required scope: jobs:search

Rate limit: 30 requests per minute

Request body (JSON):

FieldTypeRequiredDescription
querystringYesJob search keywords (e.g. "software engineer")
locationstringNoCity, state, or country (e.g. "San Francisco, CA")
remotebooleanNoFilter for remote jobs only
workArrangementstringNoOne of: remote, hybrid, onsite
employmentTypestringNoE.g. "fulltime", "parttime", "contract"
datePostedstringNoRecency filter (e.g. "today", "3days", "week", "month")
salaryMinnumberNoMinimum annual salary filter
countrystringNoCountry code or name
benefitsstring[]NoRequired benefits to filter on
includeKeywordsstring[]NoKeywords that must appear in the job
excludeKeywordsstring[]NoKeywords that must NOT appear in the job
includeCompaniesstring[]NoLimit to specific companies
excludeCompaniesstring[]NoExclude specific companies
cursorstringNoOpaque pagination cursor from a previous response's nextCursor

Curl example:

curl -s -X POST https://api.mokaru.ai/v1/jobs/search \
  -H "Authorization: Bearer $MOKARU_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "query": "frontend engineer",
    "location": "New York",
    "remote": true
  }' | jq .

Response shape:

{
  "data": [
    {
      "id": "clx...",
      "title": "Frontend Engineer",
      "company": "Acme Corp",
      "companyLogo": "https://...",
      "companyWebsite": "https://...",
      "location": "New York, NY",
      "city": "New York",
      "state": "NY",
      "country": "US",
      "isRemote": true,
      "employmentType": "fulltime",
      "applyLink": "https://...",
      "applyIsDirect": false,
      "publisher": "LinkedIn",
      "description": "<p>We are looking for a Frontend Engineer...</p>",
      "highlights": { "qualifications": [...], "responsibilities": [...] },
      "benefits": ["Health insurance", "401k"],
      "salaryMin": 120000,
      "salaryMax": 160000,
      "salaryPeriod": "year",
      "postedAt": "2026-03-10T..."
    }
  ],
  "total": 142,
  "hasMore": true,
  "nextCursor": "eyJwYWdlIjoyfQ=="
}

Pagination: Pass the nextCursor from a response as cursor in the next request to fetch more results. When hasMore is false, nextCursor is null.

How to use the results: Present jobs in a readable list. Include the title, company, location, salary range (if available), and the apply link. If hasMore is true, fetch the next page with cursor.


2. Create Application

When to use: The user wants to save or track a job. They might say "save this job" or "add this to my tracker." You can also use this right after a search to save a result.

Method: POST /v1/tracker/applications

Required scope: tracker:write

Rate limit: 20 requests per minute

Request body (JSON):

FieldTypeRequiredDescription
jobTitlestringYesJob title (max 200 chars)
companystringYesCompany name (max 200 chars)
locationstringNoJob location (max 200 chars)
jobUrlstringNoURL of the job posting (max 2000 chars, must be a valid URL). Used for duplicate detection
jobDescriptionstringNoFull job description text (max 50,000 chars). Required (non-empty) for autoPrepare.
jobListingIdstringNoIf saving from a Mokaru search result, pass the job's id to automatically pull salary/details
sourcestringNoOne of: LinkedIn, CompanyWebsite, JobWebsite, Referral, Agency, Other. Defaults to Other
autoPreparebooleanNoWhen true, Mokaru duplicates the user's default resume and tailors it to the job description using AI. Requires Plus plan, a default resume, and a non-empty job description.

Curl example:

curl -s -X POST https://api.mokaru.ai/v1/tracker/applications \
  -H "Authorization: Bearer $MOKARU_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "jobTitle": "Frontend Engineer",
    "company": "Acme Corp",
    "location": "New York, NY",
    "jobUrl": "https://acme.com/careers/frontend",
    "jobListingId": "clx...",
    "source": "JobWebsite",
    "autoPrepare": true
  }' | jq .

Response shape:

{
  "success": true,
  "applicationId": "clx...",
  "existing": false,
  "autoPrepare": true
}

If existing is true, the application was already tracked (matched by jobUrl) and the existing ID is returned. No duplicate is created.

If autoPrepare is true in the response, Mokaru is tailoring the user's resume in the background (~30 seconds). The application status will be preparing until done.

Auto-prep errors: If auto-prep fails, the API returns a clear error code:

  • PLAN_REQUIRED (403) - user needs a Plus plan
  • NO_DEFAULT_RESUME (400) - user must set a default resume in Mokaru first
  • JOB_DESCRIPTION_TOO_SHORT (400) - job description is missing or empty

Workflow tip: When saving a job from search results, pass the id from the search result as jobListingId. This auto-fills salary and description data. Add "autoPrepare": true to also tailor the resume automatically.


3. List Applications

When to use: The user wants to see their tracked applications. They might ask "show my applications" or "what jobs have I applied to?"

Method: GET /v1/tracker/applications

Required scope: tracker:read

Rate limit: 60 requests per minute

Query parameters:

ParamTypeRequiredDescription
statusstringNoFilter by status (see status values below)
limitnumberNoResults per page, default 25, max 100
offsetnumberNoNumber of results to skip for pagination

Valid status values: watchlist, preparing, applied, response, screening, interview_scheduled, interviewed, offer, negotiating, accepted, rejected, withdrawn, no_response

Curl example:

curl -s -G https://api.mokaru.ai/v1/tracker/applications \
  -H "Authorization: Bearer $MOKARU_API_KEY" \
  --data-urlencode "status=applied" \
  --data-urlencode "limit=10" | jq .

Response shape:

{
  "data": [
    {
      "id": "clx...",
      "jobTitle": "Frontend Engineer",
      "company": "Acme Corp",
      "location": "New York, NY",
      "jobUrl": "https://acme.com/careers/frontend",
      "status": "applied",
      "source": "JobWebsite",
      "priority": 3,
      "salaryMin": 120000,
      "salaryMax": 160000,
      "appliedDate": "2026-03-10T...",
      "createdAt": "2026-03-10T...",
      "updatedAt": "2026-03-12T..."
    }
  ],
  "total": 24,
  "hasMore": true,
  "limit": 10,
  "offset": 0
}

How to present: Show the list as a table or concise summary. Include status, company, job title, and any salary info. If hasMore is true, let the user know there are more results.


4. Get Application Detail

When to use: The user wants to see the full detail of a specific application, including its timeline, interviews, and notes. They might say "show me the details of my Acme application" or "what's the status of that job?"

Method: GET /v1/tracker/applications/{id}

Required scope: tracker:read

Rate limit: 60 requests per minute

Curl example:

curl -s https://api.mokaru.ai/v1/tracker/applications/clx_abc123 \
  -H "Authorization: Bearer $MOKARU_API_KEY" | jq .

Response shape:

{
  "data": {
    "id": "clx_abc123",
    "jobTitle": "Frontend Engineer",
    "company": "Acme Corp",
    "location": "New York, NY",
    "jobUrl": "https://acme.com/careers/frontend",
    "jobDescription": "We are looking for...",
    "status": "interviewed",
    "source": "JobWebsite",
    "priority": 5,
    "notes": "Great conversation with hiring manager",
    "salaryMin": 120000,
    "salaryMax": 160000,
    "salaryPeriod": "year",
    "cvId": "clx_cv456",
    "appliedDate": "2026-03-10T...",
    "createdAt": "2026-03-10T...",
    "updatedAt": "2026-03-15T...",
    "timeline": [
      {
        "id": "tl1",
        "status": "interviewed",
        "description": "status_changed",
        "createdAt": "2026-03-15T..."
      }
    ],
    "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"
        }
      }
    ]
  }
}

How to use: Present the application details clearly. Highlight the current status, upcoming interviews (with dates and contacts), and any notes. If the user has interviews coming up, suggest they prepare.


5. Update Application

When to use: The user wants to change the status, priority, notes, or details of a tracked application. They might say "mark that application as interviewed" or "set priority to high."

Method: PATCH /v1/tracker/applications/{id}

Required scope: tracker:write

Rate limit: 20 requests per minute

Request body (JSON) - all fields optional, at least one required:

FieldTypeDescription
statusstringNew status (see valid status values above)
prioritynumber1 (lowest) to 5 (highest)
notesstringFree-text notes (max 5,000 chars)
jobTitlestringUpdated job title (max 200 chars)
companystringUpdated company name (max 200 chars)
locationstringUpdated location (max 200 chars)

Curl example:

curl -s -X PATCH https://api.mokaru.ai/v1/tracker/applications/clx_abc123 \
  -H "Authorization: Bearer $MOKARU_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "status": "interviewed",
    "priority": 5,
    "notes": "Great conversation with the hiring manager"
  }' | jq .

Response shape:

{
  "success": true,
  "application": {
    "id": "clx_abc123",
    "jobTitle": "Frontend Engineer",
    "company": "Acme Corp",
    "location": "New York, NY",
    "status": "interviewed",
    "priority": 5,
    "notes": "Great conversation with the hiring manager",
    "updatedAt": "2026-03-15T..."
  }
}

Status changes are automatically recorded in the application's timeline.


6. List Contacts

When to use: The user wants to see their networking contacts. They might say "show my contacts" or "who do I know at Acme Corp?"

Method: GET /v1/contacts

Required scope: contacts:read

Rate limit: 60 requests per minute

Query parameters:

ParamTypeRequiredDescription
limitnumberNoResults per page, default 25, max 100
offsetnumberNoNumber of results to skip
relationshipstringNoFilter by type (see relationship values below)
searchstringNoSearch by name, company, or email (case-insensitive)

Valid relationship values: RECRUITER, HIRING_MANAGER, HR_MANAGER, TEAM_LEAD, DEPARTMENT_HEAD, CEO_FOUNDER, COLLEAGUE, FRIEND, REFERRAL, OTHER

Curl example:

curl -s -G https://api.mokaru.ai/v1/contacts \
  -H "Authorization: Bearer $MOKARU_API_KEY" \
  --data-urlencode "search=Acme" \
  --data-urlencode "limit=10" | jq .

Response shape:

{
  "data": [
    {
      "id": "clx...",
      "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-10T...",
      "updatedAt": "2026-03-15T..."
    }
  ],
  "total": 12,
  "hasMore": true,
  "limit": 10,
  "offset": 0
}

7. Get Contact Detail

When to use: The user wants to see full details of a specific contact. They might say "show me Sarah's info" or "what's the recruiter's email?"

Method: GET /v1/contacts/{id}

Required scope: contacts:read

Rate limit: 30 requests per minute

Curl example:

curl -s https://api.mokaru.ai/v1/contacts/clx_abc123 \
  -H "Authorization: Bearer $MOKARU_API_KEY" | jq .

Response shape:

{
  "data": {
    "id": "clx_abc123",
    "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-10T...",
    "updatedAt": "2026-03-15T..."
  }
}

8. Create Contact

When to use: The user wants to save a new networking contact. They might say "add Sarah Jones as a contact" or "save the recruiter's info."

Method: POST /v1/contacts

Required scope: contacts:write

Rate limit: 20 requests per minute

Request body (JSON):

FieldTypeRequiredDescription
firstNamestringYesFirst name (max 100 chars)
lastNamestringYesLast name (max 100 chars)
jobTitlestringNoContact's job title (max 200 chars)
companystringNoCompany name (max 200 chars)
relationshipstringNoRelationship type (see values above)
emailstringNoEmail address (max 200 chars)
phonestringNoPhone number (max 50 chars)
linkedInstringNoLinkedIn profile URL (max 500 chars)

Curl example:

curl -s -X POST https://api.mokaru.ai/v1/contacts \
  -H "Authorization: Bearer $MOKARU_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "firstName": "Sarah",
    "lastName": "Jones",
    "jobTitle": "Engineering Manager",
    "company": "Acme Corp",
    "relationship": "HIRING_MANAGER",
    "email": "sarah@acme.com"
  }' | jq .

Response shape:

{
  "success": true,
  "id": "clx..."
}

9. Update Contact

When to use: The user wants to update a contact's details. They might say "update Sarah's phone number" or "change the recruiter's company."

Method: PATCH /v1/contacts/{id}

Required scope: contacts:write

Rate limit: 20 requests per minute

Request body (JSON) - all fields optional, at least one required:

FieldTypeDescription
firstNamestringFirst name (max 100 chars)
lastNamestringLast name (max 100 chars)
jobTitlestring/nullJob title (max 200 chars, null to clear)
companystring/nullCompany name (max 200 chars)
relationshipstring/nullRelationship type (see values above)
emailstring/nullEmail address (max 200 chars)
phonestring/nullPhone number (max 50 chars)
linkedInstring/nullLinkedIn URL (max 500 chars)

Curl example:

curl -s -X PATCH https://api.mokaru.ai/v1/contacts/clx_abc123 \
  -H "Authorization: Bearer $MOKARU_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "phone": "+1 555-0201",
    "relationship": "TEAM_LEAD"
  }' | jq .

Response shape:

{
  "success": true,
  "id": "clx_abc123"
}

Pass null for optional fields to clear them (e.g. "phone": null).


10. Delete Contact

When to use: The user wants to remove a contact. They might say "delete that contact" or "remove Sarah from my contacts."

Method: DELETE /v1/contacts/{id}

Required scope: contacts:write

Rate limit: 10 requests per minute

Curl example:

curl -s -X DELETE https://api.mokaru.ai/v1/contacts/clx_abc123 \
  -H "Authorization: Bearer $MOKARU_API_KEY" | jq .

Response shape:

{
  "success": true
}

11. Get Profile

When to use: The user wants to see their career profile, or you need context about their background to tailor a job search. For example, "what skills do I have on file?" or before searching, to understand their experience level.

Method: GET /v1/profile

Required scope: profile:read

Rate limit: 30 requests per minute

Curl example:

curl -s https://api.mokaru.ai/v1/profile \
  -H "Authorization: Bearer $MOKARU_API_KEY" | jq .

Response shape:

{
  "data": {
    "firstName": "Jane",
    "lastName": "Doe",
    "email": "jane@example.com",
    "phone": "+1 555-0100",
    "address": "New York, NY",
    "country": "US",
    "province": "NY",
    "jobTitle": "Frontend Engineer",
    "summary": "5 years of experience in...",
    "sector": "Technology",
    "linkedIn": "https://linkedin.com/in/janedoe",
    "website": "https://janedoe.dev",
    "portfolio": null,
    "jobTitles": [
      { "title": "Frontend Engineer", "displayOrder": 0 },
      { "title": "React Developer", "displayOrder": 1 }
    ],
    "skills": [
      { "name": "React", "category": "TECHNICAL", "level": "expert" },
      { "name": "TypeScript", "category": "TECHNICAL", "level": "advanced" }
    ],
    "workExperiences": [
      {
        "jobTitle": "Frontend Engineer",
        "company": "TechCo",
        "location": "New York, NY",
        "startDate": "2022-01-15T00:00:00.000Z",
        "endDate": null,
        "isCurrent": true,
        "description": "Building the design system...",
        "responsibilities": ["Led frontend architecture"],
        "achievements": ["Reduced bundle size by 40%"]
      }
    ],
    "educations": [
      {
        "school": "MIT",
        "degree": "Bachelor of Science",
        "field": "Computer Science",
        "startDate": "2016-09-01T00:00:00.000Z",
        "endDate": "2020-06-15T00:00:00.000Z",
        "isCurrent": false
      }
    ]
  }
}

Note: The profile response uses friendly aliases school / field for education (derived from the DB fields institution / fieldOfStudy). When calling the dedicated /v1/education endpoints, use institution and fieldOfStudy instead (see section 24-28). Skill category values are the enum TECHNICAL, SOFT, or LANGUAGE.

How to use: Pull the user's job titles, skills, and current role to craft better search queries. Mention their background when recommending jobs.


12. Update Profile

When to use: The user wants to update their career profile. They might say "change my job title" or "update my LinkedIn" or "add my new employer."

Method: PATCH /v1/profile

Required scope: profile:write

Rate limit: 20 requests per minute

Request body (JSON) - all fields optional, at least one required:

FieldTypeDescription
firstNamestringFirst name (max 100 chars)
lastNamestringLast name (max 100 chars)
emailstringEmail address (max 254 chars)
phonestring/nullPhone number (max 50 chars)
addressstring/nullAddress (max 200 chars)
countrystring/nullCountry (max 100 chars)
provincestring/nullProvince or state (max 100 chars)
birthDatestring/nullISO date string (e.g. "1990-01-15")
driverLicensestring/nullDriver license type (max 50 chars)
genderstring/nullGender (max 50 chars)
jobTitlestring/nullCurrent job title (max 200 chars)
summarystring/nullProfessional summary (max 2000 chars)
sectorstring/nullIndustry sector (max 100 chars)
employerstring/nullCurrent employer (max 200 chars)
linkedInstring/nullLinkedIn username or URL (auto-normalized)
websitestring/nullWebsite URL (https:// added if missing)
portfoliostring/nullPortfolio URL (https:// added if missing)

Pass null for optional fields to clear them.

Curl example:

curl -s -X PATCH https://api.mokaru.ai/v1/profile \
  -H "Authorization: Bearer $MOKARU_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "jobTitle": "Senior Software Engineer",
    "employer": "Acme Corp",
    "linkedIn": "jane-smith"
  }' | jq .

Response shape:

{
  "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 missing.

Important: Profile changes propagate to all resumes that use profile data. This is different from updating a resume's cvData which only affects that specific resume.


13. List Resumes

When to use: The user wants to see their resumes, or you need to know which resume to export or update. They might say "show my resumes" or "which CVs do I have?"

Method: GET /v1/resume

Required scope: resume:read

Rate limit: 60 requests per minute

Query parameters:

ParamTypeRequiredDescription
limitnumberNoResults per page, default 25, max 100
offsetnumberNoNumber of results to skip

Curl example:

curl -s https://api.mokaru.ai/v1/resume \
  -H "Authorization: Bearer $MOKARU_API_KEY" | jq .

Response shape:

{
  "data": [
    {
      "id": "clx...",
      "name": "Software Engineer Resume",
      "template": "classic",
      "isDefault": true,
      "createdAt": "2026-01-15T...",
      "updatedAt": "2026-03-20T..."
    }
  ],
  "total": 3,
  "hasMore": false,
  "limit": 25,
  "offset": 0
}

14. Get Resume Detail

When to use: The user wants to see the full content of a specific resume, or you need the data to provide career advice. They might say "show me my default resume" or "what's on my Software Engineer CV?"

Method: GET /v1/resume/{id}

Required scope: resume:read

Rate limit: 30 requests per minute

Curl example:

curl -s https://api.mokaru.ai/v1/resume/clx_abc123 \
  -H "Authorization: Bearer $MOKARU_API_KEY" | jq .

Response shape:

{
  "data": {
    "id": "clx...",
    "name": "Software Engineer Resume",
    "template": "classic",
    "isDefault": true,
    "cvData": {
      "firstName": "Jane",
      "lastName": "Doe",
      "email": "jane@example.com",
      "jobTitle": "Software Engineer",
      "experiences": [...],
      "education": [...],
      "skills": [...]
    },
    "designSettings": { ... },
    "optionalFields": { ... },
    "sectionOrder": ["personal", "experience", "education", "skills"],
    "hiddenItems": { ... },
    "createdAt": "2026-01-15T...",
    "updatedAt": "2026-03-20T..."
  }
}

The cvData field contains the full resume content: personal info, work experiences, education, skills, languages, certificates, projects, and more. The hiddenItems field tracks which individual entries (experiences, education, etc.) are hidden from the rendered resume.


15. Create Resume

When to use: The user wants to create a new resume. They might say "create a new resume for backend roles" or "make a copy of my CV with a different name."

Method: POST /v1/resume

Required scope: resume:write

Rate limit: 10 requests per minute

Request body (JSON):

FieldTypeRequiredDescription
namestringYesResume name (max 200 chars)
templatestringNoTemplate ID (default: "classic")
isDefaultbooleanNoSet as default resume
cvDataobjectNoResume content (experiences, skills, etc)
designSettingsobjectNoVisual styling (colors, fonts, spacing)
optionalFieldsobjectNoShow/hide optional fields
sectionOrderarrayNoOrder of resume sections

Curl example:

curl -s -X POST https://api.mokaru.ai/v1/resume \
  -H "Authorization: Bearer $MOKARU_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "name": "Backend Engineer Resume",
    "template": "classic",
    "isDefault": false
  }' | jq .

Response shape:

{
  "success": true,
  "id": "clx..."
}

16. Update Resume

When to use: The user wants to change their resume name, template, content, or settings. They might say "rename my resume" or "update my skills on the default CV."

Method: PATCH /v1/resume/{id}

Required scope: resume:write

Rate limit: 20 requests per minute

Request body (JSON) - all fields optional, at least one required:

FieldTypeDescription
namestringResume name (max 200 chars)
templatestringTemplate ID
isDefaultbooleanSet as default resume
cvDataobjectResume content
designSettingsobjectVisual styling
optionalFieldsobjectShow/hide optional fields
sectionOrderarrayOrder of resume sections

Curl example:

curl -s -X PATCH https://api.mokaru.ai/v1/resume/clx_abc123 \
  -H "Authorization: Bearer $MOKARU_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "name": "Updated Resume",
    "isDefault": true
  }' | jq .

Response shape:

{
  "success": true,
  "id": "clx..."
}

17. Delete Resume

When to use: The user wants to remove a resume. They might say "delete that old resume" or "remove my Backend CV."

Method: DELETE /v1/resume/{id}

Required scope: resume:write

Rate limit: 10 requests per minute

Curl example:

curl -s -X DELETE https://api.mokaru.ai/v1/resume/clx_abc123 \
  -H "Authorization: Bearer $MOKARU_API_KEY" | jq .

Response shape:

{
  "success": true
}

If the deleted resume was the default, another resume is automatically promoted. Applications linked to this resume are unlinked (cvId set to null, the application itself is not deleted). Any Autopilot searches that reference this resume are also deleted.


18. Export Resume as PDF

When to use: The user wants to download their resume as a PDF. They might say "export my resume" or "give me a PDF of my CV."

Method: POST /v1/resume/{id}/export/pdf

Required scope: resume:export

Rate limit: 5 requests per minute

Request body (JSON, optional):

FieldTypeRequiredDescription
localestringNoLanguage for date formatting (default: "en")

Curl example:

curl -s -X POST https://api.mokaru.ai/v1/resume/clx_abc123/export/pdf \
  -H "Authorization: Bearer $MOKARU_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{}' \
  -o resume.pdf

Response: Binary PDF file with Content-Type: application/pdf. Save it to disk or send it to the user.

Important: This endpoint returns a binary file, not JSON. The PDF is rendered server-side with the user's chosen template and design settings.

Export errors:

  • RESUME_PROCESSING (409) - resume is being tailored by auto-prep. Wait 5-10 seconds and retry.
  • EMPTY_RESUME (400) - the resume has no cvData yet. Ask the user to fill in their resume first.

19. List Experiences

When to use: The user wants to see their work history. They might say "show my work experience" or "what jobs have I had?"

Method: GET /v1/experiences

Required scope: experiences:read

Rate limit: 60 requests per minute

Query parameters:

ParamTypeRequiredDescription
limitnumberNoResults per page, default 25, max 100
offsetnumberNoNumber of results to skip

Curl example:

curl -s -G https://api.mokaru.ai/v1/experiences \
  -H "Authorization: Bearer $MOKARU_API_KEY" \
  --data-urlencode "limit=10" | jq .

Response shape:

{
  "data": [
    {
      "id": "clx...",
      "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",
      "createdAt": "2026-01-10T...",
      "updatedAt": "2026-03-15T..."
    }
  ],
  "total": 4,
  "hasMore": false,
  "limit": 10,
  "offset": 0
}

Note: The list response does not include responsibilities or achievements - use GET /v1/experiences/{id} to fetch those.


20. Create Experience

When to use: The user wants to add a new work experience. They might say "add my new job at Acme" or "save this work experience."

Method: POST /v1/experiences

Required scope: experiences:write

Rate limit: 20 requests per minute

Request body (JSON):

FieldTypeRequiredDescription
jobTitlestringYesJob title (max 200 chars)
companystringYesCompany name (max 200 chars)
locationstringNoWork location (max 200 chars)
startDatestringNoFull ISO-8601 datetime (e.g. "2022-07-01T00:00:00.000Z")
endDatestringNoFull ISO-8601 datetime (omit for current position)
isCurrentbooleanNoWhether this is the current position
descriptionstringNoRole description
responsibilitiesarrayNoList of responsibilities (array of strings)
achievementsarrayNoList of achievements (array of strings)

Date format: startDate and endDate must be full ISO-8601 datetimes (YYYY-MM-DDTHH:mm:ss.sssZ). A date-only string like "2022-07-01" will be rejected.

Curl example:

curl -s -X POST https://api.mokaru.ai/v1/experiences \
  -H "Authorization: Bearer $MOKARU_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "jobTitle": "Senior Software Engineer",
    "company": "Acme Corp",
    "location": "San Francisco, CA",
    "startDate": "2022-07-01T00:00:00.000Z",
    "isCurrent": true,
    "description": "Building the core platform",
    "responsibilities": ["Led frontend architecture"],
    "achievements": ["Reduced bundle size by 40%"]
  }' | jq .

Response shape:

{
  "success": true,
  "id": "clx..."
}

21. Get Experience Detail

When to use: The user wants to see full details of a specific work experience.

Method: GET /v1/experiences/{id}

Required scope: experiences:read

Rate limit: 30 requests per minute

Curl example:

curl -s https://api.mokaru.ai/v1/experiences/clx_abc123 \
  -H "Authorization: Bearer $MOKARU_API_KEY" | jq .

Response shape:

{
  "data": {
    "id": "clx_abc123",
    "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"],
    "achievements": ["Reduced bundle size by 40%"],
    "createdAt": "2026-01-10T...",
    "updatedAt": "2026-03-15T..."
  }
}

22. Update Experience

When to use: The user wants to change details of a work experience. They might say "update my Acme job" or "I left that position, mark it as ended."

Method: PATCH /v1/experiences/{id}

Required scope: experiences:write

Rate limit: 20 requests per minute

Request body (JSON) - all fields optional, at least one required:

FieldTypeDescription
jobTitlestringJob title (max 200 chars)
companystringCompany name (max 200 chars)
locationstring/nullWork location (max 200 chars, null to clear)
startDatestring/nullFull ISO-8601 datetime (null to clear)
endDatestring/nullFull ISO-8601 datetime (null to clear)
isCurrentboolean/nullWhether this is the current position (null to clear)
descriptionstring/nullRole description (null to clear)
responsibilitiesarray/nullList of responsibilities (null to clear)
achievementsarray/nullList of achievements (null to clear)

Date format: startDate and endDate must be full ISO-8601 datetimes (YYYY-MM-DDTHH:mm:ss.sssZ). A date-only string will be rejected.

Curl example:

curl -s -X PATCH https://api.mokaru.ai/v1/experiences/clx_abc123 \
  -H "Authorization: Bearer $MOKARU_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "isCurrent": false,
    "endDate": "2026-03-15T00:00:00.000Z"
  }' | jq .

Response shape:

{
  "success": true,
  "id": "clx_abc123"
}

Pass null for optional fields to clear them.


23. Delete Experience

When to use: The user wants to remove a work experience. They might say "delete that old job" or "remove the internship from my profile."

Method: DELETE /v1/experiences/{id}

Required scope: experiences:write

Rate limit: 10 requests per minute

Curl example:

curl -s -X DELETE https://api.mokaru.ai/v1/experiences/clx_abc123 \
  -H "Authorization: Bearer $MOKARU_API_KEY" | jq .

Response shape:

{
  "success": true
}

24. List Education

When to use: The user wants to see their education history. They might say "show my education" or "what schools do I have listed?"

Method: GET /v1/education

Required scope: education:read

Rate limit: 60 requests per minute

Query parameters:

ParamTypeRequiredDescription
limitnumberNoResults per page, default 25, max 100
offsetnumberNoNumber of results to skip

Curl example:

curl -s -G https://api.mokaru.ai/v1/education \
  -H "Authorization: Bearer $MOKARU_API_KEY" \
  --data-urlencode "limit=10" | jq .

Response shape:

{
  "data": [
    {
      "id": "clx...",
      "institution": "Stanford University",
      "degree": "Bachelor of Science",
      "fieldOfStudy": "Computer Science",
      "location": "Stanford, CA",
      "startDate": "2018-09-01T00:00:00.000Z",
      "endDate": "2022-06-15T00:00:00.000Z",
      "isCurrent": false,
      "grade": "Magna Cum Laude",
      "createdAt": "2026-01-10T...",
      "updatedAt": "2026-03-15T..."
    }
  ],
  "total": 2,
  "hasMore": false,
  "limit": 10,
  "offset": 0
}

Note: The list response does not include description or gpa - use GET /v1/education/{id} to fetch those.


25. Create Education

When to use: The user wants to add education. They might say "add my Stanford degree" or "save this school to my profile."

Method: POST /v1/education

Required scope: education:write

Rate limit: 20 requests per minute

Request body (JSON):

FieldTypeRequiredDescription
institutionstringYesSchool or institution name (max 200 chars)
degreestringYesDegree type (max 200 chars)
fieldOfStudystringNoField of study (max 200 chars)
locationstringNoLocation of the school (max 200 chars)
startDatestringNoFull ISO-8601 datetime (e.g. "2018-09-01T00:00:00.000Z")
endDatestringNoFull ISO-8601 datetime (omit if currently enrolled)
isCurrentbooleanNoWhether currently enrolled
descriptionstringNoAdditional details
gradestringNoGrade or honors (max 50 chars, e.g. "Magna Cum Laude")
gpanumberNoGPA value

Date format: startDate and endDate must be full ISO-8601 datetimes (YYYY-MM-DDTHH:mm:ss.sssZ). A date-only string will be rejected.

Curl example:

curl -s -X POST https://api.mokaru.ai/v1/education \
  -H "Authorization: Bearer $MOKARU_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "institution": "Stanford University",
    "degree": "Bachelor of Science",
    "fieldOfStudy": "Computer Science",
    "startDate": "2018-09-01T00:00:00.000Z",
    "endDate": "2022-06-15T00:00:00.000Z"
  }' | jq .

Response shape:

{
  "success": true,
  "id": "clx..."
}

26. Get Education Detail

When to use: The user wants to see full details of a specific education entry.

Method: GET /v1/education/{id}

Required scope: education:read

Rate limit: 30 requests per minute

Curl example:

curl -s https://api.mokaru.ai/v1/education/clx_abc123 \
  -H "Authorization: Bearer $MOKARU_API_KEY" | jq .

Response shape:

{
  "data": {
    "id": "clx_abc123",
    "institution": "Stanford University",
    "degree": "Bachelor of Science",
    "fieldOfStudy": "Computer Science",
    "location": "Stanford, CA",
    "startDate": "2018-09-01T00:00:00.000Z",
    "endDate": "2022-06-15T00:00:00.000Z",
    "isCurrent": false,
    "description": "Graduated with honors",
    "grade": "Magna Cum Laude",
    "gpa": 3.8,
    "createdAt": "2026-01-10T...",
    "updatedAt": "2026-03-15T..."
  }
}

27. Update Education

When to use: The user wants to change education details. They might say "update my degree" or "change the field of study."

Method: PATCH /v1/education/{id}

Required scope: education:write

Rate limit: 20 requests per minute

Request body (JSON) - all fields optional, at least one required:

FieldTypeDescription
institutionstringSchool name (max 200 chars)
degreestringDegree type (max 200 chars)
fieldOfStudystring/nullField of study (max 200 chars, null to clear)
locationstring/nullLocation of the school (max 200 chars, null to clear)
startDatestring/nullFull ISO-8601 datetime (null to clear)
endDatestring/nullFull ISO-8601 datetime (null to clear)
isCurrentboolean/nullWhether currently enrolled (null to clear)
descriptionstring/nullAdditional details (null to clear)
gradestring/nullGrade or honors (max 50 chars, null to clear)
gpanumber/nullGPA value (null to clear)

Date format: startDate and endDate must be full ISO-8601 datetimes (YYYY-MM-DDTHH:mm:ss.sssZ).

Curl example:

curl -s -X PATCH https://api.mokaru.ai/v1/education/clx_abc123 \
  -H "Authorization: Bearer $MOKARU_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "degree": "Master of Science",
    "fieldOfStudy": "Machine Learning"
  }' | jq .

Response shape:

{
  "success": true,
  "id": "clx_abc123"
}

28. Delete Education

When to use: The user wants to remove an education entry. They might say "delete that school" or "remove my old degree."

Method: DELETE /v1/education/{id}

Required scope: education:write

Rate limit: 10 requests per minute

Curl example:

curl -s -X DELETE https://api.mokaru.ai/v1/education/clx_abc123 \
  -H "Authorization: Bearer $MOKARU_API_KEY" | jq .

Response shape:

{
  "success": true
}

29. List Skills

When to use: The user wants to see their skills. They might say "show my skills" or "what skills do I have?"

Method: GET /v1/skills

Required scope: skills:read

Rate limit: 60 requests per minute

Query parameters:

ParamTypeRequiredDescription
limitnumberNoResults per page, default 25, max 100
offsetnumberNoNumber of results to skip
categorystringNoFilter by category: TECHNICAL, SOFT, or LANGUAGE

Curl example:

curl -s -G https://api.mokaru.ai/v1/skills \
  -H "Authorization: Bearer $MOKARU_API_KEY" \
  --data-urlencode "limit=50" \
  --data-urlencode "category=TECHNICAL" | jq .

Response shape:

{
  "data": [
    {
      "id": "clx...",
      "name": "TypeScript",
      "category": "TECHNICAL",
      "level": "expert",
      "score": 5,
      "displayOrder": 0,
      "isVisible": true,
      "categoryRelation": { "name": "programming", "labelEn": "Programming Languages" },
      "createdAt": "2026-01-10T...",
      "updatedAt": "2026-03-15T..."
    }
  ],
  "total": 12,
  "hasMore": false,
  "limit": 50,
  "offset": 0
}

The category field is the legacy enum (TECHNICAL / SOFT / LANGUAGE). The optional categoryRelation object holds an extended category definition (system-defined or user-defined) when the skill is linked to one.


30. Create Skill

When to use: The user wants to add a skill. They might say "add TypeScript to my skills" or "save this skill."

Method: POST /v1/skills

Required scope: skills:write

Rate limit: 20 requests per minute

Request body (JSON):

FieldTypeRequiredDescription
namestringYesSkill name (max 200 chars)
categorystringNoOne of: TECHNICAL, SOFT, LANGUAGE. Defaults to TECHNICAL.
levelstringNoFree-form proficiency label (max 50 chars, e.g. "expert")
scorenumberNoInteger 1-5 (higher means more proficient)

Curl example:

curl -s -X POST https://api.mokaru.ai/v1/skills \
  -H "Authorization: Bearer $MOKARU_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "name": "TypeScript",
    "category": "TECHNICAL",
    "level": "expert",
    "score": 5
  }' | jq .

Response shape:

{
  "success": true,
  "id": "clx..."
}

31. Get Skill Detail

When to use: The user wants to see details of a specific skill.

Method: GET /v1/skills/{id}

Required scope: skills:read

Rate limit: 30 requests per minute

Curl example:

curl -s https://api.mokaru.ai/v1/skills/clx_abc123 \
  -H "Authorization: Bearer $MOKARU_API_KEY" | jq .

Response shape:

{
  "data": {
    "id": "clx_abc123",
    "name": "TypeScript",
    "categoryLegacy": "TECHNICAL",
    "categoryId": null,
    "level": "expert",
    "score": 5,
    "displayOrder": 0,
    "isVisible": true,
    "createdAt": "2026-01-10T...",
    "updatedAt": "2026-03-15T..."
  }
}

Note: Unlike the list endpoint, the detail endpoint returns the raw database row. The enum category is on categoryLegacy (not remapped to category), and the optional extended category link is on categoryId.


32. Update Skill

When to use: The user wants to change a skill's details. They might say "change my TypeScript level to expert" or "update that skill's category."

Method: PATCH /v1/skills/{id}

Required scope: skills:write

Rate limit: 20 requests per minute

Request body (JSON) - all fields optional, at least one required:

FieldTypeDescription
namestringSkill name (max 200 chars)
categorystringOne of: TECHNICAL, SOFT, LANGUAGE
levelstring/nullFree-form proficiency label (max 50 chars, null to clear)
scorenumber/nullInteger 1-5 (null to clear)
isVisiblebooleanWhether this skill shows on rendered resumes
displayOrdernumberInteger position used for sorting skills

Curl example:

curl -s -X PATCH https://api.mokaru.ai/v1/skills/clx_abc123 \
  -H "Authorization: Bearer $MOKARU_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "level": "expert",
    "score": 5
  }' | jq .

Response shape:

{
  "success": true,
  "id": "clx_abc123"
}

33. Delete Skill

When to use: The user wants to remove a skill. They might say "delete that skill" or "remove TypeScript from my profile."

Method: DELETE /v1/skills/{id}

Required scope: skills:write

Rate limit: 10 requests per minute

Curl example:

curl -s -X DELETE https://api.mokaru.ai/v1/skills/clx_abc123 \
  -H "Authorization: Bearer $MOKARU_API_KEY" | jq .

Response shape:

{
  "success": true
}

34. Delete Application

When to use: The user wants to remove an application from their tracker. They might say "delete that application" or "remove the Acme job from my tracker."

Method: DELETE /v1/tracker/applications/{id}

Required scope: tracker:write

Rate limit: 10 requests per minute

Curl example:

curl -s -X DELETE https://api.mokaru.ai/v1/tracker/applications/clx_abc123 \
  -H "Authorization: Bearer $MOKARU_API_KEY" | jq .

Response shape:

{
  "success": true
}

The application is soft-deleted (marked as deleted but retained in the database). Timeline entries are preserved. Any linked resume is not modified.


Workflows

Finding, saving, and preparing for jobs

  1. Optionally call GET /v1/profile to understand the user's background.
  2. Call POST /v1/jobs/search with a query based on what the user asked for (or derived from their profile).
  3. Present the results with the applyLink for each job.
  4. If the user wants to save one, call POST /v1/tracker/applications with the job details and pass the job id as jobListingId. Add "autoPrepare": true to tailor their resume automatically.
  5. To actually apply, the user must visit the applyLink themselves. Provide it clearly.

Reviewing application pipeline

  1. Call GET /v1/tracker/applications to get all applications, or filter by status.
  2. Summarize the pipeline: how many in each status, which are highest priority.
  3. If the user wants to update one, call PATCH /v1/tracker/applications/{id}.

Managing contacts

  1. Call GET /v1/contacts to list all contacts, or use search to find by name/company.
  2. Call GET /v1/contacts/{id} for full contact details.
  3. To add a new contact, call POST /v1/contacts with at least firstName and lastName.
  4. To update contact info, call PATCH /v1/contacts/{id} with the fields to change. Pass null to clear optional fields.
  5. To delete, call DELETE /v1/contacts/{id}.

Managing work experiences

  1. Call GET /v1/experiences to list all work experiences.
  2. Call GET /v1/experiences/{id} to see full details of a specific experience.
  3. To add a new experience, call POST /v1/experiences with at least jobTitle and company.
  4. To update, call PATCH /v1/experiences/{id} with the fields to change. Pass null to clear optional fields.
  5. To delete, call DELETE /v1/experiences/{id}.

Managing education

  1. Call GET /v1/education to list all education entries.
  2. Call GET /v1/education/{id} to see full details of a specific education entry.
  3. To add, call POST /v1/education with at least institution and degree.
  4. To update, call PATCH /v1/education/{id} with the fields to change. Pass null to clear optional fields.
  5. To delete, call DELETE /v1/education/{id}.

Managing skills

  1. Call GET /v1/skills to list all skills.
  2. Call GET /v1/skills/{id} to see details of a specific skill.
  3. To add a skill, call POST /v1/skills with at least name.
  4. To update, call PATCH /v1/skills/{id} with the fields to change. Pass null to clear optional fields.
  5. To delete, call DELETE /v1/skills/{id}.

Managing resumes

  1. Call GET /v1/resume to see all resumes and find the right one.
  2. Call GET /v1/resume/{id} to read the full content of a resume.
  3. To create a new resume, call POST /v1/resume with a name and optional content.
  4. To update resume content (add skills, experiences, etc.), call PATCH /v1/resume/{id} with the fields to change.
  5. To export as PDF, call POST /v1/resume/{id}/export/pdf and save the binary response to a file.
  6. To delete, call DELETE /v1/resume/{id}. Linked applications are unlinked, not deleted.

Error Handling

StatusMeaningWhat to do
400Bad request / validationCheck the details field for which fields failed. Fix and retry.
401Invalid or missing tokenTell the user their API key is invalid or expired.
403Insufficient permissionsThe API key does not have the required scope for this endpoint.
404Not foundThe application or profile does not exist.
409ProcessingResume is being tailored by auto-prep. Wait and retry.
429Rate limitedWait before retrying. Do not hammer the endpoint.
500Server errorRetry once. If it persists, tell the user something went wrong.
503Service unavailableRate limiter or export service is temporarily down. Retry after a short wait.

Always check the HTTP status before parsing the response body. On errors, the body contains an error field with a human-readable message.


Documentation

Full API documentation is available at docs.mokaru.ai.

适合场景

01

OpenClaw 用户查找和安装 Skill 时

02

用户想查找某类 Agent Skill 时

03

需要根据任务场景推荐可安装能力包时

04

需要对比不同来源的安装命令和来源信息时

能力概览

能力 1

按任务关键词查找相关 Skills

能力 2

展示可复制的安装命令

能力 3

保留来源站点、仓库和原始说明,方便继续核验

能力 4

补充不同宿主或平台的使用分布数据

能力 5

展示第三方安全扫描或审计结果

安装后应在对应宿主中按原始 README 的触发条件使用;具体调用方式请以来源页面和 README 为准。

平台分布

OpenClaw

79.84%
按下载量换算2,766

安全审计

VirusTotal

通过

ClawScan

通过

Static analysis

通过

权限和风险

敏感数据

该 Skill 可能接触密钥、Token、环境变量或敏感配置,应进入高风险复核队列,默认不自动发布。

安装前确认

本站仅展示第三方公开信息,不托管安装包,不提供自动安装或运行环境。安装前应自行审查源码、依赖和命令行为。当前只有一个来源,正式发布前建议补源仓库或其他目录站核验。

来源信息

继续浏览同类 Skills