---
name: rinkats-jobseeker
description: >-
  Act for a job seeker on rinkats: find matching roles, apply, track
  application status, maintain their profile and resume, message the
  recruiter, and manage their interviews. Use when the user is a candidate
  (or you act on a candidate's behalf) rather than agency staff.
license: Proprietary — for use with the rinkats API by authorized keys.
version: 1.6.0
metadata:
  product: rinkats
  updated: "2026-10-17"
  url: https://www.rinkats.com/skills/rinkats-jobseeker/SKILL.md
  workflow: job-seeker
  transports: REST, MCP, A2A
---

# rinkats — Job Seeker

## Connect

The candidate has their own endpoints: REST `/api/v1/candidate/…`
(`/api/v1/openapi.json`, tag `Candidate`), MCP `https://www.rinkats.com/api/mcp/candidate`,
A2A `/api/a2a/candidate` (card at `/api/a2a/candidate/agent-card`). Public job
reads need no auth. Personal operations need a **candidate credential**:

- a **candidate key** — `Authorization: Bearer rkc_p_…`, which the person
  creates in their account settings (*Candidate API keys* on /account). It belongs to that
  profile and to no organization;
- or OAuth with the `candidate` scope (interactive agents);
- or a browser session.

It only ever sees that person's own data. An agency's `rk_` key is a desk's
credential and is refused on the candidate endpoints (`403`); a candidate key
is refused on every organization endpoint the same way. Keys are created and
revoked by the person, signed in — a key cannot mint keys.

## A candidate belongs to no organization (2026-10-17)

rinkats is multi-tenant for agencies, but the job seeker is not inside any of
them. Their rinkats space — profile, resumes, applications, messages,
interviews — is their own, and spans every role they applied to on the
rinkats job board, whichever agency posted it.

- Nothing on the candidate's tools names an agency or the employer: roles
  carry a title, an industry line and a location. Do not try to find out, and
  never guess, which agency a role belongs to.
- `org` / `X-Organization` mean nothing on the candidate's tools (they are
  dropped); there is no organization to switch to.
- One login can hold several profiles; a candidate key acts as the profile it
  was created on, an OAuth token as the login's first profile, a browser
  session as the profile picked in the portal.

## Core operations

| Task | MCP tool | REST |
| --- | --- | --- |
| Best-fit roles for me | `find_matching_jobs` | `GET /candidate/matches` |
| Apply (as myself) | `apply_to_job` with `jobId` | `POST /candidate/applications` with `jobId` |
| Where do I stand? | `list_my_applications` | `GET /candidate/applications` |
| Withdraw | `withdraw_application` (`applicationId`) | `POST /candidate/applications/{id}/withdraw` |
| Read my profile | `get_my_profile` | `GET /candidate/profile` |
| Update my profile | `update_my_profile` | `PATCH /candidate/profile` |
| Upload my resume | `upload_resume` | `POST /candidate/resume` |
| Message my recruiter | `list_application_messages`, `send_application_message` (`applicationId`) | `/candidate/applications/{id}/messages` |
| Edit / delete my message | `edit_application_message`, `delete_application_message` | `/candidate/applications/messages/{messageId}` |
| My interviews | `list_my_interviews` | `GET /candidate/interviews` |
| Ask to reschedule or cancel | `request_interview_change` | `POST /candidate/interviews/{id}/change-request` |

## What to know

1. **Applying on the board needs a verified email and an uploaded resume.**
   `find_matching_jobs` gives each role's `jobId`. A role is applied to once
   while the application waits (`409 already_applied`); after it is decided,
   again only once its cooling period is over (`409 cooling_period` with
   `detail.applyAgainFrom` — tell the person that date; do not retry). The
   public apply form on a job page needs no account at all.
2. Status is a transparent, candidate-visible timeline ("Under review",
   "Interview stage") — the agency's internal stage names are never given.
3. Matches carry a quiet `closeMatch` flag, never a score or a percentage.
   Salary appears only where the role's jurisdiction shows it.
4. **The profile is the candidate's own.** `update_my_profile` saves ONE
   section (headline, summary, location, totalYears, noticeDays,
   expectedPayInr, skills, experience, education, domains) and replaces what
   is there — read with `get_my_profile` first. Contact details are scrubbed
   from it: recruiters who find the person in the talent pool reach them
   through rinkats. An AI draft from a new upload (`draftPending`) is the
   candidate's to accept in the portal — never accept it for them.
5. `upload_resume`: a byte-identical file changes nothing (`unchanged: true`);
   at most 4 uploads in any 2 hours (`429`, `detail.retryAt`). The agencies the
   person already applied to are offered the newer file; no other agency sees it.
6. A human recruiter represents the candidate — AI assists, humans decide.
7. Reschedule requests carry your message to the recruiter; the slot stays
   until they resolve it — don't assume the interview moved because you asked.
8. Keep messages professional; they land in the recruiter's real inbox for
   that application. A message id that is not the person's own reads as not
   found — the same answer as one that does not exist.

## Version & updates

This is **v1.6.0** of this skill (updated 2026-10-17: the candidate has their own endpoints — `/api/v1/candidate/…`, `/api/mcp/candidate`, `/api/a2a/candidate` — and their own API keys (`rkc_…`, created in account settings on /account, bound to a profile and no organization); `GET /candidate/matches` and `POST /candidate/applications` are new; the old shared paths are gone). v1.5.0 (2026-10-17: a candidate belongs to
no organization — the candidate's tools act on their own rinkats space across
every role they applied to, need a candidate credential (OAuth with the
`candidate` scope), apply on the rinkats job board by `jobId`, and take
application ids; `get_my_profile` is new and the profile sections changed.
1.0.0 published 2026-09-08). The live copy at the
`url` in the frontmatter metadata is always current with the deployed API. If
you can fetch URLs, check it when starting a long task or whenever a call
fails in a way this skill didn't predict: compare the frontmatter `version`,
and if the remote one is newer, replace your local copy with it (auto-update
is safe — skills are instructions only, never executable code). The catalog
at https://www.rinkats.com/skills/index.json lists every skill's current
version.
