Problem types
For users and admins: every error the API returns is an RFC 9457 problem document { type, title, status, detail }. The type is one of the stable slugs below. This table is scanned from apps/api/src on every build, so it lists exactly the slugs the deployed API can answer with.
| Type | Status | Title | Thrown from |
|---|---|---|---|
intro_self |
400 | Cannot ask yourself | intros/intro.service.ts |
invalid_cursor |
400 | Invalid cursor | common/page.ts |
linkedin_unavailable |
400 | LinkedIn did not answer | media/linkedin-photo.service.ts |
media_invalid |
400 | Unreadable image | media/upload.ts |
media_missing |
400 | No file uploaded | media/upload.ts |
media_too_large |
400 | Image too large | media/fetch-image.ts |
media_url_invalid |
400 | Image link not allowed | media/fetch-image.ts |
media_url_not_image |
400 | Link is not an image | media/fetch-image.ts |
media_url_unreachable |
400 | Image link could not be fetched | media/fetch-image.ts |
invalid_token |
401 | Invalid or missing bearer token | mcp/mcp-auth.guard.ts |
admin_required |
403 | Admin role required | admin/admin.guard.ts |
affiliation_side_required |
403 | Not a party to this affiliation | projects/project-affiliation.service.ts |
insufficient_scope |
403 | Insufficient scope | mcp/mcp-auth.guard.ts |
invitation_email_mismatch |
403 | Invitation email mismatch | orgs/org-invitations.service.ts |
join_policy_forbids |
403 | Join policy forbids | orgs/join-requests.service.ts |
membership_pending |
403 | Membership pending approval | common/membership.guard.ts, mcp/mcp-auth.guard.ts, mcp/mcp.server.ts |
membership_suspended |
403 | Membership suspended | common/membership.guard.ts, mcp/mcp-auth.guard.ts, mcp/mcp.server.ts, orgs/org-applications.controller.ts |
not_author |
403 | Not the author | posts/post.service.ts |
not_host |
403 | Not the host | events/event.service.ts |
org_role_required |
403 | Insufficient role | mcp/mcp.server.ts, orgs/org-context.guard.ts, orgs/org-invitations.service.ts, orgs/org.service.ts, orgs/orgs.controller.ts, projects/project-affiliation.service.ts |
progress_not_author |
403 | Not the author | progress/progress.service.ts |
progress_project_forbidden |
403 | Not on the project roster | progress/progress.service.ts |
project_manager_required |
403 | Project manager required | projects/project.service.ts |
publish_target_forbidden |
403 | Not a publish target you can use | posts/post.service.ts, progress/progress.service.ts |
affiliation_not_found |
404 | Affiliation not found | projects/project-affiliation.service.ts |
event_not_found |
404 | Event not found | events/event.service.ts |
intro_context_not_found |
404 | Intro context not found | intros/intro.service.ts |
intro_not_found |
404 | Intro request not found | intros/intro.service.ts |
intro_target_hidden |
404 | Member not found | intros/intro.service.ts |
invitation_not_found |
404 | Invitation not found | orgs/org-invitations.service.ts |
join_request_not_found |
404 | Join request not found | orgs/join-requests.service.ts |
linkedin_photo_missing |
404 | No LinkedIn photo | media/linkedin-photo.service.ts |
media_not_found |
404 | Media not found | media/media.controller.ts |
member_not_found |
404 | Member not found | admin/admin.service.ts, mcp/mcp.server.ts, orgs/org.service.ts, projects/project.service.ts |
org_application_not_found |
404 | Application not found | orgs/org-applications.controller.ts, orgs/org-applications.service.ts |
org_not_found |
404 | Organization not found | mcp/mcp.server.ts, orgs/org-context.guard.ts, orgs/org.service.ts, orgs/orgs.controller.ts, posts/post.service.ts, progress/progress.service.ts, projects/project-affiliation.service.ts, public/public.controller.ts, search/search.service.ts |
post_not_found |
404 | Post not found | posts/post.service.ts |
profile_not_found |
404 | Profile not found | me/profile.service.ts, public/public.controller.ts, users/users.controller.ts |
progress_not_found |
404 | Progress entry not found | progress/progress.service.ts |
project_not_found |
404 | Project not found | projects/project.service.ts |
affiliation_closed |
409 | Affiliation is closed | projects/project-affiliation.service.ts |
affiliation_exists |
409 | An affiliation is already open | projects/project-affiliation.service.ts |
affiliation_not_active |
409 | Affiliation is not active | projects/project-affiliation.service.ts |
affiliation_not_pending |
409 | Affiliation already decided | projects/project-affiliation.service.ts |
already_a_member |
409 | Already a member | orgs/join-requests.service.ts |
cannot_change_own_role |
409 | Cannot change your own role | admin/admin.service.ts |
cannot_suspend_self |
409 | Cannot suspend yourself | admin/admin.service.ts |
capacity_below_going |
409 | Capacity below the going count | events/event.service.ts |
event_not_editable |
409 | Event not editable | events/event.service.ts |
handle_taken |
409 | Handle already taken | me/profile.service.ts |
intro_not_pending |
409 | Intro request already answered | intros/intro.service.ts |
intro_pending_exists |
409 | Intro request already pending | intros/intro.service.ts |
invitation_exists |
409 | Invitation already pending | orgs/org-invitations.service.ts |
join_request_exists |
409 | Join request already pending | orgs/join-requests.service.ts |
last_lead |
409 | The last lead cannot be changed | projects/project.service.ts |
last_owner |
409 | The last owner cannot be changed | orgs/org.service.ts |
linkedin_not_linked |
409 | LinkedIn is not linked | media/linkedin-photo.service.ts, progress/linkedin-share.service.ts |
linkedin_relink_required |
409 | LinkedIn access expired | media/linkedin-photo.service.ts, progress/linkedin-share.service.ts |
member_suspended |
409 | Member is suspended, approve them first | admin/admin.service.ts |
org_application_decided |
409 | Application already decided | orgs/org-applications.service.ts |
org_application_exists |
409 | Application already pending | orgs/org-applications.service.ts |
org_slug_taken |
409 | Slug already taken | orgs/org-applications.service.ts, orgs/org.service.ts |
post_closed |
409 | Post is closed | posts/post.service.ts |
project_archived |
409 | Project is archived | projects/project.service.ts |
project_full |
409 | Project is full | projects/project.service.ts |
rsvp_closed |
409 | RSVPs are closed | events/event.service.ts |
invitation_expired |
410 | Invitation expired | orgs/org-invitations.service.ts |
invalid_time_range |
422 | Invalid time range | events/event.service.ts |
invalid_timezone |
422 | Invalid timezone | events/event.service.ts |
no_publish_target |
422 | No publish target | posts/post.service.ts |
scope_needs_org |
422 | Scope needs an organization | events/event.service.ts |
validation_failed |
422 | Validation failed | common/zod.pipe.ts, events/event.service.ts, mcp/mcp.server.ts |
intro_limit |
429 | Too many pending intro requests | intros/intro.service.ts |
database_unavailable |
503 | Database unavailable | mcp/mcp-auth.guard.ts |
discovery_unavailable |
503 | Authorization server metadata unavailable | auth/well-known.controller.ts |
jwks_unavailable |
503 | JWKS endpoint unavailable | mcp/mcp-auth.guard.ts |
linkedin_share_unavailable |
503 | LinkedIn sharing is off | progress/linkedin-share.service.ts |
linkedin_unavailable |
503 | LinkedIn did not answer | progress/linkedin-share.service.ts |