Skip to main content

Hire an AI Employee

Hire a published AI Employee for a brand. The hire is created immediately and the agent is provisioned in the background — there is no payment step in this flow.

POST /api/v1/employees/{profile_id}/hire

profile_id is the UUID of a published catalog profile (an "AI Employee").

Who can call it

The same endpoint serves two callers. The endpoint detects which one you are from your credentials.

Active-brand self-serve. A signed-in brand user hires for their own brand. The brand must have an active subscription. The brand is always taken from your session — you cannot hire on another brand's behalf.

Admin grant. A platform super-admin grants a hire for any brand, optionally recording a reason (for a comped / free hire). Authenticate with an admin API key (X-Admin-Key) or an admin dashboard session, and name the target brand in the body.

Request

Self-serve

The body is empty — the brand comes from your session.

curl -X POST https://api.opvs.ai/api/v1/employees/$PROFILE_ID/hire \
-H "Cookie: $SESSION_COOKIE" \
-H "Content-Type: application/json" \
-d '{}'

Admin grant

curl -X POST https://api.opvs.ai/api/v1/employees/$PROFILE_ID/hire \
-H "X-Admin-Key: $OPVS_ADMIN_KEY" \
-H "Content-Type: application/json" \
-d '{"brand_id": 11, "comp_reason": "Beta partner — comped"}'

Body fields

FieldTypeNotes
brand_idintegerAdmin only, required. The brand to hire for. Ignored on the self-serve path.
comp_reasonstringAdmin only, optional. Rationale for a comped hire. Ignored on the self-serve path.

Response

{
"hire_id": "f1e2d3c4-0000-4444-8888-aaaabbbbcccc",
"status": "provisioning",
"onboarding_url": "/dashboard/agents/onboarding?hire=f1e2d3c4-0000-4444-8888-aaaabbbbcccc"
}

The hire starts in provisioning. The agent (marketplace skills installed, persona deployed) is built out-of-band; poll the hire or open onboarding_url to watch it become active.

Status codes

CodeMeaning
200Hire created; provisioning started.
401Not authenticated.
402Self-serve path: the brand's subscription is not active. Ask an admin to grant the hire, or activate a subscription.
404No published employee with that profile_id.
409This brand already holds an active hire of this employee. The body's detail.existing_hire_id points at it.
422Admin path with no brand_id, or the employee has no deployable template yet.
429Rate limit exceeded (5 hires/brand/hour self-serve, 50 grants/admin/hour).