Skip to content

Managed submission

A Managed submission is Budi filling in and sending an Application on the employer’s form for the User. It is Step 4. The User’s click to apply is the consent, and Budi keeps a screenshot of the form as the Proof.

POST /v1/managed-submissions
{ "opportunityId": "…", "dryRun": false }
202 Accepted

The Opportunity must have a Tailored CV, or the api replies 409. With "dryRun": true Budi fills the form and takes the screenshot but does not send, so the User can review first.

Managed submission sequence across the web, the api, the Tenki session and the employer form
Figure 3. Managed submission. Time goes down. Dashed arrows are replies. The session exists only during one Run. The Workspace stays.
  1. The User clicks Apply on the Opportunity. The web sends the Opportunity id to the api.
  2. The api checks the Tailored CV and that no other Run is active, and records the Run.
  3. The api starts a session with the User’s Workspace and starts Claude Code in career-ops’ apply mode.
  4. Claude Code runs career-ops’ checks first: the blacklist, a duplicate check against the User’s application tracker, and that the posting is still live.
  5. Claude Code opens the posting in headless Chromium with the User’s own browser profile, fills the form from the Profile and the Evaluation, and uploads the Tailored CV.
  6. Before it submits, it reads every required field back from the page. A required answer it cannot fill stops the Run with needs_candidate_input.
  7. It submits, takes the Proof screenshot of the confirmation page, sets the tracker status to Applied and writes result.json.
  8. The api reads the result, copies the Proof to R2, marks the Opportunity Applied and closes the session.
Outcome Meaning
applied Budi sent the Application. The Proof shows the confirmation.
dry_run_ready A Dry run: the form is filled and the Proof shows it, nothing was sent.
auth_required The site needs a login or an account. Workday always does.
bot_check A captcha or bot check blocks the form.
unsupported_ats The form is not Ashby, Greenhouse or Lever, or cannot be driven.
needs_candidate_input A required answer is missing from the Profile.
posting_closed The job is closed.
duplicate_application The tracker or the site shows the User already applied.
form_error The form kept rejecting the Application after Budi fixed what it flagged.

Every outcome except applied and dry_run_ready stops for the User, with the reason in plain words and a Proof of the blocking page when one is open.

  • It never invents candidate data.
  • It never answers legal, work-authorization, visa or sponsorship, salary, background-check or relocation questions for the User.
  • It answers sensitive self-identification questions (gender, ethnicity, disability and the like) only from the User’s Preferences, and only with their own consent. The default is “prefer not to say”.
  • One Workspace for each User. A session mounts one Volume. Two Users never share files, a browser profile or Claude Code memory.
  • One Run at a time for each User. This prevents two Applications to the same job. Tenki also attaches a Volume to only one session at a time.
  • The key stays off the disk. The model key lives in the Claude Code process for the Run, never on the Volume.