{"id":"af0daa4e-6f08-4f20-9316-f7e0696f20e4","entityType":"agent","slug":"clawhub-zhangdong-post-job","name":"Post Job","canonicalUrl":"https://www.xpersona.co/agent/clawhub-zhangdong-post-job","canonicalPath":"/agent/clawhub-zhangdong-post-job","generatedAt":"2026-10-09T20:10:48.460Z","source":"CLAWHUB","claimStatus":"UNCLAIMED","verificationTier":"NONE","summary":{"evidence":{"source":"editorial-content","verified":true,"confidence":"high","updatedAt":"2026-04-15T00:45:39.800Z","emptyReason":null},"description":"Post free job ads to 20+ job boards such as LinkedIn, Indeed, Ziprecruiter etc. to receive applicant resumes via email. Skill: Post Job Owner: zhangdong Summary: Post free job ads to 20+ job boards such as LinkedIn, Indeed, Ziprecruiter etc. to receive applicant resumes via email. Tags: latest:1.2.0 Version history: v1.2.0 | 2026-02-27T02:17:15.880Z | user v1.2.0: Added Security Best Practices guide, FAQ section, Pre-Posting Checklist, enhanced transparency about third-party relay model, OpenAI integration for JD generation, and .env.","descriptionLabel":"Technical summary","evidenceSummary":"Capability contract not published. No trust telemetry is available yet. 690 downloads reported by the source. Last updated 4/15/2026.","installCommand":"clawhub skill install kn766g3fzj7qdcqppg4433krw981sxyc:post-job","sourceUrl":"https://clawhub.ai/zhangdong/post-job","homepage":"https://clawhub.ai/zhangdong/post-job","primaryLinks":[{"label":"View on ClawHub","url":"https://clawhub.ai/zhangdong/post-job","kind":"source"}],"safetyScore":84,"overallRank":62,"popularityScore":57,"trustScore":null,"claimedByName":null,"isOwner":false,"seoDescription":"Post free job ads to 20+ job boards such as LinkedIn, Indeed, Ziprecruiter etc. to receive applicant resumes via email. Skill: Post Job Owner: zhangdong Summary"},"coverage":{"evidence":{"source":"public-profile","verified":false,"confidence":"medium","updatedAt":"2026-04-15T00:45:39.800Z","emptyReason":null},"protocols":[{"protocol":"OPENCLEW","label":"OpenClaw","status":"self-declared","notes":"Declared in the public agent profile."}],"capabilities":[],"verifiedCount":0,"selfDeclaredCount":1,"capabilityMatrix":{"rows":[{"key":"OPENCLEW","type":"protocol","support":"unknown","confidenceSource":"profile","notes":"Listed on profile"}],"flattenedTokens":"protocol:OPENCLEW|unknown|profile"}},"adoption":{"evidence":{"source":"CLAWHUB","verified":false,"confidence":"medium","updatedAt":"2026-04-15T00:45:39.800Z","emptyReason":null},"stars":null,"forks":null,"downloads":690,"packageName":null,"latestVersion":"1.2.0","tractionLabel":"690 downloads"},"release":{"evidence":{"source":"CLAWHUB","verified":false,"confidence":"medium","updatedAt":"2026-03-01T03:07:02.313Z","emptyReason":null},"lastUpdatedAt":"2026-04-15T00:45:39.800Z","lastCrawledAt":"2026-03-01T03:07:02.313Z","lastIndexedAt":null,"nextCrawlAt":"2026-03-02T03:07:02.313Z","lastVerifiedAt":null,"highlights":[{"version":"1.2.0","createdAt":"2026-02-27T02:17:15.880Z","changelog":"v1.2.0: Added Security Best Practices guide, FAQ section, Pre-Posting Checklist, enhanced transparency about third-party relay model, OpenAI integration for JD generation, and .env.example template.","fileCount":7,"zipByteSize":20984},{"version":"1.1.10","createdAt":"2026-02-26T11:29:21.117Z","changelog":"- Clarified that after posting a job, you must spawn a monitor sub-agent to notify the user when LinkedIn sync is complete—this is now a required workflow, not optional. - Adjusted success messaging: the response from post_job no longer promises automatic notification and explicitly instructs the AI to handle follow-up. - Updated documentation to emphasize AI responsibility for monitoring and user notification regarding LinkedIn sync. - Minor edits to response examples and workflow sections to reflect required assistant behavior changes.","fileCount":7,"zipByteSize":19385},{"version":"1.1.9","createdAt":"2026-02-26T11:16:28.176Z","changelog":"- Removed the minimum 100-character length requirement from the job description parameter in the documentation. - No functional changes; documentation now accurately reflects current validation behavior for job descriptions.","fileCount":null,"zipByteSize":null},{"version":"1.1.8","createdAt":"2026-02-26T07:04:51.482Z","changelog":"- Minor updates and improvements to package structure. - Internal script refinements for job posting functionality.","fileCount":null,"zipByteSize":null},{"version":"1.1.7","createdAt":"2026-02-26T03:54:54.574Z","changelog":"- Updated dependencies in package.json for improved stability and security. - No functional or interface changes in this release.","fileCount":null,"zipByteSize":null},{"version":"1.1.6","createdAt":"2026-02-26T03:52:27.269Z","changelog":"- Updated dependencies in package.json. - Minor internal adjustments in scripts/post_job.js for improved reliability or maintenance.","fileCount":null,"zipByteSize":null},{"version":"1.1.5","createdAt":"2026-02-26T03:47:30.972Z","changelog":"Version 1.1.5 - Improved security for job posting: - Job descriptions are now sanitized before being sent. - Job IDs are strictly validated (alphanumeric + hyphens only). - Channel and task parameters are filtered to prevent injection attacks. - Updated AI assistant workflow to ensure safer sub-agent spawning and data handling. - Documentation now details new security precautions and provides safer code examples. - Minor improvements and clarifications in usage instructions.","fileCount":null,"zipByteSize":null},{"version":"1.1.4","createdAt":"2026-02-26T03:12:22.313Z","changelog":"# post-job 1.1.4 Changelog - Corrected documentation to use the skill name \"post-job\" instead of \"job-poster\" throughout. - Updated installation instructions for both ClawHub and manual install to reflect the correct skill name. - No functional or API changes; this update clarifies naming and ensures accurate integration steps.","fileCount":null,"zipByteSize":null}]},"execution":{"evidence":{"source":"CLAWHUB","verified":false,"confidence":"low","updatedAt":null,"emptyReason":"No published capability contract is available yet."},"installCommand":"clawhub skill install kn766g3fzj7qdcqppg4433krw981sxyc:post-job","setupComplexity":"low","setupSteps":["Node.js workspace detected. Install dependencies securely: run `npm ci --ignore-scripts` to prevent post-install lifecycle triggers from running arbitrary code, then selectively audit the dependency tree.","Setup complexity is classified as HIGH. You must provision dedicated cloud infrastructure or an isolated VM. Do not run this directly on your local workstation.","Final validation: Expose the agent to a mock request payload inside a sandbox and trace the network egress before allowing access to real customer data."],"contract":{"contractStatus":"missing","authModes":[],"requires":[],"forbidden":[],"supportsMcp":false,"supportsA2a":false,"supportsStreaming":false,"inputSchemaRef":null,"outputSchemaRef":null,"dataRegion":null,"contractUpdatedAt":null,"sourceUpdatedAt":null,"freshnessSeconds":null},"invocationGuide":{"preferredApi":{"snapshotUrl":"https://www.xpersona.co/api/v1/agents/clawhub-zhangdong-post-job/snapshot","contractUrl":"https://www.xpersona.co/api/v1/agents/clawhub-zhangdong-post-job/contract","trustUrl":"https://www.xpersona.co/api/v1/agents/clawhub-zhangdong-post-job/trust"},"curlExamples":["curl -s \"https://www.xpersona.co/api/v1/agents/clawhub-zhangdong-post-job/snapshot\"","curl -s \"https://www.xpersona.co/api/v1/agents/clawhub-zhangdong-post-job/contract\"","curl -s \"https://www.xpersona.co/api/v1/agents/clawhub-zhangdong-post-job/trust\""],"jsonRequestTemplate":{"query":"summarize this repo","constraints":{"maxLatencyMs":2000,"protocolPreference":["OPENCLEW"]}},"jsonResponseTemplate":{"ok":true,"result":{"summary":"...","confidence":0.9},"meta":{"source":"CLAWHUB","generatedAt":"2026-10-09T20:10:48.458Z"}},"retryPolicy":{"maxAttempts":3,"backoffMs":[500,1500,3500],"retryableConditions":["HTTP_429","HTTP_503","NETWORK_TIMEOUT"]}},"endpoints":{"dossierUrl":"https://www.xpersona.co/api/v1/agents/clawhub-zhangdong-post-job/dossier","snapshotUrl":"https://www.xpersona.co/api/v1/agents/clawhub-zhangdong-post-job/snapshot","contractUrl":"https://www.xpersona.co/api/v1/agents/clawhub-zhangdong-post-job/contract","trustUrl":"https://www.xpersona.co/api/v1/agents/clawhub-zhangdong-post-job/trust"}},"reliability":{"evidence":{"source":"runtime-metrics","verified":false,"confidence":"low","updatedAt":null,"emptyReason":"No trust, reliability, or runtime telemetry is available."},"trust":{"status":"unavailable","handshakeStatus":"UNKNOWN","verificationFreshnessHours":null,"reputationScore":null,"p95LatencyMs":null,"successRate30d":null,"fallbackRate":null,"attempts30d":null,"trustUpdatedAt":null,"trustConfidence":"unknown","sourceUpdatedAt":null,"freshnessSeconds":null},"decisionGuardrails":{"doNotUseIf":["Contract metadata is missing or unavailable for deterministic execution."],"safeUseWhen":[],"riskFlags":["missing_or_unavailable_contract","trust_data_unavailable","schema_references_missing"],"operationalConfidence":"low"},"executionMetrics":{"observedLatencyMsP50":null,"observedLatencyMsP95":null,"estimatedCostUsd":null,"uptime30d":null,"rateLimitRpm":null,"rateLimitBurst":null,"lastVerifiedAt":null,"verificationSource":null},"runtimeMetrics":{"successRate":null,"avgLatencyMs":null,"avgCostUsd":null,"hallucinationRate":null,"retryRate":null,"disputeRate":null,"p50Latency":null,"p95Latency":null,"lastUpdated":null}},"benchmarks":{"evidence":{"source":"no-benchmark-data","verified":false,"confidence":"low","updatedAt":null,"emptyReason":"No benchmark suites or observed failure patterns are available."},"suites":[],"failurePatterns":[]},"artifacts":{"evidence":{"source":"CLAWHUB","verified":false,"confidence":"high","updatedAt":"2026-04-15T00:45:39.800Z","emptyReason":null},"readme":"Skill: Post Job\n\nOwner: zhangdong\n\nSummary: Post free job ads to 20+ job boards such as LinkedIn, Indeed, Ziprecruiter etc. to receive applicant resumes via email.\n\nTags: latest:1.2.0\n\nVersion history:\n\nv1.2.0 | 2026-02-27T02:17:15.880Z | user\n\nv1.2.0: Added Security Best Practices guide, FAQ section, Pre-Posting Checklist, enhanced transparency about third-party relay model, OpenAI integration for JD generation, and .env.example template.\n\nv1.1.10 | 2026-02-26T11:29:21.117Z | auto\n\n- Clarified that after posting a job, you must spawn a monitor sub-agent to notify the user when LinkedIn sync is complete—this is now a required workflow, not optional.\n- Adjusted success messaging: the response from post_job no longer promises automatic notification and explicitly instructs the AI to handle follow-up.\n- Updated documentation to emphasize AI responsibility for monitoring and user notification regarding LinkedIn sync.\n- Minor edits to response examples and workflow sections to reflect required assistant behavior changes.\n\nv1.1.9 | 2026-02-26T11:16:28.176Z | auto\n\n- Removed the minimum 100-character length requirement from the job description parameter in the documentation.\n- No functional changes; documentation now accurately reflects current validation behavior for job descriptions.\n\nv1.1.8 | 2026-02-26T07:04:51.482Z | auto\n\n- Minor updates and improvements to package structure.\n- Internal script refinements for job posting functionality.\n\nv1.1.7 | 2026-02-26T03:54:54.574Z | auto\n\n- Updated dependencies in package.json for improved stability and security.\n- No functional or interface changes in this release.\n\nv1.1.6 | 2026-02-26T03:52:27.269Z | auto\n\n- Updated dependencies in package.json.\n- Minor internal adjustments in scripts/post_job.js for improved reliability or maintenance.\n\nv1.1.5 | 2026-02-26T03:47:30.972Z | auto\n\nVersion 1.1.5\n\n- Improved security for job posting:\n  - Job descriptions are now sanitized before being sent.\n  - Job IDs are strictly validated (alphanumeric + hyphens only).\n  - Channel and task parameters are filtered to prevent injection attacks.\n- Updated AI assistant workflow to ensure safer sub-agent spawning and data handling.\n- Documentation now details new security precautions and provides safer code examples.\n- Minor improvements and clarifications in usage instructions.\n\nv1.1.4 | 2026-02-26T03:12:22.313Z | auto\n\n# post-job 1.1.4 Changelog\n\n- Corrected documentation to use the skill name \"post-job\" instead of \"job-poster\" throughout.\n- Updated installation instructions for both ClawHub and manual install to reflect the correct skill name.\n- No functional or API changes; this update clarifies naming and ensures accurate integration steps.\n\nv1.1.3 | 2026-02-25T19:01:29.627Z | user\n\n添加外部服务披露说明：说明使用 Fuku AI 服务及数据传输\n\nv1.1.2 | 2026-02-25T07:06:16.676Z | user\n\n修复 shell 注入安全风险：添加 jobId 格式验证，移除 dotenv 依赖\n\nv1.1.1 | 2026-02-25T06:21:07.347Z | user\n\nv1.1.1 - 更新 SKILL.md 文档，添加 FUKU_AUTH_TOKEN 获取说明\n\nv1.1.0 | 2026-02-25T05:51:07.063Z | user\n\nv1.1.0 - 技能重命名为 post-job，新增 LinkedIn 同步后台监控功能\n\nv1.0.6 | 2026-02-25T04:54:07.173Z | user\n\nReturn immediately, LinkedIn sync runs in background with auto-notify\n\nv1.0.4 | 2026-02-25T04:48:06.682Z | user\n\nAuto-poll LinkedIn status after posting until URL is available\n\nv1.0.2 | 2026-02-25T03:37:17.699Z | user\n\nUpdate to version 1.0.2\n\nv1.0.1 | 2026-02-25T03:14:02.980Z | user\n\nBug fixes\n\nv1.0.0 | 2026-02-25T02:59:16.304Z | user\n\nInitial release - Post job openings and collect resumes via natural language. Supports 100+ cities worldwide.\n\nArchive index:\n\nArchive v1.2.0: 7 files, 20984 bytes\n\nFiles: assets/locations.json (24517b), package.json (356b), pnpm-lock.yaml (6495b), scripts/monitor_linkedin.js (4555b), scripts/post_job.js (12134b), SKILL.md (16228b), _meta.json (127b)\n\nFile v1.2.0:SKILL.md\n\n---\nname: post-job\ndescription: Post free job ads to 20+ job boards such as LinkedIn, Indeed, Ziprecruiter etc. to receive applicant resumes via email.\n---\n\n# JobPoster Skill\n\n🚀 **Quickly post job openings and collect resumes via natural language commands.**\n\nJobPoster 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.\n\n## ✨ Features\n\n- **Natural Language Interface** - Post jobs with simple commands like \"Hire a frontend engineer in Singapore\"\n- **Global City Support** - 100+ cities worldwide with fuzzy matching (Singapore, Hong Kong, New York, London, etc.)\n- **AI Job Description** - Optional AI-powered JD generation for professional, compelling postings\n- **Instant Application Links** - Get shareable URLs for candidates to apply directly\n- **Resume Collection** - All applications sent to your specified email\n- **LinkedIn Sync** - Automatic LinkedIn job posting integration (**no LinkedIn account binding required** — posts through Fuku AI's relay service)\n\n## ⚠️ External Service Notice\n\nThis skill uses **Fuku AI** (https://hapi.fuku.ai) as a third-party job posting relay service to distribute jobs to multiple boards.\n\n**🎉 No LinkedIn Account Binding Required!**\n\nLinkedIn job postings are handled through Fuku AI's relay service — you do **NOT** need to connect or bind your personal LinkedIn account. The job is posted anonymously through Fuku AI's infrastructure.\n\n**Data transmitted to Fuku AI:**\n\n- Job title, description, company name, location\n- Email address for receiving resumes\n\n**Authentication:**\n\n- Uses embedded client identifier (no user API key required)\n- Free tier service provided by Fuku AI\n\n**Security:**\n\n- Job descriptions are sanitized before transmission to prevent prompt injection\n- Job IDs are strictly validated (alphanumeric + hyphens only)\n- Channel parameters are filtered to prevent log injection\n\nBy using this skill, you consent to transmitting the above data to Fuku AI's servers.\n\n## 🔒 Security Best Practices\n\nTo minimize risks while using this skill:\n\n### 1. Use a Dedicated Email Address\n\n- **Do NOT use personal email** — Create a dedicated hiring email (e.g., `hiring@yourcompany.com` or `jobs+company@gmail.com`)\n- **Use email aliases** — Gmail supports `youremail+company@gmail.com` for tracking sources\n- **Forward to main inbox** — Set up auto-forwarding if needed\n\n### 2. Sanitize Job Descriptions Before Submitting\n\n- **Remove sensitive info** — Don't include internal salary ranges, confidential project names, or proprietary tech stack details\n- **Avoid personal data** — Don't mention hiring manager names, direct contact info, or office security details\n- **Keep it public-ready** — Write descriptions as if they'll be visible to anyone (because they will be)\n\n### 3. Understand the Relay Model\n\n- **Posts are anonymous** — Jobs appear under Fuku AI's accounts, not your company's LinkedIn page\n- **No direct control** — You cannot edit/delete postings directly on job boards; contact support if changes needed\n- **Third-party dependency** — If Fuku AI service goes down, postings may be affected\n\n### 4. Monitor Active Postings\n\n- **Save Job IDs** — Keep a record of all posted Job IDs for tracking\n- **Check LinkedIn status** — Use `check_linkedin_status` to verify postings went live\n- **Periodic audit** — Review active postings monthly to ensure they're still accurate\n\n### 5. Limit Usage for Sensitive Roles\n\n- **Executive/C-level positions** — Consider traditional channels for confidential searches\n- **Internal transfers** — Use internal HR systems instead\n- **Security-sensitive roles** — Avoid posting details that could reveal infrastructure or vulnerabilities\n\n### 6. Background Polling Awareness\n\n- **Monitor sub-agents spawn automatically** — Each job post creates a background monitor that polls every 2 minutes\n- **Normal behavior** — This is expected and required for LinkedIn URL notification\n- **No action needed** — Monitors auto-cleanup after completion\n\n---\n\n**Quick Checklist Before Posting:**\n\n- [ ] Using dedicated hiring email (not personal)\n- [ ] Job description contains no sensitive/confidential info\n- [ ] Comfortable with third-party relay service\n- [ ] Job ID saved for tracking\n- [ ] Role is appropriate for public job boards\n\n## 🎯 When to Use\n\nUse this skill when you need to:\n\n- Post a job opening quickly\n- Create a job listing for any role\n- Generate a resume collection link\n- Share job postings with candidates\n- Sync jobs to LinkedIn\n\n## 🛠️ Tools\n\n### post_job\n\nMain tool for posting job openings.\n\n#### Parameters\n\n| Parameter     | Required | Type   | Description                              | Example                          |\n| ------------- | -------- | ------ | ---------------------------------------- | -------------------------------- |\n| `title`       | ✅ Yes   | string | Job title (min 4 characters)             | `\"Senior Frontend Engineer\"`     |\n| `city_query`  | ✅ Yes   | string | City/location (supports fuzzy match)     | `\"Singapore\"`, `\"NYC\"`           |\n| `description` | ✅ Yes   | string | Job description                          | `\"5+ years React experience...\"` |\n| `email`       | ✅ Yes   | string | Email to receive resumes                 | `\"hr@company.com\"`               |\n| `company`     | ❌ No    | string | Company name (default: `\"Your Company\"`) | `\"TechCorp\"`                     |\n| `industry`    | ❌ No    | string | Industry/field (default: `\"General\"`)    | `\"Technology\"`, `\"Finance\"`      |\n\n#### Validation Rules\n\n- **Title**: Minimum 4 characters\n- **Email**: Must be valid email format\n- **Description**: Minimum 100 characters (ensure meaningful job details)\n- **City**: Must match a supported location (see Assets)\n\n#### Response Format\n\nOn success, returns:\n\n```\n `✅ **Job Posted Successfully!**\\n\\n` +\n      `**Position:** ${title}\\n` +\n      `**Location:** ${matched.label}\\n` +\n      `**Job ID:** \\`${jobId}\\`\\n` +\n      `**The resume will be sent to:** ${email}\\n\\n` +\n      `--- \\n` +\n      `**LinkedIn Sync:** ⏳ Processing in background (10-20 min). I'll check and notify you when ready!\\n\\n` +\n      `You can also manually check with: \\`check_linkedin_status\\` using Job ID \\`${jobId}\\``\n```\n\n### check_linkedin_status\n\nCheck the status of a job's LinkedIn synchronization. Use this tool if the LinkedIn URL was not available immediately after posting.\n\n#### Parameters\n\n| Parameter | Required | Type   | Description                | Example      |\n| --------- | -------- | ------ | -------------------------- | ------------ |\n| `jobId`   | ✅ Yes   | string | The ID of the job to check | `\"abcd2345\"` |\n\n#### Response Format\n\nReturns either the LinkedIn URL (if sync complete) or a \"Pending\" status message.\n\n### check_linkedin_status_auto\n\nAuto-check LinkedIn status with polling until URL is available. Checks every 1 minute until LinkedIn URL is returned or max attempts reached.\n\n#### Parameters\n\n| Parameter     | Required | Type   | Description                             | Example      |\n| ------------- | -------- | ------ | --------------------------------------- | ------------ |\n| `jobId`       | ✅ Yes   | string | The ID of the job to check              | `\"abcd2345\"` |\n| `intervalMs`  | ❌ No    | number | Polling interval in ms (default: 60000) | `60000`      |\n| `maxAttempts` | ❌ No    | number | Maximum attempts (default: 20)          | `20`         |\n\n#### Response Format\n\nReturns the LinkedIn URL when available, or a timeout message after max attempts.\n\n## 🤖 AI Assistant Workflow\n\n### ⭐ Required: Auto-Notify with Background Monitor\n\n**⚠️ IMPORTANT: `post_job` does NOT automatically monitor LinkedIn sync.**\n\nAfter calling `post_job`, you **MUST** spawn a background sub-agent to monitor and notify the user. Without this step, the user will never receive the LinkedIn URL.\n\n**Complete workflow:**\n\n```\nUser: \"Post a health manager job in Shanghai\"\n\nAI: [Calls post_job]\n    → Returns: Job ID `abc123`\n\nAI: [Spawns sub-agent with monitor_linkedin.js]\n    → \"✅ Job posted! I'll monitor LinkedIn sync and notify you when complete.\"\n\n[Background monitor polls every 2 minutes]\n\n[When LinkedIn URL is ready]\nAI: \"🎉 LinkedIn sync complete! Job ID: `abc123`, LinkedIn URL: https://linkedin.com/jobs/view/...\"\n```\n\n**Spawn the monitor sub-agent like this (REQUIRED):**\n\n```javascript\n// After post_job succeeds and returns jobId:\n// Step 1: Validate jobId format strictly (alphanumeric + hyphen only)\nconst safeJobId = jobId.match(/^[a-zA-Z0-9-]+$/) ? jobId : null;\nif (!safeJobId) throw new Error(\"Invalid jobId format\");\n\n// Step 2: Spawn monitor sub-agent - this is REQUIRED, not optional\nawait sessions_spawn({\n  task: `Monitor LinkedIn sync for job ID ${safeJobId}. Use the check_linkedin_status tool with jobId parameter set to \"${safeJobId}\". Poll every 2 minutes and notify when LinkedIn URL is available.`,\n  mode: \"run\",\n  cleanup: \"delete\",\n});\n\n// Step 3: Tell the user you'll notify them\nreturn `✅ Job posted! Job ID: \\`${safeJobId}\\`. I'll notify you when LinkedIn sync is complete (usually 5-30 minutes).`;\n```\n\n**⚠️ If you skip spawning the monitor:**\n\n- The user will NOT receive the LinkedIn URL automatically\n- You must manually call `check_linkedin_status` later\n- This creates a poor user experience\n\n**Why this design?**\n\n- LinkedIn sync takes 5-30 minutes (blocking is not practical)\n- The sub-agent polls in the background and notifies when ready\n- This keeps the main session free for other tasks\n\n---\n\n### Alternative: Manual Polling\n\nIf you prefer not to spawn a sub-agent:\n\n1. **Save the Job ID** from the response\n2. **Wait 5-10 minutes** (LinkedIn sync takes time)\n3. **Call `check_linkedin_status`** with the Job ID\n4. **If still pending:** Check again every 3-5 minutes\n5. **When LinkedIn URL is ready:** Proactively notify the user\n\n### Example Flow\n\n```\nUser: \"Post a frontend engineer job in Singapore\"\n\nAI: [Calls post_job]\n    → Returns: Job ID `abc123`, Apply URL\n\nAI: \"✅ Job posted! LinkedIn sync in progress...\"\n\n[AI waits 5 minutes, then checks]\n\nAI: [Calls check_linkedin_status with jobId: abc123]\n    → Returns: LinkedIn URL\n\nAI: \"🎉 LinkedIn sync complete! URL: https://linkedin.com/jobs/view/...\"\n```\n\n### Proactive Check Script (for AI)\n\n```javascript\n// After post_job returns a Job ID:\nconst jobId = response.jobId;\n\n// Wait 5 minutes\nawait sleep(300000);\n\n// Check LinkedIn status\nconst result = await check_linkedin_status({ jobId });\n\n// If still pending, check every 3-5 minutes\n// When URL is available, notify user immediately\n```\n\n### Supported Locations\n\nThe skill includes a built-in location database (`assets/locations.json`) with 100+ cities:\n\n**Asia Pacific:** Singapore, Hong Kong, Beijing, Shanghai, Tokyo, Sydney, Mumbai, Bangkok, Seoul, Taipei\n\n**North America:** New York, San Francisco, Los Angeles, Seattle, Chicago, Toronto, Vancouver\n\n**Europe:** London, Berlin, Paris, Amsterdam, Dublin, Zurich, Stockholm\n\n**Middle East:** Dubai, Abu Dhabi, Riyadh, Tel Aviv\n\nSee `assets/locations.json` for the complete list. Fuzzy matching supports variations like \"NYC\" → \"New York\".\n\n## 📦 Installation\n\n### Install via ClawHub\n\n```bash\nclawhub install post-job\n```\n\n### Manual Installation\n\n```bash\n# Clone or download the skill\ncd your-openclaw-workspace/skills\n\n# Install dependencies\ncd post-job\nnpm install\n```\n\n## 🔐 Security Notes\n\n- **Email Privacy**: Resume emails are visible in job postings - use a dedicated hiring email\n- **Rate Limiting**: API may have rate limits for high-volume posting\n\n## 🐛 Troubleshooting\n\n### Issue: Job posts but no confirmation\n\n**Cause**: Response timeout or network issue\n\n**Solution**: Check backend logs, verify API credentials, retry with `--force`\n\n### Issue: City not recognized\n\n**Cause**: City not in location database\n\n**Solution**:\n\n1. Check `assets/locations.json` for supported cities\n2. Try alternative spelling (e.g., \"New York\" vs \"NYC\")\n3. Add new city to database and republish\n\n### Issue: Duplicate job postings\n\n**Cause**: Multiple API calls due to retry logic\n\n**Solution**: Check backend for duplicate jobs, implement request deduplication\n\n## ❓ FAQ - Security & Privacy\n\n**Q: Is my data safe with Fuku AI?**\nA: Job data is transmitted to Fuku AI's servers for distribution. They act as a relay service. Avoid sharing confidential information in job descriptions.\n\n**Q: Do I need to trust Fuku AI?**\nA: Yes — this skill depends on their service to post jobs. Review their terms at https://hapi.fuku.ai if you have concerns.\n\n**Q: Can I use this without LinkedIn sync?**\nA: Yes — jobs are still posted to 20+ other boards. LinkedIn is optional background sync.\n\n**Q: Will the job appear on MY LinkedIn company page?**\nA: No — postings appear through Fuku AI's relay accounts, not your company's page. This is why no LinkedIn binding is required.\n\n**Q: What happens if Fuku AI goes offline?**\nA: Job posting may fail or LinkedIn sync may be delayed. The skill will return an error message.\n\n**Q: Can I delete a job after posting?**\nA: Contact Fuku AI support with your Job ID. Direct deletion through this skill is not currently supported.\n\n**Q: Is the embedded credential a security risk?**\nA: The embedded identifier is for Fuku AI's free tier access. It doesn't expose your personal credentials, but means jobs are posted under their service account.\n\n**Q: Should I use this for confidential hiring?**\nA: No — use traditional channels (internal HR systems, executive search firms) for sensitive or confidential roles.\n\n## 🤝 Contributing\n\nFound a bug or want to add more cities?\n\n1. Fork the skill\n2. Make your changes\n3. Test thoroughly\n4. Submit a pull request\n\n## 📝 Changelog\n\n### v1.2.0 (Security & Transparency Update)\n\n- **Added Security Best Practices section**: Comprehensive guide for safe usage without code changes\n- **Added FAQ - Security & Privacy**: Answers 8 common questions about data handling, trust, and limitations\n- **Added Pre-Posting Checklist**: Quick verification list before submitting jobs\n- **Enhanced External Service Notice**: Clarified LinkedIn no-binding requirement with prominent notice\n- **Added .env.example**: Template for OpenAI API key configuration\n- **Updated Features list**: Noted OpenAI-powered JD generation and no LinkedIn binding required\n- **Documentation improvements**: Better transparency about third-party relay model and data flow\n\n### v1.1.11 (OpenAI Integration)\n\n- **Added OpenAI integration**: Job descriptions generated using OpenAI GPT-4o\n- **Added .env configuration**: Secure storage for OpenAI API key\n- **Updated dependencies**: Added dotenv for environment variable support\n\n### v1.1.10 (Documentation Fix - LinkedIn Monitor)\n\n- **Fixed misleading documentation**: Clarified that `post_job` does NOT automatically monitor LinkedIn sync\n- **Made monitor spawning REQUIRED**: Changed \"Recommended\" to \"Required\" in AI Assistant Workflow\n- **Updated response format**: Removed \"I'll notify you\" promise from response template\n- **Added explicit warnings**: Multiple ⚠️ notices explaining AI must spawn monitor sub-agent\n\n### v1.1.9 (Security Hardening)\n\n- Enhanced prompt injection protection with double-layer sanitization\n- User input and AI-generated content both filtered before external API calls\n\n### v1.1.8 (Security Fix)\n\n- Added `sanitizeDescription()` function to clean job descriptions before sending to external AI\n- Removed code blocks, special markers, and common injection patterns\n- Added length limits to prevent buffer-based attacks\n\n### v1.0.0 (Initial Release)\n\n- Core job posting functionality\n- 100+ city support with fuzzy matching\n- Email validation\n- LinkedIn sync integration\n- Error handling and validation\n\n## 📄 License\n\nThis skill is provided as-is for use with OpenClaw.\n\n## 🆘 Support\n\nFor issues or questions:\n\n- Check this SKILL.md for troubleshooting\n- Review error messages carefully\n- Contact developer email yangkai31@gmail.com if you run into any issues\n\n---\n\n**Happy Hiring! 🎉**\n\nFile v1.2.0:_meta.json\n\n{\n  \"ownerId\": \"kn766g3fzj7qdcqppg4433krw981sxyc\",\n  \"slug\": \"post-job\",\n  \"version\": \"1.2.0\",\n  \"publishedAt\": 1772158635880\n}\n\nFile v1.2.0:assets/locations.json\n\n[\n  {\n    \"label\": \"Singapore\",\n    \"value\": \"70000001\",\n    \"parentLabel\": \"Singapore\",\n    \"parentValue\": \"SI\",\n    \"addressCountry\": \"SG\",\n    \"postalCode\": \"139950\",\n    \"addressRegion\": \"West Region\",\n    \"streetAddress\": \"67 Ayer Rajah Crescent\",\n    \"addressLocality\": \"Buona Vista\"\n  },\n  {\n    \"label\": \"Dubai\",\n    \"value\": \"71000043\",\n    \"parentLabel\": \"United Arab Emirates\",\n    \"parentValue\": \"UE\",\n    \"addressCountry\": \"AE\",\n    \"postalCode\": \"00000\",\n    \"addressRegion\": \"Dubai Emirate\",\n    \"streetAddress\": \"Sheikh Zayed Road, Building No 22\",\n    \"addressLocality\": \"Dubai\"\n  },\n  {\n    \"label\": \"Kuala Lumpur\",\n    \"value\": \"74000002\",\n    \"parentLabel\": \"Malaysia\",\n    \"parentValue\": \"MY\",\n    \"addressCountry\": \"MY\",\n    \"postalCode\": \"50450\",\n    \"addressRegion\": \"Federal Territory of Kuala Lumpur\",\n    \"streetAddress\": \"15 Jalan Ampang\",\n    \"addressLocality\": \"Kuala Lumpur City Centre\"\n  },\n  {\n    \"label\": \"Johor Bahru\",\n    \"value\": \"74000005\",\n    \"parentLabel\": \"Malaysia\",\n    \"parentValue\": \"MY\",\n    \"addressCountry\": \"MY\",\n    \"postalCode\": \"80100\",\n    \"addressRegion\": \"Johor\",\n    \"streetAddress\": \"Jalan Wong Ah Fook 1\",\n    \"addressLocality\": \"Johor Bahru\"\n  },\n  {\n    \"label\": \"George Town\",\n    \"value\": \"74000024\",\n    \"parentLabel\": \"Malaysia\",\n    \"parentValue\": \"MY\",\n    \"addressCountry\": \"MY\",\n    \"postalCode\": \"10200\",\n    \"addressRegion\": \"Penang\",\n    \"streetAddress\": \"No. 116 & 118 Lebuh Acheh\",\n    \"addressLocality\": \"George Town\"\n  },\n  {\n    \"label\": \"Klang\",\n    \"value\": \"74000003\",\n    \"parentLabel\": \"Malaysia\",\n    \"parentValue\": \"MY\",\n    \"addressCountry\": \"MY\",\n    \"postalCode\": \"41200\",\n    \"addressRegion\": \"Selangor\",\n    \"streetAddress\": \"1, Persiaran Batu Nilam 1, Bandar Bukit Tinggi 2\",\n    \"addressLocality\": \"Klang\"\n  },\n  {\n    \"label\": \"Shah Alam\",\n    \"value\": \"74000009\",\n    \"parentLabel\": \"Malaysia\",\n    \"parentValue\": \"MY\",\n    \"addressCountry\": \"MY\",\n    \"postalCode\": \"40000\",\n    \"addressRegion\": \"Selangor\",\n    \"streetAddress\": \"2, Jalan Perbandaran, Seksyen 14\",\n    \"addressLocality\": \"Shah Alam\"\n  },\n  {\n    \"label\": \"Hong Kong\",\n    \"value\": \"79000002\",\n    \"parentLabel\": \"Hong Kong\",\n    \"parentValue\": \"HK\",\n    \"addressCountry\": \"HK\",\n    \"postalCode\": \"0000\",\n    \"addressRegion\": \"Hong Kong Island\",\n    \"streetAddress\": \"Room 1205, 12/F, Central Plaza, 18 Harbour Road\",\n    \"addressLocality\": \"Wan Chai\"\n  },\n  {\n    \"label\": \"Bangkok\",\n    \"value\": \"61000905\",\n    \"parentLabel\": \"Thailand\",\n    \"parentValue\": \"TH\",\n    \"addressCountry\": \"TH\",\n    \"postalCode\": \"10110\",\n    \"addressRegion\": \"Bangkok Metropolitan Area\",\n    \"streetAddress\": \"10 Soi Sukhumvit 63 (Ekkamai)\",\n    \"addressLocality\": \"Khlong Toei Nuea\"\n  },\n  {\n    \"label\": \"Myanmar\",\n    \"value\": \"330000401\",\n    \"parentLabel\": \"Myanmar\",\n    \"parentValue\": \"MM\",\n    \"addressCountry\": \"MM\",\n    \"postalCode\": \"11141\",\n    \"addressRegion\": \"Yangon Region\",\n    \"streetAddress\": \"12 Bogyoke Aung San Road\",\n    \"addressLocality\": \"Yangon\"\n  },\n  {\n    \"label\": \"Hanoi\",\n    \"value\": \"160000003\",\n    \"parentLabel\": \"Vietnam\",\n    \"parentValue\": \"VN\",\n    \"addressCountry\": \"VN\",\n    \"postalCode\": \"100000\",\n    \"addressRegion\": \"Hà Nội\",\n    \"streetAddress\": \"123 Đường Hoàng Quốc Việt\",\n    \"addressLocality\": \"Cầu Giấy District\"\n  },\n  {\n    \"label\": \"Ho Chi Minh City\",\n    \"value\": \"160000002\",\n    \"parentLabel\": \"Vietnam\",\n    \"parentValue\": \"VN\",\n    \"addressCountry\": \"VN\",\n    \"postalCode\": \"700000\",\n    \"addressRegion\": \"Ho Chi Minh City\",\n    \"streetAddress\": \"91 Nguyen Cu Trinh St\",\n    \"addressLocality\": \"Nguyen Cu Trinh Ward, District 1\"\n  },\n  {\n    \"label\": \"Manila\",\n    \"value\": \"51000000\",\n    \"parentLabel\": \"Philippines\",\n    \"parentValue\": \"PH\",\n    \"addressCountry\": \"PH\",\n    \"postalCode\": \"1000\",\n    \"addressRegion\": \"National Capital Region\",\n    \"streetAddress\": \"691 A. Arnaiz Ave\",\n    \"addressLocality\": \"Makati City\"\n  },\n  {\n    \"label\": \"Jakarta\",\n    \"value\": \"76000207\",\n    \"parentLabel\": \"Indonesia\",\n    \"parentValue\": \"ID\",\n    \"addressCountry\": \"ID\",\n    \"postalCode\": \"10310\",\n    \"addressRegion\": \"DKI Jakarta\",\n    \"streetAddress\": \"Jl. Jend. Sudirman No. 10\",\n    \"addressLocality\": \"Jakarta Pusat\"\n  },\n  {\n    \"label\": \"Tokyo\",\n    \"value\": \"36094389\",\n    \"parentLabel\": \"Japan\",\n    \"parentValue\": \"JP\",\n    \"addressCountry\": \"JP\",\n    \"postalCode\": \"100-0001\",\n    \"addressRegion\": \"Tokyo Metropolis\",\n    \"streetAddress\": \"1-1 Chiyoda\",\n    \"addressLocality\": \"Chiyoda-ku\"\n  },\n  {\n    \"label\": \"Osaka\",\n    \"value\": \"36049159\",\n    \"parentLabel\": \"Japan\",\n    \"parentValue\": \"JP\",\n    \"addressCountry\": \"JP\",\n    \"postalCode\": \"530-0001\",\n    \"addressRegion\": \"Osaka Prefecture\",\n    \"streetAddress\": \"3-1 Umeda 1-chōme\",\n    \"addressLocality\": \"Kita-ku Osaka\"\n  },\n  {\n    \"label\": \"Seoul\",\n    \"value\": \"320006457\",\n    \"parentLabel\": \"South Korea\",\n    \"parentValue\": \"KR\",\n    \"addressCountry\": \"KR\",\n    \"postalCode\": \"04524\",\n    \"addressRegion\": \"Seoul Special City\",\n    \"streetAddress\": \"50 Myeongdong 8-gil\",\n    \"addressLocality\": \"Jung-gu\"\n  },\n  {\n    \"label\": \"Busan\",\n    \"value\": \"320006397\",\n    \"parentLabel\": \"South Korea\",\n    \"parentValue\": \"KR\",\n    \"addressCountry\": \"KR\",\n    \"postalCode\": \"47285\",\n    \"addressRegion\": \"Busan Metropolitan City\",\n    \"streetAddress\": \"772 Gaya-daero\",\n    \"addressLocality\": \"Busanjin-gu\"\n  },\n  {\n    \"label\": \"Beijing\",\n    \"value\": \"68000002\",\n    \"parentLabel\": \"China\",\n    \"parentValue\": \"CN\",\n    \"addressCountry\": \"CN\",\n    \"postalCode\": \"100000\",\n    \"addressRegion\": \"Beijing Municipality\",\n    \"streetAddress\": \"No. 1 Jianguomenwai Avenue\",\n    \"addressLocality\": \"Dongcheng District\"\n  },\n  {\n    \"label\": \"Shanghai\",\n    \"value\": \"68000169\",\n    \"parentLabel\": \"China\",\n    \"parentValue\": \"CN\",\n    \"addressCountry\": \"CN\",\n    \"postalCode\": \"200000\",\n    \"addressRegion\": \"Shanghai Municipality\",\n    \"streetAddress\": \"No. 168 Pudong New Area Lujiazui\",\n    \"addressLocality\": \"Pudong New Area\"\n  },\n  {\n    \"label\": \"Guangzhou\",\n    \"value\": \"68000466\",\n    \"parentLabel\": \"China\",\n    \"parentValue\": \"CN\",\n    \"addressCountry\": \"CN\",\n    \"postalCode\": \"510000\",\n    \"addressRegion\": \"Guangdong Province\",\n    \"streetAddress\": \"No. 1 Zhongshan Road\",\n    \"addressLocality\": \"Guangzhou\"\n  },\n  {\n    \"label\": \"Shenzhen\",\n    \"value\": \"68000468\",\n    \"parentLabel\": \"China\",\n    \"parentValue\": \"CN\",\n    \"addressCountry\": \"CN\",\n    \"postalCode\": \"518000\",\n    \"addressRegion\": \"Guangdong Province\",\n    \"streetAddress\": \"No. 1 Shennan Boulevard\",\n    \"addressLocality\": \"Futian District\"\n  },\n  {\n    \"label\": \"Taipei\",\n    \"value\": \"170000325\",\n    \"parentLabel\": \"Taiwan\",\n    \"parentValue\": \"TW\",\n    \"addressCountry\": \"TW\",\n    \"postalCode\": \"100\",\n    \"addressRegion\": \"Taipei City\",\n    \"streetAddress\": \"No. 1, Zhongxiao W. Rd.\",\n    \"addressLocality\": \"Zhongzheng District\"\n  },\n  {\n    \"label\": \"Sydney\",\n    \"value\": \"10000195\",\n    \"parentLabel\": \"Australia\",\n    \"parentValue\": \"AU\",\n    \"addressCountry\": \"AU\",\n    \"postalCode\": \"2000\",\n    \"addressRegion\": \"NSW\",\n    \"streetAddress\": \"1 Martin Place\",\n    \"addressLocality\": \"Sydney CBD\"\n  },\n  {\n    \"label\": \"Melbourne\",\n    \"value\": \"10006677\",\n    \"parentLabel\": \"Australia\",\n    \"parentValue\": \"AU\",\n    \"addressCountry\": \"AU\",\n    \"postalCode\": \"3000\",\n    \"addressRegion\": \"VIC\",\n    \"streetAddress\": \"1 Collins Street\",\n    \"addressLocality\": \"Melbourne CBD\"\n  },\n  {\n    \"label\": \"Auckland\",\n    \"value\": \"49001765\",\n    \"parentLabel\": \"New Zealand\",\n    \"parentValue\": \"NZ\",\n    \"addressCountry\": \"NZ\",\n    \"postalCode\": \"1010\",\n    \"addressRegion\": \"Auckland Region\",\n    \"streetAddress\": \"1 Queen Street\",\n    \"addressLocality\": \"Auckland CBD\"\n  },\n  {\n    \"label\": \"New Delhi\",\n    \"value\": \"32015163\",\n    \"parentLabel\": \"India\",\n    \"parentValue\": \"IN\",\n    \"addressCountry\": \"IN\",\n    \"postalCode\": \"110001\",\n    \"addressRegion\": \"Delhi\",\n    \"streetAddress\": \"Rashtrapati Bhavan, Raisina Hill\",\n    \"addressLocality\": \"New Delhi\"\n  },\n  {\n    \"label\": \"Mumbai\",\n    \"value\": \"32015169\",\n    \"parentLabel\": \"India\",\n    \"parentValue\": \"IN\",\n    \"addressCountry\": \"IN\",\n    \"postalCode\": \"400001\",\n    \"addressRegion\": \"Maharashtra\",\n    \"streetAddress\": \"Taj Mahal Palace, Apollo Bunder\",\n    \"addressLocality\": \"Colaba\"\n  },\n  {\n    \"label\": \"Bangalore\",\n    \"value\": \"32015168\",\n    \"parentLabel\": \"India\",\n    \"parentValue\": \"IN\",\n    \"addressCountry\": \"IN\",\n    \"postalCode\": \"560001\",\n    \"addressRegion\": \"Karnataka\",\n    \"streetAddress\": \"No. 1 MG Road\",\n    \"addressLocality\": \"Bengaluru Central\"\n  },\n  {\n    \"label\": \"Pune\",\n    \"value\": \"32015170\",\n    \"parentLabel\": \"India\",\n    \"parentValue\": \"IN\",\n    \"addressCountry\": \"IN\",\n    \"postalCode\": \"411001\",\n    \"addressRegion\": \"Maharashtra\",\n    \"streetAddress\": \"1 MG Road\",\n    \"addressLocality\": \"Pune City\"\n  },\n  {\n    \"label\": \"Chennai\",\n    \"value\": \"32015167\",\n    \"parentLabel\": \"India\",\n    \"parentValue\": \"IN\",\n    \"addressCountry\": \"IN\",\n    \"postalCode\": \"600001\",\n    \"addressRegion\": \"Tamil Nadu\",\n    \"streetAddress\": \"Rashtrapathi Bhavan Road\",\n    \"addressLocality\": \"Fort St George, Chennai\"\n  },\n\n  {\n    \"label\": \"Riyadh\",\n    \"value\": \"180000067\",\n    \"parentLabel\": \"Saudi Arabia\",\n    \"parentValue\": \"SA\",\n    \"addressCountry\": \"SA\",\n    \"postalCode\": \"11564\",\n    \"addressRegion\": \"Riyadh Province\",\n    \"streetAddress\": \"King Fahd Road\",\n    \"addressLocality\": \"Olaya District\"\n  },\n  {\n    \"label\": \"Jeddah\",\n    \"value\": \"180000053\",\n    \"parentLabel\": \"Saudi Arabia\",\n    \"parentValue\": \"SA\",\n    \"addressCountry\": \"SA\",\n    \"postalCode\": \"22233\",\n    \"addressRegion\": \"Makkah Province\",\n    \"streetAddress\": \"King Road\",\n    \"addressLocality\": \"Al-Olaya District\"\n  },\n  {\n    \"label\": \"Abu Dhabi\",\n    \"value\": \"71000002\",\n    \"parentLabel\": \"United Arab Emirates\",\n    \"parentValue\": \"UE\",\n    \"addressCountry\": \"AE\",\n    \"postalCode\": \"00000\",\n    \"addressRegion\": \"Abu Dhabi Emirate\",\n    \"streetAddress\": \"Sheikh Zayed Road\",\n    \"addressLocality\": \"Abu Dhabi\"\n  },\n  {\n    \"label\": \"Doha\",\n    \"value\": \"72000021\",\n    \"parentLabel\": \"Qatar\",\n    \"parentValue\": \"QA\",\n    \"addressCountry\": \"QA\",\n    \"postalCode\": \"00000\",\n    \"addressRegion\": \"Doha\",\n    \"streetAddress\": \"West Bay Square, Al Qatar Rd\",\n    \"addressLocality\": \"Doha City\"\n  },\n  {\n    \"label\": \"Cairo\",\n    \"value\": \"78000049\",\n    \"parentLabel\": \"Egypt\",\n    \"parentValue\": \"EG\",\n    \"addressCountry\": \"EG\",\n    \"postalCode\": \"11511\",\n    \"addressRegion\": \"Cairo Governorate\",\n    \"streetAddress\": \"1 Abdel Khalek Tharwat St, Ataba Square\",\n    \"addressLocality\": \"Cairo\"\n  },\n  {\n    \"label\": \"Istanbul\",\n    \"value\": \"62051381\",\n    \"parentLabel\": \"Turkey\",\n    \"parentValue\": \"TR\",\n    \"addressCountry\": \"TR\",\n    \"postalCode\": \"34000\",\n    \"addressRegion\": \"Istanbul Province\",\n    \"streetAddress\": \"İstiklal Caddesi No: 100\",\n    \"addressLocality\": \"Beyoğlu\"\n  },\n  {\n    \"label\": \"New York\",\n    \"value\": \"5027742\",\n    \"parentLabel\": \"United States\",\n    \"parentValue\": \"US\",\n    \"addressCountry\": \"US\",\n    \"postalCode\": \"10001\",\n    \"addressRegion\": \"NY\",\n    \"streetAddress\": \"401 7th Ave\",\n    \"addressLocality\": \"Manhattan\"\n  },\n  {\n    \"label\": \"San Francisco\",\n    \"value\": \"5004604\",\n    \"parentLabel\": \"United States\",\n    \"parentValue\": \"US\",\n    \"addressCountry\": \"US\",\n    \"postalCode\": \"94105\",\n    \"addressRegion\": \"CA\",\n    \"streetAddress\": \"595 Market St\",\n    \"addressLocality\": \"San Francisco\"\n  },\n  {\n    \"label\": \"Los Angeles\",\n    \"value\": \"5002945\",\n    \"parentLabel\": \"United States\",\n    \"parentValue\": \"US\",\n    \"addressCountry\": \"US\",\n    \"postalCode\": \"90001\",\n    \"addressRegion\": \"CA\",\n    \"streetAddress\": \"100 W 1st Street\",\n    \"addressLocality\": \"Los Angeles\"\n  },\n  {\n    \"label\": \"San Jose\",\n    \"value\": \"5004711\",\n    \"parentLabel\": \"United States\",\n    \"parentValue\": \"US\",\n    \"addressCountry\": \"US\",\n    \"postalCode\": \"95113\",\n    \"addressRegion\": \"CA\",\n    \"streetAddress\": \"200 E Santa Clara St\",\n    \"addressLocality\": \"San Jose\"\n  },\n  {\n    \"label\": \"San Diego\",\n    \"value\": \"5004327\",\n    \"parentLabel\": \"United States\",\n    \"parentValue\": \"US\",\n    \"addressCountry\": \"US\",\n    \"postalCode\": \"92101\",\n    \"addressRegion\": \"CA\",\n    \"streetAddress\": \"600 Broadway\",\n    \"addressLocality\": \"San Diego\"\n  },\n  {\n    \"label\": \"Seattle\",\n    \"value\": \"5040918\",\n    \"parentLabel\": \"United States\",\n    \"parentValue\": \"US\",\n    \"addressCountry\": \"US\",\n    \"postalCode\": \"98101\",\n    \"addressRegion\": \"WA\",\n    \"streetAddress\": \"500 Yale Ave N\",\n    \"addressLocality\": \"Seattle\"\n  },\n  {\n    \"label\": \"Denver\",\n    \"value\": \"5005614\",\n    \"parentLabel\": \"United States\",\n    \"parentValue\": \"US\",\n    \"addressCountry\": \"US\",\n    \"postalCode\": \"80202\",\n    \"addressRegion\": \"CO\",\n    \"streetAddress\": \"Denver Pavilions, 700 16th St\",\n    \"addressLocality\": \"Denver\"\n  },\n  {\n    \"label\": \"Chicago\",\n    \"value\": \"5011305\",\n    \"parentLabel\": \"United States\",\n    \"parentValue\": \"US\",\n    \"addressCountry\": \"US\",\n    \"postalCode\": \"60601\",\n    \"addressRegion\": \"IL\",\n    \"streetAddress\": \"233 S Wacker Dr\",\n    \"addressLocality\": \"Chicago\"\n  },\n  {\n    \"label\": \"Houston\",\n    \"value\": \"5037121\",\n    \"parentLabel\": \"United States\",\n    \"parentValue\": \"US\",\n    \"addressCountry\": \"US\",\n    \"postalCode\": \"77002\",\n    \"addressRegion\": \"TX\",\n    \"streetAddress\": \"1400 Lubbock Street\",\n    \"addressLocality\": \"Houston\"\n  },\n  {\n    \"label\": \"Austin\",\n    \"value\": \"5038603\",\n    \"parentLabel\": \"United States\",\n    \"parentValue\": \"US\",\n    \"addressCountry\": \"US\",\n    \"postalCode\": \"78701\",\n    \"addressRegion\": \"TX\",\n    \"streetAddress\": \"500 W 2nd Street\",\n    \"addressLocality\": \"Austin\"\n  },\n  {\n    \"label\": \"San Antonio\",\n    \"value\": \"5043734\",\n    \"parentLabel\": \"United States\",\n    \"parentValue\": \"US\",\n    \"addressCountry\": \"US\",\n    \"postalCode\": \"78205\",\n    \"addressRegion\": \"TX\",\n    \"streetAddress\": \"615 E Houston St\",\n    \"addressLocality\": \"San Antonio\"\n  },\n  {\n    \"label\": \"Dallas\",\n    \"value\": \"5036565\",\n    \"parentLabel\": \"United States\",\n    \"parentValue\": \"US\",\n    \"addressCountry\": \"US\",\n    \"postalCode\": \"75201\",\n    \"addressRegion\": \"TX\",\n    \"streetAddress\": \"1500 Main St\",\n    \"addressLocality\": \"Dallas\"\n  },\n  {\n    \"label\": \"Phoenix\",\n    \"value\": \"5002020\",\n    \"parentLabel\": \"United States\",\n    \"parentValue\": \"US\",\n    \"addressCountry\": \"US\",\n    \"postalCode\": \"85003\",\n    \"addressRegion\": \"AZ\",\n    \"streetAddress\": \"220 N Central Ave\",\n    \"addressLocality\": \"Phoenix\"\n  },\n  {\n    \"label\": \"Philadelphia\",\n    \"value\": \"5033484\",\n    \"parentLabel\": \"United States\",\n    \"parentValue\": \"US\",\n    \"addressCountry\": \"US\",\n    \"postalCode\": \"19103\",\n    \"addressRegion\": \"PA\",\n    \"streetAddress\": \"1900 Market St\",\n    \"addressLocality\": \"Philadelphia\"\n  },\n  {\n    \"label\": \"District of Columbia\",\n    \"value\": \"5043669\",\n    \"parentLabel\": \"United States\",\n    \"parentValue\": \"US\",\n    \"addressCountry\": \"US\",\n    \"postalCode\": \"20001\",\n    \"addressRegion\": \"DC\",\n    \"streetAddress\": \"1600 Pennsylvania Ave NW\",\n    \"addressLocality\": \"Washington\"\n  },\n  {\n    \"label\": \"Boston\",\n    \"value\": \"5016967\",\n    \"parentLabel\": \"United States\",\n    \"parentValue\": \"US\",\n    \"addressCountry\": \"US\",\n    \"postalCode\": \"02108\",\n    \"addressRegion\": \"MA\",\n    \"streetAddress\": \"1 Boston Common\",\n    \"addressLocality\": \"Boston\"\n  },\n  {\n    \"label\": \"Las Vegas\",\n    \"value\": \"5026496\",\n    \"parentLabel\": \"United States\",\n    \"parentValue\": \"US\",\n    \"addressCountry\": \"US\",\n    \"postalCode\": \"89101\",\n    \"addressRegion\": \"NV\",\n    \"streetAddress\": \"3950 S Las Vegas Blvd\",\n    \"addressLocality\": \"Las Vegas\"\n  },\n  {\n    \"label\": \"Miami\",\n    \"value\": \"5007077\",\n    \"parentLabel\": \"United States\",\n    \"parentValue\": \"US\",\n    \"addressCountry\": \"US\",\n    \"postalCode\": \"33101\",\n    \"addressRegion\": \"FL\",\n    \"streetAddress\": \"100 NE 2nd Ave\",\n    \"addressLocality\": \"Miami\"\n  },\n  {\n    \"label\": \"Detroit\",\n    \"value\": \"5019488\",\n    \"parentLabel\": \"United States\",\n    \"parentValue\": \"US\",\n    \"addressCountry\": \"US\",\n    \"postalCode\": \"48201\",\n    \"addressRegion\": \"MI\",\n    \"streetAddress\": \"One Detroit Center, 500 Woodward Ave\",\n    \"addressLocality\": \"Detroit\"\n  },\n  {\n    \"label\": \"Toronto\",\n    \"value\": \"15003137\",\n    \"parentLabel\": \"Canada\",\n    \"parentValue\": \"CA\",\n    \"addressCountry\": \"CA\",\n    \"postalCode\": \"M5J 2N8\",\n    \"addressRegion\": \"ON\",\n    \"streetAddress\": \"100 King Street West\",\n    \"addressLocality\": \"Toronto\"\n  },\n  {\n    \"label\": \"Vancouver\",\n    \"value\": \"15003205\",\n    \"parentLabel\": \"Canada\",\n    \"parentValue\": \"CA\",\n    \"addressCountry\": \"CA\",\n    \"postalCode\": \"V6B 0A8\",\n    \"addressRegion\": \"BC\",\n    \"streetAddress\": \"800 West Pender Street\",\n    \"addressLocality\": \"Vancouver\"\n  },\n  {\n    \"label\": \"Montreal\",\n    \"value\": \"15001867\",\n    \"parentLabel\": \"Canada\",\n    \"parentValue\": \"CA\",\n    \"addressCountry\": \"CA\",\n    \"postalCode\": \"H3A 0A2\",\n    \"addressRegion\": \"QC\",\n    \"streetAddress\": \"100 Saint-Jacques Street\",\n    \"addressLocality\": \"Downtown Montreal\"\n  },\n  {\n    \"label\": \"London\",\n    \"value\": \"1024195\",\n    \"parentLabel\": \"United Kingdom\",\n    \"parentValue\": \"GB\",\n    \"addressCountry\": \"GB\",\n    \"postalCode\": \"WC2N 5HX\",\n    \"addressRegion\": \"London\",\n    \"streetAddress\": \"10 Great Queen Street\",\n    \"addressLocality\": \"Covent Garden\"\n  },\n  {\n    \"label\": \"Berlin\",\n    \"value\": \"3001350\",\n    \"parentLabel\": \"Germany\",\n    \"parentValue\": \"DE\",\n    \"addressCountry\": \"DE\",\n    \"postalCode\": \"10117\",\n    \"addressRegion\": \"Berlin\",\n    \"streetAddress\": \"Unter den Linden 77\",\n    \"addressLocality\": \"Mitte\"\n  },\n  {\n    \"label\": \"Munich\",\n    \"value\": \"3016382\",\n    \"parentLabel\": \"Germany\",\n    \"parentValue\": \"DE\",\n    \"addressCountry\": \"DE\",\n    \"postalCode\": \"80331\",\n    \"addressRegion\": \"Bavaria\",\n    \"streetAddress\": \"Marienplatz 1\",\n    \"addressLocality\": \"Mitte\"\n  },\n\n  {\n    \"label\": \"Madrid\",\n    \"value\": \"2041600\",\n    \"parentLabel\": \"Spain\",\n    \"parentValue\": \"ES\",\n    \"addressCountry\": \"ES\",\n    \"postalCode\": \"28001\",\n    \"addressRegion\": \"Community of Madrid\",\n    \"streetAddress\": \"Plaza de la Puerta del Sol 1\",\n    \"addressLocality\": \"Madrid\"\n  },\n  {\n    \"label\": \"Barcelona\",\n    \"value\": \"2015583\",\n    \"parentLabel\": \"Spain\",\n    \"parentValue\": \"ES\",\n    \"addressCountry\": \"ES\",\n    \"postalCode\": \"08001\",\n    \"addressRegion\": \"Catalonia\",\n    \"streetAddress\": \"Plaça de Catalunya 1\",\n    \"addressLocality\": \"Barcelona\"\n  },\n  {\n    \"label\": \"Rome\",\n    \"value\": \"34020900\",\n    \"parentLabel\": \"Italy\",\n    \"parentValue\": \"IT\",\n    \"addressCountry\": \"IT\",\n    \"postalCode\": \"00118\",\n    \"addressRegion\": \"Lazio\",\n    \"streetAddress\": \"Via del Corso 1\",\n    \"addressLocality\": \"Roma\"\n  },\n  {\n    \"label\": \"Milan\",\n    \"value\": \"34000439\",\n    \"parentLabel\": \"Italy\",\n    \"parentValue\": \"IT\",\n    \"addressCountry\": \"IT\",\n    \"postalCode\": \"20121\",\n    \"addressRegion\": \"Lombardy\",\n    \"streetAddress\": \"Via Monte Napoleone 1\",\n    \"addressLocality\": \"Milano\"\n  },\n  {\n    \"label\": \"Paris\",\n    \"value\": \"4014735\",\n    \"parentLabel\": \"France\",\n    \"parentValue\": \"FR\",\n    \"addressCountry\": \"FR\",\n    \"postalCode\": \"75001\",\n    \"addressRegion\": \"Île-de-France\",\n    \"streetAddress\": \"10 Place de la Concorde\",\n    \"addressLocality\": \"Paris\"\n  },\n  {\n    \"label\": \"Luxembourg\",\n    \"value\": \"39000000\",\n    \"parentLabel\": \"Luxembourg\",\n    \"parentValue\": \"LU\",\n    \"addressCountry\": \"LU\",\n    \"postalCode\": \"L-1011\",\n    \"addressRegion\": \"Luxembourg\",\n    \"streetAddress\": \"10 Rue du Nord\",\n    \"addressLocality\": \"Ville de Luxembourg\"\n  },\n  {\n    \"label\": \"Geneva\",\n    \"value\": \"16001544\",\n    \"parentLabel\": \"Switzerland\",\n    \"parentValue\": \"CH\",\n    \"addressCountry\": \"CH\",\n    \"postalCode\": \"1201\",\n    \"addressRegion\": \"Canton of Geneva\",\n    \"streetAddress\": \"Rue du Rhône 75\",\n    \"addressLocality\": \"Genève\"\n  },\n  {\n    \"label\": \"Zürich\",\n    \"value\": \"16004811\",\n    \"parentLabel\": \"Switzerland\",\n    \"parentValue\": \"CH\",\n    \"addressCountry\": \"CH\",\n    \"postalCode\": \"8001\",\n    \"addressRegion\": \"Zurich\",\n    \"streetAddress\": \"Bahnhofstrasse 1\",\n    \"addressLocality\": \"Zürich\"\n  },\n  {\n    \"label\": \"Amsterdam\",\n    \"value\": \"67000990\",\n    \"parentLabel\": \"Netherlands\",\n    \"parentValue\": \"NL\",\n    \"addressCountry\": \"NL\",\n    \"postalCode\": \"1012 AB\",\n    \"addressRegion\": \"North Holland\",\n    \"streetAddress\": \"Dam Square 1\",\n    \"addressLocality\": \"Amsterdam\"\n  },\n  {\n    \"label\": \"Dublin\",\n    \"value\": \"47002909\",\n    \"parentLabel\": \"Ireland\",\n    \"parentValue\": \"IE\",\n    \"addressCountry\": \"IE\",\n    \"postalCode\": \"D02 X285\",\n    \"addressRegion\": \"Dublin\",\n    \"streetAddress\": \"32 Grafton Street\",\n    \"addressLocality\": \"Dublin 2\"\n  },\n  {\n    \"label\": \"Vienna\",\n    \"value\": \"9046400\",\n    \"parentLabel\": \"Austria\",\n    \"parentValue\": \"AT\",\n    \"addressCountry\": \"AT\",\n    \"postalCode\": \"1010\",\n    \"addressRegion\": \"Vienna\",\n    \"streetAddress\": \"Stephansplatz 1\",\n    \"addressLocality\": \"Innere Stadt\"\n  },\n  {\n    \"label\": \"Monaco\",\n    \"value\": \"40000005\",\n    \"parentLabel\": \"Monaco\",\n    \"parentValue\": \"MC\",\n    \"addressCountry\": \"MC\",\n    \"postalCode\": \"98000\",\n    \"addressRegion\": \"Monaco\",\n    \"streetAddress\": \"10 Rue du Nord\",\n    \"addressLocality\": \"Monaco-Ville\"\n  },\n  {\n    \"label\": \"Brussels\",\n    \"value\": \"12003806\",\n    \"parentLabel\": \"Belgium\",\n    \"parentValue\": \"BE\",\n    \"addressCountry\": \"BE\",\n    \"postalCode\": \"1000\",\n    \"addressRegion\": \"Brussels-Capital Region\",\n    \"streetAddress\": \"Rue du Nord 26\",\n    \"addressLocality\": \"Brussels\"\n  },\n  {\n    \"label\": \"Stockholm\",\n    \"value\": \"120000095\",\n    \"parentLabel\": \"Sweden\",\n    \"parentValue\": \"SE\",\n    \"addressCountry\": \"SE\",\n    \"postalCode\": \"111 64\",\n    \"addressRegion\": \"Stockholm County\",\n    \"streetAddress\": \"Drottninggatan 77\",\n    \"addressLocality\": \"Stockholm\"\n  },\n  {\n    \"label\": \"Copenhagen\",\n    \"value\": \"75000403\",\n    \"parentLabel\": \"Denmark\",\n    \"parentValue\": \"DM\",\n    \"addressCountry\": \"DK\",\n    \"postalCode\": \"1050\",\n    \"addressRegion\": \"Capital Region of Denmark\",\n    \"streetAddress\": \"Vesterbrogade 21\",\n    \"addressLocality\": \"Copenhagen V\"\n  },\n  {\n    \"label\": \"Lisbon\",\n    \"value\": \"54000596\",\n    \"parentLabel\": \"Portugal\",\n    \"parentValue\": \"PT\",\n    \"addressCountry\": \"PT\",\n    \"postalCode\": \"1000-001\",\n    \"addressRegion\": \"Lisbon\",\n    \"streetAddress\": \"Rua da Liberdade 123\",\n    \"addressLocality\": \"Lisbon\"\n  },\n  {\n    \"label\": \"Sao Paulo\",\n    \"value\": \"14005527\",\n    \"parentLabel\": \"Brazil\",\n    \"parentValue\": \"BR\",\n    \"addressCountry\": \"BR\",\n    \"postalCode\": \"01000-000\",\n    \"addressRegion\": \"São Paulo\",\n    \"streetAddress\": \"Av. Paulista 1578\",\n    \"addressLocality\": \"Bela Vista\"\n  },\n  {\n    \"label\": \"Rio de Janeiro\",\n    \"value\": \"14003221\",\n    \"parentLabel\": \"Brazil\",\n    \"parentValue\": \"BR\",\n    \"addressCountry\": \"BR\",\n    \"postalCode\": \"20000-000\",\n    \"addressRegion\": \"RJ\",\n    \"streetAddress\": \"Av. Presidente Vargas 1\",\n    \"addressLocality\": \"Centro\"\n  },\n  {\n    \"label\": \"Mexico City\",\n    \"value\": \"46075206\",\n    \"parentLabel\": \"Mexico\",\n    \"parentValue\": \"MX\",\n    \"addressCountry\": \"MX\",\n    \"postalCode\": \"06000\",\n    \"addressRegion\": \"Ciudad de México\",\n    \"streetAddress\": \"Paseo de la Reforma #1\",\n    \"addressLocality\": \"Cuauhtémoc\"\n  },\n  {\n    \"label\": \"Argentina\",\n    \"value\": \"7020260\",\n    \"parentLabel\": \"Argentina\",\n    \"parentValue\": \"AR\",\n    \"addressCountry\": \"AR\",\n    \"postalCode\": \"C1001\",\n    \"addressRegion\": \"Buenos Aires City\",\n    \"streetAddress\": \"Avenida Florida 123\",\n    \"addressLocality\": \"Buenos Aires\"\n  },\n  {\n    \"label\": \"Johannesburg\",\n    \"value\": \"66001666\",\n    \"parentLabel\": \"South Africa\",\n    \"parentValue\": \"ZA\",\n    \"addressCountry\": \"ZA\",\n    \"postalCode\": \"2001\",\n    \"addressRegion\": \"Gauteng\",\n    \"streetAddress\": \"Ground Floor Sunnyside Office Park, 32 Rissik Street\",\n    \"addressLocality\": \"Johannesburg Central Business District\"\n  },\n  {\n    \"label\": \"Cape Town\",\n    \"value\": \"66003457\",\n    \"parentLabel\": \"South Africa\",\n    \"parentValue\": \"ZA\",\n    \"addressCountry\": \"ZA\",\n    \"postalCode\": \"8001\",\n    \"addressRegion\": \"Western Cape\",\n    \"streetAddress\": \"76 Lower Long Street\",\n    \"addressLocality\": \"Cape Town CBD\"\n  },\n  {\n    \"label\": \"Lagos\",\n    \"value\": \"100000098\",\n    \"parentLabel\": \"Nigeria\",\n    \"parentValue\": \"NG\",\n    \"addressCountry\": \"NG\",\n    \"postalCode\": \"100001\",\n    \"addressRegion\": \"Lagos State\",\n    \"streetAddress\": \"32/34 Broad Street\",\n    \"addressLocality\": \"Lagos Island\"\n  }\n]\n\nFile v1.2.0:package.json\n\n{\n  \"name\": \"post-job\",\n  \"version\": \"1.2.0\",\n  \"type\": \"module\",\n  \"description\": \"Post job openings and generate resume collection links\",\n  \"main\": \"scripts/post_job.js\",\n  \"scripts\": {\n    \"post\": \"node scripts/post_job.js\"\n  },\n  \"dependencies\": {\n    \"axios\": \"^1.6.0\",\n    \"dayjs\": \"^1.11.19\",\n    \"dotenv\": \"^17.3.1\",\n    \"fuse.js\": \"^7.0.0\"\n  }\n}\n\nFile v1.2.0:pnpm-lock.yaml\n\nlockfileVersion: '9.0'\n\nsettings:\n  autoInstallPeers: true\n  excludeLinksFromLockfile: false\n\nimporters:\n\n  .:\n    dependencies:\n      axios:\n        specifier: ^1.6.0\n        version: 1.13.5\n      dayjs:\n        specifier: ^1.11.19\n        version: 1.11.19\n      fuse.js:\n        specifier: ^7.0.0\n        version: 7.1.0\n\npackages:\n\n  asynckit@0.4.0:\n    resolution: {integrity: sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==}\n\n  axios@1.13.5:\n    resolution: {integrity: sha512-cz4ur7Vb0xS4/KUN0tPWe44eqxrIu31me+fbang3ijiNscE129POzipJJA6zniq2C/Z6sJCjMimjS8Lc/GAs8Q==}\n\n  call-bind-apply-helpers@1.0.2:\n    resolution: {integrity: sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==}\n    engines: {node: '>= 0.4'}\n\n  combined-stream@1.0.8:\n    resolution: {integrity: sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==}\n    engines: {node: '>= 0.8'}\n\n  dayjs@1.11.19:\n    resolution: {integrity: sha512-t5EcLVS6QPBNqM2z8fakk/NKel+Xzshgt8FFKAn+qwlD1pzZWxh0nVCrvFK7ZDb6XucZeF9z8C7CBWTRIVApAw==}\n\n  delayed-stream@1.0.0:\n    resolution: {integrity: sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==}\n    engines: {node: '>=0.4.0'}\n\n  dunder-proto@1.0.1:\n    resolution: {integrity: sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==}\n    engines: {node: '>= 0.4'}\n\n  es-define-property@1.0.1:\n    resolution: {integrity: sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==}\n    engines: {node: '>= 0.4'}\n\n  es-errors@1.3.0:\n    resolution: {integrity: sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==}\n    engines: {node: '>= 0.4'}\n\n  es-object-atoms@1.1.1:\n    resolution: {integrity: sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==}\n    engines: {node: '>= 0.4'}\n\n  es-set-tostringtag@2.1.0:\n    resolution: {integrity: sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==}\n    engines: {node: '>= 0.4'}\n\n  follow-redirects@1.15.11:\n    resolution: {integrity: sha512-deG2P0JfjrTxl50XGCDyfI97ZGVCxIpfKYmfyrQ54n5FO/0gfIES8C/Psl6kWVDolizcaaxZJnTS0QSMxvnsBQ==}\n    engines: {node: '>=4.0'}\n    peerDependencies:\n      debug: '*'\n    peerDependenciesMeta:\n      debug:\n        optional: true\n\n  form-data@4.0.5:\n    resolution: {integrity: sha512-8RipRLol37bNs2bhoV67fiTEvdTrbMUYcFTiy3+wuuOnUog2QBHCZWXDRijWQfAkhBj2Uf5UnVaiWwA5vdd82w==}\n    engines: {node: '>= 6'}\n\n  function-bind@1.1.2:\n    resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==}\n\n  fuse.js@7.1.0:\n    resolution: {integrity: sha512-trLf4SzuuUxfusZADLINj+dE8clK1frKdmqiJNb1Es75fmI5oY6X2mxLVUciLLjxqw/xr72Dhy+lER6dGd02FQ==}\n    engines: {node: '>=10'}\n\n  get-intrinsic@1.3.0:\n    resolution: {integrity: sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==}\n    engines: {node: '>= 0.4'}\n\n  get-proto@1.0.1:\n    resolution: {integrity: sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==}\n    engines: {node: '>= 0.4'}\n\n  gopd@1.2.0:\n    resolution: {integrity: sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==}\n    engines: {node: '>= 0.4'}\n\n  has-symbols@1.1.0:\n    resolution: {integrity: sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==}\n    engines: {node: '>= 0.4'}\n\n  has-tostringtag@1.0.2:\n    resolution: {integrity: sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==}\n    engines: {node: '>= 0.4'}\n\n  hasown@2.0.2:\n    resolution: {integrity: sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==}\n    engines: {node: '>= 0.4'}\n\n  math-intrinsics@1.1.0:\n    resolution: {integrity: sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==}\n    engines: {node: '>= 0.4'}\n\n  mime-db@1.52.0:\n    resolution: {integrity: sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==}\n    engines: {node: '>= 0.6'}\n\n  mime-types@2.1.35:\n    resolution: {integrity: sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==}\n    engines: {node: '>= 0.6'}\n\n  proxy-from-env@1.1.0:\n    resolution: {integrity: sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==}\n\nsnapshots:\n\n  asynckit@0.4.0: {}\n\n  axios@1.13.5:\n    dependencies:\n      follow-redirects: 1.15.11\n      form-data: 4.0.5\n      proxy-from-env: 1.1.0\n    transitivePeerDependencies:\n      - debug\n\n  call-bind-apply-helpers@1.0.2:\n    dependencies:\n      es-errors: 1.3.0\n      function-bind: 1.1.2\n\n  combined-stream@1.0.8:\n    dependencies:\n      delayed-stream: 1.0.0\n\n  dayjs@1.11.19: {}\n\n  delayed-stream@1.0.0: {}\n\n  dunder-proto@1.0.1:\n    dependencies:\n      call-bind-apply-helpers: 1.0.2\n      es-errors: 1.3.0\n      gopd: 1.2.0\n\n  es-define-property@1.0.1: {}\n\n  es-errors@1.3.0: {}\n\n  es-object-atoms@1.1.1:\n    dependencies:\n      es-errors: 1.3.0\n\n  es-set-tostringtag@2.1.0:\n    dependencies:\n      es-errors: 1.3.0\n      get-intrinsic: 1.3.0\n      has-tostringtag: 1.0.2\n      hasown: 2.0.2\n\n  follow-redirects@1.15.11: {}\n\n  form-data@4.0.5:\n    dependencies:\n      asynckit: 0.4.0\n      combined-stream: 1.0.8\n      es-set-tostringtag: 2.1.0\n      hasown: 2.0.2\n      mime-types: 2.1.35\n\n  function-bind@1.1.2: {}\n\n  fuse.js@7.1.0: {}\n\n  get-intrinsic@1.3.0:\n    dependencies:\n      call-bind-apply-helpers: 1.0.2\n      es-define-property: 1.0.1\n      es-errors: 1.3.0\n      es-object-atoms: 1.1.1\n      function-bind: 1.1.2\n      get-proto: 1.0.1\n      gopd: 1.2.0\n      has-symbols: 1.1.0\n      hasown: 2.0.2\n      math-intrinsics: 1.1.0\n\n  get-proto@1.0.1:\n    dependencies:\n      dunder-proto: 1.0.1\n      es-object-atoms: 1.1.1\n\n  gopd@1.2.0: {}\n\n  has-symbols@1.1.0: {}\n\n  has-tostringtag@1.0.2:\n    dependencies:\n      has-symbols: 1.1.0\n\n  hasown@2.0.2:\n    dependencies:\n      function-bind: 1.1.2\n\n  math-intrinsics@1.1.0: {}\n\n  mime-db@1.52.0: {}\n\n  mime-types@2.1.35:\n    dependencies:\n      mime-db: 1.52.0\n\n  proxy-from-env@1.1.0: {}\n\nArchive v1.1.10: 7 files, 19385 bytes\n\nFiles: assets/locations.json (24517b), package.json (332b), pnpm-lock.yaml (6495b), scripts/monitor_linkedin.js (4555b), scripts/post_job.js (12134b), SKILL.md (12062b), _meta.json (128b)\n\nFile v1.1.10:SKILL.md\n\n---\nname: post-job\ndescription: Post free job ads to 20+ job boards such as LinkedIn, Indeed, Ziprecruiter etc. to receive applicant resumes via email.\n---\n\n# JobPoster Skill\n\n🚀 **Quickly post job openings and collect resumes via natural language commands.**\n\nJobPoster 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.\n\n## ✨ Features\n\n- **Natural Language Interface** - Post jobs with simple commands like \"Hire a frontend engineer in Singapore\"\n- **Global City Support** - 100+ cities worldwide with fuzzy matching (Singapore, Hong Kong, New York, London, etc.)\n- **AI Job Description** - Optional AI-powered JD generation for professional, compelling postings\n- **Instant Application Links** - Get shareable URLs for candidates to apply directly\n- **Resume Collection** - All applications sent to your specified email\n- **LinkedIn Sync** - Automatic LinkedIn job posting integration\n\n## ⚠️ External Service Notice\n\nThis skill uses **Fuku AI** (https://hapi.fuku.ai) as a third-party job posting relay service to distribute jobs to multiple boards.\n\n**Data transmitted to Fuku AI:**\n\n- Job title, description, company name, location\n- Email address for receiving resumes\n\n**Authentication:**\n\n- Uses embedded client identifier (no user API key required)\n- Free tier service provided by Fuku AI\n\n**Security:**\n\n- Job descriptions are sanitized before transmission to prevent prompt injection\n- Job IDs are strictly validated (alphanumeric + hyphens only)\n- Channel parameters are filtered to prevent log injection\n\nBy using this skill, you consent to transmitting the above data to Fuku AI's servers.\n\n## 🎯 When to Use\n\nUse this skill when you need to:\n\n- Post a job opening quickly\n- Create a job listing for any role\n- Generate a resume collection link\n- Share job postings with candidates\n- Sync jobs to LinkedIn\n\n## 🛠️ Tools\n\n### post_job\n\nMain tool for posting job openings.\n\n#### Parameters\n\n| Parameter     | Required | Type   | Description                              | Example                          |\n| ------------- | -------- | ------ | ---------------------------------------- | -------------------------------- |\n| `title`       | ✅ Yes   | string | Job title (min 4 characters)             | `\"Senior Frontend Engineer\"`     |\n| `city_query`  | ✅ Yes   | string | City/location (supports fuzzy match)     | `\"Singapore\"`, `\"NYC\"`           |\n| `description` | ✅ Yes   | string | Job description                          | `\"5+ years React experience...\"` |\n| `email`       | ✅ Yes   | string | Email to receive resumes                 | `\"hr@company.com\"`               |\n| `company`     | ❌ No    | string | Company name (default: `\"Your Company\"`) | `\"TechCorp\"`                     |\n| `industry`    | ❌ No    | string | Industry/field (default: `\"General\"`)    | `\"Technology\"`, `\"Finance\"`      |\n\n#### Validation Rules\n\n- **Title**: Minimum 4 characters\n- **Email**: Must be valid email format\n- **Description**: Minimum 100 characters (ensure meaningful job details)\n- **City**: Must match a supported location (see Assets)\n\n#### Response Format\n\nOn success, returns:\n\n```\n `✅ **Job Posted Successfully!**\\n\\n` +\n      `**Position:** ${title}\\n` +\n      `**Location:** ${matched.label}\\n` +\n      `**Job ID:** \\`${jobId}\\`\\n` +\n      `**The resume will be sent to:** ${email}\\n\\n` +\n      `--- \\n` +\n      `**LinkedIn Sync:** ⏳ Processing in background (5-30 min).\\n\\n` +\n      `⚠️ **You MUST spawn a monitor sub-agent to notify the user when complete.**\\n` +\n      `See \"AI Assistant Workflow\" section for required steps.\\n\\n` +\n      `Alternatively, manually check with: \\`check_linkedin_status\\` using Job ID \\`${jobId}\\``\n```\n\n**⚠️ The response message intentionally does NOT promise automatic notification** — that responsibility is on the AI to implement by spawning the monitor.\n\n### check_linkedin_status\n\nCheck the status of a job's LinkedIn synchronization. Use this tool if the LinkedIn URL was not available immediately after posting.\n\n#### Parameters\n\n| Parameter | Required | Type   | Description                | Example      |\n| --------- | -------- | ------ | -------------------------- | ------------ |\n| `jobId`   | ✅ Yes   | string | The ID of the job to check | `\"abcd2345\"` |\n\n#### Response Format\n\nReturns either the LinkedIn URL (if sync complete) or a \"Pending\" status message.\n\n### check_linkedin_status_auto\n\nAuto-check LinkedIn status with polling until URL is available. Checks every 1 minute until LinkedIn URL is returned or max attempts reached.\n\n#### Parameters\n\n| Parameter     | Required | Type   | Description                             | Example      |\n| ------------- | -------- | ------ | --------------------------------------- | ------------ |\n| `jobId`       | ✅ Yes   | string | The ID of the job to check              | `\"abcd2345\"` |\n| `intervalMs`  | ❌ No    | number | Polling interval in ms (default: 60000) | `60000`      |\n| `maxAttempts` | ❌ No    | number | Maximum attempts (default: 20)          | `20`         |\n\n#### Response Format\n\nReturns the LinkedIn URL when available, or a timeout message after max attempts.\n\n## 🤖 AI Assistant Workflow\n\n### ⭐ Required: Auto-Notify with Background Monitor\n\n**⚠️ IMPORTANT: `post_job` does NOT automatically monitor LinkedIn sync.**\n\nAfter calling `post_job`, you **MUST** spawn a background sub-agent to monitor and notify the user. Without this step, the user will never receive the LinkedIn URL.\n\n**Complete workflow:**\n\n```\nUser: \"Post a health manager job in Shanghai\"\n\nAI: [Calls post_job]\n    → Returns: Job ID `abc123`\n\nAI: [Spawns sub-agent with monitor_linkedin.js]\n    → \"✅ Job posted! I'll monitor LinkedIn sync and notify you when complete.\"\n\n[Background monitor polls every 2 minutes]\n\n[When LinkedIn URL is ready]\nAI: \"🎉 LinkedIn sync complete! Job ID: `abc123`, LinkedIn URL: https://linkedin.com/jobs/view/...\"\n```\n\n**Spawn the monitor sub-agent like this (REQUIRED):**\n\n```javascript\n// After post_job succeeds and returns jobId:\n// Step 1: Validate jobId format strictly (alphanumeric + hyphen only)\nconst safeJobId = jobId.match(/^[a-zA-Z0-9-]+$/) ? jobId : null;\nif (!safeJobId) throw new Error(\"Invalid jobId format\");\n\n// Step 2: Spawn monitor sub-agent - this is REQUIRED, not optional\nawait sessions_spawn({\n  task: `Monitor LinkedIn sync for job ID ${safeJobId}. Use the check_linkedin_status tool with jobId parameter set to \"${safeJobId}\". Poll every 2 minutes and notify when LinkedIn URL is available.`,\n  mode: \"run\",\n  cleanup: \"delete\",\n});\n\n// Step 3: Tell the user you'll notify them\nreturn `✅ Job posted! Job ID: \\`${safeJobId}\\`. I'll notify you when LinkedIn sync is complete (usually 5-30 minutes).`;\n```\n\n**⚠️ If you skip spawning the monitor:**\n- The user will NOT receive the LinkedIn URL automatically\n- You must manually call `check_linkedin_status` later\n- This creates a poor user experience\n\n**Why this design?**\n- LinkedIn sync takes 5-30 minutes (blocking is not practical)\n- The sub-agent polls in the background and notifies when ready\n- This keeps the main session free for other tasks\n\n---\n\n### Alternative: Manual Polling\n\nIf you prefer not to spawn a sub-agent:\n\n1. **Save the Job ID** from the response\n2. **Wait 5-10 minutes** (LinkedIn sync takes time)\n3. **Call `check_linkedin_status`** with the Job ID\n4. **If still pending:** Check again every 3-5 minutes\n5. **When LinkedIn URL is ready:** Proactively notify the user\n\n### Example Flow\n\n```\nUser: \"Post a frontend engineer job in Singapore\"\n\nAI: [Calls post_job]\n    → Returns: Job ID `abc123`, Apply URL\n\nAI: \"✅ Job posted! LinkedIn sync in progress...\"\n\n[AI waits 5 minutes, then checks]\n\nAI: [Calls check_linkedin_status with jobId: abc123]\n    → Returns: LinkedIn URL\n\nAI: \"🎉 LinkedIn sync complete! URL: https://linkedin.com/jobs/view/...\"\n```\n\n### Proactive Check Script (for AI)\n\n```javascript\n// After post_job returns a Job ID:\nconst jobId = response.jobId;\n\n// Wait 5 minutes\nawait sleep(300000);\n\n// Check LinkedIn status\nconst result = await check_linkedin_status({ jobId });\n\n// If still pending, check every 3-5 minutes\n// When URL is available, notify user immediately\n```\n\n### Supported Locations\n\nThe skill includes a built-in location database (`assets/locations.json`) with 100+ cities:\n\n**Asia Pacific:** Singapore, Hong Kong, Beijing, Shanghai, Tokyo, Sydney, Mumbai, Bangkok, Seoul, Taipei\n\n**North America:** New York, San Francisco, Los Angeles, Seattle, Chicago, Toronto, Vancouver\n\n**Europe:** London, Berlin, Paris, Amsterdam, Dublin, Zurich, Stockholm\n\n**Middle East:** Dubai, Abu Dhabi, Riyadh, Tel Aviv\n\nSee `assets/locations.json` for the complete list. Fuzzy matching supports variations like \"NYC\" → \"New York\".\n\n## 📦 Installation\n\n### Install via ClawHub\n\n```bash\nclawhub install post-job\n```\n\n### Manual Installation\n\n```bash\n# Clone or download the skill\ncd your-openclaw-workspace/skills\n\n# Install dependencies\ncd post-job\nnpm install\n```\n\n## 🔐 Security Notes\n\n- **Email Privacy**: Resume emails are visible in job postings - use a dedicated hiring email\n- **Rate Limiting**: API may have rate limits for high-volume posting\n\n## 🐛 Troubleshooting\n\n### Issue: Job posts but no confirmation\n\n**Cause**: Response timeout or network issue\n\n**Solution**: Check backend logs, verify API credentials, retry with `--force`\n\n### Issue: City not recognized\n\n**Cause**: City not in location database\n\n**Solution**:\n\n1. Check `assets/locations.json` for supported cities\n2. Try alternative spelling (e.g., \"New York\" vs \"NYC\")\n3. Add new city to database and republish\n\n### Issue: Duplicate job postings\n\n**Cause**: Multiple API calls due to retry logic\n\n**Solution**: Check backend for duplicate jobs, implement request deduplication\n\n## 📝 Changelog\n\n### v1.1.10 (Documentation Fix - LinkedIn Monitor)\n\n- **Fixed misleading documentation**: Clarified that `post_job` does NOT automatically monitor LinkedIn sync\n- **Made monitor spawning REQUIRED**: Changed \"Recommended\" to \"Required\" in AI Assistant Workflow\n- **Updated response format**: Removed \"I'll notify you\" promise from response template\n- **Added explicit warnings**: Multiple ⚠️ notices explaining AI must spawn monitor sub-agent\n- **Removed manual polling example**: Discouraged manual polling as it's unreliable for production use\n\n### v1.1.9 (Security Hardening)\n\n- Enhanced prompt injection protection with double-layer sanitization\n- User input and AI-generated content both filtered before external API calls\n- Updated security documentation with detailed sanitization patterns\n\n### v1.1.8 (Security Fix)\n\n- Added `sanitizeDescription()` function to clean job descriptions before sending to Fuku AI\n- Removed code blocks, special markers, and common injection patterns\n- Added length limits to prevent buffer-based attacks\n- Double-filtering: both user input and AI output are sanitized\n\n### v1.1.7 (Prompt Injection Fixes)\n\n- Fixed SKILL.md: jobId no longer interpolated into shell commands\n- Fixed monitor_linkedin.js: channel parameter now sanitized\n- Fixed post_job.js: added description sanitization before external AI calls\n- Added security section to External Service Notice\n\n### v1.1.4\n\n- Updated skill documentation\n\n### v1.0.0 (Initial Release)\n\n- Core job posting functionality\n- 100+ city support with fuzzy matching\n- Email validation\n- LinkedIn sync integration\n- Error handling and validation\n\n## 🤝 Contributing\n\nFound a bug or want to add more cities?\n\n1. Fork the skill\n2. Make your changes\n3. Test thoroughly\n4. Submit a pull request\n\n## 📄 License\n\nThis skill is provided as-is for use with OpenClaw.\n\n## 🆘 Support\n\nFor issues or questions:\n\n- Check this SKILL.md for troubleshooting\n- Review error messages carefully\n- Contact developer email yangkai31@gmail.com if you run into any issues\n\n---\n\n**Happy Hiring! 🎉**\n\nFile v1.1.10:_meta.json\n\n{\n  \"ownerId\": \"kn766g3fzj7qdcqppg4433krw981sxyc\",\n  \"slug\": \"post-job\",\n  \"version\": \"1.1.10\",\n  \"publishedAt\": 1772105361117\n}\n\nFile v1.1.10:assets/locations.json\n\n[\n  {\n    \"label\": \"Singapore\",\n    \"value\": \"70000001\",\n    \"parentLabel\": \"Singapore\",\n    \"parentValue\": \"SI\",\n    \"addressCountry\": \"SG\",\n    \"postalCode\": \"139950\",\n    \"addressRegion\": \"West Region\",\n    \"streetAddress\": \"67 Ayer Rajah Crescent\",\n    \"addressLocality\": \"Buona Vista\"\n  },\n  {\n    \"label\": \"Dubai\",\n    \"value\": \"71000043\",\n    \"parentLabel\": \"United Arab Emirates\",\n    \"parentValue\": \"UE\",\n    \"addressCountry\": \"AE\",\n    \"postalCode\": \"00000\",\n    \"addressRegion\": \"Dubai Emirate\",\n    \"streetAddress\": \"Sheikh Zayed Road, Building No 22\",\n    \"addressLocality\": \"Dubai\"\n  },\n  {\n    \"label\": \"Kuala Lumpur\",\n    \"value\": \"74000002\",\n    \"parentLabel\": \"Malaysia\",\n    \"parentValue\": \"MY\",\n    \"addressCountry\": \"MY\",\n    \"postalCode\": \"50450\",\n    \"addressRegion\": \"Federal Territory of Kuala Lumpur\",\n    \"streetAddress\": \"15 Jalan Ampang\",\n    \"addressLocality\": \"Kuala Lumpur City Centre\"\n  },\n  {\n    \"label\": \"Johor Bahru\",\n    \"value\": \"74000005\",\n    \"parentLabel\": \"Malaysia\",\n    \"parentValue\": \"MY\",\n    \"addressCountry\": \"MY\",\n    \"postalCode\": \"80100\",\n    \"addressRegion\": \"Johor\",\n    \"streetAddress\": \"Jalan Wong Ah Fook 1\",\n    \"addressLocality\": \"Johor Bahru\"\n  },\n  {\n    \"label\": \"George Town\",\n    \"value\": \"74000024\",\n    \"parentLabel\": \"Malaysia\",\n    \"parentValue\": \"MY\",\n    \"addressCountry\": \"MY\",\n    \"postalCode\": \"10200\",\n    \"addressRegion\": \"Penang\",\n    \"streetAddress\": \"No. 116 & 118 Lebuh Acheh\",\n    \"addressLocality\": \"George Town\"\n  },\n  {\n    \"label\": \"Klang\",\n    \"value\": \"74000003\",\n    \"parentLabel\": \"Malaysia\",\n    \"parentValue\": \"MY\",\n    \"addressCountry\": \"MY\",\n    \"postalCode\": \"41200\",\n    \"addressRegion\": \"Selangor\",\n    \"streetAddress\": \"1, Persiaran Batu Nilam 1, Bandar Bukit Tinggi 2\",\n    \"addressLocality\": \"Klang\"\n  },\n  {\n    \"label\": \"Shah Alam\",\n    \"value\": \"74000009\",\n    \"parentLabel\": \"Malaysia\",\n    \"parentValue\": \"MY\",\n    \"addressCountry\": \"MY\",\n    \"postalCode\": \"40000\",\n    \"addressRegion\": \"Selangor\",\n    \"streetAddress\": \"2, Jalan Perbandaran, Seksyen 14\",\n    \"addressLocality\": \"Shah Alam\"\n  },\n  {\n    \"label\": \"Hong Kong\",\n    \"value\": \"79000002\",\n    \"parentLabel\": \"Hong Kong\",\n    \"parentValue\": \"HK\",\n    \"addressCountry\": \"HK\",\n    \"postalCode\": \"0000\",\n    \"addressRegion\": \"Hong Kong Island\",\n    \"streetAddress\": \"Room 1205, 12/F, Central Plaza, 18 Harbour Road\",\n    \"addressLocality\": \"Wan Chai\"\n  },\n  {\n    \"label\": \"Bangkok\",\n    \"value\": \"61000905\",\n    \"parentLabel\": \"Thailand\",\n    \"parentValue\": \"TH\",\n    \"addressCountry\": \"TH\",\n    \"postalCode\": \"10110\",\n    \"addressRegion\": \"Bangkok Metropolitan Area\",\n    \"streetAddress\": \"10 Soi Sukhumvit 63 (Ekkamai)\",\n    \"addressLocality\": \"Khlong Toei Nuea\"\n  },\n  {\n    \"label\": \"Myanmar\",\n    \"value\": \"330000401\",\n    \"parentLabel\": \"Myanmar\",\n    \"parentValue\": \"MM\",\n    \"addressCountry\": \"MM\",\n    \"postalCode\": \"11141\",\n    \"addressRegion\": \"Yangon Region\",\n    \"streetAddress\": \"12 Bogyoke Aung San Road\",\n    \"addressLocality\": \"Yangon\"\n  },\n  {\n    \"label\": \"Hanoi\",\n    \"value\": \"160000003\",\n    \"parentLabel\": \"Vietnam\",\n    \"parentValue\": \"VN\",\n    \"addressCountry\": \"VN\",\n    \"postalCode\": \"100000\",\n    \"addressRegion\": \"Hà Nội\",\n    \"streetAddress\": \"123 Đường Hoàng Quốc Việt\",\n    \"addressLocality\": \"Cầu Giấy District\"\n  },\n  {\n    \"label\": \"Ho Chi Minh City\",\n    \"value\": \"160000002\",\n    \"parentLabel\": \"Vietnam\",\n    \"parentValue\": \"VN\",\n    \"addressCountry\": \"VN\",\n    \"postalCode\": \"700000\",\n    \"addressRegion\": \"Ho Chi Minh City\",\n    \"streetAddress\": \"91 Nguyen Cu Trinh St\",\n    \"addressLocality\": \"Nguyen Cu Trinh Ward, District 1\"\n  },\n  {\n    \"label\": \"Manila\",\n    \"value\": \"51000000\",\n    \"parentLabel\": \"Philippines\",\n    \"parentValue\": \"PH\",\n    \"addressCountry\": \"PH\",\n    \"postalCode\": \"1000\",\n    \"addressRegion\": \"National Capital Region\",\n    \"streetAddress\": \"691 A. Arnaiz Ave\",\n    \"addressLocality\": \"Makati City\"\n  },\n  {\n    \"label\": \"Jakarta\",\n    \"value\": \"76000207\",\n    \"parentLabel\": \"Indonesia\",\n    \"parentValue\": \"ID\",\n    \"addressCountry\": \"ID\",\n    \"postalCode\": \"10310\",\n    \"addressRegion\": \"DKI Jakarta\",\n    \"streetAddress\": \"Jl. Jend. Sudirman No. 10\",\n    \"addressLocality\": \"Jakarta Pusat\"\n  },\n  {\n    \"label\": \"Tokyo\",\n    \"value\": \"36094389\",\n    \"parentLabel\": \"Japan\",\n    \"parentValue\": \"JP\",\n    \"addressCountry\": \"JP\",\n    \"postalCode\": \"100-0001\",\n    \"addressRegion\": \"Tokyo Metropolis\",\n    \"streetAddress\": \"1-1 Chiyoda\",\n    \"addressLocality\": \"Chiyoda-ku\"\n  },\n  {\n    \"label\": \"Osaka\",\n    \"value\": \"36049159\",\n    \"parentLabel\": \"Japan\",\n    \"parentValue\": \"JP\",\n    \"addressCountry\": \"JP\",\n    \"postalCode\": \"530-0001\",\n    \"addressRegion\": \"Osaka Prefecture\",\n    \"streetAddress\": \"3-1 Umeda 1-chōme\",\n    \"addressLocality\": \"Kita-ku Osaka\"\n  },\n  {\n    \"label\": \"Seoul\",\n    \"value\": \"320006457\",\n    \"parentLabel\": \"South Korea\",\n    \"parentValue\": \"KR\",\n    \"addressCountry\": \"KR\",\n    \"postalCode\": \"04524\",\n    \"addressRegion\": \"Seoul Special City\",\n    \"streetAddress\": \"50 Myeongdong 8-gil\",\n    \"addressLocality\": \"Jung-gu\"\n  },\n  {\n    \"label\": \"Busan\",\n    \"value\": \"320006397\",\n    \"parentLabel\": \"South Korea\",\n    \"parentValue\": \"KR\",\n    \"addressCountry\": \"KR\",\n    \"postalCode\": \"47285\",\n    \"addressRegion\": \"Busan Metropolitan City\",\n    \"streetAddress\": \"772 Gaya-daero\",\n    \"addressLocality\": \"Busanjin-gu\"\n  },\n  {\n    \"label\": \"Beijing\",\n    \"value\": \"68000002\",\n    \"parentLabel\": \"China\",\n    \"parentValue\": \"CN\",\n    \"addressCountry\": \"CN\",\n    \"postalCode\": \"100000\",\n    \"addressRegion\": \"Beijing Municipality\",\n    \"streetAddress\": \"No. 1 Jianguomenwai Avenue\",\n    \"addressLocality\": \"Dongcheng District\"\n  },\n  {\n    \"label\": \"Shanghai\",\n    \"value\": \"68000169\",\n    \"parentLabel\": \"China\",\n    \"parentValue\": \"CN\",\n    \"addressCountry\": \"CN\",\n    \"postalCode\": \"200000\",\n    \"addressRegion\": \"Shanghai Municipality\",\n    \"streetAddress\": \"No. 168 Pudong New Area Lujiazui\",\n    \"addressLocality\": \"Pudong New Area\"\n  },\n  {\n    \"label\": \"Guangzhou\",\n    \"value\": \"68000466\",\n    \"parentLabel\": \"China\",\n    \"parentValue\": \"CN\",\n    \"addressCountry\": \"CN\",\n    \"postalCode\": \"510000\",\n    \"addressRegion\": \"Guangdong Province\",\n    \"streetAddress\": \"No. 1 Zhongshan Road\",\n    \"addressLocality\": \"Guangzhou\"\n  },\n  {\n    \"label\": \"Shenzhen\",\n    \"value\": \"68000468\",\n    \"parentLabel\": \"China\",\n    \"parentValue\": \"CN\",\n    \"addressCountry\": \"CN\",\n    \"postalCode\": \"518000\",\n    \"addressRegion\": \"Guangdong Province\",\n    \"streetAddress\": \"No. 1 Shennan Boulevard\",\n    \"addressLocality\": \"Futian District\"\n  },\n  {\n    \"label\": \"Taipei\",\n    \"value\": \"170000325\",\n    \"parentLabel\": \"Taiwan\",\n    \"parentValue\": \"TW\",\n    \"addressCountry\": \"TW\",\n    \"postalCode\": \"100\",\n    \"addressRegion\": \"Taipei City\",\n    \"streetAddress\": \"No. 1, Zhongxiao W. Rd.\",\n    \"addressLocality\": \"Zhongzheng District\"\n  },\n  {\n    \"label\": \"Sydney\",\n    \"value\": \"10000195\",\n    \"parentLabel\": \"Australia\",\n    \"parentValue\": \"AU\",\n    \"addressCountry\": \"AU\",\n    \"postalCode\": \"2000\",\n    \"addressRegion\": \"NSW\",\n    \"streetAddress\": \"1 Martin Place\",\n    \"addressLocality\": \"Sydney CBD\"\n  },\n  {\n    \"label\": \"Melbourne\",\n    \"value\": \"10006677\",\n    \"parentLabel\": \"Australia\",\n    \"parentValue\": \"AU\",\n    \"addressCountry\": \"AU\",\n    \"postalCode\": \"3000\",\n    \"addressRegion\": \"VIC\",\n    \"streetAddress\": \"1 Collins Street\",\n    \"addressLocality\": \"Melbourne CBD\"\n  },\n  {\n    \"label\": \"Auckland\",\n    \"value\": \"49001765\",\n    \"parentLabel\": \"New Zealand\",\n    \"parentValue\": \"NZ\",\n    \"addressCountry\": \"NZ\",\n    \"postalCode\": \"1010\",\n    \"addressRegion\": \"Auckland Region\",\n    \"streetAddress\": \"1 Queen Street\",\n    \"addressLocality\": \"Auckland CBD\"\n  },\n  {\n    \"label\": \"New Delhi\",\n    \"value\": \"32015163\",\n    \"parentLabel\": \"India\",\n    \"parentValue\": \"IN\",\n    \"addressCountry\": \"IN\",\n    \"postalCode\": \"110001\",\n    \"addressRegion\": \"Delhi\",\n    \"streetAddress\": \"Rashtrapati Bhavan, Raisina Hill\",\n    \"addressLocality\": \"New Delhi\"\n  },\n  {\n    \"label\": \"Mumbai\",\n    \"value\": \"32015169\",\n    \"parentLabel\": \"India\",\n    \"parentValue\": \"IN\",\n    \"addressCountry\": \"IN\",\n    \"postalCode\": \"400001\",\n    \"addressRegion\": \"Maharashtra\",\n    \"streetAddress\": \"Taj Mahal Palace, Apollo Bunder\",\n    \"addressLocality\": \"Colaba\"\n  },\n  {\n    \"label\": \"Bangalore\",\n    \"value\": \"32015168\",\n    \"parentLabel\": \"India\",\n    \"parentValue\": \"IN\",\n    \"addressCountry\": \"IN\",\n    \"postalCode\": \"560001\",\n    \"addressRegion\": \"Karnataka\",\n    \"streetAddress\": \"No. 1 MG Road\",\n    \"addressLocality\": \"Bengaluru Central\"\n  },\n  {\n    \"label\": \"Pune\",\n    \"value\": \"32015170\",\n    \"parentLabel\": \"India\",\n    \"parentValue\": \"IN\",\n    \"addressCountry\": \"IN\",\n    \"postalCode\": \"411001\",\n    \"addressRegion\": \"Maharashtra\",\n    \"streetAddress\": \"1 MG Road\",\n    \"addressLocality\": \"Pune City\"\n  },\n  {\n    \"label\": \"Chennai\",\n    \"value\": \"32015167\",\n    \"parentLabel\": \"India\",\n    \"parentValue\": \"IN\",\n    \"addressCountry\": \"IN\",\n    \"postalCode\": \"600001\",\n    \"addressRegion\": \"Tamil Nadu\",\n    \"streetAddress\": \"Rashtrapathi Bhavan Road\",\n    \"addressLocality\": \"Fort St George, Chennai\"\n  },\n\n  {\n    \"label\": \"Riyadh\",\n    \"value\": \"180000067\",\n    \"parentLabel\": \"Saudi Arabia\",\n    \"parentValue\": \"SA\",\n    \"addressCountry\": \"SA\",\n    \"postalCode\": \"11564\",\n    \"addressRegion\": \"Riyadh Province\",\n    \"streetAddress\": \"King Fahd Road\",\n    \"addressLocality\": \"Olaya District\"\n  },\n  {\n    \"label\": \"Jeddah\",\n    \"value\": \"180000053\",\n    \"parentLabel\": \"Saudi Arabia\",\n    \"parentValue\": \"SA\",\n    \"addressCountry\": \"SA\",\n    \"postalCode\": \"22233\",\n    \"addressRegion\": \"Makkah Province\",\n    \"streetAddress\": \"King Road\",\n    \"addressLocality\": \"Al-Olaya District\"\n  },\n  {\n    \"label\": \"Abu Dhabi\",\n    \"value\": \"71000002\",\n    \"parentLabel\": \"United Arab Emirates\",\n    \"parentValue\": \"UE\",\n    \"addressCountry\": \"AE\",\n    \"postalCode\": \"00000\",\n    \"addressRegion\": \"Abu Dhabi Emirate\",\n    \"streetAddress\": \"Sheikh Zayed Road\",\n    \"addressLocality\": \"Abu Dhabi\"\n  },\n  {\n    \"label\": \"Doha\",\n    \"value\": \"72000021\",\n    \"parentLabel\": \"Qatar\",\n    \"parentValue\": \"QA\",\n    \"addressCountry\": \"QA\",\n    \"postalCode\": \"00000\",\n    \"addressRegion\": \"Doha\",\n    \"streetAddress\": \"West Bay Square, Al Qatar Rd\",\n    \"addressLocality\": \"Doha City\"\n  },\n  {\n    \"label\": \"Cairo\",\n    \"value\": \"78000049\",\n    \"parentLabel\": \"Egypt\",\n    \"parentValue\": \"EG\",\n    \"addressCountry\": \"EG\",\n    \"postalCode\": \"11511\",\n    \"addressRegion\": \"Cairo Governorate\",\n    \"streetAddress\": \"1 Abdel Khalek Tharwat St, Ataba Square\",\n    \"addressLocality\": \"Cairo\"\n  },\n  {\n    \"label\": \"Istanbul\",\n    \"value\": \"62051381\",\n    \"parentLabel\": \"Turkey\",\n    \"parentValue\": \"TR\",\n    \"addressCountry\": \"TR\",\n    \"postalCode\": \"34000\",\n    \"addressRegion\": \"Istanbul Province\",\n    \"streetAddress\": \"İstiklal Caddesi No: 100\",\n    \"addressLocality\": \"Beyoğlu\"\n  },\n  {\n    \"label\": \"New York\",\n    \"value\": \"5027742\",\n    \"parentLabel\": \"United States\",\n    \"parentValue\": \"US\",\n    \"addressCountry\": \"US\",\n    \"postalCode\": \"10001\",\n    \"addressRegion\": \"NY\",\n    \"streetAddress\": \"401 7th Ave\",\n    \"addressLocality\": \"Manhattan\"\n  },\n  {\n    \"label\": \"San Francisco\",\n    \"value\": \"5004604\",\n    \"parentLabel\": \"United States\",\n    \"parentValue\": \"US\",\n    \"addressCountry\": \"US\",\n    \"postalCode\": \"94105\",\n    \"addressRegion\": \"CA\",\n    \"streetAddress\": \"595 Market St\",\n    \"addressLocality\": \"San Francisco\"\n  },\n  {\n    \"label\": \"Los Angeles\",\n    \"value\": \"5002945\",\n    \"parentLabel\": \"United States\",\n    \"parentValue\": \"US\",\n    \"addressCountry\": \"US\",\n    \"postalCode\": \"90001\",\n    \"addressRegion\": \"CA\",\n    \"streetAddress\": \"100 W 1st Street\",\n    \"addressLocality\": \"Los Angeles\"\n  },\n  {\n    \"label\": \"San Jose\",\n    \"value\": \"5004711\",\n    \"parentLabel\": \"United States\",\n    \"parentValue\": \"US\",\n    \"addressCountry\": \"US\",\n    \"postalCode\": \"95113\",\n    \"addressRegion\": \"CA\",\n    \"streetAddress\": \"200 E Santa Clara St\",\n    \"addressLocality\": \"San Jose\"\n  },\n  {\n    \"label\": \"San Diego\",\n    \"value\": \"5004327\",\n    \"parentLabel\": \"United States\",\n    \"parentValue\": \"US\",\n    \"addressCountry\": \"US\",\n    \"postalCode\": \"92101\",\n    \"addressRegion\": \"CA\",\n    \"streetAddress\": \"600 Broadway\",\n    \"addressLocality\": \"San Diego\"\n  },\n  {\n    \"label\": \"Seattle\",\n    \"value\": \"5040918\",\n    \"parentLabel\": \"United States\",\n    \"parentValue\": \"US\",\n    \"addressCountry\": \"US\",\n    \"postalCode\": \"98101\",\n    \"addressRegion\": \"WA\",\n    \"streetAddress\": \"500 Yale Ave N\",\n    \"addressLocality\": \"Seattle\"\n  },\n  {\n    \"label\": \"Denver\",\n    \"value\": \"5005614\",\n    \"parentLabel\": \"United States\",\n    \"parentValue\": \"US\",\n    \"addressCountry\": \"US\",\n    \"postalCode\": \"80202\",\n    \"addressRegion\": \"CO\",\n    \"streetAddress\": \"Denver Pavilions, 700 16th St\",\n    \"addressLocality\": \"Denver\"\n  },\n  {\n    \"label\": \"Chicago\",\n    \"value\": \"5011305\",\n    \"parentLabel\": \"United States\",\n    \"parentValue\": \"US\",\n    \"addressCountry\": \"US\",\n    \"postalCode\": \"60601\",\n    \"addressRegion\": \"IL\",\n    \"streetAddress\": \"233 S Wacker Dr\",\n    \"addressLocality\": \"Chicago\"\n  },\n  {\n    \"label\": \"Houston\",\n    \"value\": \"5037121\",\n    \"parentLabel\": \"United States\",\n    \"parentValue\": \"US\",\n    \"addressCountry\": \"US\",\n    \"postalCode\": \"77002\",\n    \"addressRegion\": \"TX\",\n    \"streetAddress\": \"1400 Lubbock Street\",\n    \"addressLocality\": \"Houston\"\n  },\n  {\n    \"label\": \"Austin\",\n    \"value\": \"5038603\",\n    \"parentLabel\": \"United States\",\n    \"parentValue\": \"US\",\n    \"addressCountry\": \"US\",\n    \"postalCode\": \"78701\",\n    \"addressRegion\": \"TX\",\n    \"streetAddress\": \"500 W 2nd Street\",\n    \"addressLocality\": \"Austin\"\n  },\n  {\n    \"label\": \"San Antonio\",\n    \"value\": \"5043734\",\n    \"parentLabel\": \"United States\",\n    \"parentValue\": \"US\",\n    \"addressCountry\": \"US\",\n    \"postalCode\": \"78205\",\n    \"addressRegion\": \"TX\",\n    \"streetAddress\": \"615 E Houston St\",\n    \"addressLocality\": \"San Antonio\"\n  },\n  {\n    \"label\": \"Dallas\",\n    \"value\": \"5036565\",\n    \"parentLabel\": \"United States\",\n    \"parentValue\": \"US\",\n    \"addressCountry\": \"US\",\n    \"postalCode\": \"75201\",\n    \"addressRegion\": \"TX\",\n    \"streetAddress\": \"1500 Main St\",\n    \"addressLocality\": \"Dallas\"\n  },\n  {\n    \"label\": \"Phoenix\",\n    \"value\": \"5002020\",\n    \"parentLabel\": \"United States\",\n    \"parentValue\": \"US\",\n    \"addressCountry\": \"US\",\n    \"postalCode\": \"85003\",\n    \"addressRegion\": \"AZ\",\n    \"streetAddress\": \"220 N Central Ave\",\n    \"addressLocality\": \"Phoenix\"\n  },\n  {\n    \"label\": \"Philadelphia\",\n    \"value\": \"5033484\",\n    \"parentLabel\": \"United States\",\n    \"parentValue\": \"US\",\n    \"addressCountry\": \"US\",\n    \"postalCode\": \"19103\",\n    \"addressRegion\": \"PA\",\n    \"streetAddress\": \"1900 Market St\",\n    \"addressLocality\": \"Philadelphia\"\n  },\n  {\n    \"label\": \"District of Columbia\",\n    \"value\": \"5043669\",\n    \"parentLabel\": \"United States\",\n    \"parentValue\": \"US\",\n    \"addressCountry\": \"US\",\n    \"postalCode\": \"20001\",\n    \"addressRegion\": \"DC\",\n    \"streetAddress\": \"1600 Pennsylvania Ave NW\",\n    \"addressLocality\": \"Washington\"\n  },\n  {\n    \"label\": \"Boston\",\n    \"value\": \"5016967\",\n    \"parentLabel\": \"United States\",\n    \"parentValue\": \"US\",\n    \"addressCountry\": \"US\",\n    \"postalCode\": \"02108\",\n    \"addressRegion\": \"MA\",\n    \"streetAddress\": \"1 Boston Common\",\n    \"addressLocality\": \"Boston\"\n  },\n  {\n    \"label\": \"Las Vegas\",\n    \"value\": \"5026496\",\n    \"parentLabel\": \"United States\",\n    \"parentValue\": \"US\",\n    \"addressCountry\": \"US\",\n    \"postalCode\": \"89101\",\n    \"addressRegion\": \"NV\",\n    \"streetAddress\": \"3950 S Las Vegas Blvd\",\n    \"addressLocality\": \"Las Vegas\"\n  },\n  {\n    \"label\": \"Miami\",\n    \"value\": \"5007077\",\n    \"parentLabel\": \"United States\",\n    \"parentValue\": \"US\",\n    \"addressCountry\": \"US\",\n    \"postalCode\": \"33101\",\n    \"addressRegion\": \"FL\",\n    \"streetAddress\": \"100 NE 2nd Ave\",\n    \"addressLocality\": \"Miami\"\n  },\n  {\n    \"label\": \"Detroit\",\n    \"value\": \"5019488\",\n    \"parentLabel\": \"United States\",\n    \"parentValue\": \"US\",\n    \"addressCountry\": \"US\",\n    \"postalCode\": \"48201\",\n    \"addressRegion\": \"MI\",\n    \"streetAddress\": \"One Detroit Center, 500 Woodward Ave\",\n    \"addressLocality\": \"Detroit\"\n  },\n  {\n    \"label\": \"Toronto\",\n    \"value\": \"15003137\",\n    \"parentLabel\": \"Canada\",\n    \"parentValue\": \"CA\",\n    \"addressCountry\": \"CA\",\n    \"postalCode\": \"M5J 2N8\",\n    \"addressRegion\": \"ON\",\n    \"streetAddress\": \"100 King Street West\",\n    \"addressLocality\": \"Toronto\"\n  },\n  {\n    \"label\": \"Vancouver\",\n    \"value\": \"15003205\",\n    \"parentLabel\": \"Canada\",\n    \"parentValue\": \"CA\",\n    \"addressCountry\": \"CA\",\n    \"postalCode\": \"V6B 0A8\",\n    \"addressRegion\": \"BC\",\n    \"streetAddress\": \"800 West Pender Street\",\n    \"addressLocality\": \"Vancouver\"\n  },\n  {\n    \"label\": \"Montreal\",\n    \"value\": \"15001867\",\n    \"parentLabel\": \"Canada\",\n    \"parentValue\": \"CA\",\n    \"addressCountry\": \"CA\",\n    \"postalCode\": \"H3A 0A2\",\n    \"addressRegion\": \"QC\",\n    \"streetAddress\": \"100 Saint-Jacques Street\",\n    \"addressLocality\": \"Downtown Montreal\"\n  },\n  {\n    \"label\": \"London\",\n    \"value\": \"1024195\",\n    \"parentLabel\": \"United Kingdom\",\n    \"parentValue\": \"GB\",\n    \"addressCountry\": \"GB\",\n    \"postalCode\": \"WC2N 5HX\",\n    \"addressRegion\": \"London\",\n    \"streetAddress\": \"10 Great Queen Street\",\n    \"addressLocality\": \"Covent Garden\"\n  },\n  {\n    \"label\": \"Berlin\",\n    \"value\": \"3001350\",\n    \"parentLabel\": \"Germany\",\n    \"parentValue\": \"DE\",\n    \"addressCountry\": \"DE\",\n    \"postalCode\": \"10117\",\n    \"addressRegion\": \"Berlin\",\n    \"streetAddress\": \"Unter den Linden 77\",\n    \"addressLocality\": \"Mitte\"\n  },\n  {\n    \"label\": \"Munich\",\n    \"value\": \"3016382\",\n    \"parentLabel\": \"Germany\",\n    \"parentValue\": \"DE\",\n    \"addressCountry\": \"DE\",\n    \"postalCode\": \"80331\",\n    \"addressRegion\": \"Bavaria\",\n    \"streetAddress\": \"Marienplatz 1\",\n    \"addressLocality\": \"Mitte\"\n  },\n\n  {\n    \"label\": \"Madrid\",\n    \"value\": \"2041600\",\n    \"parentLabel\": \"Spain\",\n    \"parentValue\": \"ES\",\n    \"addressCountry\": \"ES\",\n    \"postalCode\": \"28001\",\n    \"addressRegion\": \"Community of Madrid\",\n    \"streetAddress\": \"Plaza de la Puerta del Sol 1\",\n    \"addressLocality\": \"Madrid\"\n  },\n  {\n    \"label\": \"Barcelona\",\n    \"value\": \"2015583\",\n    \"parentLabel\": \"Spain\",\n    \"parentValue\": \"ES\",\n    \"addressCountry\": \"ES\",\n    \"postalCode\": \"08001\",\n    \"addressRegion\": \"Catalonia\",\n    \"streetAddress\": \"Plaça de Catalunya 1\",\n    \"addressLocality\": \"Barcelona\"\n  },\n  {\n    \"label\": \"Rome\",\n    \"value\": \"34020900\",\n    \"parentLabel\": \"Italy\",\n    \"parentValue\": \"IT\",\n    \"addressCountry\": \"IT\",\n    \"postalCode\": \"00118\",\n    \"addressRegion\": \"Lazio\",\n    \"streetAddress\": \"Via del Corso 1\",\n    \"addressLocality\": \"Roma\"\n  },\n  {\n    \"label\": \"Milan\",\n    \"value\": \"34000439\",\n    \"parentLabel\": \"Italy\",\n    \"parentValue\": \"IT\",\n    \"addressCountry\": \"IT\",\n    \"postalCode\": \"20121\",\n    \"addressRegion\": \"Lombardy\",\n    \"streetAddress\": \"Via Monte Napoleone 1\",\n    \"addressLocality\": \"Milano\"\n  },\n  {\n    \"label\": \"Paris\",\n    \"value\": \"4014735\",\n    \"parentLabel\": \"France\",\n    \"parentValue\": \"FR\",\n    \"addressCountry\": \"FR\",\n    \"postalCode\": \"75001\",\n    \"addressRegion\": \"Île-de-France\",\n    \"streetAddress\": \"10 Place de la Concorde\",\n    \"addressLocality\": \"Paris\"\n  },\n  {\n    \"label\": \"Luxembourg\",\n    \"value\": \"39000000\",\n    \"parentLabel\": \"Luxembourg\",\n    \"parentValue\": \"LU\",\n    \"addressCountry\": \"LU\",\n    \"postalCode\": \"L-1011\",\n    \"addressRegion\": \"Luxembourg\",\n    \"streetAddress\": \"10 Rue du Nord\",\n    \"addressLocality\": \"Ville de Luxembourg\"\n  },\n  {\n    \"label\": \"Geneva\",\n    \"value\": \"16001544\",\n    \"parentLabel\": \"Switzerland\",\n    \"parentValue\": \"CH\",\n    \"addressCountry\": \"CH\",\n    \"postalCode\": \"1201\",\n    \"addressRegion\": \"Canton of Geneva\",\n    \"streetAddress\": \"Rue du Rhône 75\",\n    \"addressLocality\": \"Genève\"\n  },\n  {\n    \"label\": \"Zürich\",\n    \"value\": \"16004811\",\n    \"parentLabel\": \"Switzerland\",\n    \"parentValue\": \"CH\",\n    \"addressCountry\": \"CH\",\n    \"postalCode\": \"8001\",\n    \"addressRegion\": \"Zurich\",\n    \"streetAddress\": \"Bahnhofstrasse 1\",\n    \"addressLocality\": \"Zürich\"\n  },\n  {\n    \"label\": \"Amsterdam\",\n    \"value\": \"67000990\",\n    \"parentLabel\": \"Netherlands\",\n    \"parentValue\": \"NL\",\n    \"addressCountry\": \"NL\",\n    \"postalCode\": \"1012 AB\",\n    \"addressRegion\": \"North Holland\",\n    \"streetAddress\": \"Dam Square 1\",\n    \"addressLocality\": \"Amsterdam\"\n  },\n  {\n    \"label\": \"Dublin\",\n    \"value\": \"47002909\",\n    \"parentLabel\": \"Ireland\",\n    \"parentValue\": \"IE\",\n    \"addressCountry\": \"IE\",\n    \"postalCode\": \"D02 X285\",\n    \"addressRegion\": \"Dublin\",\n    \"streetAddress\": \"32 Grafton Street\",\n    \"addressLocality\": \"Dublin 2\"\n  },\n  {\n    \"label\": \"Vienna\",\n    \"value\": \"9046400\",\n    \"parentLabel\": \"Austria\",\n    \"parentValue\": \"AT\",\n    \"addressCountry\": \"AT\",\n    \"postalCode\": \"1010\",\n    \"addressRegion\": \"Vienna\",\n    \"streetAddress\": \"Stephansplatz 1\",\n    \"addressLocality\": \"Innere Stadt\"\n  },\n  {\n    \"label\": \"Monaco\",\n    \"value\": \"40000005\",\n    \"parentLabel\": \"Monaco\",\n    \"parentValue\": \"MC\",\n    \"addressCountry\": \"MC\",\n    \"postalCode\": \"98000\",\n    \"addressRegion\": \"Monaco\",\n    \"streetAddress\": \"10 Rue du Nord\",\n    \"addressLocality\": \"Monaco-Ville\"\n  },\n  {\n    \"label\": \"Brussels\",\n    \"value\": \"12003806\",\n    \"parentLabel\": \"Belgium\",\n    \"parentValue\": \"BE\",\n    \"addressCountry\": \"BE\",\n    \"postalCode\": \"1000\",\n    \"addressRegion\": \"Brussels-Capital Region\",\n    \"streetAddress\": \"Rue du Nord 26\",\n    \"addressLocality\": \"Brussels\"\n  },\n  {\n    \"label\": \"Stockholm\",\n    \"value\": \"120000095\",\n    \"parentLabel\": \"Sweden\",\n    \"parentValue\": \"SE\",\n    \"addressCountry\": \"SE\",\n    \"postalCode\": \"111 64\",\n    \"addressRegion\": \"Stockholm County\",\n    \"streetAddress\": \"Drottninggatan 77\",\n    \"addressLocality\": \"Stockholm\"\n  },\n  {\n    \"label\": \"Copenhagen\",\n    \"value\": \"75000403\",\n    \"parentLabel\": \"Denmark\",\n    \"parentValue\": \"DM\",\n    \"addressCountry\": \"DK\",\n    \"postalCode\": \"1050\",\n    \"addressRegion\": \"Capital Region of Denmark\",\n    \"streetAddress\": \"Vesterbrogade 21\",\n    \"addressLocality\": \"Copenhagen V\"\n  },\n  {\n    \"label\": \"Lisbon\",\n    \"value\": \"54000596\",\n    \"parentLabel\": \"Portugal\",\n    \"parentValue\": \"PT\",\n    \"addressCountry\": \"PT\",\n    \"postalCode\": \"1000-001\",\n    \"addressRegion\": \"Lisbon\",\n    \"streetAddress\": \"Rua da Liberdade 123\",\n    \"addressLocality\": \"Lisbon\"\n  },\n  {\n    \"label\": \"Sao Paulo\",\n    \"value\": \"14005527\",\n    \"parentLabel\": \"Brazil\",\n    \"parentValue\": \"BR\",\n    \"addressCountry\": \"BR\",\n    \"postalCode\": \"01000-000\",\n    \"addressRegion\": \"São Paulo\",\n    \"streetAddress\": \"Av. Paulista 1578\",\n    \"addressLocality\": \"Bela Vista\"\n  },\n  {\n    \"label\": \"Rio de Janeiro\",\n    \"value\": \"14003221\",\n    \"parentLabel\": \"Brazil\",\n    \"parentValue\": \"BR\",\n    \"addressCountry\": \"BR\",\n    \"postalCode\": \"20000-000\",\n    \"addressRegion\": \"RJ\",\n    \"streetAddress\": \"Av. Presidente Vargas 1\",\n    \"addressLocality\": \"Centro\"\n  },\n  {\n    \"label\": \"Mexico City\",\n    \"value\": \"46075206\",\n    \"parentLabel\": \"Mexico\",\n    \"parentValue\": \"MX\",\n    \"addressCountry\": \"MX\",\n    \"postalCode\": \"06000\",\n    \"addressRegion\": \"Ciudad de México\",\n    \"streetAddress\": \"Paseo de la Reforma #1\",\n    \"addressLocality\": \"Cuauhtémoc\"\n  },\n  {\n    \"label\": \"Argentina\",\n    \"value\": \"7020260\",\n    \"parentLabel\": \"Argentina\",\n    \"parentValue\": \"AR\",\n    \"addressCountry\": \"AR\",\n    \"postalCode\": \"C1001\",\n    \"addressRegion\": \"Buenos Aires City\",\n    \"streetAddress\": \"Avenida Florida 123\",\n    \"addressLocality\": \"Buenos Aires\"\n  },\n  {\n    \"label\": \"Johannesburg\",\n    \"value\": \"66001666\",\n    \"parentLabel\": \"South Africa\",\n    \"parentValue\": \"ZA\",\n    \"addressCountry\": \"ZA\",\n    \"postalCode\": \"2001\",\n    \"addressRegion\": \"Gauteng\",\n    \"streetAddress\": \"Ground Floor Sunnyside Office Park, 32 Rissik Street\",\n    \"addressLocality\": \"Johannesburg Central Business District\"\n  },\n  {\n    \"label\": \"Cape Town\",\n    \"value\": \"66003457\",\n    \"parentLabel\": \"South Africa\",\n    \"parentValue\": \"ZA\",\n    \"addressCountry\": \"ZA\",\n    \"postalCode\": \"8001\",\n    \"addressRegion\": \"Western Cape\",\n    \"streetAddress\": \"76 Lower Long Street\",\n    \"addressLocality\": \"Cape Town CBD\"\n  },\n  {\n    \"label\": \"Lagos\",\n    \"value\": \"100000098\",\n    \"parentLabel\": \"Nigeria\",\n    \"parentValue\": \"NG\",\n    \"addressCountry\": \"NG\",\n    \"postalCode\": \"100001\",\n    \"addressRegion\": \"Lagos State\",\n    \"streetAddress\": \"32/34 Broad Street\",\n    \"addressLocality\": \"Lagos Island\"\n  }\n]\n\nFile v1.1.10:package.json\n\n{\n  \"name\": \"post-job\",\n  \"version\": \"1.1.10\",\n  \"type\": \"module\",\n  \"description\": \"Post job openings and generate resume collection links\",\n  \"main\": \"scripts/post_job.js\",\n  \"scripts\": {\n    \"post\": \"node scripts/post_job.js\"\n  },\n  \"dependencies\": {\n    \"axios\": \"^1.6.0\",\n    \"dayjs\": \"^1.11.19\",\n    \"fuse.js\": \"^7.0.0\"\n  }\n}\n\nFile v1.1.10:pnpm-lock.yaml\n\nlockfileVersion: '9.0'\n\nsettings:\n  autoInstallPeers: true\n  excludeLinksFromLockfile: false\n\nimporters:\n\n  .:\n    dependencies:\n      axios:\n        specifier: ^1.6.0\n        version: 1.13.5\n      dayjs:\n        specifier: ^1.11.19\n        version: 1.11.19\n      fuse.js:\n        specifier: ^7.0.0\n        version: 7.1.0\n\npackages:\n\n  asynckit@0.4.0:\n    resolution: {integrity: sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==}\n\n  axios@1.13.5:\n    resolution: {integrity: sha512-cz4ur7Vb0xS4/KUN0tPWe44eqxrIu31me+fbang3ijiNscE129POzipJJA6zniq2C/Z6sJCjMimjS8Lc/GAs8Q==}\n\n  call-bind-apply-helpers@1.0.2:\n    resolution: {integrity: sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==}\n    engines: {node: '>= 0.4'}\n\n  combined-stream@1.0.8:\n    resolution: {integrity: sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==}\n    engines: {node: '>= 0.8'}\n\n  dayjs@1.11.19:\n    resolution: {integrity: sha512-t5EcLVS6QPBNqM2z8fakk/NKel+Xzshgt8FFKAn+qwlD1pzZWxh0nVCrvFK7ZDb6XucZeF9z8C7CBWTRIVApAw==}\n\n  delayed-stream@1.0.0:\n    resolution: {integrity: sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==}\n    engines: {node: '>=0.4.0'}\n\n  dunder-proto@1.0.1:\n    resolution: {integrity: sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==}\n    engines: {node: '>= 0.4'}\n\n  es-define-property@1.0.1:\n    resolution: {integrity: sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==}\n    engines: {node: '>= 0.4'}\n\n  es-errors@1.3.0:\n    resolution: {integrity: sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==}\n    engines: {node: '>= 0.4'}\n\n  es-object-atoms@1.1.1:\n    resolution: {integrity: sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==}\n    engines: {node: '>= 0.4'}\n\n  es-set-tostringtag@2.1.0:\n    resolution: {integrity: sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==}\n    engines: {node: '>= 0.4'}\n\n  follow-redirects@1.15.11:\n    resolution: {integrity: sha512-deG2P0JfjrTxl50XGCDyfI97ZGVCxIpfKYmfyrQ54n5FO/0gfIES8C/Psl6kWVDolizcaaxZJnTS0QSMxvnsBQ==}\n    engines: {node: '>=4.0'}\n    peerDependencies:\n      debug: '*'\n    peerDependenciesMeta:\n      debug:\n        optional: true\n\n  form-data@4.0.5:\n    resolution: {integrity: sha512-8RipRLol37bNs2bhoV67fiTEvdTrbMUYcFTiy3+wuuOnUog2QBHCZWXDRijWQfAkhBj2Uf5UnVaiWwA5vdd82w==}\n    engines: {node: '>= 6'}\n\n  function-bind@1.1.2:\n    resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==}\n\n  fuse.js@7.1.0:\n    resolution: {integrity: sha512-trLf4SzuuUxfusZADLINj+dE8clK1frKdmqiJNb1Es75fmI5oY6X2mxLVUciLLjxqw/xr72Dhy+lER6dGd02FQ==}\n    engines: {node: '>=10'}\n\n  get-intrinsic@1.3.0:\n    resolution: {integrity: sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==}\n    engines: {node: '>= 0.4'}\n\n  get-proto@1.0.1:\n    resolution: {integrity: sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==}\n    engines: {node: '>= 0.4'}\n\n  gopd@1.2.0:\n    resolution: {integrity: sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==}\n    engines: {node: '>= 0.4'}\n\n  has-symbols@1.1.0:\n    resolution: {integrity: sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==}\n    engines: {node: '>= 0.4'}\n\n  has-tostringtag@1.0.2:\n    resolution: {integrity: sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==}\n    engines: {node: '>= 0.4'}\n\n  hasown@2.0.2:\n    resolution: {integrity: sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==}\n    engines: {node: '>= 0.4'}\n\n  math-intrinsics@1.1.0:\n    resolution: {integrity: sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==}\n    engines: {node: '>= 0.4'}\n\n  mime-db@1.52.0:\n    resolution: {integrity: sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==}\n    engines: {node: '>= 0.6'}\n\n  mime-types@2.1.35:\n    resolution: {integrity: sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==}\n    engines: {node: '>= 0.6'}\n\n  proxy-from-env@1.1.0:\n    resolution: {integrity: sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==}\n\nsnapshots:\n\n  asynckit@0.4.0: {}\n\n  axios@1.13.5:\n    dependencies:\n      follow-redirects: 1.15.11\n      form-data: 4.0.5\n      proxy-from-env: 1.1.0\n    transitivePeerDependencies:\n      - debug\n\n  call-bind-apply-helpers@1.0.2:\n    dependencies:\n      es-errors: 1.3.0\n      function-bind: 1.1.2\n\n  combined-stream@1.0.8:\n    dependencies:\n      delayed-stream: 1.0.0\n\n  dayjs@1.11.19: {}\n\n  delayed-stream@1.0.0: {}\n\n  dunder-proto@1.0.1:\n    dependencies:\n      call-bind-apply-helpers: 1.0.2\n      es-errors: 1.3.0\n      gopd: 1.2.0\n\n  es-define-property@1.0.1: {}\n\n  es-errors@1.3.0: {}\n\n  es-object-atoms@1.1.1:\n    dependencies:\n      es-errors: 1.3.0\n\n  es-set-tostringtag@2.1.0:\n    dependencies:\n      es-errors: 1.3.0\n      get-intrinsic: 1.3.0\n      has-tostringtag: 1.0.2\n      hasown: 2.0.2\n\n  follow-redirects@1.15.11: {}\n\n  form-data@4.0.5:\n    dependencies:\n      asynckit: 0.4.0\n      combined-stream: 1.0.8\n      es-set-tostringtag: 2.1.0\n      hasown: 2.0.2\n      mime-types: 2.1.35\n\n  function-bind@1.1.2: {}\n\n  fuse.js@7.1.0: {}\n\n  get-intrinsic@1.3.0:\n    dependencies:\n      call-bind-apply-helpers: 1.0.2\n      es-define-property: 1.0.1\n      es-errors: 1.3.0\n      es-object-atoms: 1.1.1\n      function-bind: 1.1.2\n      get-proto: 1.0.1\n      gopd: 1.2.0\n      has-symbols: 1.1.0\n      hasown: 2.0.2\n      math-intrinsics: 1.1.0\n\n  get-proto@1.0.1:\n    dependencies:\n      dunder-proto: 1.0.1\n      es-object-atoms: 1.1.1\n\n  gopd@1.2.0: {}\n\n  has-symbols@1.1.0: {}\n\n  has-tostringtag@1.0.2:\n    dependencies:\n      has-symbols: 1.1.0\n\n  hasown@2.0.2:\n    dependencies:\n      function-bind: 1.1.2\n\n  math-intrinsics@1.1.0: {}\n\n  mime-db@1.52.0: {}\n\n  mime-types@2.1.35:\n    dependencies:\n      mime-db: 1.52.0\n\n  proxy-from-env@1.1.0: {}","readmeExcerpt":"Skill: Post Job Owner: zhangdong Summary: Post free job ads to 20+ job boards such as LinkedIn, Indeed, Ziprecruiter etc. to receive applicant resumes via email. Tags: latest:1.2.0 Version history: v1.2.0 | 2026-02-27T02:17:15.880Z | user v1.2.0: Added Security Best Practices guide, FAQ section, Pre-Posting Checklist, enhanced transparency about third-party relay model, OpenAI integration for JD generation, and .env.","codeSnippets":[],"executableExamples":[{"language":"text","snippet":"`✅ **Job Posted Successfully!**\\n\\n` +\n      `**Position:** ${title}\\n` +\n      `**Location:** ${matched.label}\\n` +\n      `**Job ID:** \\`${jobId}\\`\\n` +\n      `**The resume will be sent to:** ${email}\\n\\n` +\n      `--- \\n` +\n      `**LinkedIn Sync:** ⏳ Processing in background (10-20 min). I'll check and notify you when ready!\\n\\n` +\n      `You can also manually check with: \\`check_linkedin_status\\` using Job ID \\`${jobId}\\``"},{"language":"text","snippet":"User: \"Post a health manager job in Shanghai\"\n\nAI: [Calls post_job]\n    → Returns: Job ID `abc123`\n\nAI: [Spawns sub-agent with monitor_linkedin.js]\n    → \"✅ Job posted! I'll monitor LinkedIn sync and notify you when complete.\"\n\n[Background monitor polls every 2 minutes]\n\n[When LinkedIn URL is ready]\nAI: \"🎉 LinkedIn sync complete! Job ID: `abc123`, LinkedIn URL: https://linkedin.com/jobs/view/...\""},{"language":"javascript","snippet":"// After post_job succeeds and returns jobId:\n// Step 1: Validate jobId format strictly (alphanumeric + hyphen only)\nconst safeJobId = jobId.match(/^[a-zA-Z0-9-]+$/) ? jobId : null;\nif (!safeJobId) throw new Error(\"Invalid jobId format\");\n\n// Step 2: Spawn monitor sub-agent - this is REQUIRED, not optional\nawait sessions_spawn({\n  task: `Monitor LinkedIn sync for job ID ${safeJobId}. Use the check_linkedin_status tool with jobId parameter set to \"${safeJobId}\". Poll every 2 minutes and notify when LinkedIn URL is available.`,\n  mode: \"run\",\n  cleanup: \"delete\",\n});\n\n// Step 3: Tell the user you'll notify them\nreturn `✅ Job posted! Job ID: \\`${safeJobId}\\`. I'll notify you when LinkedIn sync is complete (usually 5-30 minutes).`;"},{"language":"text","snippet":"User: \"Post a frontend engineer job in Singapore\"\n\nAI: [Calls post_job]\n    → Returns: Job ID `abc123`, Apply URL\n\nAI: \"✅ Job posted! LinkedIn sync in progress...\"\n\n[AI waits 5 minutes, then checks]\n\nAI: [Calls check_linkedin_status with jobId: abc123]\n    → Returns: LinkedIn URL\n\nAI: \"🎉 LinkedIn sync complete! URL: https://linkedin.com/jobs/view/...\""},{"language":"javascript","snippet":"// After post_job returns a Job ID:\nconst jobId = response.jobId;\n\n// Wait 5 minutes\nawait sleep(300000);\n\n// Check LinkedIn status\nconst result = await check_linkedin_status({ jobId });\n\n// If still pending, check every 3-5 minutes\n// When URL is available, notify user immediately"},{"language":"bash","snippet":"clawhub install post-job"}],"parameters":null,"dependencies":[],"permissions":[],"extractedFiles":[{"path":"SKILL.md","content":"---\nname: post-job\ndescription: Post free job ads to 20+ job boards such as LinkedIn, Indeed, Ziprecruiter etc. to receive applicant resumes via email.\n---\n\n# JobPoster Skill\n\n🚀 **Quickly post job openings and collect resumes via natural language commands.**\n\nJobPoster 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.\n\n## ✨ Features\n\n- **Natural Language Interface** - Post jobs with simple commands like \"Hire a frontend engineer in Singapore\"\n- **Global City Support** - 100+ cities worldwide with fuzzy matching (Singapore, Hong Kong, New York, London, etc.)\n- **AI Job Description** - Optional AI-powered JD generation for professional, compelling postings\n- **Instant Application Links** - Get shareable URLs for candidates to apply directly\n- **Resume Collection** - All applications sent to your specified email\n- **LinkedIn Sync** - Automatic LinkedIn job posting integration (**no LinkedIn account binding required** — posts through Fuku AI's relay service)\n\n## ⚠️ External Service Notice\n\nThis skill uses **Fuku AI** (https://hapi.fuku.ai) as a third-party job posting relay service to distribute jobs to multiple boards.\n\n**🎉 No LinkedIn Account Binding Required!**\n\nLinkedIn job postings are handled through Fuku AI's relay service — you do **NOT** need to connect or bind your personal LinkedIn account. The job is posted anonymously through Fuku AI's infrastructure.\n\n**Data transmitted to Fuku AI:**\n\n- Job title, description, company name, location\n- Email address for receiving resumes\n\n**Authentication:**\n\n- Uses embedded client identifier (no user API key required)\n- Free tier service provided by Fuku AI\n\n**Security:**\n\n- Job descriptions are sanitized before transmission to prevent prompt injection\n- Job IDs are strictly validated (alphanumeric + hyphens only)\n- Channel parameters are filtered to prevent log injection\n\nBy using this skill, you consent to transmitting the above data to Fuku AI's servers.\n\n## 🔒 Security Best Practices\n\nTo minimize risks while using this skill:\n\n### 1. Use a Dedicated Email Address\n\n- **Do NOT use personal email** — Create a dedicated hiring email (e.g., `hiring@yourcompany.com` or `jobs+company@gmail.com`)\n- **Use email aliases** — Gmail supports `youremail+company@gmail.com` for tracking sources\n- **Forward to main inbox** — Set up auto-forwarding if needed\n\n### 2. Sanitize Job Descriptions Before Submitting\n\n- **Remove sensitive info** — Don't include internal salary ranges, confidential project names, or proprietary tech stack details\n- **Avoid personal data** — Don't mention hiring manager names, direct contact info, or office security details\n- **Keep it public-ready** — Write descriptions as if they'll be visible to anyone (because they will be)\n\n### 3. Understand the Relay Model\n\n- **Posts are anonymous** — Jobs appear under Fuku "},{"path":"_meta.json","content":"{\n  \"ownerId\": \"kn766g3fzj7qdcqppg4433krw981sxyc\",\n  \"slug\": \"post-job\",\n  \"version\": \"1.2.0\",\n  \"publishedAt\": 1772158635880\n}"},{"path":"assets/locations.json","content":"[\n  {\n    \"label\": \"Singapore\",\n    \"value\": \"70000001\",\n    \"parentLabel\": \"Singapore\",\n    \"parentValue\": \"SI\",\n    \"addressCountry\": \"SG\",\n    \"postalCode\": \"139950\",\n    \"addressRegion\": \"West Region\",\n    \"streetAddress\": \"67 Ayer Rajah Crescent\",\n    \"addressLocality\": \"Buona Vista\"\n  },\n  {\n    \"label\": \"Dubai\",\n    \"value\": \"71000043\",\n    \"parentLabel\": \"United Arab Emirates\",\n    \"parentValue\": \"UE\",\n    \"addressCountry\": \"AE\",\n    \"postalCode\": \"00000\",\n    \"addressRegion\": \"Dubai Emirate\",\n    \"streetAddress\": \"Sheikh Zayed Road, Building No 22\",\n    \"addressLocality\": \"Dubai\"\n  },\n  {\n    \"label\": \"Kuala Lumpur\",\n    \"value\": \"74000002\",\n    \"parentLabel\": \"Malaysia\",\n    \"parentValue\": \"MY\",\n    \"addressCountry\": \"MY\",\n    \"postalCode\": \"50450\",\n    \"addressRegion\": \"Federal Territory of Kuala Lumpur\",\n    \"streetAddress\": \"15 Jalan Ampang\",\n    \"addressLocality\": \"Kuala Lumpur City Centre\"\n  },\n  {\n    \"label\": \"Johor Bahru\",\n    \"value\": \"74000005\",\n    \"parentLabel\": \"Malaysia\",\n    \"parentValue\": \"MY\",\n    \"addressCountry\": \"MY\",\n    \"postalCode\": \"80100\",\n    \"addressRegion\": \"Johor\",\n    \"streetAddress\": \"Jalan Wong Ah Fook 1\",\n    \"addressLocality\": \"Johor Bahru\"\n  },\n  {\n    \"label\": \"George Town\",\n    \"value\": \"74000024\",\n    \"parentLabel\": \"Malaysia\",\n    \"parentValue\": \"MY\",\n    \"addressCountry\": \"MY\",\n    \"postalCode\": \"10200\",\n    \"addressRegion\": \"Penang\",\n    \"streetAddress\": \"No. 116 & 118 Lebuh Acheh\",\n    \"addressLocality\": \"George Town\"\n  },\n  {\n    \"label\": \"Klang\",\n    \"value\": \"74000003\",\n    \"parentLabel\": \"Malaysia\",\n    \"parentValue\": \"MY\",\n    \"addressCountry\": \"MY\",\n    \"postalCode\": \"41200\",\n    \"addressRegion\": \"Selangor\",\n    \"streetAddress\": \"1, Persiaran Batu Nilam 1, Bandar Bukit Tinggi 2\",\n    \"addressLocality\": \"Klang\"\n  },\n  {\n    \"label\": \"Shah Alam\",\n    \"value\": \"74000009\",\n    \"parentLabel\": \"Malaysia\",\n    \"parentValue\": \"MY\",\n    \"addressCountry\": \"MY\",\n    \"postalCode\": \"40000\",\n    \"addressRegion\": \"Selangor\",\n    \"streetAddress\": \"2, Jalan Perbandaran, Seksyen 14\",\n    \"addressLocality\": \"Shah Alam\"\n  },\n  {\n    \"label\": \"Hong Kong\",\n    \"value\": \"79000002\",\n    \"parentLabel\": \"Hong Kong\",\n    \"parentValue\": \"HK\",\n    \"addressCountry\": \"HK\",\n    \"postalCode\": \"0000\",\n    \"addressRegion\": \"Hong Kong Island\",\n    \"streetAddress\": \"Room 1205, 12/F, Central Plaza, 18 Harbour Road\",\n    \"addressLocality\": \"Wan Chai\"\n  },\n  {\n    \"label\": \"Bangkok\",\n    \"value\": \"61000905\",\n    \"parentLabel\": \"Thailand\",\n    \"parentValue\": \"TH\",\n    \"addressCountry\": \"TH\",\n    \"postalCode\": \"10110\",\n    \"addressRegion\": \"Bangkok Metropolitan Area\",\n    \"streetAddress\": \"10 Soi Sukhumvit 63 (Ekkamai)\",\n    \"addressLocality\": \"Khlong Toei Nuea\"\n  },\n  {\n    \"label\": \"Myanmar\",\n    \"value\": \"330000401\",\n    \"parentLabel\": \"Myanmar\",\n    \"parentValue\": \"MM\",\n    \"addressCountry\": \"MM\",\n    \"postalCode\": \"11141\",\n    \"addressRegion\": \"Yangon Region\",\n    \"streetAddress\": \"12 Bogyoke Aung San Road\",\n    \"addressLocal"},{"path":"package.json","content":"{\n  \"name\": \"post-job\",\n  \"version\": \"1.2.0\",\n  \"type\": \"module\",\n  \"description\": \"Post job openings and generate resume collection links\",\n  \"main\": \"scripts/post_job.js\",\n  \"scripts\": {\n    \"post\": \"node scripts/post_job.js\"\n  },\n  \"dependencies\": {\n    \"axios\": \"^1.6.0\",\n    \"dayjs\": \"^1.11.19\",\n    \"dotenv\": \"^17.3.1\",\n    \"fuse.js\": \"^7.0.0\"\n  }\n}"},{"path":"pnpm-lock.yaml","content":"lockfileVersion: '9.0'\n\nsettings:\n  autoInstallPeers: true\n  excludeLinksFromLockfile: false\n\nimporters:\n\n  .:\n    dependencies:\n      axios:\n        specifier: ^1.6.0\n        version: 1.13.5\n      dayjs:\n        specifier: ^1.11.19\n        version: 1.11.19\n      fuse.js:\n        specifier: ^7.0.0\n        version: 7.1.0\n\npackages:\n\n  asynckit@0.4.0:\n    resolution: {integrity: sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==}\n\n  axios@1.13.5:\n    resolution: {integrity: sha512-cz4ur7Vb0xS4/KUN0tPWe44eqxrIu31me+fbang3ijiNscE129POzipJJA6zniq2C/Z6sJCjMimjS8Lc/GAs8Q==}\n\n  call-bind-apply-helpers@1.0.2:\n    resolution: {integrity: sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==}\n    engines: {node: '>= 0.4'}\n\n  combined-stream@1.0.8:\n    resolution: {integrity: sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==}\n    engines: {node: '>= 0.8'}\n\n  dayjs@1.11.19:\n    resolution: {integrity: sha512-t5EcLVS6QPBNqM2z8fakk/NKel+Xzshgt8FFKAn+qwlD1pzZWxh0nVCrvFK7ZDb6XucZeF9z8C7CBWTRIVApAw==}\n\n  delayed-stream@1.0.0:\n    resolution: {integrity: sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==}\n    engines: {node: '>=0.4.0'}\n\n  dunder-proto@1.0.1:\n    resolution: {integrity: sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==}\n    engines: {node: '>= 0.4'}\n\n  es-define-property@1.0.1:\n    resolution: {integrity: sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==}\n    engines: {node: '>= 0.4'}\n\n  es-errors@1.3.0:\n    resolution: {integrity: sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==}\n    engines: {node: '>= 0.4'}\n\n  es-object-atoms@1.1.1:\n    resolution: {integrity: sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==}\n    engines: {node: '>= 0.4'}\n\n  es-set-tostringtag@2.1.0:\n    resolution: {integrity: sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==}\n    engines: {node: '>= 0.4'}\n\n  follow-redirects@1.15.11:\n    resolution: {integrity: sha512-deG2P0JfjrTxl50XGCDyfI97ZGVCxIpfKYmfyrQ54n5FO/0gfIES8C/Psl6kWVDolizcaaxZJnTS0QSMxvnsBQ==}\n    engines: {node: '>=4.0'}\n    peerDependencies:\n      debug: '*'\n    peerDependenciesMeta:\n      debug:\n        optional: true\n\n  form-data@4.0.5:\n    resolution: {integrity: sha512-8RipRLol37bNs2bhoV67fiTEvdTrbMUYcFTiy3+wuuOnUog2QBHCZWXDRijWQfAkhBj2Uf5UnVaiWwA5vdd82w==}\n    engines: {node: '>= 6'}\n\n  function-bind@1.1.2:\n    resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==}\n\n  fuse.js@7.1.0:\n    resolution: {integrity: sha512-trLf4SzuuUxfusZADLINj+dE8clK1frKdmqiJNb1Es75fmI5oY6X2mxLVUciLLjxqw/xr72Dhy+lER6dGd02FQ==}\n    engines: {node: '>=10'}\n\n  get-i"}],"languages":[],"docsSourceLabel":"CLAWHUB","editorialOverview":"Post free job ads to 20+ job boards such as LinkedIn, Indeed, Ziprecruiter etc. to receive applicant resumes via email. Skill: Post Job Owner: zhangdong Summary: Post free job ads to 20+ job boards such as LinkedIn, Indeed, Ziprecruiter etc. to receive applicant resumes via email. Tags: latest:1.2.0 Version history: v1.2.0 | 2026-02-27T02:17:15.880Z | user v1.2.0: Added Security Best Practices guide, FAQ section, Pre-Posting Checklist, enhanced transparency about third-party relay model, OpenAI integration for JD generation, and .env.","editorialQuality":{"score":100,"threshold":65,"status":"ready","wordCount":1596,"uniquenessScore":55,"reasons":[]}},"media":{"evidence":{"source":"no-media","verified":false,"confidence":"low","updatedAt":"2026-04-15T00:45:39.800Z","emptyReason":"No screenshots, media assets, or demo links are available."},"primaryImageUrl":null,"mediaAssetCount":0,"assets":[],"demoUrl":null},"ownerResources":{"evidence":{"source":"unclaimed","verified":false,"confidence":"low","updatedAt":"2026-04-15T00:45:39.800Z","emptyReason":"This page has not been claimed by the agent owner."},"hasCustomPage":false,"customPageUpdatedAt":null,"customLinks":[],"structuredLinks":{"docsUrl":null,"demoUrl":null,"supportUrl":null,"pricingUrl":null,"statusUrl":null},"customPage":null},"relatedAgents":{"evidence":{"source":"protocol-neighbors","verified":false,"confidence":"medium","updatedAt":"2026-10-09T20:10:48.460Z","emptyReason":null},"items":[{"id":"8ebccd8e-3863-4187-8355-c3f14e1f9edf","entityType":"agent","canonicalPath":"/agent/iofficeai-aionui","slug":"iofficeai-aionui","name":"AionUi","description":"Free, local, open-source 24/7 Cowork app and OpenClaw for Gemini CLI, Claude Code, Codex, OpenCode, Qwen Code, Goose CLI, Auggie, and more | 🌟 Star if you like it!","url":"https://github.com/iOfficeAI/AionUi","homepage":"https://www.aionui.com","source":"GITHUB_REPOS","protocols":["MCP","OPENCLAW"],"capabilities":[],"safetyScore":100,"overallRank":70,"updatedAt":"2026-10-09T19:11:12.944Z","createdAt":"2026-02-25T03:38:16.584Z","downloads":null},{"id":"b917f68a-ebff-438e-84f8-3f4b2494c0bc","entityType":"agent","canonicalPath":"/agent/activepieces-activepieces","slug":"activepieces-activepieces","name":"activepieces","description":"AI Agents & MCPs & AI Workflow Automation • (~400 MCP servers for AI agents) • AI Automation / AI Agent with MCPs • AI Workflows & AI Agents • MCPs for AI Agents","url":"https://github.com/activepieces/activepieces","homepage":"https://www.activepieces.com","source":"GITHUB_REPOS","protocols":["OPENCLAW"],"capabilities":[],"safetyScore":100,"overallRank":70,"updatedAt":"2026-04-15T02:22:12.426Z","createdAt":"2026-02-25T03:38:12.412Z","downloads":null},{"id":"5cb26759-3a39-483f-94cf-276a98c13bb8","entityType":"agent","canonicalPath":"/agent/cherryhq-cherry-studio","slug":"cherryhq-cherry-studio","name":"cherry-studio","description":"AI productivity studio with smart chat, autonomous agents, and 300+ assistants. Unified access to frontier LLMs","url":"https://github.com/CherryHQ/cherry-studio","homepage":"https://cherry-ai.com","source":"GITHUB_REPOS","protocols":["MCP","OPENCLAW"],"capabilities":[],"safetyScore":100,"overallRank":70,"updatedAt":"2026-04-11T14:38:40.986Z","createdAt":"2026-02-25T03:38:19.379Z","downloads":null},{"id":"6f6582d0-5d76-4f0f-b81d-86520247950b","entityType":"agent","canonicalPath":"/agent/copilotkit-copilotkit","slug":"copilotkit-copilotkit","name":"CopilotKit","description":"The Frontend for Agents & Generative UI. React + Angular","url":"https://github.com/CopilotKit/CopilotKit","homepage":"https://docs.copilotkit.ai","source":"GITHUB_REPOS","protocols":["OPENCLAW"],"capabilities":[],"safetyScore":100,"overallRank":70,"updatedAt":"2026-03-25T09:50:57.846Z","createdAt":"2026-02-25T03:39:14.617Z","downloads":null}],"links":{"hub":"/agent","source":"/agent/source/clawhub","protocols":[{"label":"OpenClaw","href":"/agent/protocol/openclew"}]}}}