Skip to content
NEXORA

Documentation

The NEXORA API is versioned under /api/v1 and speaks JSON. Sign-in uses an HttpOnly session cookie. Token access for external tools is planned. Endpoints under /me need a signed-in account with a verified email address.

The complete API is described as an OpenAPI 3.1 document at /api/v1/openapi.json, with every request body and query string taken from the same schemas the server validates with. Code generators and API clients can read it directly. The list below is built from the same source.

Privacy

Profile fields a developer keeps private are removed on the server and returned as null. Profiles that are not public answer 404, exactly like profiles that do not exist. Lists return items, page, pageSize, total and totalPages.

Projects

Projects are visible to everyone only when they are public and published. Drafts and private projects exist only for their accepted team members: for everyone else every endpoint answers 404, and they never appear in lists, counts or search. Images of such projects are not served to outsiders either.

The trending sort ranks by activity from people outside each project in the last seven days: every like and every distinct commenter counts 1, every bookmark and follow counts 2. Projects without such activity are left out.

Teams and workspaces

A team is public or private. Private teams, and their requests, answer 404 to everyone who is not an accepted member. Every team has one workspace, and a workspace is always members-only, whether its team is public or private. An invitation that is not accepted yet grants nothing. Workspace changes are written to the activity feed in the same transaction; the same events are delivered live to members who have the workspace open.

Community

Posts are always public while their author's account is active. Hashtags (#name, starting with a letter) and mentions (@username) are read from the title and text; a mention only counts for developers with a public profile. The top sort shows posts from the last seven days with the most likes, then the most comments. Trending hashtags count different people, so one person repeating a tag cannot push it up. Saved posts are private.

Messages

Conversations are between two people and exist only for them: every endpoint answers 404 to anyone else, and no public endpoint returns messages. Who may start a conversation follows the recipient's "Who may message you" setting; once the recipient has replied, the conversation stays open.

Realtime

Live updates come from a separate WebSocket service. Browsers connect with their session cookie; the service accepts only NEXORA's own origin and checks membership for every event. Events are signals that carry ids: notification, message (conversationId, messageId, change), read, typing, presence and workspace (teamSlug, activityId, event). Clients then load the data through this API. Clients may send typing (conversationId), presence.watch (conversationIds), workspace.watch and workspace.unwatch (teamSlug). Online status is shown only between people who share a conversation, and never for people who switched off "Show activity".

NEXORA AI

The assistant runs on the server with Anthropic's API; the key never reaches the browser. When no key is configured, /ai/status reports configured: false and sending answers 503 with AI_NOT_CONFIGURED; nothing is answered in its place. Sending a message returns application/x-ndjson: a user line with your saved message, delta lines with text as it is written, then done (with the saved answer and usage) or error. Closing the connection stops the answer and keeps the text so far. Each person has a daily limit of messages and tokens, counted per UTC day, and one answer at a time. A project is sent along only when you shared it under AI project access and attached it to the conversation. Answers are never run or tested.

Coding challenges

Submissions never run on the application server. They are queued in Redis and run by a separate worker, each in a fresh container without network, with a read-only file system, 256 MB of memory, one CPU, at most 64 processes and a time limit per test. Expected values never enter the container; the worker compares the results outside it. Results of hidden tests show only whether they passed. Poll /submissions/:id until the status is PASSED, FAILED, ERROR or TIMED_OUT. Each challenge pays its points once per person, at the first passing submission.

Reputation

Reputation is challenge points plus achievement points; nothing else counts. Every achievement is earned once, and its rule counts different people, projects, difficulty levels or weeks, so repeating an action earns nothing. The rules are listed on Achievements.

Moderation and administration

Anyone with a verified account can report a profile, project, comment, team, collaboration request, post or a message they received. Moderators and admins review reports per piece of content: they can dismiss them, or confirm them and remove the content or suspend its author. The author is told that something was removed and why, without the moderator's name. Suspended accounts cannot sign in, and everything they published is hidden until the suspension is lifted. Admins also change roles, configure the platform (registration, community posting, challenge submissions, an announcement and AI limits) and read the audit log. Every moderation action is written to the audit log. All of this is checked on the server for every request.

Analytics

A profile or project page counts a view once per viewer and day, sent by the page after it loaded. Owners and team members viewing their own pages are not counted. Viewers are recorded only as a hash with a salt that is deleted after two days, so nobody can tell who viewed anything, and the same person cannot be followed across days. /me/analytics returns only your own numbers: views, new followers, and likes, saves, comments and follows on projects you own or maintain.

Errors

Failed requests return a status code and a body with error.code, error.message and, for invalid input, error.fields. Rate-limited requests include a Retry-After header.

Endpoints

  • GET/searchSearch developers, projects, teams, posts and challenges (q, type=all|developers|projects|teams|posts|challenges, page, and each area's own filters)Public, more when signed in
  • GET/search/suggestionsUp to three names per area for a search box (q, at least two characters)Public

Authentication

  • POST/auth/confirm-email-changeConfirm a new email address with the token from the mail sent to itPublic
  • POST/auth/change-passwordChange the password while signed inSigned in
  • POST/auth/forgot-passwordSend a password reset mailPublic
  • POST/auth/loginStart a session. With two-factor authentication on, send code too; without it the answer is TWO_FACTOR_REQUIRED. Before launch only staff and invited accounts sign inPublic
  • POST/auth/logoutEnd the current sessionPublic, more when signed in
  • GET/auth/meThe signed-in userSigned in
  • GET/auth/providersExternal sign-ins this installation offers ({ github })Public
  • GET/auth/github/startRedirect to GitHub to sign in or sign up (intent=login) or to link it to your account (intent=link); next= an internal pathPublic, more when signed in
  • GET/auth/github/callbackGitHub redirects back here (code, state); signs in, creates the account or links it, then redirectsPublic, more when signed in
  • POST/auth/github/two-factorFinish a GitHub sign-in with a two-factor code ({ ticket, code })Public
  • POST/auth/registerCreate an account and send a verification mail. Before launch only with an invitation token from the waitlist (status ready: verified at once)Public
  • POST/auth/resend-verificationSend a new verification mailPublic
  • POST/auth/reset-passwordSet a new password with a tokenPublic
  • GET/auth/sessionsList your active sessionsSigned in
  • DELETE/auth/sessionsSign out all other sessionsSigned in
  • DELETE/auth/sessions/{id}Sign out one sessionSigned in
  • POST/auth/verify-emailConfirm an email address with a tokenPublic
  • POST/waitlistJoin the waitlist (email, optional desired username and answer, consent). A confirmation mail follows (double opt-in)Public
  • POST/waitlist/confirmConfirm a waitlist entry with the token from the mailPublic
  • POST/waitlist/unsubscribeLeave the waitlist (?token= from any waitlist mail). Also the RFC 8058 one-click target of List-UnsubscribePublic
  • GET/legalThe operator details for the imprint and the privacy policy, and which are still missingPublic

Developers

  • GET/usersSearch discoverable developers: q, skill, availability, level, pagePublic
  • GET/users/{username}A public profile, with the owner's privacy settings appliedPublic, more when signed in
  • POST/users/{username}/followFollow a developer (idempotent)Verified account
  • DELETE/users/{username}/followUnfollow a developer (idempotent)Verified account
  • GET/users/{username}/followersPeople following a developer, if they show it (page)Public, more when signed in
  • GET/users/{username}/followingPeople a developer follows, if they show it (page)Public, more when signed in

Your account

  • GET/me/linked-accountsYour external sign-ins (GitHub) and whether GitHub sign-in is set upVerified account
  • DELETE/me/linked-accounts/githubUnlink GitHub; refused while you have no passwordVerified account
  • POST/me/avatarUpload a profile photo (multipart field file; JPEG, PNG or WebP, 5 MB)Verified account
  • DELETE/me/avatarRemove your profile photoVerified account
  • GET/me/bookmarksYour saved projects (page). Only you can list themVerified account
  • POST/me/coverUpload a cover image (multipart field file; JPEG, PNG or WebP, 8 MB)Verified account
  • DELETE/me/coverRemove your cover imageVerified account
  • GET/me/privacyYour privacy settingsVerified account
  • PUT/me/privacyReplace your privacy settingsVerified account
  • GET/me/accountWhat deleting your account would do: handovers, deletions and what is removedSigned in
  • DELETE/me/accountDelete your account at once (password, username typed out, and a code when two-factor is on)Signed in
  • POST/me/emailChange your email address: a link goes to the new one, a notice to the current oneVerified account
  • GET/me/exportEverything stored about you as one JSON file (three per hour)Signed in
  • GET/me/two-factorWhether two-factor authentication is on and how many recovery codes are leftVerified account
  • POST/me/two-factorTurn two-factor authentication on with a code from the app; returns recovery codes onceVerified account
  • DELETE/me/two-factorTurn two-factor authentication off (password and code)Verified account
  • POST/me/two-factor/recovery-codesReplace all recovery codes (a code from the app)Verified account
  • POST/me/two-factor/setupA new authenticator secret with its QR code; nothing changes until it is confirmedVerified account
  • GET/me/profileYour full profile, including private fieldsVerified account
  • PUT/me/profileReplace your profile fieldsVerified account
  • GET/me/project-invitationsYour open invitations to project teamsVerified account
  • GET/me/projectsProjects you are a member of, including drafts and private ones (page)Verified account
  • GET/me/skillsYour skillsVerified account
  • PUT/me/skillsReplace your skills with a list of skill slugs (at most 20)Verified account

Projects

  • GET/categoriesAll project categoriesPublic
  • GET/projectsSearch public projects: q, category, tech, status, openSource, contributors, featured, sort, pagePublic
  • POST/projectsCreate a project (published or as a draft)Verified account
  • GET/projects/{slug}A project, if you may see it. Private projects and drafts answer 404 outside the teamPublic, more when signed in
  • PUT/projects/{slug}Replace a project's fields (owner and maintainers; visibility and publishing: owner)Verified account
  • DELETE/projects/{slug}Delete a project (owner)Verified account
  • POST/projects/{slug}/bookmarkSave a project (idempotent)Verified account
  • DELETE/projects/{slug}/bookmarkRemove it from your saved projects (idempotent)Verified account
  • GET/projects/{slug}/commentsComment threads, newest first, with replies (page)Public, more when signed in
  • POST/projects/{slug}/commentsComment, or reply with parentIdVerified account
  • PATCH/projects/{slug}/comments/{id}Edit your commentVerified account
  • DELETE/projects/{slug}/comments/{id}Delete your comment; the team and moderators can delete anyVerified account
  • POST/projects/{slug}/coverUpload a cover image (multipart field file; 8 MB)Verified account
  • DELETE/projects/{slug}/coverRemove the cover imageVerified account
  • POST/projects/{slug}/featuredFeature a public project (moderators and admins)Verified account
  • DELETE/projects/{slug}/featuredStop featuring a project (moderators and admins)Verified account
  • POST/projects/{slug}/followFollow a project's updates (idempotent)Verified account
  • DELETE/projects/{slug}/followStop following a project's updates (idempotent)Verified account
  • POST/projects/{slug}/invitationAccept your invitation to the teamVerified account
  • DELETE/projects/{slug}/invitationDecline your invitationVerified account
  • POST/projects/{slug}/likeLike a project (idempotent, returns the new count)Verified account
  • DELETE/projects/{slug}/likeRemove your like (idempotent)Verified account
  • POST/projects/{slug}/logoUpload a logo (multipart field file; JPEG, PNG or WebP, 5 MB)Verified account
  • DELETE/projects/{slug}/logoRemove the logoVerified account
  • GET/projects/{slug}/membersThe team including open invitations (owner)Verified account
  • POST/projects/{slug}/membersInvite a developer by username (owner)Verified account
  • POST/projects/{slug}/transferHand the project to an accepted member ({ username, confirm: the project's name }); you stay as maintainer (owner)Verified account
  • PATCH/projects/{slug}/members/{username}Change a member's role or title (owner)Verified account
  • DELETE/projects/{slug}/members/{username}Remove a member or withdraw an invitation (owner), or leave with your own usernameVerified account
  • POST/projects/{slug}/screenshotsAdd a screenshot (multipart field file; 8 MB, at most 8)Verified account
  • PATCH/projects/{slug}/screenshots/{id}Set a screenshot's caption, used as alt textVerified account
  • DELETE/projects/{slug}/screenshots/{id}Remove a screenshotVerified account
  • GET/projects/{slug}/updatesThe project's updates, newest first (page)Public, more when signed in
  • POST/projects/{slug}/updatesPost an update and notify followers (owner and maintainers)Verified account
  • DELETE/projects/{slug}/updates/{id}Delete an update (owner and maintainers)Verified account
  • GET/projects/suggestionsSearch suggestions for projects, technologies and categories (q)Public

Teams

  • GET/me/team-invitationsYour open invitations to teamsVerified account
  • GET/me/teamsTeams you belong to, including private teams, with open task countsVerified account
  • POST/teamsCreate a team and its workspace (you become the owner)Verified account
  • GET/teams/{slug}A team, if you may see it. Private teams answer 404 outside the teamPublic, more when signed in
  • PUT/teams/{slug}Replace name, description and visibility (owner and admins; visibility: owner)Verified account
  • DELETE/teams/{slug}Delete a team, its requests and its workspace (owner)Verified account
  • POST/teams/{slug}/invitationAccept your invitation to the teamVerified account
  • DELETE/teams/{slug}/invitationDecline your invitationVerified account
  • GET/teams/{slug}/membersThe team including open invitations (owner and admins)Verified account
  • POST/teams/{slug}/membersInvite a developer by username (owner and admins; admins only as member)Verified account
  • POST/teams/{slug}/transferHand the team to an accepted member ({ username, confirm: the team's name }); you stay as admin (owner)Verified account
  • PATCH/teams/{slug}/members/{username}Change a member's role or title (admins manage members, the owner manages admins)Verified account
  • DELETE/teams/{slug}/members/{username}Remove a member or withdraw an invitation, or leave with your own usernameVerified account

Team finder

  • PATCH/applications/{id}status ACCEPTED or REJECTED (the team's managers) or WITHDRAWN (the applicant)Verified account
  • GET/collaboration-requestsThe team finder: q, tech, role, type, status (default OPEN), pagePublic
  • POST/collaboration-requestsPost a request for a team you own or administerVerified account
  • GET/collaboration-requests/{id}A request, if its team is visible to youPublic, more when signed in
  • PUT/collaboration-requests/{id}Replace a request's fields and status (the team's owner and admins)Verified account
  • DELETE/collaboration-requests/{id}Delete a request; pending applications are answered as not acceptedVerified account
  • GET/collaboration-requests/{id}/applicationsApplications to a request (the team's owner and admins)Verified account
  • POST/collaboration-requests/{id}/applicationsApply with a messageVerified account
  • GET/me/applicationsYour applications to collaboration requests and their statusVerified account

Workspaces

  • GET/me/tasksOpen tasks assigned to you across your teamsVerified account
  • GET/workspaces/{slug}A team's workspace overview: task counts, members, linked project (members only)Verified account
  • PUT/workspaces/{slug}Overview text and linked project (owner and admins; you must own the project)Verified account
  • GET/workspaces/{slug}/activityThe activity feed, newest first (page)Verified account
  • GET/workspaces/{slug}/discussionsDiscussions, most recently active first (page)Verified account
  • POST/workspaces/{slug}/discussionsStart a discussionVerified account
  • GET/workspaces/{slug}/discussions/{id}A discussion with its repliesVerified account
  • DELETE/workspaces/{slug}/discussions/{id}Delete a discussion (its author and the team's admins)Verified account
  • POST/workspaces/{slug}/discussions/{id}/repliesReply to a discussionVerified account
  • DELETE/workspaces/{slug}/discussions/{id}/replies/{replyId}Delete a reply (its author and the team's admins)Verified account
  • GET/workspaces/{slug}/docsDocumentation pages, recently edited firstVerified account
  • POST/workspaces/{slug}/docsWrite a pageVerified account
  • GET/workspaces/{slug}/docs/{id}A pageVerified account
  • PUT/workspaces/{slug}/docs/{id}Replace a page's title and textVerified account
  • DELETE/workspaces/{slug}/docs/{id}Delete a page (its author and the team's admins)Verified account
  • GET/workspaces/{slug}/filesEvery file in the workspaceVerified account
  • POST/workspaces/{slug}/filesUpload a file (multipart fields file and optional taskId; 10 MB; images, PDF, ZIP, text)Verified account
  • GET/workspaces/{slug}/files/{id}Download a file (members only, always as an attachment)Verified account
  • DELETE/workspaces/{slug}/files/{id}Delete a file (its uploader and the team's admins)Verified account
  • GET/workspaces/{slug}/milestonesMilestones with task progressVerified account
  • POST/workspaces/{slug}/milestonesCreate a milestone (owner and admins)Verified account
  • PUT/workspaces/{slug}/milestones/{id}Replace a milestone, including completed (owner and admins)Verified account
  • DELETE/workspaces/{slug}/milestones/{id}Delete a milestone; its tasks stay (owner and admins)Verified account
  • GET/workspaces/{slug}/tasksEvery task on the boardVerified account
  • POST/workspaces/{slug}/tasksCreate a task: title, description, status, assignee, milestoneId, dueAtVerified account
  • GET/workspaces/{slug}/tasks/{id}A task with its filesVerified account
  • PATCH/workspaces/{slug}/tasks/{id}Change only the fields you sendVerified account
  • DELETE/workspaces/{slug}/tasks/{id}Delete a task (its creator and the team's admins)Verified account
  • GET/workspaces/{slug}/tasks/{id}/commentsComments on a task, oldest firstVerified account
  • POST/workspaces/{slug}/tasks/{id}/commentsComment on a taskVerified account
  • PATCH/workspaces/{slug}/tasks/{id}/comments/{commentId}Edit your commentVerified account
  • DELETE/workspaces/{slug}/tasks/{id}/comments/{commentId}Delete a comment (its author and the team's admins)Verified account
  • POST/workspaces/{slug}/tasks/{id}/moveMove a task to a column and position: status, indexVerified account

Community

  • GET/hashtags/trendingHashtags used by the most different people in the last 7 daysPublic
  • GET/me/saved-postsYour saved posts (page). Only you can list themVerified account
  • GET/postsCommunity feeds: feed (discover or following), q, tag, kind, author, sort (newest or top), pagePublic, more when signed in
  • POST/postsPublish a post: kind, title, body, code, codeLanguage, projectSlug. Hashtags and mentions come from the textVerified account
  • GET/posts/{id}A postPublic, more when signed in
  • PUT/posts/{id}Replace a post's fields (its author)Verified account
  • DELETE/posts/{id}Delete a post (its author; moderators and admins can remove any)Verified account
  • POST/posts/{id}/bookmarkSave a post (idempotent)Verified account
  • DELETE/posts/{id}/bookmarkRemove it from your saved posts (idempotent)Verified account
  • GET/posts/{id}/commentsComment threads, oldest first, with replies (page)Public, more when signed in
  • POST/posts/{id}/commentsComment, or reply with parentIdVerified account
  • PATCH/posts/{id}/comments/{commentId}Edit your commentVerified account
  • DELETE/posts/{id}/comments/{commentId}Delete your comment; the post's author and moderators can delete anyVerified account
  • POST/posts/{id}/imagesAdd an image to your post (multipart fields file and caption; JPEG, PNG or WebP, 8 MB, at most 4)Verified account
  • PATCH/posts/{id}/images/{imageId}Set an image's caption, used as alt text (the author)Verified account
  • DELETE/posts/{id}/images/{imageId}Remove an image (the author)Verified account
  • POST/posts/{id}/likeLike a post (idempotent, returns the new count)Verified account
  • DELETE/posts/{id}/likeRemove your like (idempotent)Verified account

Notifications

  • GET/me/notification-preferencesWhich notification types are onVerified account
  • PUT/me/notification-preferencesReplace every preference: { preferences: { TYPE: { inApp, email: OFF | INSTANT | DAILY } } } (a boolean sets the app alone)Verified account
  • POST/notifications/unsubscribeOne-click unsubscribe from notification mails (?token=&type=; RFC 8058). Without type, all mails stopPublic
  • GET/me/unreadUnread notifications and unread messages, for badgesVerified account
  • GET/notificationsYour notifications, newest first (page, unread=1), with unreadCountVerified account
  • POST/notifications/readMark notifications read ({ ids } or { all: true }), or unread with read: falseVerified account

Messages

  • GET/conversationsYour conversations with messages, most recent first, with unread counts (page)Verified account
  • POST/conversationsOpen your direct conversation with someone ({ username }); their privacy settings decide who mayVerified account
  • POST/conversations/groupsStart a group conversation ({ title, usernames }); up to 20 people, their message settings decide who can be addedVerified account
  • GET/conversations/{id}A conversation with its members, members only; everyone else gets 404Verified account
  • PATCH/conversations/{id}Rename a group ({ title }); the person who manages itVerified account
  • POST/conversations/{id}/membersAdd people to a group ({ usernames }); the person who manages itVerified account
  • DELETE/conversations/{id}/members/{username}Leave a group (your username) or remove someone (the person who manages it)Verified account
  • POST/conversations/{id}/attachmentsSend a file as a message (multipart fields file and optional body; 10 MB; images, PDF, ZIP, text)Verified account
  • GET/conversations/{id}/attachments/{attachmentId}Download a file (members only, always as an attachment)Verified account
  • GET/conversations/{id}/messagesHistory, oldest first: the latest page, ?before=<id> for older, ?after=<id> for newerVerified account
  • POST/conversations/{id}/messagesSend a message ({ body })Verified account
  • GET/conversations/{id}/messages/{messageId}One messageVerified account
  • DELETE/conversations/{id}/messages/{messageId}Delete your own message and its filesVerified account
  • POST/conversations/{id}/readMark the conversation read; the other person sees a read receiptVerified account
  • GET/messages/searchSearch your own messages (q, at least 2 characters)Verified account
  • GET/users/{username}/messagingWhether you may message a developer, and your existing conversationVerified account

NEXORA AI

  • GET/ai/conversationsYour AI conversations, most recent first (page). Nobody else can list or open themVerified account
  • POST/ai/conversationsStart a conversation ({ title?, projectSlug? }); a project must be shared with NEXORA AI firstVerified account
  • GET/ai/conversations/{id}One of your conversations with all messagesVerified account
  • PATCH/ai/conversations/{id}Rename ({ title }) or attach and detach a shared project ({ projectSlug }, null detaches)Verified account
  • DELETE/ai/conversations/{id}Delete a conversation and its messagesVerified account
  • POST/ai/conversations/{id}/messagesSend a message ({ content }); the answer streams back as NDJSONVerified account
  • GET/ai/statusWhether NEXORA AI is configured on this server, and your usage today against the limitsVerified account
  • GET/me/ai/project-accessProjects you own or maintain and whether NEXORA AI may read each oneVerified account
  • GET/me/ai/project-access/{slug}Exactly the text NEXORA AI receives about a projectVerified account
  • PUT/me/ai/project-access/{slug}Allow NEXORA AI to read a project (owner and maintainers)Verified account
  • DELETE/me/ai/project-access/{slug}Stop sharing a project; it is detached from all your conversationsVerified account

Challenges

  • GET/challengesCoding challenges: q, difficulty, language, status (solved or unsolved), sort (difficulty, newest, popular), pagePublic, more when signed in
  • GET/challenges/{slug}A challenge with statement, starter code and sample tests; hidden tests are only countedPublic, more when signed in
  • GET/challenges/{slug}/submissionsYour submissions to a challenge, newest first (page)Verified account
  • POST/challenges/{slug}/submissionsSubmit a solution ({ language, code }); it is queued for the sandboxVerified account
  • GET/challenges/leaderboardChallenge points per person (period: all or 30d, page) and your own standingPublic, more when signed in
  • GET/submissions/{id}One of your submissions with code and per-test results; others answer 404Verified account

Reputation

  • GET/achievementsEvery achievement with its rule, how many people earned it and whether you didPublic, more when signed in
  • GET/me/reputationYour reputation, its breakdown and your achievementsVerified account
  • GET/users/{username}/reputationA developer's reputation and achievements; null when they hide their activityPublic, more when signed in

Analytics

  • POST/analytics/viewsCount a view of a public profile ({ type: PROFILE, id: username }) or project ({ type: PROJECT, id: slug }), once per viewer and dayPublic, more when signed in
  • GET/me/analyticsYour developer analytics for the last 7, 30 or 90 days (days): views, followers, project interactions. Only counts, never whoVerified account
  • GET/me/analytics/projects/{slug}One project's numbers per day (owners and maintainers; days: 7, 30 or 90)Verified account

Moderation

  • POST/reportsReport a project or team (targetId: slug), or a project comment, collaboration request, post, post comment or received message (targetId: id)Verified account

Administration

  • GET/admin/abuseAbuse signals from recorded events: failed sign-ins, registrations per address, refused requests, reports and writing volume. window: 24h or 7d (admins)Admins
  • GET/admin/audit-logThe audit log, newest first: action (prefix), actor (username), targetId, page (admins)Admins
  • POST/admin/content/{type}/{id}/removalRemove content as a moderator ({ reason }). type: project, post, team, request, project-comment, post-comment, message. The author is told whyModerators and admins
  • DELETE/admin/content/{type}/{id}/removalRestore a project, post, team or request a moderator removedModerators and admins
  • GET/admin/overviewLive counts for the admin start page and what you may do in the admin area (moderators and admins)Moderators and admins
  • GET/admin/postsCommunity posts for moderation: q, state (public, removed), pageModerators and admins
  • GET/admin/projectsProjects for moderation: q, state (public, featured, removed), page. Private projects are never listedModerators and admins
  • GET/admin/reportsReports grouped by what they are about: queue (open or closed), type, pageModerators and admins
  • GET/admin/reports/{type}/{id}Every report about one target, the reported content as stored, and earlier decisions. type: user, project, project-comment, post, post-comment, team, collaboration-request, messageModerators and admins
  • POST/admin/reports/{type}/{id}Decide every unfinished report about the target: REVIEW, RESOLVE (optionally removeContent and suspendAuthor, with a note) or DISMISSModerators and admins
  • GET/admin/legalThe operator details for the legal pages and which are missing (admins)Admins
  • PUT/admin/legalReplace the operator details (admins). Every changed field is audit-loggedAdmins
  • GET/admin/waitlistWaitlist counts (confirmed, unconfirmed, invited, registered) and confirmations per day for 30 days (admins)Admins
  • GET/admin/waitlist/answersConfirmed entries with their answers, newest first: q, page (admins)Admins
  • GET/admin/waitlist/exportEvery confirmed entry with its proof of consent as CSV (admins, audit-logged)Admins
  • POST/admin/waitlist/invitationsInvite the next { count } confirmed people in the order they confirmed; existing accounts are let in (admins)Admins
  • GET/admin/challengesEvery challenge with its state (draft, published, reference) and whether it is verified (admins)Admins
  • POST/admin/challengesWrite a new challenge with tests and reference solutions; it starts as a draft (admins)Admins
  • GET/admin/challenges/{slug}A challenge with all tests, reference solutions and the latest sandbox runs (admins)Admins
  • PUT/admin/challenges/{slug}Replace a challenge; while published only text and starter code may change (admins)Admins
  • DELETE/admin/challenges/{slug}Delete a draft nobody submitted to (admins)Admins
  • POST/admin/challenges/{slug}/verifyRun the reference solutions against the saved tests in the sandbox (admins)Admins
  • POST/admin/challenges/{slug}/publishPublish; refused until every language's reference solution passed exactly the saved tests (admins)Admins
  • DELETE/admin/challenges/{slug}/publishUnpublish; solves and submissions stay (admins)Admins
  • GET/admin/settingsThe platform configuration and the server's own AI limits (admins)Admins
  • PUT/admin/settingsReplace the platform configuration (admins). Every changed setting is audit-loggedAdmins
  • GET/admin/usersEvery account, newest first: q, role, status, page. Email addresses are shown and searchable for admins onlyModerators and admins
  • PUT/admin/users/{id}/early-accessLet a member in while the platform is in waitlist mode (admins)Admins
  • DELETE/admin/users/{id}/early-accessTake a member's early access back (admins)Admins
  • GET/admin/users/{id}One account with its counts, moderation history and the actions you may takeModerators and admins
  • PUT/admin/users/{id}/roleChange someone's role ({ role }: USER, MODERATOR or ADMIN). Admins only, never their ownAdmins
  • POST/admin/users/{id}/suspensionSuspend an account ({ reason }). Ends all its sessions and hides its content. Moderators suspend members, admins also moderatorsModerators and admins
  • DELETE/admin/users/{id}/suspensionLift a suspensionModerators and admins

Reference data

  • GET/skillsAll skills: languages, frameworks, tools and disciplinesPublic

Media

  • GET/media/{key}An uploaded imagePublic, more when signed in

Service

  • GET/healthService healthPublic
  • GET/openapi.jsonThis API as an OpenAPI 3.1 documentPublic
  • GET/platformWhether registration, community posting and challenge submissions are open, and the site announcementPublic

Design system

Every interface element NEXORA uses is shown in the design system.