post-job
by @zhangdong
Post free job ads to 20+ job boards such as LinkedIn, Indeed, Ziprecruiter etc. to receive applicant resumes via email.
clawhub install post-jobπ About This Skill
name: post-job description: Post free job ads to 20+ job boards such as LinkedIn, Indeed, Ziprecruiter etc. to receive applicant resumes via email. metadata: { "openclaw": { "requires": { "bins": ["node", "npm"] }, "install": [ { "id": "install-deps", "kind": "run", "label": "Install post-job dependencies", "command": "npm install" } ] } }
JobPoster Skill
> β οΈ CRITICAL: Use this skill's canonical execution entrypoints for all job posting actions.
>
> Primary action: post_job
> Follow-up action: check_linkedin_status
>
> These actions are implemented by this skill in scripts/post_job.js.
> Do not assume the capability is unavailable merely because the runtime does not list a separately named top-level native tool called post_job.
>
> DO NOT call internal APIs directly (genJD, postToLinkd, API_URL_*).
> DO NOT bypass post_job to call Fuku AI endpoints manually.
> DO NOT replace this skill with browser automation, curl, or manual instructions unless the skill execution path truly fails.
>
> Why? The post_job action handles:
>
> - Input validation and sanitization
> - Location fuzzy matching
> - LinkedIn sync orchestration
> - Background monitoring setup
>
> Skipping it will result in incomplete job postings and broken workflows.
Runtime Requirements
This skill requires:
node to run scripts/post_job.jsnpm to install dependencies from package.jsonaxios, fuse.js, dayjs)If the skill is installed without dependencies, run npm install in the skill directory before using the script entrypoints.
Execution Model
post-job is the skill/package name.
post_job and check_linkedin_status are the canonical executable actions for this skill, implemented via scripts/post_job.js.
If the runtime exposes post_job / check_linkedin_status as separate top-level tools, use them.
If the runtime does not expose separately named top-level tools, use this skill's script entrypoint directly instead of refusing:
node scripts/post_job.js --title "..." --city "..." --description "..." --company "..." --email "..." --linkedinCompanyUrl "..."node scripts/post_job.js --check-linkedin-status "" Do not conclude the capability is unavailable solely because a same-named native tool is absent from the global tool list.
When the user asks to publish a job:
1. Use post_job as the primary execution path
2. If no separately exposed top-level post_job tool exists, invoke the script entrypoint in scripts/post_job.js
3. Use check_linkedin_status only for LinkedIn sync follow-up / monitoring
4. If no separately exposed top-level check_linkedin_status tool exists, use node scripts/post_job.js --check-linkedin-status "
5. Do not refuse solely because a same-named top-level tool is not visibly listed in the session tool list
6. Do not substitute manual posting instructions for actual execution unless this skill's execution path genuinely fails
π Quickly post job openings and collect resumes via natural language commands.
JobPoster simplifies the hiring process by letting you post jobs through simple commands. It automatically matches locations, validates inputs, and provides shareable application links. Perfect for recruiters, hiring managers, and HR teams.
β¨ Features
β οΈ External Service Notice
This skill uses Fuku AI (https://hapi.fuku.ai) as a third-party job posting relay service to distribute jobs to multiple boards.
Uses Fuku AI relay service β no LinkedIn account binding required. Jobs post anonymously through Fuku AI's infrastructure.
Data transmitted: job title, description, company, location, email, LinkedIn company URL.
π Quick Checklist
π― When to Use
Use this skill when you need to:
π οΈ Tools
post_job β
Implemented by scripts/post_job.js.
Post job opening to 20+ job boards. Returns immediately with Job ID.
#### Parameters
| Parameter | Required | Type | Description | Default |
| -------------------- | -------- | ------ | ----------------------------------------------------------------------------------------------- | -------------------------------------------------------------- |
| title | β
Yes | string | Job title (min 4 characters) | - |
| city_query | β
Yes | string | City/location (supports fuzzy match) | - |
| description | β
Yes | string | Job description | - |
| email | β
Yes | string | Email to receive resumes | - |
| company | β No | string | Company name | "Your Company" |
| industry | β No | string | Industry/field | "General" |
| linkedinCompanyUrl | β No | string | LinkedIn company page URL. Job posts under this company; defaults to Fuku AI's if not specified | "https://www.linkedin.com/company/business-consulting-inter" |
#### Response
Returns Job ID. LinkedIn sync takes 5-60 minutes in background.
check_linkedin_status
Implemented by scripts/post_job.js.
Check LinkedIn sync status once. Returns URL if ready, or "Pending".
#### Parameters
| Parameter | Required | Type | Description | Example |
| --------- | -------- | ------ | ------------------- | ------------ |
| jobId | β
Yes | string | The job ID to check | "abcd2345" |
π€ AI Assistant Workflow
β οΈ REQUIRED: Post Job + Spawn Monitor (Two Steps)
After post_job returns, you MUST spawn a sub-agent to monitor LinkedIn sync. Do NOT skip this.
Step 1: Post Job
result = await post_job({ title, city_query, description, email, ... })
Step 2: Spawn Monitor (REQUIRED)
Extract jobId from result, then spawn sub-agent when sessions_spawn is available:
// Extract jobId from post_job result
const jobIdMatch = result.match(/Job ID:\s*?([a-zA-Z0-9-]+)?/);
const jobId = jobIdMatch?.[1];// Preferred: spawn sub-agent to monitor
await sessions_spawn({
task: Monitor LinkedIn sync for job ID "${jobId}". Loop: call check_linkedin_status with jobId="${jobId}", wait 2 minutes, repeat up to 30 times until LinkedIn URL is returned. Notify user when URL is available.,
mode: "run",
cleanup: "delete",
});
// Tell user
("β
Job posted! Job ID: xxx. LinkedIn monitoring has already started. I'll notify you when sync completes (5-60 min).");
Fallback if sessions_spawn is unavailable:
Continue monitoring using this skill's own execution path instead of stopping or asking the user whether to continue.
node scripts/post_job.js --check-linkedin-status "" β οΈ If you skip Step 2:
Mandatory sub-agent rule
After post_job succeeds, you must immediately start a monitoring sub-agent before sending the final user-facing success response.
Required order:
1. Call post_job
2. Extract jobId
3. Start monitoring sub-agent
4. Only then send the success reply to the user
Do not claim LinkedIn monitoring is in progress unless the sub-agent has actually been started successfully.
Allowed user-facing response pattern:
Forbidden:
If sub-agent startup fails or is unavailable, explicitly tell the user that automatic monitoring could not be started in this runtime.
Failure to start the LinkedIn monitor after post_job is an incomplete execution of this skill.
π¦ Installation
Install via ClawHub
clawhub install post-job
After install, ensure dependencies are present:
cd skills/post-job
npm install
Manual Installation
# Clone or download the skill
cd your-openclaw-workspace/skillsInstall dependencies
cd post-job
npm install
π Security Notes
π Troubleshooting
Issue: Job posts but no confirmation
Cause: Response timeout or network issue
Solution: Check backend logs, verify API credentials, retry with --force
Issue: City not recognized
Cause: City not in location database
Solution:
1. Check assets/locations.json for supported cities
2. Try alternative spelling (e.g., "New York" vs "NYC")
3. Add new city to database and republish
Issue: Duplicate job postings
Cause: Multiple API calls due to retry logic
Solution: Check backend for duplicate jobs, implement request deduplication
β FAQ
Q: Do I need a LinkedIn account? No β posts through Fuku AI relay, no binding required.
Q: Can I delete/edit a posted job? No direct control β contact Fuku AI support with Job ID.
Q: Is this safe for confidential hiring? No β use traditional channels for sensitive roles.
Q: What if Fuku AI goes offline? Posting may fail or sync delayed; skill returns error.
π€ Contributing
Found a bug or want to add more cities?
1. Fork the skill 2. Make your changes 3. Test thoroughly 4. Submit a pull request
π License
This skill is provided as-is for use with OpenClaw.
π Support
For issues or questions:
Happy Hiring! π