Put our assessments inside your product.
Two REST APIs, an assessment room that mounts in your page under your own brand, and a remote MCP server for the work you would rather just ask for. Interviews, coding tests, resume screening and scored reports, reachable from whatever you are already building.
Sandbox keys run the whole flow without spending a credit.
- Two REST APIs
- Embeddable assessment room
- Webhooks and a remote MCP server

Build our assessments into your own product.
Two APIs, because they are two products. One evaluates a candidate for a role. The other gives a learner feedback. Separate keys, separate base URLs, and a key from one is rejected by the other, so a misconfigured integration fails loudly rather than quietly scoring the wrong thing.
Hiring API
A candidate being assessed for a role.
- Base URL
- hiring-api.experthire.cloud
- Keys
- ehs_sk_live_ / ehs_sk_test_
- Register a role, create an assessment, get a scored report
- AI interviews, human interviews, phone screens, coding tests
- Resume screening without an interview
- Clients, scheduling, webhooks
Preparation API
A learner practising.
- Base URL
- prep-api.experthire.cloud
- Keys
- ehp_sk_live_ / ehp_sk_test_
- Mock interviews with feedback the learner acts on
- Resume analysis and scoring
- Coding practice, prompt engineering, psychometric tests
- Question bank, webhooks
# One assessment, end to end.curl -X POST https://hiring-api.experthire.cloud/v1/assessments \ -H "Authorization: Bearer $EH_SECRET_KEY" \ -H "Idempotency-Key: $(uuidgen)" \ -H "Content-Type: application/json" \ -d '{ "type": "ai_interview", "job_id": "'"$JOB_ID"'", "candidate": { "email": "ada@example.com", "name": "Ada Lovelace" }, "duration_minutes": 20 }'The full four-call quickstart, including the scored report, is in the docs.
The base URL does not change between sandbox and live. The key prefix decides that, so the same deployed code runs against both. Sandbox never records, so it is never scored.
The assessment runs inside your product, under your brand.
Your candidate never sees us. Two ways in, and your secret key stays on your server in both.
In your page
Allowlist your origin once, mint a session on your server scoped to one assessment, then mount the room with a publishable key. The room refreshes its own token and reports back over webhooks.
import { ExpertHire } from "@experthireai/room"; const sdk = await ExpertHire.load({ publishableKey: "ehs_pk_live_..." });const room = await sdk.mount({ container: "#interview", sessionToken, // minted on your server interviewId: assessmentId,});A link you send
One call returns a single-use URL, seven days by default. Send it however you already reach candidates. Nothing to build, nothing to host.
curl -X POST https://hiring-api.experthire.cloud/v1/assessments/$ID/launch-link \ -H "Authorization: Bearer $EH_SECRET_KEY" \ -H "Content-Type: application/json" \ -d '{"expires_in_seconds": 604800}'Chat with Mia. In the app, or from Claude.
Mia sits in the workspace and runs the desk in plain language: put a candidate on a role, chase a pipeline, pull a report. A secure, OAuth-protected remote MCP server exposes the same tools to your own AI assistant. ChatGPT support is in beta.
Financial, team-admin, and destructive actions are intentionally excluded. They stay where a human confirms.
- Type
- Remote MCP server
- Auth
- OAuth
- Exposes
- Dozens of recruiting tools
Excluded by design
- Financial actions
- Team-admin changes
- Destructive operations
The tool surface, in an assistant instead of a client library.
Mia is the recruiter-side copilot inside the workspace. The same tools are exposed over a remote MCP server at https://mcp.experthire.cloud/. Authentication is OAuth, so there is no key to paste: you add the server once, the assistant signs in to Expert Hire on your behalf, and every call after that runs as you, scoped to your organization. Claude connects it as a custom connector. ChatGPT connects it as a custom app, and that support is in beta.
{ "mcpServers": { "expert-hire": { "type": "remote", "url": "https://mcp.experthire.cloud/", "auth": "oauth" } }}The URL and the OAuth method are exact. The surrounding JSON is only a shape: in practice you add the server through the assistant's own interface, as a custom app in ChatGPT or a custom connector in Claude, then approve the OAuth prompt once.
# Every call runs as you, scoped to your organization."Who is awaiting my review on the Backend Engineer role?""Create a coding round on job_8f21c4 and shortlist the top five.""Schedule AI interviews for the shortlist on Thursday.""How many interviews did the team run this week?"Financial actions, team-admin changes and destructive operations are deliberately left off the MCP surface. Those stay where a human confirms them.
- Jobs and rounds
- Candidates and resumes
- Interviews and scheduling
- Pipelines and workflows
- Reports and analytics
Add it as a custom app.
ChatGPT reaches MCP servers through its built-in Apps platform. Open the Apps settings, turn on Developer mode, then create a new app with the values below and leave Authentication on OAuth. ChatGPT verifies the connection and the app lands in your enabled apps. Signing in through the OAuth prompt is what scopes it to your organization.
- Name
- Expert Hire
- Description
- Allows access and control of Expert Hire systems
- MCP Server URL
- https://mcp.experthire.cloud/
- Authentication
- OAuth
Developer mode is required to connect any custom MCP server. ChatGPT flags it as elevated risk because it allows unverified connectors that could modify or erase data permanently, and it disables memory.
The connection uses your own Expert Hire login rather than an API key, so it does not wait on partner key provisioning. The MCP server itself unlocks on Growth.
The last step of the setup. Name, description, the MCP server URL and Authentication on OAuth, then Create. ChatGPT shows its own warning about unverified MCP servers and asks you to confirm before the app is added. That is ChatGPT's interface, not ours, so it can change.
What this site publishes for agents.
Separate from the product MCP server, this site serves a few machine-readable descriptors. They describe public pages so an agent can find its way around. Discovery artifacts, not an API reference.
/.well-known/api-catalogA linkset pointing at the public service docs./.well-known/mcp/server-card.jsonServer card for the public site surface./.well-known/agent-skills/index.jsonSite navigation, written for agents./llms.txt and /llms-full.txtThe site index in plain markdown.
Connecting an ATS is a different job from calling the API. Greenhouse is available today in early access with bidirectional sync, and Bullhorn, Lever, Workday and Vincere are on the roadmap. See the integrations.
Built to be wired into production safely.
Defaults for credentials, outbound requests and embedding, so an integration does not become an attack surface.
Hashed keys.
API keys are stored hashed. The full key is shown once at issue, and we cannot recover it later.
SSRF guards.
Outbound webhook targets are validated to block requests to internal and private network ranges.
Origin allowlist.
The connector reaches only what your own login can reach. Financial actions, team-admin changes and destructive operations are excluded by design.
Machine-discoverable API catalog.
We publish a .well-known/api-catalog artifact so tools can discover available APIs programmatically. It is a discovery descriptor, not a developer docs portal.
Integration questions, answered.
What engineers ask before they commit a sprint to this.
Still have a question? Talk to us and we will go through your integration with you.
Connect it in about five minutes.
The MCP server is live at mcp.experthire.cloud. Add it to ChatGPT as a custom app, approve the OAuth prompt once, and you are running Expert Hire from chat. There is no key to request.
Need something the connector does not cover? Tell us what you are building and we will say plainly whether it is possible today.