current_step carries a field with format: "one_time_code" that expires in
90 seconds. Others email a confirmation link that has to be clicked before
the application counts as submitted.
Connecting a mailbox is entirely optional. Verification steps work the same
whether or not Jobo can see the inbox — the code is just another answer on the
step, so if you already read that mailbox yourself, keep doing exactly that and
submit the code through
POST /applications/{id}/answers as usual. These
endpoints exist purely so you don’t have to build and operate IMAP/OAuth inbox
access if you’d rather not. Nothing else in Auto Apply depends on them, and you
can adopt them for some mailboxes and not others.Connect a mailbox once
Mailboxes are account-level resources — connect each inbox once and reference itsid from any application. Two providers:
imap— host, address, and a password (use an app password where the provider offers them, e.g. Gmail). Credentials are verified synchronously on create: you either getstatus: "connected"back or amailbox_verification_failedproblem and nothing is stored.outlook— this provider uses a hosted Microsoft consent flow and reads over Microsoft Graph (delegatedMail.Read). Create returnsstatus: "pending"plus anauthorization_url; open it (or send it to the mailbox owner), sign in with the same address you declared, and the mailbox flips toconnected. The consent link expires after 15 minutes — fetch the mailbox again for a fresh one. No IMAP host is needed or returned for this provider.
DELETE hard-deletes them.
Retrieve the verification
The moment an application pauses on its verification step, callPOST /api/auto-apply/mailboxes/{id}/verification with the application_id. The call
blocks while Jobo polls the inbox (newest messages first, read-only — your
mail is never marked as seen) and an AI extractor picks the verification email
using the application’s apply host and ATS provider as context, so a Greenhouse
code isn’t confused with an unrelated login email that arrived the same minute.
Providers verify in one of two ways — a one-time code to type into the
form, or a confirmation link to click. The response’s type says which
was found (constrain it by passing type: "code" or type: "link" in the
request; the default any accepts either):
diagnostics block saying what the poll actually
observed, so a timeout is explainable: messages_seen counts messages newer
than the application that were visible at all, fetch_failures counts reads
the mail provider failed transiently (skipped, not fatal), and
extraction_failures counts rounds where the extraction model gave no usable
answer while extraction_rejected counts rounds where it answered and nothing
was accepted — last_extraction_reason names why the last such round came back
empty (not_found, code_not_verbatim, …). A message is offered to the model
more than once when a round produces no match, so a single off answer does not
cost you the wait. On found, matched_by is llm, or pattern when the model
spent its rounds on the message without a match and a strict
provider-correlated pattern matched a one-time code.
For type: "link" Jobo clicks the link server-side — https-only, public
hosts only, bounded redirects — which confirms the address the way the
applicant would. When link_visited is false the click failed; open the
returned link yourself.
A visited confirmation link is not by itself a terminal application result.
Fetch the application and inspect status; only submitted confirms that the
application completed. For code verification, submit the full current answer
snapshot, including the code field and any other fields requiring answers.
timeout is an expected outcome — the email may simply not have arrived —
not an error. Real faults are RFC 7807 problems: mailbox_not_connected,
mailbox_auth_failed (reconnect the mailbox), application_not_found, and
mailbox_provider_unavailable (503 — the mail provider kept failing for the
whole poll; retry shortly).
The extracted code is validated server-side: it must appear verbatim in the
selected email. The response returns verification details and diagnostics,
not the full email body.
Timing in practice
POST /applications→ application eventually pauses with aone_time_codefield (the step’sanswers_expire_attells you the deadline).- Immediately
POST /mailboxes/{id}/verificationwith theapplication_id— the verification email typically lands within seconds of the step appearing. POST /applications/{id}/answerswith the code as the field’s answer.
verification_code_rejected and the application offers a correction round —
read the current step and its new deadline before trying again. If the
application is already terminal with verification_timeout, the old step
cannot be resumed by submitting another code.
