Create a new post in a community
Input
application/jsoncommunity
string
Required
Community identifier (DID, handle, name@origin, or bare local name) of the community to post in
maxLength: 320 bytescontent
string
Optional
Post content - supports rich text via facets
maxLength: 500000 bytesmaxGraphemes: 50000 graphemesembed
union
Optional
Embedded media, external links, or quoted posts
facets
array
Optional
Annotations for rich text (mentions, links, formatting, block structure)
maxLength: 200 itemslabels
refcom.atproto.label.defs#selfLabels
Optional
Self-applied content labels (NSFW, spoilers, etc.)
langs
array
Optional
Languages used in the post content (ISO 639-1)
maxLength: 3 itemstags
array
Optional
User-applied topic tags
maxLength: 8 itemstitle
string
Optional
Post title (optional for media-only posts)
maxLength: 3000 bytesmaxGraphemes: 300 graphemesOutput
application/jsoncid
stringcid
Required
CID of the created post
status
string
Optional
The community's decision as of this response. 'accepted' means this host runs the community's admission and a community acceptance now stands for the post; 'pending' means no acceptance covers it yet - either the community is hosted elsewhere and decides for itself, or the synchronous acceptance failed and will be retried. Pending is a SUCCESS, not an error: the post exists in its author's repository either way. Optional, so a client predating the field decodes an unchanged response. knownValues rather than an enum because the vocabulary may grow, and a closed enum would make adding a status a breaking change for every generated client in the network.
accepted, pendinguri
stringat-uri
Required
AT-URI of the created post
Errors
CommunityNotFound
Community not found NotAuthorized
User is not authorized to post in this community Banned
User is banned from this community InvalidContent
Post content violates community rules ContentRuleViolation
Post violates community content rules (e.g., embeds not allowed, text too short) Try It
Requests are sent directly from your browser. Some servers may block requests due to CORS.
View raw schema
{
"description": "Create a new post in a community",
"errors": [
{
"description": "Community not found",
"name": "CommunityNotFound"
},
{
"description": "User is not authorized to post in this community",
"name": "NotAuthorized"
},
{
"description": "User is banned from this community",
"name": "Banned"
},
{
"description": "Post content violates community rules",
"name": "InvalidContent"
},
{
"description": "Post violates community content rules (e.g., embeds not allowed, text too short)",
"name": "ContentRuleViolation"
}
],
"input": {
"encoding": "application/json",
"schema": {
"properties": {
"community": {
"description": "Community identifier (DID, handle, name@origin, or bare local name) of the community to post in",
"maxLength": 320,
"type": "string"
},
"content": {
"description": "Post content - supports rich text via facets",
"maxGraphemes": 50000,
"maxLength": 500000,
"type": "string"
},
"embed": {
"description": "Embedded media, external links, or quoted posts",
"refs": [
"social.coves.embed.images",
"social.coves.embed.video",
"social.coves.embed.external",
"social.coves.embed.post"
],
"type": "union"
},
"facets": {
"description": "Annotations for rich text (mentions, links, formatting, block structure)",
"items": {
"ref": "social.coves.richtext.facet",
"type": "ref"
},
"maxLength": 200,
"type": "array"
},
"labels": {
"description": "Self-applied content labels (NSFW, spoilers, etc.)",
"ref": "com.atproto.label.defs#selfLabels",
"type": "ref"
},
"langs": {
"description": "Languages used in the post content (ISO 639-1)",
"items": {
"format": "language",
"type": "string"
},
"maxLength": 3,
"type": "array"
},
"tags": {
"description": "User-applied topic tags",
"items": {
"maxGraphemes": 64,
"maxLength": 640,
"type": "string"
},
"maxLength": 8,
"type": "array"
},
"title": {
"description": "Post title (optional for media-only posts)",
"maxGraphemes": 300,
"maxLength": 3000,
"type": "string"
}
},
"required": [
"community"
],
"type": "object"
}
},
"output": {
"encoding": "application/json",
"schema": {
"properties": {
"cid": {
"description": "CID of the created post",
"format": "cid",
"type": "string"
},
"status": {
"description": "The community's decision as of this response. 'accepted' means this host runs the community's admission and a community acceptance now stands for the post; 'pending' means no acceptance covers it yet - either the community is hosted elsewhere and decides for itself, or the synchronous acceptance failed and will be retried. Pending is a SUCCESS, not an error: the post exists in its author's repository either way. Optional, so a client predating the field decodes an unchanged response. knownValues rather than an enum because the vocabulary may grow, and a closed enum would make adding a status a breaking change for every generated client in the network.",
"knownValues": [
"accepted",
"pending"
],
"type": "string"
},
"uri": {
"description": "AT-URI of the created post",
"format": "at-uri",
"type": "string"
}
},
"required": [
"uri",
"cid"
],
"type": "object"
}
},
"type": "procedure"
}