DEV Community

Kamil Kwiecien
Kamil Kwiecien

Posted on

Automate your job search from the terminal: the ApplyTop API and CLI

If you live in the terminal, clicking through a job board probably is not your idea of a good time. So I built something for you.

ApplyTop now has a public API and a CLI. You can search the jobs pool, manage your alerts, matches, and saved jobs, and run our AI features (ATS scoring, CV tailoring, and cover-letter generation) without ever leaving the command line, or wire them straight into your own code.

Install

The CLI is published on npm and needs Node 18 or newer.

npm install -g applytop
# or run it without installing
npx applytop jobs:search -q engineer
Enter fullscreen mode Exit fullscreen mode

Authenticate once

Grab an API key from your dashboard (keys look like at_live_...), then log in. The CLI validates the key and stores it in ~/.applytop/credentials.json.

applytop auth:login
applytop auth:status   # who am I?
Enter fullscreen mode Exit fullscreen mode

You can also pass APPLYTOP_API_KEY as an env var or --api-key per command. Precedence is flag, then env, then the saved file.

The API and CLI are an ApplyTop Pro feature.

But! If you DM me on X @ https://x.com/kamil_shman I will give you coupon to try it for free.

Search jobs and pipe into jq

Every command prints JSON to stdout, so it composes cleanly with jq.

applytop jobs:search -q "react developer" --work-model remote --limit 5 | jq '.jobs[].title'
applytop matches:list --min-score 70 --limit 10
applytop saved:list
Enter fullscreen mode Exit fullscreen mode

Run the AI tools

Three commands tap the AI features and cost 1 credit each (charged to the key owner, and auto-refunded if a generation fails). Everything else is included in Pro sub (which adds 2,500 credits each month BDW).

# tailor your CV to a specific job
JOB=$(applytop jobs:search -q "platform engineer" --work-model remote --limit 1 | jq -r '.jobs[0].id')
applytop cvs:tailor "$JOB"

# get an ATS score, or generate a cover letter
applytop cvs:ats-score <cvId>
applytop cvs:cover-letter "$JOB" --hiring-manager "Jane Doe"

# download a CV as a PDF
applytop cvs:pdf <cvId> --template modern -o resume.pdf
Enter fullscreen mode Exit fullscreen mode

The job id for these commands accepts a pool job id (from jobs:search) or one of your matched ids (from matches:list). Omit --cv to use your default CV.

It is also a Node client

The same package exports an ApplyTop client, so you can script the exact same calls programmatically.

import { ApplyTop, ApplyTopError } from 'applytop';

const client = new ApplyTop({ apiKey: process.env.APPLYTOP_API_KEY });

const { jobs, total } = await client.jobsSearch({ q: 'engineer', work_model: 'remote', limit: 5 });
console.log(total, jobs.map((j) => j.title));

try {
  const result = await client.cvsTailorToJob({ jobId, cvId }); // 1 credit
  console.log(result.cvId, 'balance:', result.balance);
} catch (err) {
  if (err instanceof ApplyTopError && err.code === 'insufficient_credits') {
    console.error(`Need ${err.required}, have ${err.balance}`);
  } else {
    throw err;
  }
}
Enter fullscreen mode Exit fullscreen mode

Errors come back as structured JSON on stderr with a code you can branch on (auth_required, insufficient_credits, rate_limited, and so on), which makes it easy to handle in scripts and CI.

What would you build?

A nightly cron that tailors your CV to the best new remote match? A Slack bot that posts fresh matches every morning? A pre-apply ATS check in your own pipeline? I would love to see what you wire up.

📖 API docs: https://applytop.com/api-docs
📖 CLI docs: https://applytop.com/cli-docs
📦 npm: https://www.npmjs.com/package/applytop
🐙 GitHub: https://github.com/shman2000/applytop-agent

Top comments (0)