Curviate: job postings and applicants
SkillAI & modelsCurviate-jobs is a skill for AI agents that works with LinkedIn job postings through the Curviate CLI. It lets an agent create, edit, publish and close classic job postings, manage their budgets, and read the applicants, including resumes. It follows a draft-then-publish flow and handles the subscription gate that can stop a publish.
Use Curviate: job postings and applicants in Claude, ChatGPT or Ahel Desktop
Free. Sign in, add Curviate: job postings and applicants and connect your AI. About a minute.
Also: Claude Code · Cursor · Codex
Then ask your AI: use the Curviate: job postings and applicants skill
Details
Instructions available. Your AI can read the instructions. Execution depends on the setup they require.
Account requirements not reviewed. Check the skill instructions before use; ahel provides instructions and does not run this skill.
No other account needed.
Have the Curviate CLI installed and authenticated with access to LinkedIn job postings.
What your AI can do with it
- Create, update, get and list LinkedIn job postings via the `job` command
- Manage posting budgets with `job budget`
- Publish and close job postings
- Read applicants with `job applicants` and `job applicant get`
- Download applicant resumes with `job applicant resume`
- Follow the draft-then-publish flow and handle the subscription gate
Getting started
- Have the Curviate CLI installed and authenticated with access to LinkedIn job postings.
- Add the curviate-jobs skill to the agent so it can run the `job` commands.
- Ask the agent to draft a job posting, review it, then have it publish when ready.
- Ask the agent to list applicants or fetch a resume for a published posting.
What this skill tells your AI
The instructions your AI receives, as published by davila7/claude-code-templates in cli-tool/components/skills/curviate/curviate-jobs/SKILL.md and read by ahel’s review.
Every posting starts as a draft. Drafts are free and reversible; publishing is neither. The two things that surprise agents here are that a free publish is still subscription-gated and that an update's read-back lags the write.
Command surface established against CLI 0.33.0.
Before any command
npm install -g @curviate/cli && curviate --version # needs Node 18 or newer
curviate login --api-key <key> # or export CURVIATE_API_KEY
curviate account list --json # the acc_id for --account
- Credentials resolve flag > environment > stored profile (
CURVIATE_API_KEY,CURVIATE_BASE_URL,CURVIATE_ACCOUNT). --profile <name>picks the stored credential set;--account <acc_id>picks which connected LinkedIn account owns the posting.--previewbefore every write, and especially before a publish. On a read command it is refused with exit2.--jsonon anything you parse;--fields a,b,cto project;--verbosewhen a slim response looks suspiciously empty.- Put global flags at the end of the command.
- Branch on the exit code, never on prose. See the table at the end.
- These are not retrieval-mode commands:
--mode/--max-ageare refused here withunknown flag, exit2.job publish --modeis a different flag with the same name: it selects a publishing publishing mode and can spend real money. Seecurviate-profilefor retrieval mode.
The commands
| Command | What it does | Confidence |
|---|---|---|
curviate job get <id> | One public posting's full detail. Takes a job URL or a bare numeric id. No seat needed. | proven |
curviate job list --state <DRAFT|OPEN|CLOSED|REVIEW|SUSPENDED> | Your own postings by state. --state is required. | proven |
curviate job create … | Create a draft. Never publishes, never spends. | proven |
curviate job update <id> … | Partial update to a posting you own; same flags as create. | proven |
curviate job budget <id> | Price a publish before committing any money. | proven |
curviate job publish <id> --mode FREE|PROMOTED|PROMOTED_PLUS | Publish a draft. PROMOTED and PROMOTED_PLUS spend real money and additionally require --budget-currency (ISO-4217), --budget-amount and --budget-scope (DAILY or TOTAL). | wired, never live-fired |
curviate job close <id> | Stop a posting accepting applications. Irreversible once listed. | wired, never live-fired |
curviate job applicants <id> | Applicants to a posting you own. | proven (shape only, exercised on a draft with no applicants) |
curviate job applicant get <id> <applicant_id> | One applicant's full detail, including contact information. | proven (shape only) |
curviate job applicant resume <id> <applicant_id> | Download an applicant's résumé. Binary, write it with -o <file>. | proven (shape only) |
job create: the required set
--description (minimum 200 characters, enforced server-side), --workplace-type
(ON_SITE|HYBRID|REMOTE), --location (a LOCATION parameter id, resolved via
curviate search parameters --type LOCATION), --employment-status
(FULL_TIME|PART_TIME|CONTRACT|TEMPORARY|OTHER|VOLUNTEER|INTERNSHIP), --apply-method
(linkedin or external), plus a title and a company.
- Title:
--job-titleas free text, or--job-title-idfor an existing LinkedIn title. - Company:
--companyas free text, or--company-id. --apply-method linkedinrequires--notification-email;--apply-method externalrequires--website-url.--skillstakes comma-separated skill parameter ids and is optional.
Run curviate job create --help for the current required set before building a call.
Traps
- A publish is subscription-gated in practice, not just on the paid modes.
--mode FREE(the money-free mode) still returnsLINKEDIN_FEATURE_NOT_SUBSCRIBED, exit5, on an account with no LinkedIn job-posting subscription. On that error nothing goes public and the draft stays a draft. Expect exit5unless you have confirmed the subscription; do not read it as a malformed request. publishandcloseare wired, never live-fired. Every test account run against this surface hit the subscription gate above before a posting ever went public, so a live200from either command has not been observed;close's happy path is unreachable the same way, since nothing gets published to close. The response shapes are cross-checked against the substrate's own types rather than an observed call. The read and draft surface abovepublish(list/get/budget/create/update, plus the three applicant reads) does not depend on that subscription and is proven.- An update lands before the read-back reflects it.
job updatereturning exit0was applied, but its own response and an immediatejob getcan both still show the old value, whilejob list(the owner view, checked minutes later) shows the update did land. Do not conclude a silent no-op from a stale-looking immediate read. job list --statefilters client-side and says so on stderr. LinkedIn's own state filter is best-effort, so the CLI re-fetches the unfiltered page walk and drops non-matching items itself, logging what it dropped. Read stdout for data and stderr for what was dropped, and note that--allmay walk far more upstream pages than the filtered item count suggests.job closeis irreversible once the posting is listed. Preview it, and be sure.- Price before you publish.
job budget <id>costs nothing and is the only way to know what a promoted publish will spend.
A safe posting flow
curviate job create --job-title "…" --company "…" --workplace-type REMOTE \
--location <loc_id> --employment-status FULL_TIME --description "$(cat jd.md)" \
--apply-method linkedin --notification-email <email> --account <acc_id> --preview --json
# re-run without --preview to create the draft, then:
curviate job get <id> --account <acc_id> --json # confirm the draft
curviate job budget <id> --account <acc_id> --json # price it
curviate job publish <id> --mode FREE --account <acc_id> --preview --json
Full command surface
Read from the CLI's own --help at version 0.33.0. Descriptions, traps and confidence
tags elsewhere in this skill are hand-written and carry the version they were established against.
Every command below that takes flags at all also accepts --account, --api-key, --base-url, --beta, --fields, --json, --preview, --profile, --timeout, --verbose.
| Command | Arguments | Flags |
|---|---|---|
curviate job get | ID | (none) |
curviate job list | (none) | --limit, --cursor, --all, --max-pages, --page-delay, --state (required) |
curviate job create | (none) | --job-title, --job-title-id, --company, --company-id, --workplace-type, --location, --employment-status, --description, --apply-method, --notification-email, --website-url, --skills |
curviate job update | ID | --job-title, --job-title-id, --company, --company-id, --workplace-type, --location, --employment-status, --description, --apply-method, --notification-email, --website-url, --skills |
curviate job budget | ID | (none) |
curviate job publish | ID | --mode (required), --budget-currency, --budget-amount, --budget-scope |
curviate job close | ID | (none) |
curviate job applicants | ID | --limit, --cursor, --all, --max-pages, --page-delay, --ratings |
curviate job applicant get | ID APPLICANTID | (none) |
curviate job applicant resume | ID APPLICANTID | -o, --output |
Exit codes to branch on here
| Code | Meaning | What to do |
|---|---|---|
1 | INTERNAL from the server itself: a genuine bug on the platform side. | Worth one retry; if it repeats it is a bug to report, not a state to work around. |
2 | Usage or invalid input, often raised before any network call: a missing required flag, a description under 200 characters, a location passed as a name rather than an id. | Fix the invocation. Never retry unchanged. |
4 | Not found: the posting does not exist, or is not yours. | Re-check the id and the acting account. |
5 | Three causes, one code: read error.code. NO_ACTIVE_SEAT: the account is on no active seat. LINKEDIN_FEATURE_NOT_SUBSCRIBED: LinkedIn itself lacks the feature. BETA_NOT_ENABLED: the operation is beta-gated and this workspace has not opted in. | Branch on error.code: the three fixes have nothing in common, and none is fixed by retrying unchanged. |
6 | PLATFORM_RATE_LIMIT and its siblings. Carries retry_after in whole seconds. A response naming budgetRow means only that row is paused; every other row on the account keeps working. | Back off and retry after that many seconds. On a named budgetRow, switch to other work on the account rather than backing off across the board. |
7 | Transient platform fault: a request that got no response at all (network error, DNS failure, timeout) or one that came back as something other than a valid API answer. Carries retryLikelyToSucceed: true. | Retry with backoff. |
11 | Billing: payment, a cancelled seat, or a subscription lock. SUBSCRIPTION_BUSY is retry-likely; check the envelope. | Resolve it in the dashboard. |
13 | BUDGET_EXHAUSTED: a safety rule of your own refused the action, not LinkedIn. Read error.safetyReason: ceiling means the row named in error.budgetRow hit its configured limit; activity_window means the account is outside the hours it works in (no budgetRow on that one). Nothing reached LinkedIn and nothing was spent. reset_at can be weeks out, and may be null where no clock frees it. | Do not back off and retry. error.safetyHint.parameter names the exact setting to change. Read quotas[] via curviate account get <acc_id> --json, then wait for the named reset or change that setting. |
Signals
- GitHub stars
- 32k
- Forks
- 4k
- Last commit
- Oct 2026
ahel review
K1binfo
installs-packages
Automated review, not a security audit. Ruleset v1+k2.
Questions
- What happens if a publish is blocked?
- The skill is aware of the subscription gate that stops a publish, so the agent can recognise when a publish cannot go through and report it instead of failing silently.
- Can the agent see who applied?
- Yes. It can list applicants with `job applicants`, get details with `job applicant get`, and fetch a resume with `job applicant resume`.
- Does it post the job immediately?
- No. It uses a draft-then-publish flow: the posting is created as a draft first and published only when told to.
- Can it edit a posting after creation?
- Yes. The `job update` command lets the agent change an existing posting, and `job budget` adjusts its budget.
Advanced
- Item type
- skill
- Key
curviate-jobs- Source
- github.com/davila7/claude-code-templates
github.com/davila7/claude-code-templates
More in AI & models
Skill · anthropics
More in AI & modelswayfinder
Skill · mattpocock
More in AI & modelswizard
Skill · mattpocock
More in AI & modelsalgorithmic-art
Skill · anthropics
More in AI & modelscode-review-and-quality
Skill · addyosmani
More in AI & modelsai-first-engineering
Skill · affaan-m
More in AI & models