"Optional poll question. Adds a poll only when the post has none.",
),
field(
"poll_options",
"form",
"string",
False,
"",
"Repeat the field for each poll option, or send a single newline- or comma-separated string (2-6 options).",
),
],
),
endpoint(
id="posts-delete",
method="POST",
path="/posts/delete/{post_slug}",
title="Delete a post",
summary="Delete a post you own; administrators may delete any user's post. Soft-deleted (hidden everywhere but restorable from admin trash) and cascades its comments and votes.",
auth="user",
destructive=True,
params=[
field(
"post_slug",
"path",
"string",
True,
"POST_SLUG",
"Slug or UID of the post.",
)
],
),
endpoint(
id="comments-create",
method="POST",
path="/comments/create",
title="Create a comment",
summary="Comment on any commentable target. Supports nested replies.",
auth="user",
encoding="form",
destructive=True,
params=[
field(
"content",
"form",
"textarea",
True,
"Nice work.",
"Body, 3-1000 characters.",
),
field(
"target_uid",
"form",
"string",
False,
"POST_UID",
"UID of the target (or use post_uid).",
),
field(
"post_uid",
"form",
"string",
False,
"",
"Convenience alias for a post target.",
),
field(
"target_type",
"form",
"enum",
False,
"post",
"Type of the target.",
COMMENT_TARGETS,
),
field(
"parent_uid",
"form",
"string",
False,
"",
"Parent comment UID for a reply.",
),
],
notes=["Either `target_uid` or `post_uid` is required."],
),
endpoint(
id="comments-edit",
method="POST",
path="/comments/edit/{comment_uid}",
title="Edit a comment",
summary="Edit the body of a comment you own. Returns the updated comment.",
auth="user",
encoding="form",
params=[
field(
"comment_uid",
"path",
"string",
True,
"COMMENT_UID",
"UID of the comment.",
),
field(
"content",
"form",
"textarea",
True,
"Edited body.",
"New body, 3-1000 characters.",
),
],
sample_response={
"uid":"COMMENT_UID",
"content":"Edited body.",
"url":"/posts/POST_SLUG#comment-COMMENT_UID",
"updated_at":"2026-06-15T12:00:00+00:00",
},
),
endpoint(
id="comments-delete",
method="POST",
path="/comments/delete/{comment_uid}",
title="Delete a comment",
summary="Delete a comment you own; administrators may delete any user's comment. Soft-deleted (hidden everywhere but restorable from admin trash).",
auth="user",
destructive=True,
params=[
field(
"comment_uid",
"path",
"string",
True,
"COMMENT_UID",
"UID of the comment.",
)
],
),
endpoint(
id="projects-list",
method="GET",
path="/projects",
title="Browse projects",
summary="List projects. Returns an HTML page.",
auth="public",
interactive=True,
params=[
field(
"tab",
"query",
"enum",
False,
"recent",
"Sort selector.",
["recent","popular","released"],
),
field(
"search",
"query",
"string",
False,
"",
"Search project title, description, and author username.",
summary="Publish a project. Redirects to the new project.",
auth="user",
encoding="form",
destructive=True,
params=[
field(
"title",
"form",
"string",
True,
"My Project",
"Title, 1-200 characters.",
),
field(
"description",
"form",
"textarea",
True,
"What it does.",
"Description, 1-5000 characters.",
),
field(
"project_type",
"form",
"enum",
False,
"software",
"Project type.",
PROJECT_TYPES,
),
field(
"status",
"form",
"string",
False,
"In Development",
"Free-form status label.",
),
field(
"platforms",
"form",
"string",
False,
"Linux, Web",
"Comma-separated platforms.",
),
field(
"release_date",
"form",
"string",
False,
"31/12/2026",
"Optional release date in DD/MM/YYYY format.",
),
field(
"demo_date",
"form",
"string",
False,
"31/12/2026",
"Optional demo date in DD/MM/YYYY format.",
),
],
),
endpoint(
id="projects-edit",
method="POST",
path="/projects/edit/{project_slug}",
title="Edit a project",
summary="Update an owned project. Redirects to the project.",
auth="user",
encoding="form",
destructive=True,
params=[
field(
"project_slug",
"path",
"string",
True,
"my-project-1a2b3c4d",
"Project slug or uid.",
),
field(
"title",
"form",
"string",
True,
"My Project",
"Title, 1-200 characters.",
),
field(
"description",
"form",
"textarea",
True,
"What it does.",
"Description, 1-5000 characters.",
),
field(
"project_type",
"form",
"enum",
False,
"software",
"Project type.",
PROJECT_TYPES,
),
field(
"status",
"form",
"string",
False,
"In Development",
"Free-form status label.",
),
field(
"platforms",
"form",
"string",
False,
"Linux, Web",
"Comma-separated platforms.",
),
field(
"release_date",
"form",
"string",
False,
"31/12/2026",
"Optional release date in DD/MM/YYYY format.",
),
field(
"demo_date",
"form",
"string",
False,
"31/12/2026",
"Optional demo date in DD/MM/YYYY format.",
),
],
),
endpoint(
id="projects-delete",
method="POST",
path="/projects/delete/{project_slug}",
title="Delete a project",
summary="Delete a project you own; administrators may delete any user's project. Soft-deleted with all of its files (hidden everywhere but restorable from admin trash).",
auth="user",
destructive=True,
params=[
field(
"project_slug",
"path",
"string",
True,
"PROJECT_SLUG",
"Slug or UID of the project.",
)
],
),
endpoint(
id="projects-private",
method="POST",
path="/projects/{project_slug}/private",
title="Set project visibility",
summary="Mark a project you own private or public. Send value=1 for private, value=0 for public. A project you hide as a member stays visible to administrators; a project you hide as an administrator is visible only to you, not to other administrators (this also hides its files and any attached containers).",
auth="user",
encoding="form",
params=[
field(
"project_slug",
"path",
"string",
True,
"PROJECT_SLUG",
"Slug or UID of the project.",
),
field(
"value",
"form",
"boolean",
True,
"1",
"1 to make the project private, 0 to make it public.",
),
],
),
endpoint(
id="projects-readonly",
method="POST",
path="/projects/{project_slug}/readonly",
title="Set project read-only",
summary="Mark a project you own read-only so all of its files become immutable (no writes, edits, moves, deletes, or uploads succeed), or writable again. Send value=1 for read-only, value=0 for writable.",
auth="user",
encoding="form",
destructive=True,
params=[
field(
"project_slug",
"path",
"string",
True,
"PROJECT_SLUG",
"Slug or UID of the project.",
),
field(
"value",
"form",
"boolean",
True,
"1",
"1 to make the project read-only, 0 to make it writable.",
),
],
),
endpoint(
id="projects-zip",
method="POST",
path="/projects/{project_slug}/zip",
title="Queue a project zip",
summary="Start a background job that archives the whole project. Returns the job uid and status URL to poll.",
auth="public",
params=[
field(
"project_slug",
"path",
"string",
True,
"PROJECT_SLUG",
"Slug or UID of the project.",
)
],
sample_response={
"uid":"ZIP_JOB_UID",
"status_url":"/zips/ZIP_JOB_UID",
},
),
endpoint(
id="zips-status",
method="GET",
path="/zips/{uid}",
title="Zip job status",
summary="Poll a zip job. While pending or running download_url is null; once done it points at the archive.",
auth="public",
params=[
field(
"uid",
"path",
"string",
True,
"ZIP_JOB_UID",
"Zip job uid returned when the job was queued.",
)
],
sample_response={
"uid":"ZIP_JOB_UID",
"kind":"zip",
"status":"done",
"preferred_name":"my-project",
"download_url":"/zips/ZIP_JOB_UID/download",
"error":None,
"bytes_in":20480,
"bytes_out":8192,
"item_count":12,
"file_count":10,
"dir_count":2,
"created_at":"2026-06-09T10:00:00+00:00",
"completed_at":"2026-06-09T10:00:03+00:00",
},
),
endpoint(
id="zips-download",
method="GET",
path="/zips/{uid}/download",
title="Download a zip archive",
summary="Stream the finished archive as application/zip. Each access extends the retention window.",
auth="public",
interactive=True,
params=[
field(
"uid",
"path",
"string",
True,
"ZIP_JOB_UID",
"Zip job uid of a finished job.",
)
],
),
endpoint(
id="projects-fork",
method="POST",
path="/projects/{project_slug}/fork",
title="Queue a project fork",
summary="Start a background job that copies the whole project into a new project owned by you. Returns the job uid and status URL to poll.",
auth="user",
params=[
field(
"project_slug",
"path",
"string",
True,
"PROJECT_SLUG",
"Slug or UID of the project to fork.",
),
field(
"title",
"form",
"string",
True,
"My Fork",
"Title for the new forked project.",
),
],
sample_response={
"uid":"FORK_JOB_UID",
"status_url":"/forks/FORK_JOB_UID",
},
),
endpoint(
id="forks-status",
method="GET",
path="/forks/{uid}",
title="Fork job status",
summary="Poll a fork job. While pending or running project_url is null; once done it points at the new project.",
auth="public",
params=[
field(
"uid",
"path",
"string",
True,
"FORK_JOB_UID",
"Fork job uid returned when the job was queued.",
)
],
sample_response={
"uid":"FORK_JOB_UID",
"kind":"fork",
"status":"done",
"preferred_name":"My Fork",
"project_uid":"NEW_PROJECT_UID",
"project_url":"/projects/new-project-slug",
"source_project_uid":"SOURCE_PROJECT_UID",
"error":None,
"item_count":12,
"created_at":"2026-06-09T10:00:00+00:00",
"completed_at":"2026-06-09T10:00:05+00:00",
},
),
endpoint(
id="gists-list",
method="GET",
path="/gists",
title="Browse gists",
summary="List code gists. Returns an HTML page.",
auth="public",
interactive=True,
params=[
field(
"language",
"query",
"enum",
False,
"",
"Filter by language.",
GIST_LANGUAGES,
),
field(
"user_uid",
"query",
"string",
False,
"",
"Filter by author UID.",
),
field(
"search",
"query",
"string",
False,
"",
"Search gist title, description, and author username.",