Skip to main content
Use Job Application Recipes to extract details from a job posting or apply with your resume. Each request starts a workflow run that you can track in Skyvern. You can use the recipe page or the API. Supply a direct job posting URL for each request.
Apply can submit an application on your behalf. Check the job URL, resume, and instructions before you start a run.

Apply from the dashboard

1

Open Job Application Recipes

Go to Recipes → Job Applications in Skyvern Cloud.
2

Add the job and resume

Paste the Job URL. Upload one PDF resume, up to 10 MiB, or select Use a URL instead to provide a publicly accessible resume URL.
3

Add instructions and facts

Use Instructions to describe how Skyvern should complete the application. Use Your information for facts such as work authorization, location, or expected salary. Both fields are optional.Skyvern parses your resume to help answer application questions. Values in Your information override matching values from the resume. You can enter text or JSON.
4

Add login details if needed

Select This job site requires a login to enter a username and password. When you provide credentials, select Save this login for future applications on this site to allow Skyvern to store them.If the site uses two-factor authentication, enable Uses 2FA? and supply your configured 2FA identifier when needed.
5

Start and track the application

Open Advanced options to edit Terminate if or Error code mapping. The defaults stop an application when the posting explicitly says it is closed and classify that outcome as job_expired. Use Reset to defaults to restore both settings.Submit the form, then open the returned run link. The Runs panel lists applications and job extractions with their status.
To apply to several postings, enable Bulk and paste one job URL per line. Review the confirmation before sending. Each URL starts a separate run; the displayed credit estimate is not a maximum charge. To extract a posting without applying, use the extraction form on the same page. Enter the job URL and open its run to view the result. The page saves instructions and Your information in browser storage for the selected organization. Resume URLs are also saved while URL mode is active. Clear these fields or your browser’s site data to remove saved values.

Use the API

Get your API key from Settings and set it in your shell:
Send the key in the x-api-key header on every request. The three job endpoints appear in the Recipes section of the API reference.

Extract a job posting

Extract a job application posting accepts a JSON body with job_url:
The response contains the new run ID:
The run executes asynchronously. This response confirms that the run started; poll its status to get the extraction output. Extract can complete for a closed posting when its details remain readable. The normal extract_output.extracted_information object includes availability: closed for explicit closure, open for evidence that applications are accepted, or unknown when the page is ambiguous. Readable details remain in that object. Closure does not itself make Extract fail.

Apply with a resume URL

Apply to a job accepts JSON with job_url, resume_url, and custom_prompt. Include custom_prompt even when you have no instructions; use an empty string.
Replace the example URLs and applicant facts with your own. Both URLs must use public HTTP or HTTPS addresses. Skyvern must be able to download the resume without an interactive login.

Apply with a file upload

Use multipart/form-data to upload a local resume. Supply resume_file instead of resume_url:
Let curl set the multipart Content-Type header and boundary. Send each field once, and use exactly one resume source per request. The API supports PDF, DOCX, and image resumes. The default upload limit is 30 MiB. Skyvern uses OCR when a PDF has no extractable text. If resume parsing fails, the application continues using the remaining inputs. Both Apply request formats return only workflow_run_id. Check the run result to determine whether the application was submitted.

Configure termination and error codes

Apply accepts two optional settings in either request format. If you omit them, it uses these defaults:
terminate_criterion tells the agent when to stop. error_code_mapping defines the codes that the failure classifier may return. Keep both when you want early stopping and a stable code. A prompt alone does not define a machine-readable error code. The settings are independent. Clearing a rule does not clear the mapping, and clearing the mapping does not clear the rule. Use a JSON object with nonempty string keys and string descriptions for the mapping. Only configured codes can be returned; replacing the mapping can remove job_expired. In multipart requests, send the criterion as text and the mapping as JSON text:
Send text null or {} to disable the multipart mapping, or an empty criterion field to disable the rule. In the dashboard, clear Terminate if or enter null or {} in Error code mapping. Advanced settings apply to each URL in a bulk submission and are not saved in browser storage. Apply checks closure when it observes the posting; resume parsing or login may already have occurred. The default rule applies only to explicit expiry, closure, filled positions, or statements that applications are no longer accepted. A missing button, redirect, or HTTP 404 alone is insufficient. Editing or disabling the rule uses agent execution when a deterministic adapter cannot represent it.

Supply credentials and a 2FA identifier

For a site that needs login, add these fields to the JSON Apply body:
Provide username and password together. persist_credentials: true is required when you supply them and authorizes Skyvern to store the login for future use. Omit all three fields when no login is needed. 2fa_identifier is optional. For multipart requests, send these values as text fields. Use the lowercase text true for persist_credentials:

Track runs and results

Use the returned ID with Get run info by id:
Poll this endpoint while the run is active. When it finishes, inspect its status and output. A successful launch response alone does not confirm extraction or application completion. With the default Apply settings, an explicitly closed posting terminates the run. Inspect the standard status, failure_reason, and errors fields. A classified expiry has error_code: "job_expired", with reasoning and confidence_float, in errors. The same fields use the normal workflow webhook payload. Classification only returns configured codes when it can identify a match; an empty errors list is not proof that a posting is open. Extract availability appears in the normal workflow outputs, not in the recipe run list. To list recipe runs for your organization, use List job recipe runs:
Each entry includes the run ID, recipe (apply or extract), status, creation time, job URL, and failure reason when available. The response also includes page, page_size, and has_next. Increment page while has_next is true. Page size must be between 1 and 100.
Each Apply API request creates a new run. Repeating a request can submit another application, so check the original run before retrying.

Credits

For organizations billed in recipe credits, each admitted execution attempt costs 50 credits ($0.05). Login, extraction, and application attempts are billed separately. Retries and fallback attempts also cost 50 credits each, including attempts that fail or are canceled after admission. Resume parsing has no separate recipe charge. The launch check requires the following balance when overage is disabled: The range depends on the execution path selected for the job site and your inputs. The launch check does not debit credits. These balances and the dashboard estimate are not maximum prices; the final charge depends on the attempts executed.

Handle request errors

Request validation rejects unknown fields. JSON credentials require the boolean true for persist_credentials; multipart credentials require the text true. Use the Recipes API reference for the full request and response schemas.