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:
{
"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
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.