Interviews run with the InterviewWatch agent get a signed integrity report on the candidate card. See how monitoring works →
Careers page setup

Two ways to take applications

Turn on a hosted careers page and be collecting applicants in about a minute, or post from the careers page you already have and keep candidates on your own domain. Both routes create the same pipeline card, store the same resume and fill the same fields, so this is a choice about your website, not about what the ATS can do.

Hosted page
app.interviewwatch.com/careers/you
Setup
Claim an address, about a minute
Own page
POST /api/careers/applications
Setup
One request, under an hour
Always collected
Name, email, resume
Duplicates
Idempotent per job and email
Short answer

No careers page yet? Claim an address in settings and yours is live at app.interviewwatch.com/careers/your-company straight away, listing your open jobs with an apply form that files onto the board. No DNS, no certificate, nothing to deploy, no code.

Already have a careers page? Keep it. Your form handler posts each applicant to /api/careers/applications with your company apply key, and candidates never leave your domain.

The two are not exclusive, and neither is a lesser version of the other. What lands on the pipeline board is identical either way.

Which one

Pick the route that matches your website

This is the only decision worth making up front, and it is reversible: turning the hosted page on later, or off again, changes nothing about the applications you have already collected.

Route one

The hosted careers page

We publish the page. You pick an address and choose the questions.

  • Live in about a minute, with no code and nobody technical
  • Lists your open jobs, and drops a role the moment you close it
  • Collects name, email, resume and your own questions
  • Nothing to deploy, no DNS record, no certificate to buy
  • One shared layout, with no theme editor
  • A shared address, not careers.yourcompany.com
How to turn it on
Route two

Your own careers page

You keep the page. We take the applicant from your form handler.

  • Your domain, your design, your URLs and your SEO
  • One POST request per submission, usually an afternoon's work
  • Send the resume in the same call as multipart form data
  • Any extra question becomes a field with no setup first
  • Needs a backend or a serverless function
  • The apply key can never be shipped to the browser
How to wire it up

Running both is normal: the hosted link goes in job posts and outbound messages while your own page carries the roles you promote. Candidates are deduplicated by email whichever door they come through, so somebody who applies on your site and again through the hosted link is one candidate, not two.

Route one

Turn on the hosted careers page

Three steps, all of them in the dashboard, none of them requiring an engineer.

Claim an address Settings, about a minute Page is live /careers/acme Candidate applies name, email, resume, answers Card on your board Applied · resume indexed Close a job and it leaves the page immediately. Turn the address off and the page stops answering.

No DNS record, no certificate, no deployment. The address is the whole configuration.

  1. Claim your addressSettings, under Pipeline: type the name you want, such as acme, and save. The page is live at https://app.interviewwatch.com/careers/acme immediately. Addresses are lowercase letters, numbers and hyphens, three to forty characters, and a handful of words are reserved so a page can never collide with a product route. If the name you want is taken you are told to pick another, and you are never told who holds it.
  2. Choose what the form asksName, email and a resume are always collected, so a page can never be configured into collecting nobody. Everything else is yours: in the same settings screen, tick Ask on careers page against any application field, tick Required if an answer is compulsory, and move questions up or down into the order you want them asked. See form fields below.
  3. Share the linkPut it in your job posts, your email signature and your LinkedIn page. Every submission creates a pipeline card in Applied with the resume attached and indexed for search, marked as having arrived from your careers page.
What a candidate sees.

Your company name, your open roles with their team and title, and an apply form on the same page. Closing a job removes it from the listing at once, so a filled req never collects another application. A candidate who submits twice is told plainly that you already have their application rather than being thanked a second time for one that was not created.

The form

What the apply form asks for

The same field catalogue that drives the board also drives the hosted form, which is why a question you add here arrives as a column you can filter by rather than as text buried in a note.

Always collected

Name, email and a resume, on every hosted form. These are not configurable: an apply form that collects no way to reach somebody is not an apply form. PDF, DOC, DOCX, ODT, RTF and TXT are accepted, up to 10 MB.

Your own questions

Anything else you want to ask: notice period, work authorization, a portfolio link, how they heard about you. Each is text, long text, a number, a date, a choice list, yes/no or a link, and renders as the matching input.

Required, and in order

Mark a question required and the form will not submit without it, and the server checks it again rather than trusting the browser. Reorder questions with the up and down controls; the form asks in the order you set.

Board fields and form questions are separate switches.

A field can show on the board card without being asked on the form, and the other way round. "Internal rating" belongs on the card and nowhere near a candidate; "How did you hear about us?" is worth asking and not worth a chip on every card. One switch doing both jobs would force every question onto the board, so there are two.

Fields also create themselves. If your own careers page starts sending a question we have not seen before, it is adopted as a field the first time somebody answers it, so a form change needs no dashboard change first. Up to 50 fields per company, and deleting one removes the answers with it while hiding one keeps them.

Route two

Post from your own careers page

Your page stays on your domain exactly as it is. Your form handler posts each submission to the apply API, and the candidate never leaves your site.

  1. Mint an apply keyOn the Pipeline screen, issue a company apply key. It looks like iwk_1a2b3c4d… and is shown once, because only its hash is stored. Put it in your server environment as INTERVIEWWATCH_APPLY_KEY.
  2. Read your job idsCall GET /api/careers/jobs and build your listings from the result, so a closed role never leaves a dead form behind.
  3. Post each applicant from your backendOne request per submission carrying jobId, name and email, plus whatever else your form asks. Send it as multipart and the resume comes along in the same call.

The request

curl -X POST https://app.interviewwatch.com/api/careers/applications \
  -H "Authorization: Bearer $INTERVIEWWATCH_APPLY_KEY" \
  -H "Content-Type: application/json" \
  -d '{"jobId":"3f1c…","name":"Ada Lovelace","email":"[email protected]"}'

The response

// 201 Created on a new application, 200 OK if they already had a card for this job
{
  "applicationId": "a41d…",
  "candidateId":   "9b02…",
  "jobId":         "3f1c…",
  "stage":         "Applied",
  "source":        "CareersApi",
  "created":       true,
  "active":        true
}

Repeat submissions are safe: the same person and job returns 200 with created: false rather than a second card. Treat both as success in your UI.

Call it from your server, not from the browser.

The apply key authorizes writes for your whole company, so it must never reach page JavaScript. There is deliberately no CORS policy on this endpoint: a static form posting straight to it will fail. On Framer, Webflow or a static site, put a small serverless function in between, or use the hosted page, which needs no key at all.

The full integration guide has working examples for Next.js, PHP and WordPress, every endpoint and status code, resume upload as multipart, custom fields, and how to rotate a key.

The other two doors

CSV import and sourced candidates

Not every applicant applies. Two more ways in, both of which land on the same board and dedupe against the same candidate identity.

Bulk import from CSV

An admin uploads a file with a header row of name,email and an optional jobId column, up to 500 rows and 512 KB at a time. Every row reports back separately, so one malformed line never abandons the other 499, and a person already in the pipeline comes back as a duplicate rather than a second card.

Useful once: the spreadsheet you are moving off. Useful afterwards: a stack of applications from an event or an agency.

Adding a sourced candidate

A recruiter adds someone by hand from the dashboard, with a resume dropped onto the card. Referrals and outbound candidates arrive this way, and the card records that a person added them rather than that they applied, so provenance on the board stays honest.

The same candidate can later apply through either careers route without becoming a second record.

Limits

What each route allows

Generous for a careers page, tight enough to absorb a bot storm on an apply form. A throttled request returns HTTP 429 with a Retry-After header.

LimitHosted pageYour own page (apply key)
Applications per minute30 per page60 per company key
Applications per minute, one visitor520 per client IP
Job listing requestsRendered with the page120 per minute
Resume size and formats10 MB. PDF, DOC, DOCX, ODT, RTF, TXT, verified by reading the file rather than trusting its name
Custom fields50 per company, 40 answers per submission
CSV import500 rows and 512 KB per file, 5 imports per minute, admin only
Credential neededNone, the address is publicApply key, server side only

The hosted page is capped harder on purpose. Its address is public and cannot be rotated the way a leaked key can, so the per-page and per-visitor ceilings are what stand between a public apply form and somebody filling your board. The address authorizes creating an application and attaching its resume, and nothing else: it cannot read your pipeline, list your candidates or run a bulk import.

FAQ

Careers page setup: frequently asked questions

Do you host a careers page for us?
Yes, if you want one. An admin claims an address in settings and the page is live immediately at app.interviewwatch.com/careers/your-company, listing your open jobs with an apply form. It is off until somebody turns it on. Bringing your own careers page is equally supported and unchanged: both routes post through the same apply API and produce the same board.
Which should I use?
Use the hosted page if you have no careers page, or nobody free to wire one up. Use your own page if the careers page matters to your brand and your search traffic, since that keeps your domain, your design and your URLs. Many teams run both and feed one pipeline.
Can the hosted page live on our own domain?
No. It sits at a shared path, which is exactly what lets it go live with no DNS record, no certificate and no deployment. Custom domains such as careers.yourcompany.com are not offered and are not on the near roadmap. If the page has to be on your domain, keep your own careers page and post to the apply API.
Can I change the design of the hosted page?
Beyond your company name, no. It is one clean shared layout, not a page builder: no theme editor, no custom CSS, no uploaded banner. That is a deliberate limit rather than a missing feature, and it is why the setup is a single field instead of an afternoon. If the page has to carry your design, that is what route two is for.
What does the hosted form collect?
Name, email and a resume every time, plus any application field you tick for the careers page. Those can be required or optional, typed as text, long text, number, date, choice, yes/no or link, and ordered however you like. Every answer lands on the pipeline card as a field you can filter the board by.
Does the hosted page need an apply key?
No. The address in the URL identifies your company, and it authorizes creating an application and attaching its resume, nothing more. It cannot read your pipeline, list candidates or import a file, and it reaches no other company. Keep the apply key for route two, where it belongs on your server.
What stops bots filling our board through a public page?
Rate limits sized for the fact that the address is public: 30 applications a minute for the page and 5 a minute from any one visitor, both returning HTTP 429 with a Retry-After header. Applications are also idempotent per job and email, so a script resubmitting the same person makes one card. A real applicant never runs into any of this.
What happens when we close a job?
It leaves the hosted page immediately, so a filled req stops collecting applications the moment you close it. On your own page, call GET /api/careers/jobs to build your listings and the same thing happens there; hardcoding ids is what leaves a dead form behind.
What if we turn the hosted page off later?
The page stops answering at once and an old link shows a plain page-not-found. Your jobs, candidates, applications and resumes are untouched, and claiming the same address again brings the page back exactly as it was. Nothing about turning it on is hard to reverse.
Do applications from the two routes look different on the board?
No. Both are marked as having arrived from a careers page rather than being added by a recruiter, both attach and index the resume, and both fill the same custom fields. The card cannot tell you which page the person was looking at, because nothing downstream needs to know.
Do you syndicate our jobs to Indeed or LinkedIn?
No. The hosted page lists your roles at your address and does not post them to job boards. Syndication is a separate product with its own feed formats and per-board rules, and it is not something we do.

Start collecting applications today.

Claim an address and your careers page is live in about a minute, or wire your own page to the API this afternoon. Free to start, no card required.

Start for free Read the API reference
Keep reading