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.
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.
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
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
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.
Turn on the hosted careers page
Three steps, all of them in the dashboard, none of them requiring an engineer.
No DNS record, no certificate, no deployment. The address is the whole configuration.
- Claim your addressSettings, under Pipeline: type the name you want, such as
acme, and save. The page is live athttps://app.interviewwatch.com/careers/acmeimmediately. 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. - 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.
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.
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.
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.
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.
- 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 asINTERVIEWWATCH_APPLY_KEY. - Read your job idsCall
GET /api/careers/jobsand build your listings from the result, so a closed role never leaves a dead form behind. - Post each applicant from your backendOne request per submission carrying
jobId,nameandemail, 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.
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.
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.
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.
| Limit | Hosted page | Your own page (apply key) |
|---|---|---|
| Applications per minute | 30 per page | 60 per company key |
| Applications per minute, one visitor | 5 | 20 per client IP |
| Job listing requests | Rendered with the page | 120 per minute |
| Resume size and formats | 10 MB. PDF, DOC, DOCX, ODT, RTF, TXT, verified by reading the file rather than trusting its name | |
| Custom fields | 50 per company, 40 answers per submission | |
| CSV import | 500 rows and 512 KB per file, 5 imports per minute, admin only | |
| Credential needed | None, the address is public | Apply 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.
Careers page setup: frequently asked questions
Do you host a careers page for us?
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?
Can the hosted page live on our own domain?
Can I change the design of the hosted page?
What does the hosted form collect?
Does the hosted page need an apply key?
What stops bots filling our board through a public page?
What happens when we close a job?
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?
Do applications from the two routes look different on the board?
Do you syndicate our jobs to Indeed or LinkedIn?
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