findjobs HR Suite

Platform

API for your agents

A key your company mints lets your own agents (Claude or any other) and scripts read and act on your HR Suite and your findjobs.ge account. Scoped, logged, revocable, and described by machine so an agent can discover it on its own.

Try it in the demo

Who it is for

Companies that want an assistant to do the routine: answer "what should we offer a warehouse lead", list applicants waiting too long, post a vacancy from a brief, approve a pay run after a human has read the checks. The API is the same service layer the pages use, so anything the suite does will be reachable, with the same rules and the same role limits.

It is also the honest answer to "can I automate this": read-only endpoints are live now; write endpoints are listed with status "planned" and answer 501 until they are served, so an agent never guesses.

Minting a key

  1. Open Settings › API keys. Only the company owner can mint; a fresh second lock is asked for first.
  2. Name the key for what it does ("Claude agent", "payroll script"), pick the narrowest scopes that do the job, and choose when it expires.
  3. Read the risks and tick the acknowledgement. The key is shown once; copy it to your agent's secret store and nowhere else.
  4. Revoke it from the same page the moment you no longer need it. Revoking is instant.

In the demo anyone can mint a demo key (fjhr_demo_…). It acts on your demo company only and dies with it.

The risks, plainly

  • A key is a password for the company. Whoever holds it can do everything its scopes allow, with no second lock.
  • An agent acts in your name. A wrong instruction can close a vacancy, reject an applicant or change a record. Start with read scopes; add write scopes when the agent has earned them.
  • Never paste a key into a public chat, a repository or a prompt someone else can read. Rotate when in doubt.
  • Every call is logged with the key, the route, the status and the time. The owner reads the log on the same page.

Scopes

  • market:read: pay bands and hiring difficulty.
  • company:read: the company, Home and the counts.
  • jobs:read and jobs:write: read, post, edit, close and bump vacancies.
  • applications:read and applications:write: read applications and scores; move stages, reply, schedule interviews.
  • people:read and people:write: employee records without private details; add and change people, decide leave.
  • money:read and money:write: pay runs and rules; approve a pay run (files are prepared; no money moves).
  • settings:write: webhooks and settings. Keys themselves can never be minted or changed by a key.
  • all: everything above.

Calling it

Base URL https://hr.findjobs.ge/hr/api/v1. Send the key as Authorization: Bearer fjhr_live_… on every request. Answers are JSON. Add ?hl=ka, ru or tr to get summaries in that language where the API speaks.

Limits: 60 calls a minute and 20 writes a minute per key. A 429 carries Retry-After in seconds.

Errors are JSON with a stable code and a sentence: missing_key, invalid_key, scope, rate_limited, not_yet (designed, not served), not_found, server_error, and a docs link.

For an LLM agent

  1. Give the agent https://hr.findjobs.ge/hr/api/v1/llms.txt: it describes the API, the limits and the rules in plain text.
  2. Give it the OpenAPI document at https://hr.findjobs.ge/hr/api/v1/openapi.json to generate tools from.
  3. Store the key in the agent's secret store, never in the prompt.
  4. Tell it which scopes the key has, so it does not try what it cannot do.

Example: curl -H "Authorization: Bearer $KEY" "https://hr.findjobs.ge/hr/api/v1/market/pay-check?city=tbilisi&family=sales&offer=1200"

What a key can never do

  • Read another company's data, or any job seeker's private data beyond what the company already sees on findjobs.ge.
  • Move money, log in to a bank, or file with the Revenue Service.
  • Mint or change keys, or weaken the second lock.
  • Learn whether an employee has a findjobs profile or is applying elsewhere.

MCP server

The same API is served as a Model Context Protocol server at https://hr.findjobs.ge/hr/api/mcp (Streamable HTTP). Add it as a remote MCP server in Claude, ChatGPT, Cursor or any MCP host, with the company key as the bearer token; every endpoint appears as a tool, generated from the same registry, with the same scopes, limits and log.

Endpoints

The table below is generated from the same list the API routes from, so it cannot drift. Every endpoint listed answers today; scopes say what a key may do.

hr.findjobs.ge/hr/api/v1scopestatus
GET /me company:read live Who you are: the company, this key's scopes and limits
GET /home company:read live The Home queue: what needs a decision
GET /market/pay-check market:read live What a family pays in a city: lower quarter, middle, upper quarter
GET /market/difficulty market:read live Hiring difficulty in a city: ads per seeker, days ads stay up
GET /market/radar market:read live Competitor radar: your open roles, rival ads, pay, who hires most
GET /market/survey market:read live Salary survey groups in a city: companies, people, the middle of real pay
POST /market/survey money:write live Your company's pay entry for a family: people, low, middle, high
GET /jobs jobs:read live Your vacancies on findjobs.ge
GET /jobs/{id} jobs:read live One vacancy in full
GET /jobs/{id}/doctor jobs:read live The ad doctor: a 0–100 score, every check and what to fix
POST /jobs jobs:write live Post a vacancy (goes to moderation, as on the site)
PATCH /jobs/{id} jobs:write live Edit a vacancy
POST /jobs/{id}/close jobs:write live Close a vacancy
POST /jobs/{id}/bump jobs:write live Bump a vacancy (Pro)
GET /applications applications:read live Applications to your vacancies
POST /applications applications:write live An application from your own site: on the pipeline and in the inbox, nobody emailed
GET /applications/{id} applications:read live One application: message, answers, scores
GET /people people:read live Employee records (without private fields)
POST /people people:write live Add a record
GET /people/{id} people:read live One record with its history and leave balance
PATCH /people/{id} people:write live Change a record; pay, role and department changes go to the history
GET /people/{id}/earnings people:read live Earnings reported from outside, by month
POST /people/{id}/earnings people:write live Report a month's earnings for a per-job worker (the same month and source again updates it)
POST /people/{id}/leaving people:write live Set the last day
GET /timeoff people:read live Time off: asked and approved
POST /timeoff people:write live Add time off (asked, or approved at once)
POST /timeoff/{id}/decide people:write live Decide: approved, declined, cancelled
GET /payrun money:read live A month's pay run: lines and totals
POST /payrun/{period}/approve money:write live Approve a month (a snapshot is taken first)
GET /payrun/{period}/file money:read live A file of an approved month: oris, fina, 1c, excel, journal, tbc, bog, liberty, bank-excel, rsge
GET /rules money:read live Rules and rates, with their confirmer
POST /rules/{id}/confirm money:write live Confirm a rule in a name
GET /snapshots settings:write live The snapshots
POST /snapshots settings:write live Take a snapshot now
POST /snapshots/{id}/restore settings:write live Restore a snapshot (a snapshot of now is taken first)
GET /pipeline applications:read live One vacancy's board: stages, cards, the reply clock, scorecards
POST /applications/{id}/status applications:write live Move a card to a stage: seen, shortlisted, hold, hired, rejected
POST /applications/{id}/scorecard applications:write live Save a scorecard: four scores 1–5 and a note
POST /applications/{id}/message applications:write live Reply to the applicant in the same chat as on the site
POST /applications/{id}/interview applications:write live Schedule an interview
GET /keys settings:write live This company's keys (keys cannot be minted by a key)
GET /webhooks settings:write live Webhook subscriptions
GET /shifts people:read live A week of the rota: shifts, open ones, swaps, cover
POST /shifts people:write live Add a shift (no person_id = open)
POST /shifts/{id}/assign people:write live Give a shift to a person, or make it open
DELETE /shifts/{id} people:write live Remove a shift
GET /reviews people:read live A review round: scores, averages, goals
POST /reviews/open people:write live Open a round for everyone or a department
POST /reviews/{id}/score people:write live Save scores (manager, or side: self)
POST /reviews/{id}/goals people:write live Save goals
GET /pay-vs-market people:read live Everyone's pay against the city market
GET /permits people:read live Work permit cases
POST /permits people:write live Open a case
POST /permits/{id}/move people:write live Move the step, the date, a document
GET /leaving people:read live Leavers: checklist, settlement, certificate
POST /leaving/{id}/tick people:write live Tick a checklist item
POST /leaving/{id}/settle money:write live Compute and save the final settlement
GET /onboarding people:read live Starters: checklist, contract status
POST /onboarding people:write live Add a starter
POST /onboarding/{id}/tick people:write live Tick a checklist item
POST /onboarding/{id}/contract people:write live Send the contract with a code
POST /onboarding/{id}/record people:write live Make the record from the row
GET /automations settings:write live Automation switches and the log
POST /automations/run settings:write live Run this company's automations now
POST /automations/{key} settings:write live Switch one on or off
GET /connections settings:write live Program, bank, calendar feed
PATCH /connections settings:write live Change the connections
POST /webhooks settings:write live Add a webhook (the secret comes back once)
DELETE /webhooks/{id} settings:write live Remove a webhook
GET /accountants money:read live Accountants with a door
POST /accountants money:write live Add and invite an accountant
DELETE /accountants/{id} money:write live Remove an accountant
GET /reports/twelve-months people:read live Twelve months: people, pay runs, days off, hiring