Praxicraft

Assess API · v1

Invitations

Programmatically invite candidates from your ATS or internal hiring tool. All invite endpoints are idempotent — re-inviting the same email returns the existing invitation rather than creating a duplicate.

POSThttps://praxicraft.com/api/v1/public/assessments/:slug/invites/
invitations:writeAuth: Bearer ct_live_…

Create Invitation

Creates a unique assessment link for one candidate. Idempotent: if the email was already invited to this assessment, returns the existing invitation with HTTP 200 (not 201).

Request Body
NameTypeRequiredDescription
emailstringrequiredCandidate email address
namestringoptionalCandidate full name (displayed in the email and on the landing page)
rolestringoptionalJob role or position the candidate is being screened for (e.g. Senior Backend Engineer). Shown in the invitation email.
send_emailbooleanoptionalSet true to immediately dispatch the invitation email (default: false)
Response Fields
FieldTypeDescription
messagestringConfirmation message
invite_tokenuuidUnique token for this invitation — use this to fetch results later
invite_urlurlDirect link the candidate opens to start the assessment
expires_atISO 8601Invitation expiry (7 days from creation)
statusstringpending | started | completed | expired
HTTP
POST /api/v1/public/assessments/senior-backend-screen/invites/
Authorization: Bearer ct_live_xxxxxxxxxxxxxxxx
Content-Type: application/json

{
  "email": "jane.doe@example.com",
  "name": "Jane Doe",
  "role": "Senior Backend Engineer",
  "send_email": true
}
Example Response
JSON
{
  "message": "Invitation created successfully.",
  "invite_token": "c7b3e2a1-1234-5678-abcd-ef0123456789",
  "invite_url": "https://praxicraft.com/take/c7b3e2a1-1234-5678-abcd-ef0123456789",
  "expires_at": "2025-03-22T10:00:00Z",
  "status": "pending"
}
POSThttps://praxicraft.com/api/v1/public/assessments/:slug/invites/bulk/
invitations:writeAuth: Bearer ct_live_…

Bulk Create Invitations

Creates invitations for multiple candidates in one request. Emails that were already invited are silently skipped and returned in the `skipped` array. Useful for ATS batch imports.

Request Body
NameTypeRequiredDescription
candidatesarrayrequiredArray of candidate objects, each with `email` and optional `name` and `role`
send_emailbooleanoptionalSend invitation email to all newly created invitations (default: false)
Response Fields
FieldTypeDescription
invitedarrayCandidates who received a new invitation — includes email, invite_token, invite_url
skippedarrayCandidates skipped with a reason (already_invited | missing_email | error)
HTTP
POST /api/v1/public/assessments/senior-backend-screen/invites/bulk/
Authorization: Bearer ct_live_xxxxxxxxxxxxxxxx
Content-Type: application/json

{
  "candidates": [
    { "email": "alice@example.com", "name": "Alice Chen", "role": "Senior Backend Engineer" },
    { "email": "bob@example.com",   "name": "Bob Smith",  "role": "Senior Backend Engineer" },
    { "email": "jane@example.com"  }
  ],
  "send_email": true
}
Example Response
JSON
{
  "invited": [
    {
      "email": "alice@example.com",
      "invite_token": "a1b2c3d4-...",
      "invite_url": "https://praxicraft.com/take/a1b2c3d4-..."
    },
    {
      "email": "bob@example.com",
      "invite_token": "e5f6a7b8-...",
      "invite_url": "https://praxicraft.com/take/e5f6a7b8-..."
    }
  ],
  "skipped": [
    { "email": "jane@example.com", "reason": "already invited" }
  ]
}
GEThttps://praxicraft.com/api/v1/public/invites/:token/
invitations:readAuth: Bearer ct_live_…

Get Invitation Status

Returns the current status and metadata for a single invitation. Use this to poll pending invitations from your ATS without pulling the full scored result.

Query / Path Parameters
NameTypeRequiredDescription
tokenuuidrequiredThe invite_token from the create invitation response
Response Fields
FieldTypeDescription
invite_tokenuuidUnique token for this invitation
emailstringCandidate email address
namestring|nullCandidate name if provided
rolestring|nullJob role the candidate was invited for
statusstringpending | started | completed | expired
assessmentobject{ slug, title } — the assessment this invitation belongs to
created_atISO 8601When the invitation was created
expires_atISO 8601Invitation expiry timestamp
started_atISO 8601|nullWhen the candidate started the session
completed_atISO 8601|nullWhen the candidate completed the session
reminded_atISO 8601|nullTimestamp of the last reminder email sent
HTTP
GET /api/v1/public/invites/c7b3e2a1-.../
Authorization: Bearer ct_live_xxxxxxxxxxxxxxxx
Example Response
JSON
{
  "invite_token": "c7b3e2a1-1234-5678-abcd-ef0123456789",
  "email": "jane.doe@example.com",
  "name": "Jane Doe",
  "role": "Senior Backend Engineer",
  "status": "started",
  "assessment": {
    "slug": "senior-backend-screen",
    "title": "Senior Backend Engineer Screen"
  },
  "created_at": "2025-03-15T09:00:00Z",
  "expires_at": "2025-03-22T09:00:00Z",
  "started_at": "2025-03-15T14:00:00Z",
  "completed_at": null,
  "reminded_at": null
}
POSThttps://praxicraft.com/api/v1/public/invites/:token/remind/
invitations:writeAuth: Bearer ct_live_…

Send Reminder

Re-sends the invitation email to the candidate. Only valid for invitations in `pending` or `started` status. Returns 400 if the invitation is expired or already completed.

Query / Path Parameters
NameTypeRequiredDescription
tokenuuidrequiredThe invite_token from the create invitation response
Response Fields
FieldTypeDescription
messagestringConfirmation that the reminder was dispatched
HTTP
POST /api/v1/public/invites/c7b3e2a1-.../remind/
Authorization: Bearer ct_live_xxxxxxxxxxxxxxxx
Example Response
JSON
{
  "message": "Reminder sent."
}
DELETEhttps://praxicraft.com/api/v1/public/invites/:token/
invitations:writeAuth: Bearer ct_live_…

Cancel Invitation

Permanently deletes a pending invitation. Returns 400 if the candidate has already started or completed the assessment.

Query / Path Parameters
NameTypeRequiredDescription
tokenuuidrequiredThe invite_token to cancel
HTTP
DELETE /api/v1/public/invites/c7b3e2a1-.../
Authorization: Bearer ct_live_xxxxxxxxxxxxxxxx
Example Response
JSON
HTTP/1.1 204 No Content
GEThttps://praxicraft.com/api/v1/public/invites/
invitations:readAuth: Bearer ct_live_…

List All Invitations

Returns a global list of all candidate invitations across all assessments in your organisation. Paginated.

Query / Path Parameters
NameTypeRequiredDescription
cursorstringoptionalOpaque pagination cursor — pass the value from `next` to fetch the next page
page_sizeintegeroptionalResults per page, max 100 (default: 20)
Response Fields
FieldTypeDescription
invite_tokenuuidUnique token for this invitation
assessment_titlestringTitle of the assessment
assessment_slugstringSlug of the assessment
emailstringCandidate email
candidate_namestring|nullCandidate name if provided at invite time
rolestring|nullJob role the candidate was invited for
statusstringpending | started | completed | expired
sent_atISO 8601|nullWhen the invite email was dispatched
created_atISO 8601When the invitation record was created
expires_atISO 8601Invitation expiry timestamp
HTTP
GET /api/v1/public/invites/
Authorization: Bearer ct_live_xxxxxxxxxxxxxxxx
Example Response
JSON
{
  "next": "https://app.praxicraft.io/api/v1/public/invites/?cursor=cD0yMDI1LTA0...",
  "previous": null,
  "results": [
    {
      "invite_token": "c7b3e2a1-...",
      "assessment_title": "Senior Backend Engineer Screen",
      "assessment_slug": "senior-backend-screen",
      "email": "jane@example.com",
      "candidate_name": "Jane Doe",
      "role": "Senior Backend Engineer",
      "status": "completed",
      "sent_at": "2025-03-15T09:00:00Z",
      "created_at": "2025-03-15T08:55:00Z",
      "expires_at": "2025-03-22T08:55:00Z"
    }
  ]
}

Need help integrating?

Email support@praxicraft.com

Get your API key