---
name: "hiring_save_assessment"
area: "hiring"
title: "Write a skills test"
price: "$0.01"
method: "POST"
url: "https://api.conecto.chat/v1/tools/hiring_save_assessment"
mcp_server: "https://api.conecto.chat/mcp/hiring"
auth: "Authorization: Bearer <conecto_sk_ key>"
docs_url: "https://conecto.chat/tools/hiring/hiring_save_assessment"
---

# Write a skills test (`hiring_save_assessment`)

Writes a skills test or changes one: questions scored on their own, written answers to mark, a time limit and shuffling.

Write a skills test for candidates, or change one (give its slug): questions with one or more right options are scored on their own; short answers too when you list the accepted ones; written answers wait for hiring_mark_assessment. Optional time limit and shuffling. Write tests about the job's real work; personality and IQ-style questions are not what this is for. Questions stay fixed once someone has started the test; save a new test instead.

Price: $0.01 a call. A call that fails costs nothing.

## Use it when

Candidates should show they can do the work before an interview.

## Say this to your agent

> Write a short skills test for mechanics: the torque for a carbon seatpost clamp, and how they'd find a creak that comes and goes.

## Inputs

| Name | Type | Required | Description | Allowed values | Default |
|---|---|---|---|---|---|
| `assessment` | string | no | The test (its slug from hiring_list_assessments). 1 to 80 characters. |  |  |
| `title` | string | no | 2 to 160 characters. |  |  |
| `intro` | string | no | Markdown shown before they start. Up to 5,000 characters. |  |  |
| `questions` | array of objects | no | [{"type": "choice", "prompt": "...", "options": ["A", "B", "C"], "correct": "B", "points": 1}, {"type": "multi_choice", ..., "correct": ["A", "C"]}, {"type": "short_text", "prompt": "...", "accept": ["42"]}, {"type": "long_text", "prompt": "...", "points": 5}] (1 to 50 items) |  |  |
| `time_limit_minutes` | integer | no | 0: none. 0 to 180. |  |  |
| `shuffle` | boolean | no | Shuffle questions and options for each candidate. |  |  |

## Example

Written for Halverson Cycle & Repair, a bike shop with a repair workshop in Portland, Oregon.

MCP: call `hiring_save_assessment` on the MCP server `https://api.conecto.chat/mcp/hiring` with these arguments:

```json
{
  "title": "Workshop basics",
  "time_limit_minutes": 20,
  "questions": [
    {
      "type": "choice",
      "prompt": "A carbon seatpost clamp is marked 5 Nm. How do you tighten it?",
      "options": [
        "To 5 Nm with a torque wrench",
        "Hand-tight, then a quarter turn",
        "To 8 Nm, to be safe"
      ],
      "correct": "To 5 Nm with a torque wrench",
      "points": 1
    },
    {
      "type": "long_text",
      "prompt": "A customer's bike creaks under load, but only some days. How would you find the cause?",
      "points": 5
    }
  ]
}
```

REST:

```bash
curl https://api.conecto.chat/v1/tools/hiring_save_assessment \
  -H "Authorization: Bearer $CONECTO_KEY" \
  -H "Content-Type: application/json" \
  -d '{"title": "Workshop basics", "time_limit_minutes": 20, "questions": [{"type": "choice", "prompt": "A carbon seatpost clamp is marked 5 Nm. How do you tighten it?", "options": ["To 5 Nm with a torque wrench", "Hand-tight, then a quarter turn", "To 8 Nm, to be safe"], "correct": "To 5 Nm with a torque wrench", "points": 1}, {"type": "long_text", "prompt": "A customer'\''s bike creaks under load, but only some days. How would you find the cause?", "points": 5}]}'
```

## Response

```json
{
  "call_id": "5f0c8a2e-3b7d-4c1e-9a64-2d8e1f7b0c93",
  "tool": "hiring_save_assessment",
  "status": "succeeded",
  "replayed": false,
  "cost_usd": "$0.01",
  "balance_usd": "$19.75",
  "result": {
    "assessment": {
      "assessment": "workshop-basics",
      "title": "Workshop basics",
      "intro": null,
      "time_limit_minutes": 20,
      "shuffle": false,
      "question_count": 2,
      "max_score": 6,
      "sent": 0,
      "completed": 0,
      "updated_at": "2026-10-14T08:00:00+00:00",
      "questions": [
        {
          "id": "q1",
          "type": "choice",
          "prompt": "A carbon seatpost clamp is marked 5 Nm. How do you tighten it?",
          "points": 1,
          "options": [
            {
              "id": "o1",
              "label": "To 5 Nm with a torque wrench"
            },
            {
              "id": "o2",
              "label": "Hand-tight, then a quarter turn"
            }
          ],
          "correct": [
            "o1"
          ]
        },
        {
          "id": "q2",
          "type": "long_text",
          "prompt": "A customer's bike creaks under load, but only some days. How would you find the cause?",
          "points": 5
        }
      ]
    }
  }
}
```

`result`: assessment: the test with its slug, title, questions, time limit and counts.

## Errors

| Code | Status | When | Fix |
|---|---|---|---|
| `not_set_up` | 404 | The business has no careers page yet. | Run hiring_setup_careers first. |
| `not_found` | 404 | No skills test has that slug. | Call hiring_list_assessments and use one of its slugs. |
| `invalid_input` | 400 | A new test has no title or questions, or a question is not in the right shape. | Fix the question the message names. |
| `in_use` | 409 | Candidates have started the test, so its questions stay. | Save a new test instead. |

The refusals every tool can give (401 key, 402 balance, 429 limits) are on the errors page: https://conecto.chat/docs/errors.md

## Related

- [hiring_setup_careers](https://conecto.chat/tools/hiring/hiring_setup_careers.md): Sets up the careers page at cncto.co/j/<name>: its name, intro, website, reply-to address and who hears about applications. $0.001 a call.
- [hiring_design_careers](https://conecto.chat/tools/hiring/hiring_design_careers.md): Gives the careers and job pages the business's own look: colours, a font, corners, a cover, a headline and its own CSS. $0.001 a call.
- [hiring_create_job](https://conecto.chat/tools/hiring/hiring_create_job.md): Posts a job with its own page and application form on the careers page. $0.01 a call.
- [hiring_update_job](https://conecto.chat/tools/hiring/hiring_update_job.md): Changes a job's details, its criteria and filter, or opens or closes it. $0.01 a call.
- [hiring_list_jobs](https://conecto.chat/tools/hiring/hiring_list_jobs.md): The business's jobs with their status, page and applicants per stage. Free up to 1,000,000 reads a month.
- [hiring_list_applicants](https://conecto.chat/tools/hiring/hiring_list_applicants.md): Applicants, newest or best match first: for one job or all, by stage, screening, risk, name or email, or the ones kept as spam. Free up to 1,000,000 reads a month.
- [hiring_get_applicant](https://conecto.chat/tools/hiring/hiring_get_applicant.md): One application in full: answers, résumé link, screening and match score, the checks on who sent it, notes and history. Free up to 1,000,000 reads a month.
- [hiring_screen_queue](https://conecto.chat/tools/hiring/hiring_screen_queue.md): The next applications nobody has screened, with the job's criteria and the résumé as text, blind by default. Free up to 1,000,000 reads a month.
- [hiring_record_screening](https://conecto.chat/tools/hiring/hiring_record_screening.md): Saves a review of one application: strong, partial or weak, a summary, and each criterion with its evidence. $0.01 a call.
- [hiring_mark_spam](https://conecto.chat/tools/hiring/hiring_mark_spam.md): Moves one application to spam or back, and can block the network and email domain it came from. $0.001 a call.
- [hiring_get_blocklist](https://conecto.chat/tools/hiring/hiring_get_blocklist.md): The networks and email domains whose applications are kept as spam. Free up to 1,000,000 reads a month.
- [hiring_update_blocklist](https://conecto.chat/tools/hiring/hiring_update_blocklist.md): Blocks or unblocks networks and email domains; what comes from them is kept as spam, with no fee and no emails. $0.001 a call.
- [hiring_move_applicant](https://conecto.chat/tools/hiring/hiring_move_applicant.md): Moves an applicant to another stage of their job, with a note; the candidate is not told. $0.01 a call.
- [hiring_hire_applicant](https://conecto.chat/tools/hiring/hiring_hire_applicant.md): Hires an applicant in one call: Hired in hiring, a person in HR with their résumé on file, and their onboarding checklist started. $0.25 a call.
- [hiring_note](https://conecto.chat/tools/hiring/hiring_note.md): Adds a note to an applicant, rates them 1 to 5, or both. $0.01 a call.
- [hiring_email_applicant](https://conecto.chat/tools/hiring/hiring_email_applicant.md): Emails an applicant in the business's name; replies go to the careers page's reply-to address. $0.02 a call.
- [hiring_invite_to_interview](https://conecto.chat/tools/hiring/hiring_invite_to_interview.md): Emails an applicant a link to book an interview on one of the calendar's meeting types, and can move them to a stage. $0.05 a call.
- [hiring_list_assessments](https://conecto.chat/tools/hiring/hiring_list_assessments.md): The business's skills tests: title, questions, time limit, and how many were sent and completed. Free up to 1,000,000 reads a month.
- [hiring_send_assessment](https://conecto.chat/tools/hiring/hiring_send_assessment.md): Emails an applicant their own link to a skills test. $0.02 a call.
- [hiring_assessment_results](https://conecto.chat/tools/hiring/hiring_assessment_results.md): An applicant's tests: status, score, each answer against the expected one, answers to mark, time taken and how often they left the page. Free up to 1,000,000 reads a month.
- [hiring_mark_assessment](https://conecto.chat/tools/hiring/hiring_mark_assessment.md): Gives points to the written answers of a completed test. $0.01 a call.
- [hiring_delete_assessment](https://conecto.chat/tools/hiring/hiring_delete_assessment.md): Deletes a skills test with every candidate's answers to it. Free.
- [hiring_delete_applicant](https://conecto.chat/tools/hiring/hiring_delete_applicant.md): Deletes an applicant and their résumé for good. Free.
- [hiring_dashboard_link](https://conecto.chat/tools/hiring/hiring_dashboard_link.md): A one-time link to hiring at a glance: each applicant's stage and next step, the tests and interviews waiting, and the open jobs. Free up to 1,000,000 reads a month.
