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 AcceptedThe 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.
- The User clicks Apply on the Opportunity. The web sends the Opportunity id to the api.
- The api checks the Tailored CV and that no other Run is active, and records the Run.
- The api starts a session with the User’s Workspace and starts Claude Code in career-ops’
applymode. - 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.
- 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.
- 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. - It submits, takes the Proof screenshot of the confirmation page, sets the tracker status to Applied and writes
result.json. - The api reads the result, copies the Proof to R2, marks the Opportunity Applied and closes the session.
Outcomes
Section titled “Outcomes”| 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.
What Budi never does
Section titled “What Budi never does”- 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”.
Isolation
Section titled “Isolation”- 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.