# Errors

When Learnt refuses something, the message says what went wrong in plain words. Replies from the Course Editor's API also carry a stable `code`, a `fix` line and a `docs` link to the matching section below, for example:

```json
{
  "error": "That web address is already taken — please choose another",
  "code": "slug_taken",
  "fix": "Pick a different address, e.g. add your city or a short suffix.",
  "docs": "https://learnt.tech/docs/errors#slug_taken"
}
```

The `code` never changes, so code and AI agents can rely on it; the sentence may be reworded.

## `not_signed_in`: Not signed in

The request had no sign-in, or the sign-in has expired.

**How to fix:** Sign in again. From code, send the signed-in user's current access token as "Authorization: Bearer <token>"; tokens expire after about an hour.

## `not_admin`: Course Editor access needed

The account is signed in but is not an administrator of a workspace.

**How to fix:** Sign in with the account that created the workspace. Learners can't use the Course Editor.

## `no_workspace`: Account has no workspace

The account is not attached to a Learnt workspace yet.

**How to fix:** If you just signed up, wait a minute for setup to finish and try again. Otherwise email hello@learnt.tech with the account's email address.

## `email_unconfirmed`: Email not confirmed

Signup can't continue until the email address is confirmed.

**How to fix:** Enter the 8-digit code from the confirmation email (or use its button), then continue.

## `signup_not_allowed`: This account can't start a trial

This email address already has a Learnt account or workspace.

**How to fix:** Sign in at app.learnt.tech/login instead, or sign up with a different email address.

## `trial_ended`: Trial ended

The 14-day trial ended without a payment method, so the workspace is locked. Nothing has been deleted.

**How to fix:** Open Billing in the Course Editor and add a payment method; the workspace unlocks straight away.

## `subscription_ended`: Subscription ended

The subscription was canceled, so the workspace is locked. Nothing has been deleted.

**How to fix:** Email hello@learnt.tech to restart the subscription.

## `email_invalid`: Email address not valid

The email address is missing or not in a valid form, or it is a learnt.tech or goalie.guide address, which cannot be your support address.

**How to fix:** Enter a full address such as name@yourcompany.com.

## `name_required`: Name required

A required name was left empty or is too long.

**How to fix:** Enter a name of up to the length shown in the message.

## `slug_required`: Web address required

No web address was chosen for the training site.

**How to fix:** Enter an address of 3–63 lowercase letters, numbers or hyphens, e.g. summit-sales-training.

## `slug_invalid`: Web address not allowed

The web address breaks a rule: 3–63 lowercase letters, numbers or hyphens, no hyphen at either end, not a reserved word.

**How to fix:** Pick a different address, e.g. your organization name with hyphens instead of spaces.

## `slug_taken`: Web address already taken

Another workspace already uses this web address.

**How to fix:** Pick a different address, e.g. add your city or a short suffix.

## `signup_rate_limited`: Too many signups from this network

Several signups were started from the same network in the last hour.

**How to fix:** Wait an hour and try again, or email hello@learnt.tech to be set up directly.

## `no_billing_account`: No billing account yet

This workspace has no Stripe billing account, so there is no billing page to open.

**How to fix:** Finish signup (the secure Stripe step) first. Workspaces set up by hand are billed directly; email hello@learnt.tech.

## `course_not_found`: Course not found

The workspace has no course, or the course named in the request doesn't belong to it.

**How to fix:** Use the course id returned for your own workspace. If you just signed up, wait a minute for setup to finish.

## `course_ambiguous`: More than one course

The workspace has more than one course, so Learnt can't tell which one the invitations are for. A workspace normally has one course, so this is a setup problem on our side.

**How to fix:** Email hello@learnt.tech and we'll sort out which course is yours.

## `course_not_licensed`: Course not licensed

The organization isn't licensed for the course it is set to use.

**How to fix:** Email hello@learnt.tech; this is a configuration problem on our side.

## `not_found`: Item not found

The module, quiz, question, client organization or learner doesn't exist in this workspace (it may have been deleted).

**How to fix:** Reload the list and use an id from your own workspace.

## `module_too_long`: Module too long

One module holds more text than can be saved at once.

**How to fix:** Split it into two or more modules.

## `content_rights_required`: Content rights confirmation needed

Importing content needs confirmation that you have the right to use it.

**How to fix:** Tick the box confirming you own or have permission to use the content, then import again.

## `file_missing`: No file attached

The upload arrived without a file.

**How to fix:** Choose a file and upload again (as multipart form data, field "file", from code).

## `file_too_large`: File too large

Images and PDFs can be up to 4 MB; PDFs up to the page limit shown.

**How to fix:** Compress the image or split the PDF, then upload again.

## `file_type`: File type not supported

Images must be JPG, PNG, WEBP or GIF; imports must be a readable, unencrypted PDF.

**How to fix:** Save the file in a supported format (or remove the PDF password) and upload again.

## `storage_full`: Image storage full

The workspace has used its 500 MB of image storage.

**How to fix:** Remove unused images from modules, then try again.

## `quiz_invalid`: Quiz setting not valid

A quiz setting is out of range: pass mark 1–100, a valid retake policy and placement, and a module for a module quiz.

**How to fix:** Correct the setting named in the message and save again.

## `question_invalid`: Question not valid

A multiple-choice question needs at least two options, and the correct answer must be one of them.

**How to fix:** Add options, tick the correct one, and save again.

## `quiz_empty`: Quiz has no questions

A quiz can't go live without at least one question.

**How to fix:** Add a question, then make the quiz live.

## `color_invalid`: Brand color not valid

Brand colors are six-digit hex values.

**How to fix:** Use a value like #4F46E5.

## `branding_value_invalid`: Branding option not recognised

Header, page background and fonts each take one of a short list of values.

**How to fix:** Use header_style white or brand; page_background plain, tint or picture; font_pairing modern, classic, friendly or plain. Send null to go back to the default.

## `branding_image_not_yours`: Picture not in this workspace

Background and cover pictures must be files uploaded to this workspace.

**How to fix:** Upload the picture instead (POST /api/v1/branding/background or /api/v1/branding/cover, or the Branding section), or send null to remove it.

## `cover_no_course`: No course of your own for a cover

A cover picture belongs to a course this workspace owns.

**How to fix:** Create your course first (the Course Editor, or PATCH /api/v1/course), then add the cover.

## `domain_invalid`: Domain not valid

The custom domain isn't a valid web address.

**How to fix:** Enter just the address, e.g. training.yourcompany.com (no https:// or path).

## `domain_platform_host`: Domain belongs to the platform

learnt.tech addresses (and other platform addresses) can't be used as a custom domain.

**How to fix:** Enter a domain you own, e.g. training.yourcompany.com.

## `domain_in_use`: Domain already in use

Another workspace (or another Vercel project) already uses this domain.

**How to fix:** Pick a different subdomain, such as training.yourcompany.com, or email hello@learnt.tech if it's yours.

## `domain_not_set`: No custom domain yet

There is no custom domain to check or remove.

**How to fix:** Save a domain first. Step-by-step guide: learnt.tech/custom-domain-help.

## `invite_limit_reached`: Daily invitation limit reached

Workspaces can send 25 invitations in any 24 hours during the free trial, and 500 once the paid subscription starts.

**How to fix:** Send the rest in 24 hours. The limit rises to 500 a day once your paid subscription starts; to raise it sooner, email hello@learnt.tech.

## `invite_recently_sent`: Invitation just re-sent

This learner's invitation was re-sent in the last 10 minutes.

**How to fix:** Give it a few minutes to arrive (and ask them to check spam) before sending again.

## `learner_inactive`: Learner removed or access ended

The learner was removed, or their client organization's access end date has passed.

**How to fix:** Restore the learner, or move the organization's end date later, then resend.

## `reminder_recently_sent`: Reminder just sent

Remind now sends at most one reminder per learner in any 24 hours, so nobody is flooded.

**How to fix:** Give the last one a day to work (and ask them to check spam). After 24 hours you can send another.

## `reminder_limit_reached`: Daily reminder limit reached

Reminders may use at most half of the daily invitation limit (12 a day on the trial, 250 once subscribed), so invitations always have room.

**How to fix:** Try again tomorrow. Automatic reminders that did not fit go out the next day.

## `reminders_test_workspace`: Test workspace

This workspace is marked as a test workspace, so it sends no reminders.

**How to fix:** Use a real workspace to send reminders.

## `reminders_course_draft`: Course is a draft

Learners cannot open a draft course, so a reminder would lead nowhere.

**How to fix:** Publish the course in the Course Editor, then send the reminder.

## `reminders_stopped`: Learner turned reminders off

The learner used the "Stop these reminders" link in a reminder email, so Learnt sends them no more reminders, automatic or by hand.

**How to fix:** Contact the learner another way if you need to. Their invitation link still works, and Resend invitation still sends it.

## `learner_complete`: Learner has finished

The learner has completed every module (and passed the quiz, where there is one), so there is nothing to remind them about.

**How to fix:** Nothing to do. Their certificate is on their course page.

## `reminders_unavailable`: Reminders not available here

This course has its own reminder emails, so the Learnt reminders are not used for it.

**How to fix:** Nothing to do: its own reminders keep running.

## `questions_unavailable`: Questions not available here

The training provider has switched questions off, the workspace is locked, or this course is shared between workspaces.

**How to fix:** Contact your training provider another way, for example by replying to your invitation email.

## `question_limit_reached`: Daily question limit reached

Each learner can send 5 questions a day, each workspace takes 200 a day, and one network can send 300 an hour, so nobody is flooded.

**How to fix:** Try again tomorrow, or reply to your invitation email if it can't wait.

## `learner_question_invalid`: Learner question not usable

The question is empty or longer than 2,000 characters.

**How to fix:** Type the question, and split a very long one into two.

## `learner_not_enrolled`: Not enrolled in this course

This account has no active enrollment in the course: it was never added, was removed, or its access ended.

**How to fix:** Ask your training provider to add you again. Sign in with the email address your invitation was sent to.

## `export_unavailable`: Course download not available

This workspace's course can't be downloaded here (Goalie Guide's own course).

**How to fix:** Email hello@learnt.tech for a copy.

## `export_limit_reached`: Course download limit reached

The course was downloaded 30 times in the last day.

**How to fix:** Try again tomorrow; the file you already downloaded is complete.

## `export_failed`: Course download failed

Learnt couldn't read the course right now.

**How to fix:** Try again in a minute. If it keeps happening, email hello@learnt.tech.

## `learner_question_not_found`: Learner question not found

The question id isn't one of this workspace's questions, or the body is missing its true/false value.

**How to fix:** List questions first to get their ids, and send "answered" (or "questions_enabled") as true or false.

## `learner_required`: Learner required

The request didn't name a learner.

**How to fix:** Pick a learner from the list (from code, send their user id).

## `roster_invalid`: Roster file problem

A roster upload can hold 1–500 learners.

**How to fix:** Split the file into uploads of up to 500 rows (name, email, optional client organization).

## `client_org_name_taken`: Client organization already exists

Client organization names are unique within a workspace.

**How to fix:** Use the existing organization, or choose a different name.

## `date_invalid`: Date not valid

The access end date isn't a real date.

**How to fix:** Use a date in the form YYYY-MM-DD.

## `api_key_missing`: API key required

A learnt.tech/api/v1 request arrived without a workspace API key.

**How to fix:** Send the key as "Authorization: Bearer lt_live_…". Create one in the Course Editor under Developer access.

## `api_key_invalid`: API key not valid

The key is mistyped, was revoked, or belongs to no workspace.

**How to fix:** Copy the whole key again, or create a new one in the Course Editor under Developer access. Revoked keys never work again.

## `read_only_key`: Read-only API key

The key was created read-only, so it can read but not change anything.

**How to fix:** Use a key created with write access for this call.

## `rate_limited`: Too many requests

This key sent more requests in the last minute than the limit allows.

**How to fix:** Wait a minute and retry, and space out bulk work (one import call can create up to 100 modules).

## `api_key_name_invalid`: API key name not usable

Every API key has a name so you can tell keys apart later.

**How to fix:** Name the key after what will use it, e.g. "Claude Code on my laptop".

## `api_key_limit`: Too many API keys

A workspace can hold up to 20 active API keys.

**How to fix:** Revoke a key you no longer use in the Course Editor under Developer access, then create the new one.

## `api_key_not_found`: API key not found

The key was already revoked, or isn't one of this workspace's keys.

**How to fix:** Reload Developer access to see the current keys.

## `api_paused`: API paused

The API has been switched off for maintenance; the Course Editor still works.

**How to fix:** Retry later. Status updates come from hello@learnt.tech.

## `confirmation_required`: Confirm before sending email

An AI app tried to send invitation email through Learnt's MCP server without saying the user had agreed. Nothing was sent.

**How to fix:** The app shows you who will get email and asks; once you say yes it calls again with user_confirmed=true.

## `mcp_paused`: MCP server paused

The MCP server at learnt.tech/mcp has been switched off for maintenance; the API and the Course Editor still work.

**How to fix:** Retry later, or use the API or the Learnt skill meanwhile.

## `api_key_in_url`: API key in the web address

The key was sent in the address, where it would be kept in logs and browser history, so the request was refused.

**How to fix:** Send it as the header "Authorization: Bearer lt_live_…" (in Claude: the connector's Request headers). Then revoke this key and create a new one, since the address may have been logged.

## `endpoint_not_found`: No such API endpoint

The path or method isn't part of learnt.tech/api/v1, or an id in the path is not a valid id.

**How to fix:** Check the path and method against learnt.tech/docs/api (or the OpenAPI file at https://learnt.tech/docs/openapi.json).

## `markdown_invalid`: Markdown not usable

A whole-course markdown import needs one document, up to 200,000 characters and 100 modules, with each module starting at a "# " heading.

**How to fix:** Put "# Module title" before each module's text, and split very large courses into several imports.

## `title_invalid`: Title not usable

Titles need some text and at most 200 characters.

**How to fix:** Send a shorter title, or a non-empty one.

## `body_invalid`: Request body not understood

The body isn't JSON, or a required list is missing.

**How to fix:** Send Content-Type: application/json with the fields shown for the call in learnt.tech/docs/api.

## `missing_parameter`: Something required is missing

The request left out a required value (named in the message).

**How to fix:** Include the value named in the message. Requests from the Course Editor never hit this; from code, check the docs for the call.

## `invalid_request`: Request not understood

The request asked for something this endpoint doesn't do, or changed nothing.

**How to fix:** Check the action and fields against the docs. Reloading the page fixes this if it came from an old browser tab.

## `request_refused`: Request refused

The request was refused for the reason in the message.

**How to fix:** Read the message; if it doesn't say what to do, email hello@learnt.tech with what you were trying.
