People
Profiles
actor-service
People, groups and events: reading and changing them, who may see them and what may be posted on them, their administrators, and deleting, archiving and purging them (account-lifecycle.md).
What profile an alias is
/actors/{alias}Of any kind: what its own address begins with, and its id. The web app finds /@ana by it.
Who: Anyone, signed in or not
Parameters
aliasstringrequiredin pathA profile's alias:ana,anahita-atrium, orana@mastodon.socialfor somebody elsewhere.
Answers
- 200OKactor.HandleResponse application/json
- 404there is no such profile that the viewer may see
Request
curl "https://api.example.org/actors/<alias>"
const response = await fetch('https://api.example.org/actors/<alias>', {
method: 'GET',
});
const answer = await response.json();
import requests
response = requests.get(
"https://api.example.org/actors/<alias>",
)
answer = response.json()
Answer · 200
{
"alias": "string",
"id": 42,
"kind": "string"
}
Make an event
/events/Its own, or hosted by a group whoever makes it administers.
Who: Somebody signed in
Body application/json or application/x-www-form-urlencoded or multipart/form-data
accessstringWho can see it. Anybody, unless it says otherwise. One ofpublic,registered,followers.addressstringWhere it is held, when it is somewhere: an address as it is typed, kept on the event and shown to whoever is going. Not a place on the map, which is public. Every part is optional. At most 255 characters.bodystringWhat it is about. At most 8000 characters.capacityintegerHow many may be going. 0, or left out, for no limit. At least 0. At most 100000.citystringAt most 100 characters.countrystringAt most 100 characters.ends_atstringrequiredAt most 40 characters.host_group_idintegerA group hosting it, which whoever makes the event must administer. Left out for an event that is its maker's own.namestringrequiredWhat it is called. At most 64 characters.online_urlstring (uri)Where to join, when it is online. At most 512 characters.open_to_host_followersbooleanWhether everybody who follows the group hosting it may see that it is on and answer it. Means nothing on an event with no host.postal_codestringAt most 20 characters.show_mapbooleanWhether to show that address on a map. Off unless asked for: finding it means sending it to a mapping service, and an address may be somebody's home.starts_atstringrequiredWhen, as RFC 3339 with an offset: 2026-11-05T19:00:00-05:00. At most 40 characters.state_provincestringAt most 100 characters.timezone_namestringrequiredThe zone those times were chosen in, as IANA names it. At most 64 characters.website_urlstring (uri)One link. At most 255 characters.
Answers
- 201CreatedActorNode application/json
- 400
invalid_timezone,invalid_time,ends_before_start,too_longoralready_over; or not well formed, without a bodyRefusal application/json - 401no token, or one that has expired
- 403
host_not_allowed: the viewer does not administer the groupRefusal application/json - 404
host_not_allowed: there is no such groupRefusal application/json
Request
curl -X POST "https://api.example.org/events/" \
-H "Authorization: Bearer $TOKEN" \
-H "Content-Type: application/json" \
-d '{
"access": "public",
"address": "string",
"body": "string",
"capacity": 1,
"city": "string",
"country": "string",
"ends_at": "2026-10-27T09:30:00Z",
"host_group_id": 42,
"name": "string",
"online_url": "https://example.org/",
"open_to_host_followers": false,
"postal_code": "string",
"show_map": false,
"starts_at": "2026-10-27T09:30:00Z",
"state_province": "string",
"timezone_name": "string",
"website_url": "https://example.org/"
}'
const response = await fetch('https://api.example.org/events/', {
method: 'POST',
headers: { Authorization: `Bearer ${token}`, 'Content-Type': 'application/json' },
body: JSON.stringify({
"access": "public",
"address": "string",
"body": "string",
"capacity": 1,
"city": "string",
"country": "string",
"ends_at": "2026-10-27T09:30:00Z",
"host_group_id": 42,
"name": "string",
"online_url": "https://example.org/",
"open_to_host_followers": false,
"postal_code": "string",
"show_map": false,
"starts_at": "2026-10-27T09:30:00Z",
"state_province": "string",
"timezone_name": "string",
"website_url": "https://example.org/"
}),
});
const answer = await response.json();
import requests
response = requests.post(
"https://api.example.org/events/",
headers={"Authorization": f"Bearer {token}"},
json={
"access": "public",
"address": "string",
"body": "string",
"capacity": 1,
"city": "string",
"country": "string",
"ends_at": "2026-10-27T09:30:00Z",
"host_group_id": 42,
"name": "string",
"online_url": "https://example.org/",
"open_to_host_followers": False,
"postal_code": "string",
"show_map": False,
"starts_at": "2026-10-27T09:30:00Z",
"state_province": "string",
"timezone_name": "string",
"website_url": "https://example.org/"
},
)
answer = response.json()
Answer · 201
{
"access": "string",
"administrators": [
{
"alias": "string",
"avatar_urls": {
"key": null
},
"id": 42,
"name": "string",
"type": "string"
}
],
"alias": "string",
"allow_download": false,
"allow_follow_request": false,
"archived_at": "2026-10-27T09:30:00Z",
"author": {
"alias": "string",
"avatar_urls": {
"key": null
},
"id": 42,
"name": "string",
"type": "string"
},
"authorized": {
"add_follower": false,
"administration": false,
"audiences": [
"string"
],
"block_from_owner": false,
"comment": false,
"composers": [
"string"
],
"delete": false,
"download": false,
"edit": false,
"hide": false,
"invite": false,
"like": false,
"pin": false,
"quote": false
},
"avatar_urls": {
"key": {
"size": null,
"url": "https://example.org/"
}
},
"body": "string",
"cover_urls": {
"key": {
"size": null,
"url": "https://example.org/"
}
},
"created_at": "2026-10-27T09:30:00Z",
"deleted_at": "2026-10-27T09:30:00Z",
"editor": {
"alias": "string",
"avatar_urls": {
"key": null
},
"id": 42,
"name": "string",
"type": "string"
},
"enabled": false,
"event": {
"address": {
"city": null,
"country": null,
"latitude": null,
"longitude": null,
"postal_code": null,
"state_province": null,
"street": null
},
"cancelled_at": "2026-10-27T09:30:00Z",
"capacity": 1,
"ends_at": "2026-10-27T09:30:00Z",
"going_count": 1,
"has_address": false,
"has_online_url": false,
"host": {
"alias": null,
"avatar_urls": null,
"id": null,
"name": null,
"type": null,
"verified": null
},
"is_full": false,
"maybe_count": 1,
"online_url": "https://example.org/",
"open_to_host_followers": false,
"starts_at": "2026-10-27T09:30:00Z",
"state": "string",
"timezone_name": "string",
"viewer_rsvp": "string"
},
"featured_at": "2026-10-27T09:30:00Z",
"features": [
{
"add_permissions": [
null
],
"composers": [
null
],
"enabled": false,
"node_types": [
null
],
"optional": false,
"ordering": 1,
"service": "string"
}
],
"follower_count": 1,
"id": 42,
"is_admined_by_viewer": false,
"is_blocked_by_viewer": false,
"is_following_viewer": false,
"is_invited": false,
"is_leading_viewer": false,
"leader_count": 1,
"name": "string",
"origin_domain": "string",
"permissions": {
"key": "string"
},
"quote_policy": "string",
"show_reposts_on_profile": false,
"type": "string",
"updated_at": "2026-10-27T09:30:00Z",
"uri": "https://example.org/",
"verified": false,
"website_url": "https://example.org/"
}
One event
/events/{id}To somebody it is not open to, but who may ask to follow it, what a stranger is shown of it.
Who: Anyone, signed in or not
Parameters
idintegerrequiredin pathThe profile's id.
Answers
- 200it, or what a stranger is shown of it (LimitedActor)ActorNode application/json
- 400the request is not well formed, or a value in it is not one it may be
- 403the viewer may not see it
- 404there is no such event
Request
curl "https://api.example.org/events/<id>"
const response = await fetch('https://api.example.org/events/<id>', {
method: 'GET',
});
const answer = await response.json();
import requests
response = requests.get(
"https://api.example.org/events/<id>",
)
answer = response.json()
Answer · 200
{
"access": "string",
"administrators": [
{
"alias": "string",
"avatar_urls": {
"key": null
},
"id": 42,
"name": "string",
"type": "string"
}
],
"alias": "string",
"allow_download": false,
"allow_follow_request": false,
"archived_at": "2026-10-27T09:30:00Z",
"author": {
"alias": "string",
"avatar_urls": {
"key": null
},
"id": 42,
"name": "string",
"type": "string"
},
"authorized": {
"add_follower": false,
"administration": false,
"audiences": [
"string"
],
"block_from_owner": false,
"comment": false,
"composers": [
"string"
],
"delete": false,
"download": false,
"edit": false,
"hide": false,
"invite": false,
"like": false,
"pin": false,
"quote": false
},
"avatar_urls": {
"key": {
"size": null,
"url": "https://example.org/"
}
},
"body": "string",
"cover_urls": {
"key": {
"size": null,
"url": "https://example.org/"
}
},
"created_at": "2026-10-27T09:30:00Z",
"deleted_at": "2026-10-27T09:30:00Z",
"editor": {
"alias": "string",
"avatar_urls": {
"key": null
},
"id": 42,
"name": "string",
"type": "string"
},
"enabled": false,
"event": {
"address": {
"city": null,
"country": null,
"latitude": null,
"longitude": null,
"postal_code": null,
"state_province": null,
"street": null
},
"cancelled_at": "2026-10-27T09:30:00Z",
"capacity": 1,
"ends_at": "2026-10-27T09:30:00Z",
"going_count": 1,
"has_address": false,
"has_online_url": false,
"host": {
"alias": null,
"avatar_urls": null,
"id": null,
"name": null,
"type": null,
"verified": null
},
"is_full": false,
"maybe_count": 1,
"online_url": "https://example.org/",
"open_to_host_followers": false,
"starts_at": "2026-10-27T09:30:00Z",
"state": "string",
"timezone_name": "string",
"viewer_rsvp": "string"
},
"featured_at": "2026-10-27T09:30:00Z",
"features": [
{
"add_permissions": [
null
],
"composers": [
null
],
"enabled": false,
"node_types": [
null
],
"optional": false,
"ordering": 1,
"service": "string"
}
],
"follower_count": 1,
"id": 42,
"is_admined_by_viewer": false,
"is_blocked_by_viewer": false,
"is_following_viewer": false,
"is_invited": false,
"is_leading_viewer": false,
"leader_count": 1,
"name": "string",
"origin_domain": "string",
"permissions": {
"key": "string"
},
"quote_policy": "string",
"show_reposts_on_profile": false,
"type": "string",
"updated_at": "2026-10-27T09:30:00Z",
"uri": "https://example.org/",
"verified": false,
"website_url": "https://example.org/"
}
Change an event
/events/{id}Who: Somebody signed in
Parameters
idintegerrequiredin pathThe event's id.
Body application/json or application/x-www-form-urlencoded or multipart/form-data
addressstringWhere it is held, when it is somewhere: an address as it is typed, kept on the event and shown to whoever is going. Not a place on the map, which is public. Every part is optional. At most 255 characters.bodystringWhat it is about. At most 8000 characters.capacityintegerHow many may be going. 0, or left out, for no limit. At least 0. At most 100000.citystringAt most 100 characters.countrystringAt most 100 characters.ends_atstringrequiredAt most 40 characters.namestringrequiredWhat it is called. At most 64 characters.online_urlstring (uri)Where to join, when it is online. At most 512 characters.open_to_host_followersbooleanWhether everybody who follows the group hosting it may see that it is on and answer it. Means nothing on an event with no host.postal_codestringAt most 20 characters.show_mapbooleanWhether to show that address on a map. Off unless asked for: finding it means sending it to a mapping service, and an address may be somebody's home.starts_atstringrequiredWhen, as RFC 3339 with an offset: 2026-11-05T19:00:00-05:00. At most 40 characters.state_provincestringAt most 100 characters.timezone_namestringrequiredThe zone those times were chosen in, as IANA names it. At most 64 characters.website_urlstring (uri)One link. At most 255 characters.
Answers
Request
curl -X PATCH "https://api.example.org/events/<id>" \
-H "Authorization: Bearer $TOKEN" \
-H "Content-Type: application/json" \
-d '{
"address": "string",
"body": "string",
"capacity": 1,
"city": "string",
"country": "string",
"ends_at": "2026-10-27T09:30:00Z",
"name": "string",
"online_url": "https://example.org/",
"open_to_host_followers": false,
"postal_code": "string",
"show_map": false,
"starts_at": "2026-10-27T09:30:00Z",
"state_province": "string",
"timezone_name": "string",
"website_url": "https://example.org/"
}'
const response = await fetch('https://api.example.org/events/<id>', {
method: 'PATCH',
headers: { Authorization: `Bearer ${token}`, 'Content-Type': 'application/json' },
body: JSON.stringify({
"address": "string",
"body": "string",
"capacity": 1,
"city": "string",
"country": "string",
"ends_at": "2026-10-27T09:30:00Z",
"name": "string",
"online_url": "https://example.org/",
"open_to_host_followers": false,
"postal_code": "string",
"show_map": false,
"starts_at": "2026-10-27T09:30:00Z",
"state_province": "string",
"timezone_name": "string",
"website_url": "https://example.org/"
}),
});
const answer = await response.json();
import requests
response = requests.patch(
"https://api.example.org/events/<id>",
headers={"Authorization": f"Bearer {token}"},
json={
"address": "string",
"body": "string",
"capacity": 1,
"city": "string",
"country": "string",
"ends_at": "2026-10-27T09:30:00Z",
"name": "string",
"online_url": "https://example.org/",
"open_to_host_followers": False,
"postal_code": "string",
"show_map": False,
"starts_at": "2026-10-27T09:30:00Z",
"state_province": "string",
"timezone_name": "string",
"website_url": "https://example.org/"
},
)
answer = response.json()
Answer · 200
{
"access": "string",
"administrators": [
{
"alias": "string",
"avatar_urls": {
"key": null
},
"id": 42,
"name": "string",
"type": "string"
}
],
"alias": "string",
"allow_download": false,
"allow_follow_request": false,
"archived_at": "2026-10-27T09:30:00Z",
"author": {
"alias": "string",
"avatar_urls": {
"key": null
},
"id": 42,
"name": "string",
"type": "string"
},
"authorized": {
"add_follower": false,
"administration": false,
"audiences": [
"string"
],
"block_from_owner": false,
"comment": false,
"composers": [
"string"
],
"delete": false,
"download": false,
"edit": false,
"hide": false,
"invite": false,
"like": false,
"pin": false,
"quote": false
},
"avatar_urls": {
"key": {
"size": null,
"url": "https://example.org/"
}
},
"body": "string",
"cover_urls": {
"key": {
"size": null,
"url": "https://example.org/"
}
},
"created_at": "2026-10-27T09:30:00Z",
"deleted_at": "2026-10-27T09:30:00Z",
"editor": {
"alias": "string",
"avatar_urls": {
"key": null
},
"id": 42,
"name": "string",
"type": "string"
},
"enabled": false,
"event": {
"address": {
"city": null,
"country": null,
"latitude": null,
"longitude": null,
"postal_code": null,
"state_province": null,
"street": null
},
"cancelled_at": "2026-10-27T09:30:00Z",
"capacity": 1,
"ends_at": "2026-10-27T09:30:00Z",
"going_count": 1,
"has_address": false,
"has_online_url": false,
"host": {
"alias": null,
"avatar_urls": null,
"id": null,
"name": null,
"type": null,
"verified": null
},
"is_full": false,
"maybe_count": 1,
"online_url": "https://example.org/",
"open_to_host_followers": false,
"starts_at": "2026-10-27T09:30:00Z",
"state": "string",
"timezone_name": "string",
"viewer_rsvp": "string"
},
"featured_at": "2026-10-27T09:30:00Z",
"features": [
{
"add_permissions": [
null
],
"composers": [
null
],
"enabled": false,
"node_types": [
null
],
"optional": false,
"ordering": 1,
"service": "string"
}
],
"follower_count": 1,
"id": 42,
"is_admined_by_viewer": false,
"is_blocked_by_viewer": false,
"is_following_viewer": false,
"is_invited": false,
"is_leading_viewer": false,
"leader_count": 1,
"name": "string",
"origin_domain": "string",
"permissions": {
"key": "string"
},
"quote_policy": "string",
"show_reposts_on_profile": false,
"type": "string",
"updated_at": "2026-10-27T09:30:00Z",
"uri": "https://example.org/",
"verified": false,
"website_url": "https://example.org/"
}
Delete a event
/events/{id}It is out of sight at once and destroyed after thirty days, unless it is restored before then.
Who: Somebody signed in, who has just proved who they are again
Parameters
idintegerrequiredin pathThe profile's id.
Answers
- 200it will be deleted
- 400the request is not well formed, or a value in it is not one it may be
- 401no token, or one that has expired
- 403
step_up_required: the viewer must prove who they are again first; or the viewer may not, without a bodyRefusal application/json - 404there is no such profile
Request
curl -X DELETE "https://api.example.org/events/<id>" \
-H "Authorization: Bearer $TOKEN"
const response = await fetch('https://api.example.org/events/<id>', {
method: 'DELETE',
headers: { Authorization: `Bearer ${token}` },
});
const answer = await response.json();
import requests
response = requests.delete(
"https://api.example.org/events/<id>",
headers={"Authorization": f"Bearer {token}"},
)
answer = response.json()
Change who may see it
/events/{id}/accessAnd whether people it is not open to may ask to follow it.
Who: Somebody signed in
Parameters
idintegerrequiredin pathThe profile's id.
Body application/x-www-form-urlencoded or multipart/form-data
accessstringrequiredWho may see it:public,registered,followersoradmins. One ofpublic,registered,followers,admins.publicunless given.allow_follow_requestbooleanWhether people it is not open to may ask to follow it.
Answers
- 200OKActorNode application/json
- 400the request is not well formed, or a value in it is not one it may be
- 401no token, or one that has expired
- 403the viewer may not change it
- 404there is no such profile
Request
curl -X PATCH "https://api.example.org/events/<id>/access" \
-H "Authorization: Bearer $TOKEN" \
--data-urlencode "access=public" \
--data-urlencode "allow_follow_request=false"
const form = new URLSearchParams();
form.append('access', "public");
form.append('allow_follow_request', "false");
const response = await fetch('https://api.example.org/events/<id>/access', {
method: 'PATCH',
headers: { Authorization: `Bearer ${token}` },
body: form,
});
const answer = await response.json();
import requests
response = requests.patch(
"https://api.example.org/events/<id>/access",
headers={"Authorization": f"Bearer {token}"},
data={"access": "public", "allow_follow_request": "false"},
)
answer = response.json()
Answer · 200
{
"access": "string",
"administrators": [
{
"alias": "string",
"avatar_urls": {
"key": null
},
"id": 42,
"name": "string",
"type": "string"
}
],
"alias": "string",
"allow_download": false,
"allow_follow_request": false,
"archived_at": "2026-10-27T09:30:00Z",
"author": {
"alias": "string",
"avatar_urls": {
"key": null
},
"id": 42,
"name": "string",
"type": "string"
},
"authorized": {
"add_follower": false,
"administration": false,
"audiences": [
"string"
],
"block_from_owner": false,
"comment": false,
"composers": [
"string"
],
"delete": false,
"download": false,
"edit": false,
"hide": false,
"invite": false,
"like": false,
"pin": false,
"quote": false
},
"avatar_urls": {
"key": {
"size": null,
"url": "https://example.org/"
}
},
"body": "string",
"cover_urls": {
"key": {
"size": null,
"url": "https://example.org/"
}
},
"created_at": "2026-10-27T09:30:00Z",
"deleted_at": "2026-10-27T09:30:00Z",
"editor": {
"alias": "string",
"avatar_urls": {
"key": null
},
"id": 42,
"name": "string",
"type": "string"
},
"enabled": false,
"event": {
"address": {
"city": null,
"country": null,
"latitude": null,
"longitude": null,
"postal_code": null,
"state_province": null,
"street": null
},
"cancelled_at": "2026-10-27T09:30:00Z",
"capacity": 1,
"ends_at": "2026-10-27T09:30:00Z",
"going_count": 1,
"has_address": false,
"has_online_url": false,
"host": {
"alias": null,
"avatar_urls": null,
"id": null,
"name": null,
"type": null,
"verified": null
},
"is_full": false,
"maybe_count": 1,
"online_url": "https://example.org/",
"open_to_host_followers": false,
"starts_at": "2026-10-27T09:30:00Z",
"state": "string",
"timezone_name": "string",
"viewer_rsvp": "string"
},
"featured_at": "2026-10-27T09:30:00Z",
"features": [
{
"add_permissions": [
null
],
"composers": [
null
],
"enabled": false,
"node_types": [
null
],
"optional": false,
"ordering": 1,
"service": "string"
}
],
"follower_count": 1,
"id": 42,
"is_admined_by_viewer": false,
"is_blocked_by_viewer": false,
"is_following_viewer": false,
"is_invited": false,
"is_leading_viewer": false,
"leader_count": 1,
"name": "string",
"origin_domain": "string",
"permissions": {
"key": "string"
},
"quote_policy": "string",
"show_reposts_on_profile": false,
"type": "string",
"updated_at": "2026-10-27T09:30:00Z",
"uri": "https://example.org/",
"verified": false,
"website_url": "https://example.org/"
}
A event's administrators
/events/{id}/admins/Who: Somebody signed in
Parameters
idintegerrequiredin pathThe group's or the event's id.startintegerin queryHow many to pass over. At least 0.limitintegerin queryThe most to send. At least 0.20unless given.dirstringin queryWhich way the order runs. At most 4 characters. One ofasc,desc.ascunless given.
Answers
- 200OKobject application/json
- 400the request is not well formed, or a value in it is not one it may be
- 401no token, or one that has expired
- 403the viewer may not see them
- 404there is no such event
Request
curl "https://api.example.org/events/<id>/admins/" \
-H "Authorization: Bearer $TOKEN"
const response = await fetch('https://api.example.org/events/<id>/admins/', {
method: 'GET',
headers: { Authorization: `Bearer ${token}` },
});
const answer = await response.json();
import requests
response = requests.get(
"https://api.example.org/events/<id>/admins/",
headers={"Authorization": f"Bearer {token}"},
)
answer = response.json()
Answer · 200
{
"data": [
{
"access": "string",
"alias": "string",
"allow_download": false,
"allow_follow_request": false,
"archived_at": "2026-10-27T09:30:00Z",
"author": {
"alias": null,
"avatar_urls": null,
"id": null,
"name": null,
"type": null
},
"avatar_urls": {
"key": null
},
"body": "string",
"cover_urls": {
"key": null
},
"created_at": "2026-10-27T09:30:00Z",
"deleted_at": "2026-10-27T09:30:00Z",
"enabled": false,
"event": {
"address": null,
"cancelled_at": null,
"capacity": null,
"ends_at": null,
"going_count": null,
"has_address": null,
"has_online_url": null,
"host": null,
"is_full": null,
"maybe_count": null,
"online_url": null,
"open_to_host_followers": null,
"starts_at": null,
"state": null,
"timezone_name": null,
"viewer_rsvp": null
},
"featured_at": "2026-10-27T09:30:00Z",
"follower_count": 1,
"id": 42,
"is_admined_by_viewer": false,
"is_blocked_by_viewer": false,
"is_following_viewer": false,
"is_invited": false,
"is_leading_viewer": false,
"leader_count": 1,
"name": "string",
"origin_domain": "string",
"quote_policy": "string",
"show_reposts_on_profile": false,
"type": "string",
"uri": "https://example.org/",
"verified": false,
"website_url": "https://example.org/"
}
]
}
Make somebody an administrator of a event
/events/{id}/admins/By one of its administrators. Answers with them.
Who: Somebody signed in
Parameters
idintegerrequiredin pathThe group's or the event's id.
Body application/x-www-form-urlencoded or multipart/form-data
admin_idintegerrequiredThe person to make an administrator.
Answers
- 201CreatedActorNodeItem application/json
- 400the request is not well formed, or a value in it is not one it may be
- 401no token, or one that has expired
- 403the viewer may not
- 404there is no such event or person
Request
curl -X POST "https://api.example.org/events/<id>/admins/" \
-H "Authorization: Bearer $TOKEN" \
--data-urlencode "admin_id=42"
const form = new URLSearchParams();
form.append('admin_id', "42");
const response = await fetch('https://api.example.org/events/<id>/admins/', {
method: 'POST',
headers: { Authorization: `Bearer ${token}` },
body: form,
});
const answer = await response.json();
import requests
response = requests.post(
"https://api.example.org/events/<id>/admins/",
headers={"Authorization": f"Bearer {token}"},
data={"admin_id": "42"},
)
answer = response.json()
Answer · 201
{
"access": "string",
"alias": "string",
"allow_download": false,
"allow_follow_request": false,
"archived_at": "2026-10-27T09:30:00Z",
"author": {
"alias": "string",
"avatar_urls": {
"key": null
},
"id": 42,
"name": "string",
"type": "string"
},
"avatar_urls": {
"key": {
"size": null,
"url": "https://example.org/"
}
},
"body": "string",
"cover_urls": {
"key": {
"size": null,
"url": "https://example.org/"
}
},
"created_at": "2026-10-27T09:30:00Z",
"deleted_at": "2026-10-27T09:30:00Z",
"enabled": false,
"event": {
"address": {
"city": null,
"country": null,
"latitude": null,
"longitude": null,
"postal_code": null,
"state_province": null,
"street": null
},
"cancelled_at": "2026-10-27T09:30:00Z",
"capacity": 1,
"ends_at": "2026-10-27T09:30:00Z",
"going_count": 1,
"has_address": false,
"has_online_url": false,
"host": {
"alias": null,
"avatar_urls": null,
"id": null,
"name": null,
"type": null,
"verified": null
},
"is_full": false,
"maybe_count": 1,
"online_url": "https://example.org/",
"open_to_host_followers": false,
"starts_at": "2026-10-27T09:30:00Z",
"state": "string",
"timezone_name": "string",
"viewer_rsvp": "string"
},
"featured_at": "2026-10-27T09:30:00Z",
"follower_count": 1,
"id": 42,
"is_admined_by_viewer": false,
"is_blocked_by_viewer": false,
"is_following_viewer": false,
"is_invited": false,
"is_leading_viewer": false,
"leader_count": 1,
"name": "string",
"origin_domain": "string",
"quote_policy": "string",
"show_reposts_on_profile": false,
"type": "string",
"uri": "https://example.org/",
"verified": false,
"website_url": "https://example.org/"
}
Remove an administrator of a event
/events/{id}/admins/{admin_id}Who: Somebody signed in
Parameters
idintegerrequiredin pathThe group's or the event's id.admin_idintegerrequiredin pathThe administrator to remove.
Answers
- 204removed
- 400the request is not well formed, or a value in it is not one it may be
- 401no token, or one that has expired
- 403the viewer may not
- 404there is no such event or administrator
Request
curl -X DELETE "https://api.example.org/events/<id>/admins/<admin_id>" \
-H "Authorization: Bearer $TOKEN"
const response = await fetch('https://api.example.org/events/<id>/admins/<admin_id>', {
method: 'DELETE',
headers: { Authorization: `Bearer ${token}` },
});
const answer = await response.json();
import requests
response = requests.delete(
"https://api.example.org/events/<id>/admins/<admin_id>",
headers={"Authorization": f"Bearer {token}"},
)
answer = response.json()
Archive a event
/events/{id}/archiveFor good, and nothing is destroyed (account-lifecycle.md).
Who: Somebody signed in, who has just proved who they are again
Parameters
idintegerrequiredin pathThe profile's id.
Answers
- 200archived
- 204archived already, or being deleted
- 400the request is not well formed, or a value in it is not one it may be
- 401no token, or one that has expired
- 403
step_up_required: the viewer must prove who they are again first; or the viewer may not, without a bodyRefusal application/json - 404there is no such profile
Request
curl -X POST "https://api.example.org/events/<id>/archive" \
-H "Authorization: Bearer $TOKEN"
const response = await fetch('https://api.example.org/events/<id>/archive', {
method: 'POST',
headers: { Authorization: `Bearer ${token}` },
});
const answer = await response.json();
import requests
response = requests.post(
"https://api.example.org/events/<id>/archive",
headers={"Authorization": f"Bearer {token}"},
)
answer = response.json()
Who is going to an event, or may
/events/{id}/attendees/Who: Anyone, signed in or not
Parameters
idintegerrequiredin pathThe event's id.rsvpstringin querygoing or maybe. Going when left out. One ofgoing,maybe.startintegerin queryHow many to pass over. At least 0.limitintegerin queryThe most to send: up to 100. At least 0. At most 100.20unless given.
Answers
- 200OKobject application/json
- 400the request is not well formed, or a value in it is not one it may be
- 403the viewer may not see who is going
- 404there is no such event
Request
curl "https://api.example.org/events/<id>/attendees/"
const response = await fetch('https://api.example.org/events/<id>/attendees/', {
method: 'GET',
});
const answer = await response.json();
import requests
response = requests.get(
"https://api.example.org/events/<id>/attendees/",
)
answer = response.json()
Answer · 200
{
"data": [
{
"access": "string",
"alias": "string",
"allow_download": false,
"allow_follow_request": false,
"archived_at": "2026-10-27T09:30:00Z",
"author": {
"alias": null,
"avatar_urls": null,
"id": null,
"name": null,
"type": null
},
"avatar_urls": {
"key": null
},
"body": "string",
"cover_urls": {
"key": null
},
"created_at": "2026-10-27T09:30:00Z",
"deleted_at": "2026-10-27T09:30:00Z",
"enabled": false,
"event": {
"address": null,
"cancelled_at": null,
"capacity": null,
"ends_at": null,
"going_count": null,
"has_address": null,
"has_online_url": null,
"host": null,
"is_full": null,
"maybe_count": null,
"online_url": null,
"open_to_host_followers": null,
"starts_at": null,
"state": null,
"timezone_name": null,
"viewer_rsvp": null
},
"featured_at": "2026-10-27T09:30:00Z",
"follower_count": 1,
"id": 42,
"is_admined_by_viewer": false,
"is_blocked_by_viewer": false,
"is_following_viewer": false,
"is_invited": false,
"is_leading_viewer": false,
"leader_count": 1,
"name": "string",
"origin_domain": "string",
"quote_policy": "string",
"show_reposts_on_profile": false,
"type": "string",
"uri": "https://example.org/",
"verified": false,
"website_url": "https://example.org/"
}
],
"pagination": {
"limit": 1,
"offset": 1,
"total": 1
}
}
Call an event off
/events/{id}/cancelIt is kept, saying so. Answers with it.
Who: Somebody signed in
Parameters
idintegerrequiredin pathThe event's id.
Answers
- 200OKActorNode application/json
- 400the request is not well formed, or a value in it is not one it may be
- 401no token, or one that has expired
- 403the viewer does not look after it
- 404there is no such event
Request
curl -X POST "https://api.example.org/events/<id>/cancel" \
-H "Authorization: Bearer $TOKEN"
const response = await fetch('https://api.example.org/events/<id>/cancel', {
method: 'POST',
headers: { Authorization: `Bearer ${token}` },
});
const answer = await response.json();
import requests
response = requests.post(
"https://api.example.org/events/<id>/cancel",
headers={"Authorization": f"Bearer {token}"},
)
answer = response.json()
Answer · 200
{
"access": "string",
"administrators": [
{
"alias": "string",
"avatar_urls": {
"key": null
},
"id": 42,
"name": "string",
"type": "string"
}
],
"alias": "string",
"allow_download": false,
"allow_follow_request": false,
"archived_at": "2026-10-27T09:30:00Z",
"author": {
"alias": "string",
"avatar_urls": {
"key": null
},
"id": 42,
"name": "string",
"type": "string"
},
"authorized": {
"add_follower": false,
"administration": false,
"audiences": [
"string"
],
"block_from_owner": false,
"comment": false,
"composers": [
"string"
],
"delete": false,
"download": false,
"edit": false,
"hide": false,
"invite": false,
"like": false,
"pin": false,
"quote": false
},
"avatar_urls": {
"key": {
"size": null,
"url": "https://example.org/"
}
},
"body": "string",
"cover_urls": {
"key": {
"size": null,
"url": "https://example.org/"
}
},
"created_at": "2026-10-27T09:30:00Z",
"deleted_at": "2026-10-27T09:30:00Z",
"editor": {
"alias": "string",
"avatar_urls": {
"key": null
},
"id": 42,
"name": "string",
"type": "string"
},
"enabled": false,
"event": {
"address": {
"city": null,
"country": null,
"latitude": null,
"longitude": null,
"postal_code": null,
"state_province": null,
"street": null
},
"cancelled_at": "2026-10-27T09:30:00Z",
"capacity": 1,
"ends_at": "2026-10-27T09:30:00Z",
"going_count": 1,
"has_address": false,
"has_online_url": false,
"host": {
"alias": null,
"avatar_urls": null,
"id": null,
"name": null,
"type": null,
"verified": null
},
"is_full": false,
"maybe_count": 1,
"online_url": "https://example.org/",
"open_to_host_followers": false,
"starts_at": "2026-10-27T09:30:00Z",
"state": "string",
"timezone_name": "string",
"viewer_rsvp": "string"
},
"featured_at": "2026-10-27T09:30:00Z",
"features": [
{
"add_permissions": [
null
],
"composers": [
null
],
"enabled": false,
"node_types": [
null
],
"optional": false,
"ordering": 1,
"service": "string"
}
],
"follower_count": 1,
"id": 42,
"is_admined_by_viewer": false,
"is_blocked_by_viewer": false,
"is_following_viewer": false,
"is_invited": false,
"is_leading_viewer": false,
"leader_count": 1,
"name": "string",
"origin_domain": "string",
"permissions": {
"key": "string"
},
"quote_policy": "string",
"show_reposts_on_profile": false,
"type": "string",
"updated_at": "2026-10-27T09:30:00Z",
"uri": "https://example.org/",
"verified": false,
"website_url": "https://example.org/"
}
What deleting a event would take with it
/events/{id}/deletion-countsFor the Danger zone, for whoever may delete it.
Who: Somebody signed in
Parameters
idintegerrequiredin pathThe profile's id.
Answers
- 200OKactor.GroupDeletionCounts application/json
- 400the request is not well formed, or a value in it is not one it may be
- 401no token, or one that has expired
- 403the viewer may not delete it
- 404there is no such profile
Request
curl "https://api.example.org/events/<id>/deletion-counts" \
-H "Authorization: Bearer $TOKEN"
const response = await fetch('https://api.example.org/events/<id>/deletion-counts', {
method: 'GET',
headers: { Authorization: `Bearer ${token}` },
});
const answer = await response.json();
import requests
response = requests.get(
"https://api.example.org/events/<id>/deletion-counts",
headers={"Authorization": f"Bearer {token}"},
)
answer = response.json()
Answer · 200
{
"admins": 1,
"followers": 1,
"member_since": "string",
"posts": 1,
"replies": 1
}
Turn a profile on or off
/events/{id}/enabledReversible, site administrators only. Off, it is out of sight and may not act; nothing is deleted.
Who: Somebody signed in
Parameters
idintegerrequiredin pathThe profile's id.
Body application/json
enabledbooleanrequiredWhether it is shown and may act. Off, it is out of sight until it is turned on again; nothing is deleted.
Answers
- 200done
- 204it was so already
- 400the request is not well formed, or a value in it is not one it may be
- 401no token, or one that has expired
- 403the viewer may not
- 404there is no such profile
Request
curl -X PATCH "https://api.example.org/events/<id>/enabled" \
-H "Authorization: Bearer $TOKEN" \
-H "Content-Type: application/json" \
-d '{
"enabled": false
}'
const response = await fetch('https://api.example.org/events/<id>/enabled', {
method: 'PATCH',
headers: { Authorization: `Bearer ${token}`, 'Content-Type': 'application/json' },
body: JSON.stringify({
"enabled": false
}),
});
const answer = await response.json();
import requests
response = requests.patch(
"https://api.example.org/events/<id>/enabled",
headers={"Authorization": f"Bearer {token}"},
json={
"enabled": False
},
)
answer = response.json()
Change what may be posted on it
/events/{id}/featuresEach kind of post, on or off, and who may add it (permissions.md).
Who: Somebody signed in
Parameters
idintegerrequiredin pathThe profile's id.
Body application/json
- Each feature as it is to be. An empty list goes back to the installation's defaults.
Answers
- 200OKActorNode application/json
- 400the request is not well formed, or a value in it is not one it may be
- 401no token, or one that has expired
- 403the viewer may not change it
- 404there is no such profile
Request
curl -X PATCH "https://api.example.org/events/<id>/features" \
-H "Authorization: Bearer $TOKEN" \
-H "Content-Type: application/json" \
-d '{
"features": [
{
"add_permissions": [
null
],
"composers": [
"string"
],
"enabled": false,
"node_types": [
"string"
],
"optional": false,
"ordering": 1,
"service": "string"
}
]
}'
const response = await fetch('https://api.example.org/events/<id>/features', {
method: 'PATCH',
headers: { Authorization: `Bearer ${token}`, 'Content-Type': 'application/json' },
body: JSON.stringify({
"features": [
{
"add_permissions": [
null
],
"composers": [
"string"
],
"enabled": false,
"node_types": [
"string"
],
"optional": false,
"ordering": 1,
"service": "string"
}
]
}),
});
const answer = await response.json();
import requests
response = requests.patch(
"https://api.example.org/events/<id>/features",
headers={"Authorization": f"Bearer {token}"},
json={
"features": [
{
"add_permissions": [
None
],
"composers": [
"string"
],
"enabled": False,
"node_types": [
"string"
],
"optional": False,
"ordering": 1,
"service": "string"
}
]
},
)
answer = response.json()
Answer · 200
{
"access": "string",
"administrators": [
{
"alias": "string",
"avatar_urls": {
"key": null
},
"id": 42,
"name": "string",
"type": "string"
}
],
"alias": "string",
"allow_download": false,
"allow_follow_request": false,
"archived_at": "2026-10-27T09:30:00Z",
"author": {
"alias": "string",
"avatar_urls": {
"key": null
},
"id": 42,
"name": "string",
"type": "string"
},
"authorized": {
"add_follower": false,
"administration": false,
"audiences": [
"string"
],
"block_from_owner": false,
"comment": false,
"composers": [
"string"
],
"delete": false,
"download": false,
"edit": false,
"hide": false,
"invite": false,
"like": false,
"pin": false,
"quote": false
},
"avatar_urls": {
"key": {
"size": null,
"url": "https://example.org/"
}
},
"body": "string",
"cover_urls": {
"key": {
"size": null,
"url": "https://example.org/"
}
},
"created_at": "2026-10-27T09:30:00Z",
"deleted_at": "2026-10-27T09:30:00Z",
"editor": {
"alias": "string",
"avatar_urls": {
"key": null
},
"id": 42,
"name": "string",
"type": "string"
},
"enabled": false,
"event": {
"address": {
"city": null,
"country": null,
"latitude": null,
"longitude": null,
"postal_code": null,
"state_province": null,
"street": null
},
"cancelled_at": "2026-10-27T09:30:00Z",
"capacity": 1,
"ends_at": "2026-10-27T09:30:00Z",
"going_count": 1,
"has_address": false,
"has_online_url": false,
"host": {
"alias": null,
"avatar_urls": null,
"id": null,
"name": null,
"type": null,
"verified": null
},
"is_full": false,
"maybe_count": 1,
"online_url": "https://example.org/",
"open_to_host_followers": false,
"starts_at": "2026-10-27T09:30:00Z",
"state": "string",
"timezone_name": "string",
"viewer_rsvp": "string"
},
"featured_at": "2026-10-27T09:30:00Z",
"features": [
{
"add_permissions": [
null
],
"composers": [
null
],
"enabled": false,
"node_types": [
null
],
"optional": false,
"ordering": 1,
"service": "string"
}
],
"follower_count": 1,
"id": 42,
"is_admined_by_viewer": false,
"is_blocked_by_viewer": false,
"is_following_viewer": false,
"is_invited": false,
"is_leading_viewer": false,
"leader_count": 1,
"name": "string",
"origin_domain": "string",
"permissions": {
"key": "string"
},
"quote_policy": "string",
"show_reposts_on_profile": false,
"type": "string",
"updated_at": "2026-10-27T09:30:00Z",
"uri": "https://example.org/",
"verified": false,
"website_url": "https://example.org/"
}
An event for a calendar
/events/{id}/icsAs iCalendar (RFC 5545), text/calendar, to add to one's own calendar.
Who: Anyone, signed in or not
Parameters
idintegerrequiredin pathThe event's id.
Answers
- 200the event, as
text/calendar - 400the request is not well formed, or a value in it is not one it may be
- 403the viewer may not see it
- 404there is no such event
Request
curl "https://api.example.org/events/<id>/ics"
const response = await fetch('https://api.example.org/events/<id>/ics', {
method: 'GET',
});
const answer = await response.json();
import requests
response = requests.get(
"https://api.example.org/events/<id>/ics",
)
answer = response.json()
Destroy a event for good
/events/{id}/purgeEverything of it, at once and with no thirty days. Super administrators only, never on their own profile. Queued, and done by the sweeper.
Who: A super administrator, who has just proved who they are again
Parameters
idintegerrequiredin pathThe profile's id.
Answers
- 200purged or queued alreadyPurgeQueued application/json
- 202queuedPurgeQueued application/json
- 400the request is not well formed, or a value in it is not one it may be
- 401no token, or one that has expired
- 403
step_up_required: the viewer must prove who they are again first; or the viewer may not, without a bodyRefusal application/json - 409it cannot be purged; nothing was queuedPurgeRefused application/json
Request
curl -X DELETE "https://api.example.org/events/<id>/purge" \
-H "Authorization: Bearer $TOKEN"
const response = await fetch('https://api.example.org/events/<id>/purge', {
method: 'DELETE',
headers: { Authorization: `Bearer ${token}` },
});
const answer = await response.json();
import requests
response = requests.delete(
"https://api.example.org/events/<id>/purge",
headers={"Authorization": f"Bearer {token}"},
)
answer = response.json()
Answer · 200
{
"batch_id": "string",
"queued": 1,
"skipped": 1
}
Restore a deleted event
/events/{id}/restoreWithin the thirty days. Answers with it.
Who: Somebody signed in
Parameters
idintegerrequiredin pathThe profile's id.
Answers
- 200OKActorNode application/json
- 400the request is not well formed, or a value in it is not one it may be
- 401no token, or one that has expired
- 403the viewer may not
- 404there is no such profile to restore
Request
curl -X POST "https://api.example.org/events/<id>/restore" \
-H "Authorization: Bearer $TOKEN"
const response = await fetch('https://api.example.org/events/<id>/restore', {
method: 'POST',
headers: { Authorization: `Bearer ${token}` },
});
const answer = await response.json();
import requests
response = requests.post(
"https://api.example.org/events/<id>/restore",
headers={"Authorization": f"Bearer {token}"},
)
answer = response.json()
Answer · 200
{
"access": "string",
"administrators": [
{
"alias": "string",
"avatar_urls": {
"key": null
},
"id": 42,
"name": "string",
"type": "string"
}
],
"alias": "string",
"allow_download": false,
"allow_follow_request": false,
"archived_at": "2026-10-27T09:30:00Z",
"author": {
"alias": "string",
"avatar_urls": {
"key": null
},
"id": 42,
"name": "string",
"type": "string"
},
"authorized": {
"add_follower": false,
"administration": false,
"audiences": [
"string"
],
"block_from_owner": false,
"comment": false,
"composers": [
"string"
],
"delete": false,
"download": false,
"edit": false,
"hide": false,
"invite": false,
"like": false,
"pin": false,
"quote": false
},
"avatar_urls": {
"key": {
"size": null,
"url": "https://example.org/"
}
},
"body": "string",
"cover_urls": {
"key": {
"size": null,
"url": "https://example.org/"
}
},
"created_at": "2026-10-27T09:30:00Z",
"deleted_at": "2026-10-27T09:30:00Z",
"editor": {
"alias": "string",
"avatar_urls": {
"key": null
},
"id": 42,
"name": "string",
"type": "string"
},
"enabled": false,
"event": {
"address": {
"city": null,
"country": null,
"latitude": null,
"longitude": null,
"postal_code": null,
"state_province": null,
"street": null
},
"cancelled_at": "2026-10-27T09:30:00Z",
"capacity": 1,
"ends_at": "2026-10-27T09:30:00Z",
"going_count": 1,
"has_address": false,
"has_online_url": false,
"host": {
"alias": null,
"avatar_urls": null,
"id": null,
"name": null,
"type": null,
"verified": null
},
"is_full": false,
"maybe_count": 1,
"online_url": "https://example.org/",
"open_to_host_followers": false,
"starts_at": "2026-10-27T09:30:00Z",
"state": "string",
"timezone_name": "string",
"viewer_rsvp": "string"
},
"featured_at": "2026-10-27T09:30:00Z",
"features": [
{
"add_permissions": [
null
],
"composers": [
null
],
"enabled": false,
"node_types": [
null
],
"optional": false,
"ordering": 1,
"service": "string"
}
],
"follower_count": 1,
"id": 42,
"is_admined_by_viewer": false,
"is_blocked_by_viewer": false,
"is_following_viewer": false,
"is_invited": false,
"is_leading_viewer": false,
"leader_count": 1,
"name": "string",
"origin_domain": "string",
"permissions": {
"key": "string"
},
"quote_policy": "string",
"show_reposts_on_profile": false,
"type": "string",
"updated_at": "2026-10-27T09:30:00Z",
"uri": "https://example.org/",
"verified": false,
"website_url": "https://example.org/"
}
Say going, or maybe
/events/{id}/rsvpAnswers with the event.
Who: Somebody signed in
Parameters
idintegerrequiredin pathThe event's id.
Body application/json or application/x-www-form-urlencoded or multipart/form-data
rsvpstringrequiredgoingormaybe. One ofgoing,maybe.
Answers
- 200OKActorNode application/json
- 400the request is not well formed, or a value in it is not one it may be
- 401no token, or one that has expired
- 403the viewer may not go to it
- 404there is no such event
- 409
event_full: every place is taken; maybe is still open; orrules_not_agreed: it is a group or an event with rules the viewer has not agreed to; tick each and agree (POST /groups|events/:id/rules/agree), then ask againRefusal application/json - 410
event_closed: it is over or called offRefusal application/json
Request
curl -X PUT "https://api.example.org/events/<id>/rsvp" \
-H "Authorization: Bearer $TOKEN" \
-H "Content-Type: application/json" \
-d '{
"rsvp": "going"
}'
const response = await fetch('https://api.example.org/events/<id>/rsvp', {
method: 'PUT',
headers: { Authorization: `Bearer ${token}`, 'Content-Type': 'application/json' },
body: JSON.stringify({
"rsvp": "going"
}),
});
const answer = await response.json();
import requests
response = requests.put(
"https://api.example.org/events/<id>/rsvp",
headers={"Authorization": f"Bearer {token}"},
json={
"rsvp": "going"
},
)
answer = response.json()
Answer · 200
{
"access": "string",
"administrators": [
{
"alias": "string",
"avatar_urls": {
"key": null
},
"id": 42,
"name": "string",
"type": "string"
}
],
"alias": "string",
"allow_download": false,
"allow_follow_request": false,
"archived_at": "2026-10-27T09:30:00Z",
"author": {
"alias": "string",
"avatar_urls": {
"key": null
},
"id": 42,
"name": "string",
"type": "string"
},
"authorized": {
"add_follower": false,
"administration": false,
"audiences": [
"string"
],
"block_from_owner": false,
"comment": false,
"composers": [
"string"
],
"delete": false,
"download": false,
"edit": false,
"hide": false,
"invite": false,
"like": false,
"pin": false,
"quote": false
},
"avatar_urls": {
"key": {
"size": null,
"url": "https://example.org/"
}
},
"body": "string",
"cover_urls": {
"key": {
"size": null,
"url": "https://example.org/"
}
},
"created_at": "2026-10-27T09:30:00Z",
"deleted_at": "2026-10-27T09:30:00Z",
"editor": {
"alias": "string",
"avatar_urls": {
"key": null
},
"id": 42,
"name": "string",
"type": "string"
},
"enabled": false,
"event": {
"address": {
"city": null,
"country": null,
"latitude": null,
"longitude": null,
"postal_code": null,
"state_province": null,
"street": null
},
"cancelled_at": "2026-10-27T09:30:00Z",
"capacity": 1,
"ends_at": "2026-10-27T09:30:00Z",
"going_count": 1,
"has_address": false,
"has_online_url": false,
"host": {
"alias": null,
"avatar_urls": null,
"id": null,
"name": null,
"type": null,
"verified": null
},
"is_full": false,
"maybe_count": 1,
"online_url": "https://example.org/",
"open_to_host_followers": false,
"starts_at": "2026-10-27T09:30:00Z",
"state": "string",
"timezone_name": "string",
"viewer_rsvp": "string"
},
"featured_at": "2026-10-27T09:30:00Z",
"features": [
{
"add_permissions": [
null
],
"composers": [
null
],
"enabled": false,
"node_types": [
null
],
"optional": false,
"ordering": 1,
"service": "string"
}
],
"follower_count": 1,
"id": 42,
"is_admined_by_viewer": false,
"is_blocked_by_viewer": false,
"is_following_viewer": false,
"is_invited": false,
"is_leading_viewer": false,
"leader_count": 1,
"name": "string",
"origin_domain": "string",
"permissions": {
"key": "string"
},
"quote_policy": "string",
"show_reposts_on_profile": false,
"type": "string",
"updated_at": "2026-10-27T09:30:00Z",
"uri": "https://example.org/",
"verified": false,
"website_url": "https://example.org/"
}
Not going after all
/events/{id}/rsvpWho: Somebody signed in
Parameters
idintegerrequiredin pathThe event's id.
Answers
- 204done
- 400the request is not well formed, or a value in it is not one it may be
- 401no token, or one that has expired
- 403the viewer may not
- 404there is no such event
Request
curl -X DELETE "https://api.example.org/events/<id>/rsvp" \
-H "Authorization: Bearer $TOKEN"
const response = await fetch('https://api.example.org/events/<id>/rsvp', {
method: 'DELETE',
headers: { Authorization: `Bearer ${token}` },
});
const answer = await response.json();
import requests
response = requests.delete(
"https://api.example.org/events/<id>/rsvp",
headers={"Authorization": f"Bearer {token}"},
)
answer = response.json()
The rules of a event
/events/{id}/rulesWhat somebody agrees to, each ticked, before following it or answering it: at most ten, in order, with the version they are at and the version the viewer last agreed to. For whoever may see it, and for whoever it would let ask to follow.
Who: Anyone, signed in or not
Parameters
idintegerrequiredin pathThe profile's id.
Answers
- 200OKactor.Rules application/json
- 400the request is not well formed, or a value in it is not one it may be
- 403the viewer may not see it
- 404there is no such event
Request
curl "https://api.example.org/events/<id>/rules"
const response = await fetch('https://api.example.org/events/<id>/rules', {
method: 'GET',
});
const answer = await response.json();
import requests
response = requests.get(
"https://api.example.org/events/<id>/rules",
)
answer = response.json()
Answer · 200
{
"agreed_version": 1,
"items": [
{
"body": "string",
"title": "string"
}
],
"updated_at": "2026-10-27T09:30:00Z",
"version": 1
}
Set the rules of a event
/events/{id}/rulesThe rules as they are to be from now on, in order, at most ten; an empty list takes them away. Every change raises the version, so that whoever agreed before is asked again. For whoever may change it.
Who: Somebody signed in
Parameters
idintegerrequiredin path
Body application/json
itemslist of actor.RuleAt most 10 of them.
Answers
- 200OKactor.Rules application/json
- 400
rules_invalid: more than ten, or one too longRefusal application/json - 401no token, or one that has expired
- 403the viewer may not change it
- 404there is no such event
Request
curl -X PUT "https://api.example.org/events/<id>/rules" \
-H "Authorization: Bearer $TOKEN" \
-H "Content-Type: application/json" \
-d '{
"items": [
{
"body": "string",
"title": "string"
}
]
}'
const response = await fetch('https://api.example.org/events/<id>/rules', {
method: 'PUT',
headers: { Authorization: `Bearer ${token}`, 'Content-Type': 'application/json' },
body: JSON.stringify({
"items": [
{
"body": "string",
"title": "string"
}
]
}),
});
const answer = await response.json();
import requests
response = requests.put(
"https://api.example.org/events/<id>/rules",
headers={"Authorization": f"Bearer {token}"},
json={
"items": [
{
"body": "string",
"title": "string"
}
]
},
)
answer = response.json()
Answer · 200
{
"agreed_version": 1,
"items": [
{
"body": "string",
"title": "string"
}
],
"updated_at": "2026-10-27T09:30:00Z",
"version": 1
}
Agree to the rules of a event
/events/{id}/rules/agreeThe viewer agreeing, each rule ticked, to the version they were shown.
Who: Somebody signed in
Parameters
idintegerrequiredin path
Body application/json
versionintegerrequired
Answers
- 204No Content
- 400the request is not well formed, or a value in it is not one it may be
- 401no token, or one that has expired
- 404there is no such event
- 409
rules_not_current: the rules changed since; read them againRefusal application/json
Request
curl -X POST "https://api.example.org/events/<id>/rules/agree" \
-H "Authorization: Bearer $TOKEN" \
-H "Content-Type: application/json" \
-d '{
"version": 1
}'
const response = await fetch('https://api.example.org/events/<id>/rules/agree', {
method: 'POST',
headers: { Authorization: `Bearer ${token}`, 'Content-Type': 'application/json' },
body: JSON.stringify({
"version": 1
}),
});
const answer = await response.json();
import requests
response = requests.post(
"https://api.example.org/events/<id>/rules/agree",
headers={"Authorization": f"Bearer {token}"},
json={
"version": 1
},
)
answer = response.json()
The viewer's events
/events/mineThe ones they said going or maybe to, look after, or were invited to.
Who: Somebody signed in
Parameters
filterstringin queryupcoming, past, hosting or invited. Upcoming when left out. One ofupcoming,past,hosting,invited.startintegerin queryHow many to pass over. At least 0.limitintegerin queryThe most to send: up to 100. At least 0. At most 100.20unless given.
Answers
- 200OKobject application/json
- 400the request is not well formed, or a value in it is not one it may be
- 401no token, or one that has expired
Request
curl "https://api.example.org/events/mine" \
-H "Authorization: Bearer $TOKEN"
const response = await fetch('https://api.example.org/events/mine', {
method: 'GET',
headers: { Authorization: `Bearer ${token}` },
});
const answer = await response.json();
import requests
response = requests.get(
"https://api.example.org/events/mine",
headers={"Authorization": f"Bearer {token}"},
)
answer = response.json()
Answer · 200
{
"data": [
null
],
"pagination": {
"limit": 1,
"offset": 1,
"total": 1
}
}
Groups
/groups/Those the viewer may see. Each a full profile, or, for one the viewer may only ask to follow, what a stranger is shown of it (restricted).
Who: Anyone, signed in or not
Parameters
startintegerin queryHow many to pass over. At least 0.limitintegerin queryThe most to send. At least 0.20unless given.qstringin queryWords the name, the handle or the description holds. At most 100 characters.orderingstringin queryWhat they are ordered by. At most 15 characters. One ofcreated_at,updated_at,enabled.updated_atunless given.dirstringin queryWhich way the order runs. At most 4 characters. One ofasc,desc.descunless given.disabledbooleanin queryDisabled ones as well, for whoever may see them.featuredbooleanin queryOnly the actors the installation features — what onboarding offers a new member to follow. Ordered most recently featured first unless the caller asks for an ordering; see the browse handlers.
Answers
- 200OKobject application/json
- 400the request is not well formed, or a value in it is not one it may be
- 403the viewer may not list groups
Request
curl "https://api.example.org/groups/"
const response = await fetch('https://api.example.org/groups/', {
method: 'GET',
});
const answer = await response.json();
import requests
response = requests.get(
"https://api.example.org/groups/",
)
answer = response.json()
Answer · 200
{
"data": [
null
],
"pagination": {
"limit": 1,
"offset": 1,
"total": 1
}
}
Make a group
/groups/Whoever makes it is its first administrator.
Who: Somebody signed in
Body application/x-www-form-urlencoded or multipart/form-data
bodystringWhat it says of itself. At most 500 characters.enabledbooleanWhether it is enabled.trueunless given.namestringrequiredIts name. At most 64 characters.website_urlstring (uri)One link on the profile. A bareexample.comis taken as https. At most 255 characters.
Answers
- 201CreatedActorNode application/json
- 400the request is not well formed, or a value in it is not one it may be
- 401no token, or one that has expired
Request
curl -X POST "https://api.example.org/groups/" \
-H "Authorization: Bearer $TOKEN" \
--data-urlencode "body=string" \
--data-urlencode "enabled=true" \
--data-urlencode "name=string" \
--data-urlencode "website_url=https://example.org/"
const form = new URLSearchParams();
form.append('body', "string");
form.append('enabled', "true");
form.append('name', "string");
form.append('website_url', "https://example.org/");
const response = await fetch('https://api.example.org/groups/', {
method: 'POST',
headers: { Authorization: `Bearer ${token}` },
body: form,
});
const answer = await response.json();
import requests
response = requests.post(
"https://api.example.org/groups/",
headers={"Authorization": f"Bearer {token}"},
data={"body": "string", "enabled": "true", "name": "string", "website_url": "https://example.org/"},
)
answer = response.json()
Answer · 201
{
"access": "string",
"administrators": [
{
"alias": "string",
"avatar_urls": {
"key": null
},
"id": 42,
"name": "string",
"type": "string"
}
],
"alias": "string",
"allow_download": false,
"allow_follow_request": false,
"archived_at": "2026-10-27T09:30:00Z",
"author": {
"alias": "string",
"avatar_urls": {
"key": null
},
"id": 42,
"name": "string",
"type": "string"
},
"authorized": {
"add_follower": false,
"administration": false,
"audiences": [
"string"
],
"block_from_owner": false,
"comment": false,
"composers": [
"string"
],
"delete": false,
"download": false,
"edit": false,
"hide": false,
"invite": false,
"like": false,
"pin": false,
"quote": false
},
"avatar_urls": {
"key": {
"size": null,
"url": "https://example.org/"
}
},
"body": "string",
"cover_urls": {
"key": {
"size": null,
"url": "https://example.org/"
}
},
"created_at": "2026-10-27T09:30:00Z",
"deleted_at": "2026-10-27T09:30:00Z",
"editor": {
"alias": "string",
"avatar_urls": {
"key": null
},
"id": 42,
"name": "string",
"type": "string"
},
"enabled": false,
"event": {
"address": {
"city": null,
"country": null,
"latitude": null,
"longitude": null,
"postal_code": null,
"state_province": null,
"street": null
},
"cancelled_at": "2026-10-27T09:30:00Z",
"capacity": 1,
"ends_at": "2026-10-27T09:30:00Z",
"going_count": 1,
"has_address": false,
"has_online_url": false,
"host": {
"alias": null,
"avatar_urls": null,
"id": null,
"name": null,
"type": null,
"verified": null
},
"is_full": false,
"maybe_count": 1,
"online_url": "https://example.org/",
"open_to_host_followers": false,
"starts_at": "2026-10-27T09:30:00Z",
"state": "string",
"timezone_name": "string",
"viewer_rsvp": "string"
},
"featured_at": "2026-10-27T09:30:00Z",
"features": [
{
"add_permissions": [
null
],
"composers": [
null
],
"enabled": false,
"node_types": [
null
],
"optional": false,
"ordering": 1,
"service": "string"
}
],
"follower_count": 1,
"id": 42,
"is_admined_by_viewer": false,
"is_blocked_by_viewer": false,
"is_following_viewer": false,
"is_invited": false,
"is_leading_viewer": false,
"leader_count": 1,
"name": "string",
"origin_domain": "string",
"permissions": {
"key": "string"
},
"quote_policy": "string",
"show_reposts_on_profile": false,
"type": "string",
"updated_at": "2026-10-27T09:30:00Z",
"uri": "https://example.org/",
"verified": false,
"website_url": "https://example.org/"
}
One group
/groups/{id}To somebody it is not open to, but who may ask to follow it, what a stranger is shown of it.
Who: Anyone, signed in or not
Parameters
idintegerrequiredin pathThe profile's id.
Answers
- 200it, or what a stranger is shown of it (LimitedActor)ActorNode application/json
- 400the request is not well formed, or a value in it is not one it may be
- 403the viewer may not see it
- 404there is no such group
Request
curl "https://api.example.org/groups/<id>"
const response = await fetch('https://api.example.org/groups/<id>', {
method: 'GET',
});
const answer = await response.json();
import requests
response = requests.get(
"https://api.example.org/groups/<id>",
)
answer = response.json()
Answer · 200
{
"access": "string",
"administrators": [
{
"alias": "string",
"avatar_urls": {
"key": null
},
"id": 42,
"name": "string",
"type": "string"
}
],
"alias": "string",
"allow_download": false,
"allow_follow_request": false,
"archived_at": "2026-10-27T09:30:00Z",
"author": {
"alias": "string",
"avatar_urls": {
"key": null
},
"id": 42,
"name": "string",
"type": "string"
},
"authorized": {
"add_follower": false,
"administration": false,
"audiences": [
"string"
],
"block_from_owner": false,
"comment": false,
"composers": [
"string"
],
"delete": false,
"download": false,
"edit": false,
"hide": false,
"invite": false,
"like": false,
"pin": false,
"quote": false
},
"avatar_urls": {
"key": {
"size": null,
"url": "https://example.org/"
}
},
"body": "string",
"cover_urls": {
"key": {
"size": null,
"url": "https://example.org/"
}
},
"created_at": "2026-10-27T09:30:00Z",
"deleted_at": "2026-10-27T09:30:00Z",
"editor": {
"alias": "string",
"avatar_urls": {
"key": null
},
"id": 42,
"name": "string",
"type": "string"
},
"enabled": false,
"event": {
"address": {
"city": null,
"country": null,
"latitude": null,
"longitude": null,
"postal_code": null,
"state_province": null,
"street": null
},
"cancelled_at": "2026-10-27T09:30:00Z",
"capacity": 1,
"ends_at": "2026-10-27T09:30:00Z",
"going_count": 1,
"has_address": false,
"has_online_url": false,
"host": {
"alias": null,
"avatar_urls": null,
"id": null,
"name": null,
"type": null,
"verified": null
},
"is_full": false,
"maybe_count": 1,
"online_url": "https://example.org/",
"open_to_host_followers": false,
"starts_at": "2026-10-27T09:30:00Z",
"state": "string",
"timezone_name": "string",
"viewer_rsvp": "string"
},
"featured_at": "2026-10-27T09:30:00Z",
"features": [
{
"add_permissions": [
null
],
"composers": [
null
],
"enabled": false,
"node_types": [
null
],
"optional": false,
"ordering": 1,
"service": "string"
}
],
"follower_count": 1,
"id": 42,
"is_admined_by_viewer": false,
"is_blocked_by_viewer": false,
"is_following_viewer": false,
"is_invited": false,
"is_leading_viewer": false,
"leader_count": 1,
"name": "string",
"origin_domain": "string",
"permissions": {
"key": "string"
},
"quote_policy": "string",
"show_reposts_on_profile": false,
"type": "string",
"updated_at": "2026-10-27T09:30:00Z",
"uri": "https://example.org/",
"verified": false,
"website_url": "https://example.org/"
}
Change a group
/groups/{id}Who: Somebody signed in
Parameters
idintegerrequiredin pathThe profile's id.
Body application/x-www-form-urlencoded or multipart/form-data
bodystringWhat it says of itself. At most 500 characters.enabledbooleanWhether it is enabled.namestringrequiredIts name. At most 64 characters.website_urlstring (uri)One link on the profile. A bareexample.comis taken as https. At most 255 characters.
Answers
- 200OKActorNode application/json
- 400the request is not well formed, or a value in it is not one it may be
- 401no token, or one that has expired
- 403the viewer may not change it
- 404there is no such group
Request
curl -X PATCH "https://api.example.org/groups/<id>" \
-H "Authorization: Bearer $TOKEN" \
--data-urlencode "body=string" \
--data-urlencode "enabled=false" \
--data-urlencode "name=string" \
--data-urlencode "website_url=https://example.org/"
const form = new URLSearchParams();
form.append('body', "string");
form.append('enabled', "false");
form.append('name', "string");
form.append('website_url', "https://example.org/");
const response = await fetch('https://api.example.org/groups/<id>', {
method: 'PATCH',
headers: { Authorization: `Bearer ${token}` },
body: form,
});
const answer = await response.json();
import requests
response = requests.patch(
"https://api.example.org/groups/<id>",
headers={"Authorization": f"Bearer {token}"},
data={"body": "string", "enabled": "false", "name": "string", "website_url": "https://example.org/"},
)
answer = response.json()
Answer · 200
{
"access": "string",
"administrators": [
{
"alias": "string",
"avatar_urls": {
"key": null
},
"id": 42,
"name": "string",
"type": "string"
}
],
"alias": "string",
"allow_download": false,
"allow_follow_request": false,
"archived_at": "2026-10-27T09:30:00Z",
"author": {
"alias": "string",
"avatar_urls": {
"key": null
},
"id": 42,
"name": "string",
"type": "string"
},
"authorized": {
"add_follower": false,
"administration": false,
"audiences": [
"string"
],
"block_from_owner": false,
"comment": false,
"composers": [
"string"
],
"delete": false,
"download": false,
"edit": false,
"hide": false,
"invite": false,
"like": false,
"pin": false,
"quote": false
},
"avatar_urls": {
"key": {
"size": null,
"url": "https://example.org/"
}
},
"body": "string",
"cover_urls": {
"key": {
"size": null,
"url": "https://example.org/"
}
},
"created_at": "2026-10-27T09:30:00Z",
"deleted_at": "2026-10-27T09:30:00Z",
"editor": {
"alias": "string",
"avatar_urls": {
"key": null
},
"id": 42,
"name": "string",
"type": "string"
},
"enabled": false,
"event": {
"address": {
"city": null,
"country": null,
"latitude": null,
"longitude": null,
"postal_code": null,
"state_province": null,
"street": null
},
"cancelled_at": "2026-10-27T09:30:00Z",
"capacity": 1,
"ends_at": "2026-10-27T09:30:00Z",
"going_count": 1,
"has_address": false,
"has_online_url": false,
"host": {
"alias": null,
"avatar_urls": null,
"id": null,
"name": null,
"type": null,
"verified": null
},
"is_full": false,
"maybe_count": 1,
"online_url": "https://example.org/",
"open_to_host_followers": false,
"starts_at": "2026-10-27T09:30:00Z",
"state": "string",
"timezone_name": "string",
"viewer_rsvp": "string"
},
"featured_at": "2026-10-27T09:30:00Z",
"features": [
{
"add_permissions": [
null
],
"composers": [
null
],
"enabled": false,
"node_types": [
null
],
"optional": false,
"ordering": 1,
"service": "string"
}
],
"follower_count": 1,
"id": 42,
"is_admined_by_viewer": false,
"is_blocked_by_viewer": false,
"is_following_viewer": false,
"is_invited": false,
"is_leading_viewer": false,
"leader_count": 1,
"name": "string",
"origin_domain": "string",
"permissions": {
"key": "string"
},
"quote_policy": "string",
"show_reposts_on_profile": false,
"type": "string",
"updated_at": "2026-10-27T09:30:00Z",
"uri": "https://example.org/",
"verified": false,
"website_url": "https://example.org/"
}
Delete a group
/groups/{id}It is out of sight at once and destroyed after thirty days, unless it is restored before then.
Who: Somebody signed in, who has just proved who they are again
Parameters
idintegerrequiredin pathThe profile's id.
Answers
- 200it will be deleted
- 400the request is not well formed, or a value in it is not one it may be
- 401no token, or one that has expired
- 403
step_up_required: the viewer must prove who they are again first; or the viewer may not, without a bodyRefusal application/json - 404there is no such profile
Request
curl -X DELETE "https://api.example.org/groups/<id>" \
-H "Authorization: Bearer $TOKEN"
const response = await fetch('https://api.example.org/groups/<id>', {
method: 'DELETE',
headers: { Authorization: `Bearer ${token}` },
});
const answer = await response.json();
import requests
response = requests.delete(
"https://api.example.org/groups/<id>",
headers={"Authorization": f"Bearer {token}"},
)
answer = response.json()
Change who may see it
/groups/{id}/accessAnd whether people it is not open to may ask to follow it.
Who: Somebody signed in
Parameters
idintegerrequiredin pathThe profile's id.
Body application/x-www-form-urlencoded or multipart/form-data
accessstringrequiredWho may see it:public,registered,followersoradmins. One ofpublic,registered,followers,admins.publicunless given.allow_follow_requestbooleanWhether people it is not open to may ask to follow it.
Answers
- 200OKActorNode application/json
- 400the request is not well formed, or a value in it is not one it may be
- 401no token, or one that has expired
- 403the viewer may not change it
- 404there is no such profile
Request
curl -X PATCH "https://api.example.org/groups/<id>/access" \
-H "Authorization: Bearer $TOKEN" \
--data-urlencode "access=public" \
--data-urlencode "allow_follow_request=false"
const form = new URLSearchParams();
form.append('access', "public");
form.append('allow_follow_request', "false");
const response = await fetch('https://api.example.org/groups/<id>/access', {
method: 'PATCH',
headers: { Authorization: `Bearer ${token}` },
body: form,
});
const answer = await response.json();
import requests
response = requests.patch(
"https://api.example.org/groups/<id>/access",
headers={"Authorization": f"Bearer {token}"},
data={"access": "public", "allow_follow_request": "false"},
)
answer = response.json()
Answer · 200
{
"access": "string",
"administrators": [
{
"alias": "string",
"avatar_urls": {
"key": null
},
"id": 42,
"name": "string",
"type": "string"
}
],
"alias": "string",
"allow_download": false,
"allow_follow_request": false,
"archived_at": "2026-10-27T09:30:00Z",
"author": {
"alias": "string",
"avatar_urls": {
"key": null
},
"id": 42,
"name": "string",
"type": "string"
},
"authorized": {
"add_follower": false,
"administration": false,
"audiences": [
"string"
],
"block_from_owner": false,
"comment": false,
"composers": [
"string"
],
"delete": false,
"download": false,
"edit": false,
"hide": false,
"invite": false,
"like": false,
"pin": false,
"quote": false
},
"avatar_urls": {
"key": {
"size": null,
"url": "https://example.org/"
}
},
"body": "string",
"cover_urls": {
"key": {
"size": null,
"url": "https://example.org/"
}
},
"created_at": "2026-10-27T09:30:00Z",
"deleted_at": "2026-10-27T09:30:00Z",
"editor": {
"alias": "string",
"avatar_urls": {
"key": null
},
"id": 42,
"name": "string",
"type": "string"
},
"enabled": false,
"event": {
"address": {
"city": null,
"country": null,
"latitude": null,
"longitude": null,
"postal_code": null,
"state_province": null,
"street": null
},
"cancelled_at": "2026-10-27T09:30:00Z",
"capacity": 1,
"ends_at": "2026-10-27T09:30:00Z",
"going_count": 1,
"has_address": false,
"has_online_url": false,
"host": {
"alias": null,
"avatar_urls": null,
"id": null,
"name": null,
"type": null,
"verified": null
},
"is_full": false,
"maybe_count": 1,
"online_url": "https://example.org/",
"open_to_host_followers": false,
"starts_at": "2026-10-27T09:30:00Z",
"state": "string",
"timezone_name": "string",
"viewer_rsvp": "string"
},
"featured_at": "2026-10-27T09:30:00Z",
"features": [
{
"add_permissions": [
null
],
"composers": [
null
],
"enabled": false,
"node_types": [
null
],
"optional": false,
"ordering": 1,
"service": "string"
}
],
"follower_count": 1,
"id": 42,
"is_admined_by_viewer": false,
"is_blocked_by_viewer": false,
"is_following_viewer": false,
"is_invited": false,
"is_leading_viewer": false,
"leader_count": 1,
"name": "string",
"origin_domain": "string",
"permissions": {
"key": "string"
},
"quote_policy": "string",
"show_reposts_on_profile": false,
"type": "string",
"updated_at": "2026-10-27T09:30:00Z",
"uri": "https://example.org/",
"verified": false,
"website_url": "https://example.org/"
}
A group's administrators
/groups/{id}/admins/Who: Somebody signed in
Parameters
idintegerrequiredin pathThe group's or the event's id.startintegerin queryHow many to pass over. At least 0.limitintegerin queryThe most to send. At least 0.20unless given.dirstringin queryWhich way the order runs. At most 4 characters. One ofasc,desc.ascunless given.
Answers
- 200OKobject application/json
- 400the request is not well formed, or a value in it is not one it may be
- 401no token, or one that has expired
- 403the viewer may not see them
- 404there is no such group
Request
curl "https://api.example.org/groups/<id>/admins/" \
-H "Authorization: Bearer $TOKEN"
const response = await fetch('https://api.example.org/groups/<id>/admins/', {
method: 'GET',
headers: { Authorization: `Bearer ${token}` },
});
const answer = await response.json();
import requests
response = requests.get(
"https://api.example.org/groups/<id>/admins/",
headers={"Authorization": f"Bearer {token}"},
)
answer = response.json()
Answer · 200
{
"data": [
{
"access": "string",
"alias": "string",
"allow_download": false,
"allow_follow_request": false,
"archived_at": "2026-10-27T09:30:00Z",
"author": {
"alias": null,
"avatar_urls": null,
"id": null,
"name": null,
"type": null
},
"avatar_urls": {
"key": null
},
"body": "string",
"cover_urls": {
"key": null
},
"created_at": "2026-10-27T09:30:00Z",
"deleted_at": "2026-10-27T09:30:00Z",
"enabled": false,
"event": {
"address": null,
"cancelled_at": null,
"capacity": null,
"ends_at": null,
"going_count": null,
"has_address": null,
"has_online_url": null,
"host": null,
"is_full": null,
"maybe_count": null,
"online_url": null,
"open_to_host_followers": null,
"starts_at": null,
"state": null,
"timezone_name": null,
"viewer_rsvp": null
},
"featured_at": "2026-10-27T09:30:00Z",
"follower_count": 1,
"id": 42,
"is_admined_by_viewer": false,
"is_blocked_by_viewer": false,
"is_following_viewer": false,
"is_invited": false,
"is_leading_viewer": false,
"leader_count": 1,
"name": "string",
"origin_domain": "string",
"quote_policy": "string",
"show_reposts_on_profile": false,
"type": "string",
"uri": "https://example.org/",
"verified": false,
"website_url": "https://example.org/"
}
]
}
Make somebody an administrator of a group
/groups/{id}/admins/By one of its administrators. Answers with them.
Who: Somebody signed in
Parameters
idintegerrequiredin pathThe group's or the event's id.
Body application/x-www-form-urlencoded or multipart/form-data
admin_idintegerrequiredThe person to make an administrator.
Answers
- 201CreatedActorNodeItem application/json
- 400the request is not well formed, or a value in it is not one it may be
- 401no token, or one that has expired
- 403the viewer may not
- 404there is no such group or person
Request
curl -X POST "https://api.example.org/groups/<id>/admins/" \
-H "Authorization: Bearer $TOKEN" \
--data-urlencode "admin_id=42"
const form = new URLSearchParams();
form.append('admin_id', "42");
const response = await fetch('https://api.example.org/groups/<id>/admins/', {
method: 'POST',
headers: { Authorization: `Bearer ${token}` },
body: form,
});
const answer = await response.json();
import requests
response = requests.post(
"https://api.example.org/groups/<id>/admins/",
headers={"Authorization": f"Bearer {token}"},
data={"admin_id": "42"},
)
answer = response.json()
Answer · 201
{
"access": "string",
"alias": "string",
"allow_download": false,
"allow_follow_request": false,
"archived_at": "2026-10-27T09:30:00Z",
"author": {
"alias": "string",
"avatar_urls": {
"key": null
},
"id": 42,
"name": "string",
"type": "string"
},
"avatar_urls": {
"key": {
"size": null,
"url": "https://example.org/"
}
},
"body": "string",
"cover_urls": {
"key": {
"size": null,
"url": "https://example.org/"
}
},
"created_at": "2026-10-27T09:30:00Z",
"deleted_at": "2026-10-27T09:30:00Z",
"enabled": false,
"event": {
"address": {
"city": null,
"country": null,
"latitude": null,
"longitude": null,
"postal_code": null,
"state_province": null,
"street": null
},
"cancelled_at": "2026-10-27T09:30:00Z",
"capacity": 1,
"ends_at": "2026-10-27T09:30:00Z",
"going_count": 1,
"has_address": false,
"has_online_url": false,
"host": {
"alias": null,
"avatar_urls": null,
"id": null,
"name": null,
"type": null,
"verified": null
},
"is_full": false,
"maybe_count": 1,
"online_url": "https://example.org/",
"open_to_host_followers": false,
"starts_at": "2026-10-27T09:30:00Z",
"state": "string",
"timezone_name": "string",
"viewer_rsvp": "string"
},
"featured_at": "2026-10-27T09:30:00Z",
"follower_count": 1,
"id": 42,
"is_admined_by_viewer": false,
"is_blocked_by_viewer": false,
"is_following_viewer": false,
"is_invited": false,
"is_leading_viewer": false,
"leader_count": 1,
"name": "string",
"origin_domain": "string",
"quote_policy": "string",
"show_reposts_on_profile": false,
"type": "string",
"uri": "https://example.org/",
"verified": false,
"website_url": "https://example.org/"
}
Remove an administrator of a group
/groups/{id}/admins/{admin_id}Who: Somebody signed in
Parameters
idintegerrequiredin pathThe group's or the event's id.admin_idintegerrequiredin pathThe administrator to remove.
Answers
- 204removed
- 400the request is not well formed, or a value in it is not one it may be
- 401no token, or one that has expired
- 403the viewer may not
- 404there is no such group or administrator
Request
curl -X DELETE "https://api.example.org/groups/<id>/admins/<admin_id>" \
-H "Authorization: Bearer $TOKEN"
const response = await fetch('https://api.example.org/groups/<id>/admins/<admin_id>', {
method: 'DELETE',
headers: { Authorization: `Bearer ${token}` },
});
const answer = await response.json();
import requests
response = requests.delete(
"https://api.example.org/groups/<id>/admins/<admin_id>",
headers={"Authorization": f"Bearer {token}"},
)
answer = response.json()
Archive a group
/groups/{id}/archiveFor good, and nothing is destroyed (account-lifecycle.md).
Who: Somebody signed in, who has just proved who they are again
Parameters
idintegerrequiredin pathThe profile's id.
Answers
- 200archived
- 204archived already, or being deleted
- 400the request is not well formed, or a value in it is not one it may be
- 401no token, or one that has expired
- 403
step_up_required: the viewer must prove who they are again first; or the viewer may not, without a bodyRefusal application/json - 404there is no such profile
Request
curl -X POST "https://api.example.org/groups/<id>/archive" \
-H "Authorization: Bearer $TOKEN"
const response = await fetch('https://api.example.org/groups/<id>/archive', {
method: 'POST',
headers: { Authorization: `Bearer ${token}` },
});
const answer = await response.json();
import requests
response = requests.post(
"https://api.example.org/groups/<id>/archive",
headers={"Authorization": f"Bearer {token}"},
)
answer = response.json()
What deleting a group would take with it
/groups/{id}/deletion-countsFor the Danger zone, for whoever may delete it.
Who: Somebody signed in
Parameters
idintegerrequiredin pathThe profile's id.
Answers
- 200OKactor.GroupDeletionCounts application/json
- 400the request is not well formed, or a value in it is not one it may be
- 401no token, or one that has expired
- 403the viewer may not delete it
- 404there is no such profile
Request
curl "https://api.example.org/groups/<id>/deletion-counts" \
-H "Authorization: Bearer $TOKEN"
const response = await fetch('https://api.example.org/groups/<id>/deletion-counts', {
method: 'GET',
headers: { Authorization: `Bearer ${token}` },
});
const answer = await response.json();
import requests
response = requests.get(
"https://api.example.org/groups/<id>/deletion-counts",
headers={"Authorization": f"Bearer {token}"},
)
answer = response.json()
Answer · 200
{
"admins": 1,
"followers": 1,
"member_since": "string",
"posts": 1,
"replies": 1
}
Change whether new photos and videos may be downloaded
/groups/{id}/download-defaultWhat a post starts with; each post can say otherwise.
Who: Somebody signed in
Parameters
idintegerrequiredin pathThe profile's id.
Body application/json or application/x-www-form-urlencoded or multipart/form-data
allowbooleanWhether its new photos and videos start out downloadable.
Answers
- 200OKActorNode application/json
- 400the request is not well formed, or a value in it is not one it may be
- 401no token, or one that has expired
- 403the viewer may not change it
- 404there is no such profile
Request
curl -X PATCH "https://api.example.org/groups/<id>/download-default" \
-H "Authorization: Bearer $TOKEN" \
-H "Content-Type: application/json" \
-d '{
"allow": false
}'
const response = await fetch('https://api.example.org/groups/<id>/download-default', {
method: 'PATCH',
headers: { Authorization: `Bearer ${token}`, 'Content-Type': 'application/json' },
body: JSON.stringify({
"allow": false
}),
});
const answer = await response.json();
import requests
response = requests.patch(
"https://api.example.org/groups/<id>/download-default",
headers={"Authorization": f"Bearer {token}"},
json={
"allow": False
},
)
answer = response.json()
Answer · 200
{
"access": "string",
"administrators": [
{
"alias": "string",
"avatar_urls": {
"key": null
},
"id": 42,
"name": "string",
"type": "string"
}
],
"alias": "string",
"allow_download": false,
"allow_follow_request": false,
"archived_at": "2026-10-27T09:30:00Z",
"author": {
"alias": "string",
"avatar_urls": {
"key": null
},
"id": 42,
"name": "string",
"type": "string"
},
"authorized": {
"add_follower": false,
"administration": false,
"audiences": [
"string"
],
"block_from_owner": false,
"comment": false,
"composers": [
"string"
],
"delete": false,
"download": false,
"edit": false,
"hide": false,
"invite": false,
"like": false,
"pin": false,
"quote": false
},
"avatar_urls": {
"key": {
"size": null,
"url": "https://example.org/"
}
},
"body": "string",
"cover_urls": {
"key": {
"size": null,
"url": "https://example.org/"
}
},
"created_at": "2026-10-27T09:30:00Z",
"deleted_at": "2026-10-27T09:30:00Z",
"editor": {
"alias": "string",
"avatar_urls": {
"key": null
},
"id": 42,
"name": "string",
"type": "string"
},
"enabled": false,
"event": {
"address": {
"city": null,
"country": null,
"latitude": null,
"longitude": null,
"postal_code": null,
"state_province": null,
"street": null
},
"cancelled_at": "2026-10-27T09:30:00Z",
"capacity": 1,
"ends_at": "2026-10-27T09:30:00Z",
"going_count": 1,
"has_address": false,
"has_online_url": false,
"host": {
"alias": null,
"avatar_urls": null,
"id": null,
"name": null,
"type": null,
"verified": null
},
"is_full": false,
"maybe_count": 1,
"online_url": "https://example.org/",
"open_to_host_followers": false,
"starts_at": "2026-10-27T09:30:00Z",
"state": "string",
"timezone_name": "string",
"viewer_rsvp": "string"
},
"featured_at": "2026-10-27T09:30:00Z",
"features": [
{
"add_permissions": [
null
],
"composers": [
null
],
"enabled": false,
"node_types": [
null
],
"optional": false,
"ordering": 1,
"service": "string"
}
],
"follower_count": 1,
"id": 42,
"is_admined_by_viewer": false,
"is_blocked_by_viewer": false,
"is_following_viewer": false,
"is_invited": false,
"is_leading_viewer": false,
"leader_count": 1,
"name": "string",
"origin_domain": "string",
"permissions": {
"key": "string"
},
"quote_policy": "string",
"show_reposts_on_profile": false,
"type": "string",
"updated_at": "2026-10-27T09:30:00Z",
"uri": "https://example.org/",
"verified": false,
"website_url": "https://example.org/"
}
Turn a profile on or off
/groups/{id}/enabledReversible, site administrators only. Off, it is out of sight and may not act; nothing is deleted.
Who: Somebody signed in
Parameters
idintegerrequiredin pathThe profile's id.
Body application/json
enabledbooleanrequiredWhether it is shown and may act. Off, it is out of sight until it is turned on again; nothing is deleted.
Answers
- 200done
- 204it was so already
- 400the request is not well formed, or a value in it is not one it may be
- 401no token, or one that has expired
- 403the viewer may not
- 404there is no such profile
Request
curl -X PATCH "https://api.example.org/groups/<id>/enabled" \
-H "Authorization: Bearer $TOKEN" \
-H "Content-Type: application/json" \
-d '{
"enabled": false
}'
const response = await fetch('https://api.example.org/groups/<id>/enabled', {
method: 'PATCH',
headers: { Authorization: `Bearer ${token}`, 'Content-Type': 'application/json' },
body: JSON.stringify({
"enabled": false
}),
});
const answer = await response.json();
import requests
response = requests.patch(
"https://api.example.org/groups/<id>/enabled",
headers={"Authorization": f"Bearer {token}"},
json={
"enabled": False
},
)
answer = response.json()
The events a group hosts
/groups/{id}/events/Those the viewer may see. Each an event, or what is shown of one the viewer may only answer as a follower of the group.
Who: Anyone, signed in or not
Parameters
idintegerrequiredin pathThe group.filterstringin queryupcoming or past. Upcoming when left out. One ofupcoming,past.startintegerin queryHow many to pass over. At least 0.limitintegerin queryThe most to send: up to 100. At least 0. At most 100.20unless given.
Answers
- 200OKobject application/json
- 400the request is not well formed, or a value in it is not one it may be
- 403the viewer may not see the group
- 404there is no such group
Request
curl "https://api.example.org/groups/<id>/events/"
const response = await fetch('https://api.example.org/groups/<id>/events/', {
method: 'GET',
});
const answer = await response.json();
import requests
response = requests.get(
"https://api.example.org/groups/<id>/events/",
)
answer = response.json()
Answer · 200
{
"data": [
null
],
"pagination": {
"limit": 1,
"offset": 1,
"total": 1
}
}
Feature a profile, or stop
/groups/{id}/featuredWhat onboarding offers new members to follow. Super administrators only.
Who: Somebody signed in
Parameters
idintegerrequiredin pathThe profile's id.
Body application/json
featuredbooleanrequiredWhether onboarding offers it to follow.
Answers
- 200done
- 204it was so already
- 400the request is not well formed, or a value in it is not one it may be
- 401no token, or one that has expired
- 403the viewer may not
- 404there is no such profile
- 409
not_featurable: it is disabled, archived or deletedRefusal application/json
Request
curl -X PATCH "https://api.example.org/groups/<id>/featured" \
-H "Authorization: Bearer $TOKEN" \
-H "Content-Type: application/json" \
-d '{
"featured": false
}'
const response = await fetch('https://api.example.org/groups/<id>/featured', {
method: 'PATCH',
headers: { Authorization: `Bearer ${token}`, 'Content-Type': 'application/json' },
body: JSON.stringify({
"featured": false
}),
});
const answer = await response.json();
import requests
response = requests.patch(
"https://api.example.org/groups/<id>/featured",
headers={"Authorization": f"Bearer {token}"},
json={
"featured": False
},
)
answer = response.json()
Change what may be posted on it
/groups/{id}/featuresEach kind of post, on or off, and who may add it (permissions.md).
Who: Somebody signed in
Parameters
idintegerrequiredin pathThe profile's id.
Body application/json
- Each feature as it is to be. An empty list goes back to the installation's defaults.
Answers
- 200OKActorNode application/json
- 400the request is not well formed, or a value in it is not one it may be
- 401no token, or one that has expired
- 403the viewer may not change it
- 404there is no such profile
Request
curl -X PATCH "https://api.example.org/groups/<id>/features" \
-H "Authorization: Bearer $TOKEN" \
-H "Content-Type: application/json" \
-d '{
"features": [
{
"add_permissions": [
null
],
"composers": [
"string"
],
"enabled": false,
"node_types": [
"string"
],
"optional": false,
"ordering": 1,
"service": "string"
}
]
}'
const response = await fetch('https://api.example.org/groups/<id>/features', {
method: 'PATCH',
headers: { Authorization: `Bearer ${token}`, 'Content-Type': 'application/json' },
body: JSON.stringify({
"features": [
{
"add_permissions": [
null
],
"composers": [
"string"
],
"enabled": false,
"node_types": [
"string"
],
"optional": false,
"ordering": 1,
"service": "string"
}
]
}),
});
const answer = await response.json();
import requests
response = requests.patch(
"https://api.example.org/groups/<id>/features",
headers={"Authorization": f"Bearer {token}"},
json={
"features": [
{
"add_permissions": [
None
],
"composers": [
"string"
],
"enabled": False,
"node_types": [
"string"
],
"optional": False,
"ordering": 1,
"service": "string"
}
]
},
)
answer = response.json()
Answer · 200
{
"access": "string",
"administrators": [
{
"alias": "string",
"avatar_urls": {
"key": null
},
"id": 42,
"name": "string",
"type": "string"
}
],
"alias": "string",
"allow_download": false,
"allow_follow_request": false,
"archived_at": "2026-10-27T09:30:00Z",
"author": {
"alias": "string",
"avatar_urls": {
"key": null
},
"id": 42,
"name": "string",
"type": "string"
},
"authorized": {
"add_follower": false,
"administration": false,
"audiences": [
"string"
],
"block_from_owner": false,
"comment": false,
"composers": [
"string"
],
"delete": false,
"download": false,
"edit": false,
"hide": false,
"invite": false,
"like": false,
"pin": false,
"quote": false
},
"avatar_urls": {
"key": {
"size": null,
"url": "https://example.org/"
}
},
"body": "string",
"cover_urls": {
"key": {
"size": null,
"url": "https://example.org/"
}
},
"created_at": "2026-10-27T09:30:00Z",
"deleted_at": "2026-10-27T09:30:00Z",
"editor": {
"alias": "string",
"avatar_urls": {
"key": null
},
"id": 42,
"name": "string",
"type": "string"
},
"enabled": false,
"event": {
"address": {
"city": null,
"country": null,
"latitude": null,
"longitude": null,
"postal_code": null,
"state_province": null,
"street": null
},
"cancelled_at": "2026-10-27T09:30:00Z",
"capacity": 1,
"ends_at": "2026-10-27T09:30:00Z",
"going_count": 1,
"has_address": false,
"has_online_url": false,
"host": {
"alias": null,
"avatar_urls": null,
"id": null,
"name": null,
"type": null,
"verified": null
},
"is_full": false,
"maybe_count": 1,
"online_url": "https://example.org/",
"open_to_host_followers": false,
"starts_at": "2026-10-27T09:30:00Z",
"state": "string",
"timezone_name": "string",
"viewer_rsvp": "string"
},
"featured_at": "2026-10-27T09:30:00Z",
"features": [
{
"add_permissions": [
null
],
"composers": [
null
],
"enabled": false,
"node_types": [
null
],
"optional": false,
"ordering": 1,
"service": "string"
}
],
"follower_count": 1,
"id": 42,
"is_admined_by_viewer": false,
"is_blocked_by_viewer": false,
"is_following_viewer": false,
"is_invited": false,
"is_leading_viewer": false,
"leader_count": 1,
"name": "string",
"origin_domain": "string",
"permissions": {
"key": "string"
},
"quote_policy": "string",
"show_reposts_on_profile": false,
"type": "string",
"updated_at": "2026-10-27T09:30:00Z",
"uri": "https://example.org/",
"verified": false,
"website_url": "https://example.org/"
}
Destroy a group for good
/groups/{id}/purgeEverything of it, at once and with no thirty days. Super administrators only, never on their own profile. Queued, and done by the sweeper.
Who: A super administrator, who has just proved who they are again
Parameters
idintegerrequiredin pathThe profile's id.
Answers
- 200purged or queued alreadyPurgeQueued application/json
- 202queuedPurgeQueued application/json
- 400the request is not well formed, or a value in it is not one it may be
- 401no token, or one that has expired
- 403
step_up_required: the viewer must prove who they are again first; or the viewer may not, without a bodyRefusal application/json - 409it cannot be purged; nothing was queuedPurgeRefused application/json
Request
curl -X DELETE "https://api.example.org/groups/<id>/purge" \
-H "Authorization: Bearer $TOKEN"
const response = await fetch('https://api.example.org/groups/<id>/purge', {
method: 'DELETE',
headers: { Authorization: `Bearer ${token}` },
});
const answer = await response.json();
import requests
response = requests.delete(
"https://api.example.org/groups/<id>/purge",
headers={"Authorization": f"Bearer {token}"},
)
answer = response.json()
Answer · 200
{
"batch_id": "string",
"queued": 1,
"skipped": 1
}
Restore a deleted group
/groups/{id}/restoreWithin the thirty days. Answers with it.
Who: Somebody signed in
Parameters
idintegerrequiredin pathThe profile's id.
Answers
- 200OKActorNode application/json
- 400the request is not well formed, or a value in it is not one it may be
- 401no token, or one that has expired
- 403the viewer may not
- 404there is no such profile to restore
Request
curl -X POST "https://api.example.org/groups/<id>/restore" \
-H "Authorization: Bearer $TOKEN"
const response = await fetch('https://api.example.org/groups/<id>/restore', {
method: 'POST',
headers: { Authorization: `Bearer ${token}` },
});
const answer = await response.json();
import requests
response = requests.post(
"https://api.example.org/groups/<id>/restore",
headers={"Authorization": f"Bearer {token}"},
)
answer = response.json()
Answer · 200
{
"access": "string",
"administrators": [
{
"alias": "string",
"avatar_urls": {
"key": null
},
"id": 42,
"name": "string",
"type": "string"
}
],
"alias": "string",
"allow_download": false,
"allow_follow_request": false,
"archived_at": "2026-10-27T09:30:00Z",
"author": {
"alias": "string",
"avatar_urls": {
"key": null
},
"id": 42,
"name": "string",
"type": "string"
},
"authorized": {
"add_follower": false,
"administration": false,
"audiences": [
"string"
],
"block_from_owner": false,
"comment": false,
"composers": [
"string"
],
"delete": false,
"download": false,
"edit": false,
"hide": false,
"invite": false,
"like": false,
"pin": false,
"quote": false
},
"avatar_urls": {
"key": {
"size": null,
"url": "https://example.org/"
}
},
"body": "string",
"cover_urls": {
"key": {
"size": null,
"url": "https://example.org/"
}
},
"created_at": "2026-10-27T09:30:00Z",
"deleted_at": "2026-10-27T09:30:00Z",
"editor": {
"alias": "string",
"avatar_urls": {
"key": null
},
"id": 42,
"name": "string",
"type": "string"
},
"enabled": false,
"event": {
"address": {
"city": null,
"country": null,
"latitude": null,
"longitude": null,
"postal_code": null,
"state_province": null,
"street": null
},
"cancelled_at": "2026-10-27T09:30:00Z",
"capacity": 1,
"ends_at": "2026-10-27T09:30:00Z",
"going_count": 1,
"has_address": false,
"has_online_url": false,
"host": {
"alias": null,
"avatar_urls": null,
"id": null,
"name": null,
"type": null,
"verified": null
},
"is_full": false,
"maybe_count": 1,
"online_url": "https://example.org/",
"open_to_host_followers": false,
"starts_at": "2026-10-27T09:30:00Z",
"state": "string",
"timezone_name": "string",
"viewer_rsvp": "string"
},
"featured_at": "2026-10-27T09:30:00Z",
"features": [
{
"add_permissions": [
null
],
"composers": [
null
],
"enabled": false,
"node_types": [
null
],
"optional": false,
"ordering": 1,
"service": "string"
}
],
"follower_count": 1,
"id": 42,
"is_admined_by_viewer": false,
"is_blocked_by_viewer": false,
"is_following_viewer": false,
"is_invited": false,
"is_leading_viewer": false,
"leader_count": 1,
"name": "string",
"origin_domain": "string",
"permissions": {
"key": "string"
},
"quote_policy": "string",
"show_reposts_on_profile": false,
"type": "string",
"updated_at": "2026-10-27T09:30:00Z",
"uri": "https://example.org/",
"verified": false,
"website_url": "https://example.org/"
}
The rules of a group
/groups/{id}/rulesWhat somebody agrees to, each ticked, before following it or answering it: at most ten, in order, with the version they are at and the version the viewer last agreed to. For whoever may see it, and for whoever it would let ask to follow.
Who: Anyone, signed in or not
Parameters
idintegerrequiredin pathThe profile's id.
Answers
- 200OKactor.Rules application/json
- 400the request is not well formed, or a value in it is not one it may be
- 403the viewer may not see it
- 404there is no such group
Request
curl "https://api.example.org/groups/<id>/rules"
const response = await fetch('https://api.example.org/groups/<id>/rules', {
method: 'GET',
});
const answer = await response.json();
import requests
response = requests.get(
"https://api.example.org/groups/<id>/rules",
)
answer = response.json()
Answer · 200
{
"agreed_version": 1,
"items": [
{
"body": "string",
"title": "string"
}
],
"updated_at": "2026-10-27T09:30:00Z",
"version": 1
}
Set the rules of a group
/groups/{id}/rulesThe rules as they are to be from now on, in order, at most ten; an empty list takes them away. Every change raises the version, so that whoever agreed before is asked again. For whoever may change it.
Who: Somebody signed in
Parameters
idintegerrequiredin path
Body application/json
itemslist of actor.RuleAt most 10 of them.
Answers
- 200OKactor.Rules application/json
- 400
rules_invalid: more than ten, or one too longRefusal application/json - 401no token, or one that has expired
- 403the viewer may not change it
- 404there is no such group
Request
curl -X PUT "https://api.example.org/groups/<id>/rules" \
-H "Authorization: Bearer $TOKEN" \
-H "Content-Type: application/json" \
-d '{
"items": [
{
"body": "string",
"title": "string"
}
]
}'
const response = await fetch('https://api.example.org/groups/<id>/rules', {
method: 'PUT',
headers: { Authorization: `Bearer ${token}`, 'Content-Type': 'application/json' },
body: JSON.stringify({
"items": [
{
"body": "string",
"title": "string"
}
]
}),
});
const answer = await response.json();
import requests
response = requests.put(
"https://api.example.org/groups/<id>/rules",
headers={"Authorization": f"Bearer {token}"},
json={
"items": [
{
"body": "string",
"title": "string"
}
]
},
)
answer = response.json()
Answer · 200
{
"agreed_version": 1,
"items": [
{
"body": "string",
"title": "string"
}
],
"updated_at": "2026-10-27T09:30:00Z",
"version": 1
}
Agree to the rules of a group
/groups/{id}/rules/agreeThe viewer agreeing, each rule ticked, to the version they were shown.
Who: Somebody signed in
Parameters
idintegerrequiredin path
Body application/json
versionintegerrequired
Answers
- 204No Content
- 400the request is not well formed, or a value in it is not one it may be
- 401no token, or one that has expired
- 404there is no such group
- 409
rules_not_current: the rules changed since; read them againRefusal application/json
Request
curl -X POST "https://api.example.org/groups/<id>/rules/agree" \
-H "Authorization: Bearer $TOKEN" \
-H "Content-Type: application/json" \
-d '{
"version": 1
}'
const response = await fetch('https://api.example.org/groups/<id>/rules/agree', {
method: 'POST',
headers: { Authorization: `Bearer ${token}`, 'Content-Type': 'application/json' },
body: JSON.stringify({
"version": 1
}),
});
const answer = await response.json();
import requests
response = requests.post(
"https://api.example.org/groups/<id>/rules/agree",
headers={"Authorization": f"Bearer {token}"},
json={
"version": 1
},
)
answer = response.json()
Remove a group as spam
/groups/{id}/spamA moderator's decision (roadmap row 102): everything of it destroyed at once, with no thirty days, and recorded as removed-as-spam with who decided. Administrators and super administrators; never an administrator's or a super administrator's account, nor one's own. Queued, and done by the sweeper.
Who: An administrator
Parameters
idintegerrequiredin pathThe profile's id.
Answers
- 200purged or queued alreadyPurgeQueued application/json
- 202queuedPurgeQueued application/json
- 400the request is not well formed, or a value in it is not one it may be
- 401no token, or one that has expired
- 403the viewer is not an administrator
- 409it cannot be removed (
administrator,yourself,not_found,wrong_type); nothing was queuedPurgeRefused application/json
Request
curl -X POST "https://api.example.org/groups/<id>/spam" \
-H "Authorization: Bearer $TOKEN"
const response = await fetch('https://api.example.org/groups/<id>/spam', {
method: 'POST',
headers: { Authorization: `Bearer ${token}` },
});
const answer = await response.json();
import requests
response = requests.post(
"https://api.example.org/groups/<id>/spam",
headers={"Authorization": f"Bearer {token}"},
)
answer = response.json()
Answer · 200
{
"batch_id": "string",
"queued": 1,
"skipped": 1
}
Destroy many groups for good
/groups/purge-batchAs purging one, for up to 500 at once.
Who: A super administrator, who has just proved who they are again
Body application/json
confirmstringrequiredPURGEand how many there are (PURGE 12), typed, to say it is meant. At most 20 characters.idslist of integerrequiredThe profiles: up to 500. At least 1 of them. At most 500 of them.
Answers
- 200purged or queued alreadyPurgeQueued application/json
- 202queuedPurgeQueued application/json
- 400
confirmation_mismatch:confirmdoes not name how many there are; or not well formed, without a bodyRefusal application/json - 401no token, or one that has expired
- 403
step_up_required: the viewer must prove who they are again first; or the viewer may not, without a bodyRefusal application/json - 409some cannot be purged; nothing was queuedPurgeRefused application/json
Request
curl -X POST "https://api.example.org/groups/purge-batch" \
-H "Authorization: Bearer $TOKEN" \
-H "Content-Type: application/json" \
-d '{
"confirm": "string",
"ids": [
1
]
}'
const response = await fetch('https://api.example.org/groups/purge-batch', {
method: 'POST',
headers: { Authorization: `Bearer ${token}`, 'Content-Type': 'application/json' },
body: JSON.stringify({
"confirm": "string",
"ids": [
1
]
}),
});
const answer = await response.json();
import requests
response = requests.post(
"https://api.example.org/groups/purge-batch",
headers={"Authorization": f"Bearer {token}"},
json={
"confirm": "string",
"ids": [
1
]
},
)
answer = response.json()
Answer · 200
{
"batch_id": "string",
"queued": 1,
"skipped": 1
}
How far a purge has got
/groups/purge-batch/{batch_id}Asked every few seconds. Changes nothing, and needs no proof.
Who: A super administrator
Parameters
batch_idstring (uuid)requiredin pathWhat the purge request answered asbatch_id.
Answers
- 200OKPurgeProgress application/json
- 400the request is not well formed, or a value in it is not one it may be
- 401no token, or one that has expired
- 403the viewer is not a super administrator
- 404there is no such purge
Request
curl "https://api.example.org/groups/purge-batch/<batch_id>" \
-H "Authorization: Bearer $TOKEN"
const response = await fetch('https://api.example.org/groups/purge-batch/<batch_id>', {
method: 'GET',
headers: { Authorization: `Bearer ${token}` },
});
const answer = await response.json();
import requests
response = requests.get(
"https://api.example.org/groups/purge-batch/<batch_id>",
headers={"Authorization": f"Bearer {token}"},
)
answer = response.json()
Answer · 200
{
"batch_id": "string",
"done": 1,
"failed": 1,
"items": [
{
"alias": "string",
"error": "string",
"id": 42,
"status": "string"
}
],
"queued": 1,
"total": 1
}
People
/people/Those the viewer may see. Each a full profile, or, for one the viewer may only ask to follow, what a stranger is shown of it (restricted).
Who: Anyone, signed in or not
Parameters
startintegerin queryHow many to pass over. At least 0.limitintegerin queryThe most to send. At least 0.20unless given.qstringin queryWords the name, the handle or the description holds. At most 100 characters.orderingstringin queryWhat they are ordered by. At most 15 characters. One ofcreated_at,updated_at,enabled.updated_atunless given.dirstringin queryWhich way the order runs. At most 4 characters. One ofasc,desc.descunless given.disabledbooleanin queryDisabled ones as well, for whoever may see them.featuredbooleanin queryOnly the actors the installation features — what onboarding offers a new member to follow. Ordered most recently featured first unless the caller asks for an ordering; see the browse handlers.
Answers
- 200OKobject application/json
- 400the request is not well formed, or a value in it is not one it may be
- 403the viewer may not list people
Request
curl "https://api.example.org/people/"
const response = await fetch('https://api.example.org/people/', {
method: 'GET',
});
const answer = await response.json();
import requests
response = requests.get(
"https://api.example.org/people/",
)
answer = response.json()
Answer · 200
{
"data": [
null
],
"pagination": {
"limit": 1,
"offset": 1,
"total": 1
}
}
Change who may see it
/people/{id}/accessAnd whether people it is not open to may ask to follow it.
Who: Somebody signed in
Parameters
idintegerrequiredin pathThe person's id.
Body application/x-www-form-urlencoded or multipart/form-data
accessstringrequiredWho may see their profile:public,registered,followers,leaders,mutualsormyself. One ofpublic,registered,followers,leaders,mutuals,myself.publicunless given.allow_follow_requestbooleanWhether people it is not open to may ask to follow them.
Answers
- 200OKactor.PersonNode application/json
- 400the request is not well formed, or a value in it is not one it may be
- 401no token, or one that has expired
- 403the viewer may not change it
- 404there is no such profile
Request
curl -X PATCH "https://api.example.org/people/<id>/access" \
-H "Authorization: Bearer $TOKEN" \
--data-urlencode "access=public" \
--data-urlencode "allow_follow_request=false"
const form = new URLSearchParams();
form.append('access', "public");
form.append('allow_follow_request', "false");
const response = await fetch('https://api.example.org/people/<id>/access', {
method: 'PATCH',
headers: { Authorization: `Bearer ${token}` },
body: form,
});
const answer = await response.json();
import requests
response = requests.patch(
"https://api.example.org/people/<id>/access",
headers={"Authorization": f"Bearer {token}"},
data={"access": "public", "allow_follow_request": "false"},
)
answer = response.json()
Answer · 200
{
"access": "string",
"alias": "string",
"allow_download": false,
"allow_follow_request": false,
"archived_at": "2026-10-27T09:30:00Z",
"author": {
"alias": "string",
"avatar_urls": {
"key": null
},
"id": 42,
"name": "string",
"type": "string"
},
"authorized": {
"add_follower": false,
"administration": false,
"audiences": [
"string"
],
"block_from_owner": false,
"comment": false,
"composers": [
"string"
],
"delete": false,
"download": false,
"edit": false,
"hide": false,
"invite": false,
"like": false,
"pin": false,
"quote": false
},
"avatar_urls": {
"key": {
"size": null,
"url": "https://example.org/"
}
},
"body": "string",
"cover_urls": {
"key": {
"size": null,
"url": "https://example.org/"
}
},
"created_at": "2026-10-27T09:30:00Z",
"deleted_at": "2026-10-27T09:30:00Z",
"editor": {
"alias": "string",
"avatar_urls": {
"key": null
},
"id": 42,
"name": "string",
"type": "string"
},
"enabled": false,
"event": {
"address": {
"city": null,
"country": null,
"latitude": null,
"longitude": null,
"postal_code": null,
"state_province": null,
"street": null
},
"cancelled_at": "2026-10-27T09:30:00Z",
"capacity": 1,
"ends_at": "2026-10-27T09:30:00Z",
"going_count": 1,
"has_address": false,
"has_online_url": false,
"host": {
"alias": null,
"avatar_urls": null,
"id": null,
"name": null,
"type": null,
"verified": null
},
"is_full": false,
"maybe_count": 1,
"online_url": "https://example.org/",
"open_to_host_followers": false,
"starts_at": "2026-10-27T09:30:00Z",
"state": "string",
"timezone_name": "string",
"viewer_rsvp": "string"
},
"featured_at": "2026-10-27T09:30:00Z",
"features": [
{
"add_permissions": [
null
],
"composers": [
null
],
"enabled": false,
"node_types": [
null
],
"optional": false,
"ordering": 1,
"service": "string"
}
],
"follower_count": 1,
"id": 42,
"is_admined_by_viewer": false,
"is_blocked_by_viewer": false,
"is_following_viewer": false,
"is_invited": false,
"is_leading_viewer": false,
"language": "en",
"leader_count": 1,
"name": "string",
"origin_domain": "string",
"permissions": {
"key": "string"
},
"person_pronouns": "string",
"person_type": "string",
"quote_policy": "string",
"show_reposts_on_profile": false,
"type": "string",
"updated_at": "2026-10-27T09:30:00Z",
"uri": "https://example.org/",
"verified": false,
"website_url": "https://example.org/"
}
Archive a person
/people/{id}/archiveFor good, and nothing is destroyed (account-lifecycle.md).
Who: Somebody signed in, who has just proved who they are again
Parameters
idintegerrequiredin pathThe profile's id.
Answers
- 200archived
- 204archived already, or being deleted
- 400the request is not well formed, or a value in it is not one it may be
- 401no token, or one that has expired
- 403
step_up_required: the viewer must prove who they are again first; or the viewer may not, without a bodyRefusal application/json - 404there is no such profile
Request
curl -X POST "https://api.example.org/people/<id>/archive" \
-H "Authorization: Bearer $TOKEN"
const response = await fetch('https://api.example.org/people/<id>/archive', {
method: 'POST',
headers: { Authorization: `Bearer ${token}` },
});
const answer = await response.json();
import requests
response = requests.post(
"https://api.example.org/people/<id>/archive",
headers={"Authorization": f"Bearer {token}"},
)
answer = response.json()
What deleting a person would take with it
/people/{id}/deletion-countsFor the Danger zone, for whoever may delete it.
Who: Somebody signed in
Parameters
idintegerrequiredin pathThe profile's id.
Answers
- 200OKactor.PersonDeletionCounts application/json
- 400the request is not well formed, or a value in it is not one it may be
- 401no token, or one that has expired
- 403the viewer may not delete it
- 404there is no such profile
Request
curl "https://api.example.org/people/<id>/deletion-counts" \
-H "Authorization: Bearer $TOKEN"
const response = await fetch('https://api.example.org/people/<id>/deletion-counts', {
method: 'GET',
headers: { Authorization: `Bearer ${token}` },
});
const answer = await response.json();
import requests
response = requests.get(
"https://api.example.org/people/<id>/deletion-counts",
headers={"Authorization": f"Bearer {token}"},
)
answer = response.json()
Answer · 200
{
"followers": 1,
"following": 1,
"groups_administered": 1,
"member_since": "string",
"posts": 1,
"replies": 1
}
Change whether new photos and videos may be downloaded
/people/{id}/download-defaultWhat a post starts with; each post can say otherwise.
Who: Somebody signed in
Parameters
idintegerrequiredin pathThe profile's id.
Body application/json or application/x-www-form-urlencoded or multipart/form-data
allowbooleanWhether its new photos and videos start out downloadable.
Answers
- 200OKactor.PersonNode application/json
- 400the request is not well formed, or a value in it is not one it may be
- 401no token, or one that has expired
- 403the viewer may not change it
- 404there is no such profile
Request
curl -X PATCH "https://api.example.org/people/<id>/download-default" \
-H "Authorization: Bearer $TOKEN" \
-H "Content-Type: application/json" \
-d '{
"allow": false
}'
const response = await fetch('https://api.example.org/people/<id>/download-default', {
method: 'PATCH',
headers: { Authorization: `Bearer ${token}`, 'Content-Type': 'application/json' },
body: JSON.stringify({
"allow": false
}),
});
const answer = await response.json();
import requests
response = requests.patch(
"https://api.example.org/people/<id>/download-default",
headers={"Authorization": f"Bearer {token}"},
json={
"allow": False
},
)
answer = response.json()
Answer · 200
{
"access": "string",
"alias": "string",
"allow_download": false,
"allow_follow_request": false,
"archived_at": "2026-10-27T09:30:00Z",
"author": {
"alias": "string",
"avatar_urls": {
"key": null
},
"id": 42,
"name": "string",
"type": "string"
},
"authorized": {
"add_follower": false,
"administration": false,
"audiences": [
"string"
],
"block_from_owner": false,
"comment": false,
"composers": [
"string"
],
"delete": false,
"download": false,
"edit": false,
"hide": false,
"invite": false,
"like": false,
"pin": false,
"quote": false
},
"avatar_urls": {
"key": {
"size": null,
"url": "https://example.org/"
}
},
"body": "string",
"cover_urls": {
"key": {
"size": null,
"url": "https://example.org/"
}
},
"created_at": "2026-10-27T09:30:00Z",
"deleted_at": "2026-10-27T09:30:00Z",
"editor": {
"alias": "string",
"avatar_urls": {
"key": null
},
"id": 42,
"name": "string",
"type": "string"
},
"enabled": false,
"event": {
"address": {
"city": null,
"country": null,
"latitude": null,
"longitude": null,
"postal_code": null,
"state_province": null,
"street": null
},
"cancelled_at": "2026-10-27T09:30:00Z",
"capacity": 1,
"ends_at": "2026-10-27T09:30:00Z",
"going_count": 1,
"has_address": false,
"has_online_url": false,
"host": {
"alias": null,
"avatar_urls": null,
"id": null,
"name": null,
"type": null,
"verified": null
},
"is_full": false,
"maybe_count": 1,
"online_url": "https://example.org/",
"open_to_host_followers": false,
"starts_at": "2026-10-27T09:30:00Z",
"state": "string",
"timezone_name": "string",
"viewer_rsvp": "string"
},
"featured_at": "2026-10-27T09:30:00Z",
"features": [
{
"add_permissions": [
null
],
"composers": [
null
],
"enabled": false,
"node_types": [
null
],
"optional": false,
"ordering": 1,
"service": "string"
}
],
"follower_count": 1,
"id": 42,
"is_admined_by_viewer": false,
"is_blocked_by_viewer": false,
"is_following_viewer": false,
"is_invited": false,
"is_leading_viewer": false,
"language": "en",
"leader_count": 1,
"name": "string",
"origin_domain": "string",
"permissions": {
"key": "string"
},
"person_pronouns": "string",
"person_type": "string",
"quote_policy": "string",
"show_reposts_on_profile": false,
"type": "string",
"updated_at": "2026-10-27T09:30:00Z",
"uri": "https://example.org/",
"verified": false,
"website_url": "https://example.org/"
}
Turn a profile on or off
/people/{id}/enabledReversible, site administrators only. Off, it is out of sight and may not act; nothing is deleted.
Who: Somebody signed in
Parameters
idintegerrequiredin pathThe profile's id.
Body application/json
enabledbooleanrequiredWhether it is shown and may act. Off, it is out of sight until it is turned on again; nothing is deleted.
Answers
- 200done
- 204it was so already
- 400the request is not well formed, or a value in it is not one it may be
- 401no token, or one that has expired
- 403the viewer may not
- 404there is no such profile
- 409
last_super_administratorRefusal application/json
Request
curl -X PATCH "https://api.example.org/people/<id>/enabled" \
-H "Authorization: Bearer $TOKEN" \
-H "Content-Type: application/json" \
-d '{
"enabled": false
}'
const response = await fetch('https://api.example.org/people/<id>/enabled', {
method: 'PATCH',
headers: { Authorization: `Bearer ${token}`, 'Content-Type': 'application/json' },
body: JSON.stringify({
"enabled": false
}),
});
const answer = await response.json();
import requests
response = requests.patch(
"https://api.example.org/people/<id>/enabled",
headers={"Authorization": f"Bearer {token}"},
json={
"enabled": False
},
)
answer = response.json()
Feature a profile, or stop
/people/{id}/featuredWhat onboarding offers new members to follow. Super administrators only.
Who: Somebody signed in
Parameters
idintegerrequiredin pathThe profile's id.
Body application/json
featuredbooleanrequiredWhether onboarding offers it to follow.
Answers
- 200done
- 204it was so already
- 400the request is not well formed, or a value in it is not one it may be
- 401no token, or one that has expired
- 403the viewer may not
- 404there is no such profile
- 409
not_featurable: it is disabled, archived or deletedRefusal application/json
Request
curl -X PATCH "https://api.example.org/people/<id>/featured" \
-H "Authorization: Bearer $TOKEN" \
-H "Content-Type: application/json" \
-d '{
"featured": false
}'
const response = await fetch('https://api.example.org/people/<id>/featured', {
method: 'PATCH',
headers: { Authorization: `Bearer ${token}`, 'Content-Type': 'application/json' },
body: JSON.stringify({
"featured": false
}),
});
const answer = await response.json();
import requests
response = requests.patch(
"https://api.example.org/people/<id>/featured",
headers={"Authorization": f"Bearer {token}"},
json={
"featured": False
},
)
answer = response.json()
Change what may be posted on it
/people/{id}/featuresEach kind of post, on or off, and who may add it (permissions.md).
Who: Somebody signed in
Parameters
idintegerrequiredin pathThe person's id.
Body application/json
- Each feature as it is to be. An empty list goes back to the installation's defaults.
Answers
- 200OKactor.PersonNode application/json
- 400the request is not well formed, or a value in it is not one it may be
- 401no token, or one that has expired
- 403the viewer may not change it
- 404there is no such profile
Request
curl -X PATCH "https://api.example.org/people/<id>/features" \
-H "Authorization: Bearer $TOKEN" \
-H "Content-Type: application/json" \
-d '{
"features": [
{
"add_permissions": [
null
],
"composers": [
"string"
],
"enabled": false,
"node_types": [
"string"
],
"optional": false,
"ordering": 1,
"service": "string"
}
]
}'
const response = await fetch('https://api.example.org/people/<id>/features', {
method: 'PATCH',
headers: { Authorization: `Bearer ${token}`, 'Content-Type': 'application/json' },
body: JSON.stringify({
"features": [
{
"add_permissions": [
null
],
"composers": [
"string"
],
"enabled": false,
"node_types": [
"string"
],
"optional": false,
"ordering": 1,
"service": "string"
}
]
}),
});
const answer = await response.json();
import requests
response = requests.patch(
"https://api.example.org/people/<id>/features",
headers={"Authorization": f"Bearer {token}"},
json={
"features": [
{
"add_permissions": [
None
],
"composers": [
"string"
],
"enabled": False,
"node_types": [
"string"
],
"optional": False,
"ordering": 1,
"service": "string"
}
]
},
)
answer = response.json()
Answer · 200
{
"access": "string",
"alias": "string",
"allow_download": false,
"allow_follow_request": false,
"archived_at": "2026-10-27T09:30:00Z",
"author": {
"alias": "string",
"avatar_urls": {
"key": null
},
"id": 42,
"name": "string",
"type": "string"
},
"authorized": {
"add_follower": false,
"administration": false,
"audiences": [
"string"
],
"block_from_owner": false,
"comment": false,
"composers": [
"string"
],
"delete": false,
"download": false,
"edit": false,
"hide": false,
"invite": false,
"like": false,
"pin": false,
"quote": false
},
"avatar_urls": {
"key": {
"size": null,
"url": "https://example.org/"
}
},
"body": "string",
"cover_urls": {
"key": {
"size": null,
"url": "https://example.org/"
}
},
"created_at": "2026-10-27T09:30:00Z",
"deleted_at": "2026-10-27T09:30:00Z",
"editor": {
"alias": "string",
"avatar_urls": {
"key": null
},
"id": 42,
"name": "string",
"type": "string"
},
"enabled": false,
"event": {
"address": {
"city": null,
"country": null,
"latitude": null,
"longitude": null,
"postal_code": null,
"state_province": null,
"street": null
},
"cancelled_at": "2026-10-27T09:30:00Z",
"capacity": 1,
"ends_at": "2026-10-27T09:30:00Z",
"going_count": 1,
"has_address": false,
"has_online_url": false,
"host": {
"alias": null,
"avatar_urls": null,
"id": null,
"name": null,
"type": null,
"verified": null
},
"is_full": false,
"maybe_count": 1,
"online_url": "https://example.org/",
"open_to_host_followers": false,
"starts_at": "2026-10-27T09:30:00Z",
"state": "string",
"timezone_name": "string",
"viewer_rsvp": "string"
},
"featured_at": "2026-10-27T09:30:00Z",
"features": [
{
"add_permissions": [
null
],
"composers": [
null
],
"enabled": false,
"node_types": [
null
],
"optional": false,
"ordering": 1,
"service": "string"
}
],
"follower_count": 1,
"id": 42,
"is_admined_by_viewer": false,
"is_blocked_by_viewer": false,
"is_following_viewer": false,
"is_invited": false,
"is_leading_viewer": false,
"language": "en",
"leader_count": 1,
"name": "string",
"origin_domain": "string",
"permissions": {
"key": "string"
},
"person_pronouns": "string",
"person_type": "string",
"quote_policy": "string",
"show_reposts_on_profile": false,
"type": "string",
"updated_at": "2026-10-27T09:30:00Z",
"uri": "https://example.org/",
"verified": false,
"website_url": "https://example.org/"
}
Destroy a person for good
/people/{id}/purgeEverything of it, at once and with no thirty days. Super administrators only, never on their own profile. Queued, and done by the sweeper.
Who: A super administrator, who has just proved who they are again
Parameters
idintegerrequiredin pathThe profile's id.
Answers
- 200purged or queued alreadyPurgeQueued application/json
- 202queuedPurgeQueued application/json
- 400the request is not well formed, or a value in it is not one it may be
- 401no token, or one that has expired
- 403
step_up_required: the viewer must prove who they are again first; or the viewer may not, without a bodyRefusal application/json - 409it cannot be purged; nothing was queuedPurgeRefused application/json
Request
curl -X DELETE "https://api.example.org/people/<id>/purge" \
-H "Authorization: Bearer $TOKEN"
const response = await fetch('https://api.example.org/people/<id>/purge', {
method: 'DELETE',
headers: { Authorization: `Bearer ${token}` },
});
const answer = await response.json();
import requests
response = requests.delete(
"https://api.example.org/people/<id>/purge",
headers={"Authorization": f"Bearer {token}"},
)
answer = response.json()
Answer · 200
{
"batch_id": "string",
"queued": 1,
"skipped": 1
}
Change who may quote a person's posts
/people/{id}/quote-policyFor the posts that do not say.
Who: Somebody signed in
Parameters
idintegerrequiredin pathThe person's id.
Body application/json or application/x-www-form-urlencoded or multipart/form-data
quote_policystringrequiredWho may quote their posts, when a post does not say:anyone,followersornobody. At most 16 characters.
Answers
- 200OKactor.PersonNode application/json
- 400
quote_policy_invalid, or not well formedRefusal application/json - 401no token, or one that has expired
- 403the viewer may not change it
- 404there is no such person
Request
curl -X PATCH "https://api.example.org/people/<id>/quote-policy" \
-H "Authorization: Bearer $TOKEN" \
-H "Content-Type: application/json" \
-d '{
"quote_policy": "string"
}'
const response = await fetch('https://api.example.org/people/<id>/quote-policy', {
method: 'PATCH',
headers: { Authorization: `Bearer ${token}`, 'Content-Type': 'application/json' },
body: JSON.stringify({
"quote_policy": "string"
}),
});
const answer = await response.json();
import requests
response = requests.patch(
"https://api.example.org/people/<id>/quote-policy",
headers={"Authorization": f"Bearer {token}"},
json={
"quote_policy": "string"
},
)
answer = response.json()
Answer · 200
{
"access": "string",
"alias": "string",
"allow_download": false,
"allow_follow_request": false,
"archived_at": "2026-10-27T09:30:00Z",
"author": {
"alias": "string",
"avatar_urls": {
"key": null
},
"id": 42,
"name": "string",
"type": "string"
},
"authorized": {
"add_follower": false,
"administration": false,
"audiences": [
"string"
],
"block_from_owner": false,
"comment": false,
"composers": [
"string"
],
"delete": false,
"download": false,
"edit": false,
"hide": false,
"invite": false,
"like": false,
"pin": false,
"quote": false
},
"avatar_urls": {
"key": {
"size": null,
"url": "https://example.org/"
}
},
"body": "string",
"cover_urls": {
"key": {
"size": null,
"url": "https://example.org/"
}
},
"created_at": "2026-10-27T09:30:00Z",
"deleted_at": "2026-10-27T09:30:00Z",
"editor": {
"alias": "string",
"avatar_urls": {
"key": null
},
"id": 42,
"name": "string",
"type": "string"
},
"enabled": false,
"event": {
"address": {
"city": null,
"country": null,
"latitude": null,
"longitude": null,
"postal_code": null,
"state_province": null,
"street": null
},
"cancelled_at": "2026-10-27T09:30:00Z",
"capacity": 1,
"ends_at": "2026-10-27T09:30:00Z",
"going_count": 1,
"has_address": false,
"has_online_url": false,
"host": {
"alias": null,
"avatar_urls": null,
"id": null,
"name": null,
"type": null,
"verified": null
},
"is_full": false,
"maybe_count": 1,
"online_url": "https://example.org/",
"open_to_host_followers": false,
"starts_at": "2026-10-27T09:30:00Z",
"state": "string",
"timezone_name": "string",
"viewer_rsvp": "string"
},
"featured_at": "2026-10-27T09:30:00Z",
"features": [
{
"add_permissions": [
null
],
"composers": [
null
],
"enabled": false,
"node_types": [
null
],
"optional": false,
"ordering": 1,
"service": "string"
}
],
"follower_count": 1,
"id": 42,
"is_admined_by_viewer": false,
"is_blocked_by_viewer": false,
"is_following_viewer": false,
"is_invited": false,
"is_leading_viewer": false,
"language": "en",
"leader_count": 1,
"name": "string",
"origin_domain": "string",
"permissions": {
"key": "string"
},
"person_pronouns": "string",
"person_type": "string",
"quote_policy": "string",
"show_reposts_on_profile": false,
"type": "string",
"updated_at": "2026-10-27T09:30:00Z",
"uri": "https://example.org/",
"verified": false,
"website_url": "https://example.org/"
}
Show reposts among a person's posts, or not
/people/{id}/reposts-on-profileThey are always in the Reposts tab of the profile.
Who: Somebody signed in
Parameters
idintegerrequiredin pathThe person's id.
Body application/json or application/x-www-form-urlencoded or multipart/form-data
show_reposts_on_profilebooleanWhether what they repost is also among their profile's posts.
Answers
- 200OKactor.PersonNode application/json
- 400the request is not well formed, or a value in it is not one it may be
- 401no token, or one that has expired
- 403the viewer may not change it
- 404there is no such person
Request
curl -X PATCH "https://api.example.org/people/<id>/reposts-on-profile" \
-H "Authorization: Bearer $TOKEN" \
-H "Content-Type: application/json" \
-d '{
"show_reposts_on_profile": false
}'
const response = await fetch('https://api.example.org/people/<id>/reposts-on-profile', {
method: 'PATCH',
headers: { Authorization: `Bearer ${token}`, 'Content-Type': 'application/json' },
body: JSON.stringify({
"show_reposts_on_profile": false
}),
});
const answer = await response.json();
import requests
response = requests.patch(
"https://api.example.org/people/<id>/reposts-on-profile",
headers={"Authorization": f"Bearer {token}"},
json={
"show_reposts_on_profile": False
},
)
answer = response.json()
Answer · 200
{
"access": "string",
"alias": "string",
"allow_download": false,
"allow_follow_request": false,
"archived_at": "2026-10-27T09:30:00Z",
"author": {
"alias": "string",
"avatar_urls": {
"key": null
},
"id": 42,
"name": "string",
"type": "string"
},
"authorized": {
"add_follower": false,
"administration": false,
"audiences": [
"string"
],
"block_from_owner": false,
"comment": false,
"composers": [
"string"
],
"delete": false,
"download": false,
"edit": false,
"hide": false,
"invite": false,
"like": false,
"pin": false,
"quote": false
},
"avatar_urls": {
"key": {
"size": null,
"url": "https://example.org/"
}
},
"body": "string",
"cover_urls": {
"key": {
"size": null,
"url": "https://example.org/"
}
},
"created_at": "2026-10-27T09:30:00Z",
"deleted_at": "2026-10-27T09:30:00Z",
"editor": {
"alias": "string",
"avatar_urls": {
"key": null
},
"id": 42,
"name": "string",
"type": "string"
},
"enabled": false,
"event": {
"address": {
"city": null,
"country": null,
"latitude": null,
"longitude": null,
"postal_code": null,
"state_province": null,
"street": null
},
"cancelled_at": "2026-10-27T09:30:00Z",
"capacity": 1,
"ends_at": "2026-10-27T09:30:00Z",
"going_count": 1,
"has_address": false,
"has_online_url": false,
"host": {
"alias": null,
"avatar_urls": null,
"id": null,
"name": null,
"type": null,
"verified": null
},
"is_full": false,
"maybe_count": 1,
"online_url": "https://example.org/",
"open_to_host_followers": false,
"starts_at": "2026-10-27T09:30:00Z",
"state": "string",
"timezone_name": "string",
"viewer_rsvp": "string"
},
"featured_at": "2026-10-27T09:30:00Z",
"features": [
{
"add_permissions": [
null
],
"composers": [
null
],
"enabled": false,
"node_types": [
null
],
"optional": false,
"ordering": 1,
"service": "string"
}
],
"follower_count": 1,
"id": 42,
"is_admined_by_viewer": false,
"is_blocked_by_viewer": false,
"is_following_viewer": false,
"is_invited": false,
"is_leading_viewer": false,
"language": "en",
"leader_count": 1,
"name": "string",
"origin_domain": "string",
"permissions": {
"key": "string"
},
"person_pronouns": "string",
"person_type": "string",
"quote_policy": "string",
"show_reposts_on_profile": false,
"type": "string",
"updated_at": "2026-10-27T09:30:00Z",
"uri": "https://example.org/",
"verified": false,
"website_url": "https://example.org/"
}
Remove a person as spam
/people/{id}/spamA moderator's decision (roadmap row 102): everything of it destroyed at once, with no thirty days, and recorded as removed-as-spam with who decided. Administrators and super administrators; never an administrator's or a super administrator's account, nor one's own. Queued, and done by the sweeper.
Who: An administrator
Parameters
idintegerrequiredin pathThe profile's id.
Answers
- 200purged or queued alreadyPurgeQueued application/json
- 202queuedPurgeQueued application/json
- 400the request is not well formed, or a value in it is not one it may be
- 401no token, or one that has expired
- 403the viewer is not an administrator
- 409it cannot be removed (
administrator,yourself,not_found,wrong_type); nothing was queuedPurgeRefused application/json
Request
curl -X POST "https://api.example.org/people/<id>/spam" \
-H "Authorization: Bearer $TOKEN"
const response = await fetch('https://api.example.org/people/<id>/spam', {
method: 'POST',
headers: { Authorization: `Bearer ${token}` },
});
const answer = await response.json();
import requests
response = requests.post(
"https://api.example.org/people/<id>/spam",
headers={"Authorization": f"Bearer {token}"},
)
answer = response.json()
Answer · 200
{
"batch_id": "string",
"queued": 1,
"skipped": 1
}
Tag somebody in a photo or a video
/people/{id}/tags/{post_id}For the post's author. Only a person here may be tagged, and as they chose: at once, each approved first (the default), or not at all. Anybody may tag themselves. At most 20 people in one post.
Who: Somebody signed in
Parameters
idintegerrequiredin pathThe person's id.post_idintegerrequiredin pathThe photo's or the video's id.
Answers
- 201tagged
- 202tagged, waiting for their approval
- 400the request is not well formed, or a value in it is not one it may be
- 401no token, or one that has expired
- 403the viewer did not write the post
- 404no such person, or no such photo or video the viewer can see
- 409
not_taggable, they do not allow it or are not here;too_many, the post has as many people as it mayRefusal application/json
Request
curl -X POST "https://api.example.org/people/<id>/tags/<post_id>" \
-H "Authorization: Bearer $TOKEN"
const response = await fetch('https://api.example.org/people/<id>/tags/<post_id>', {
method: 'POST',
headers: { Authorization: `Bearer ${token}` },
});
const answer = await response.json();
import requests
response = requests.post(
"https://api.example.org/people/<id>/tags/<post_id>",
headers={"Authorization": f"Bearer {token}"},
)
answer = response.json()
Approve being tagged
/people/{id}/tags/{post_id}For the person tagged.
Who: Somebody signed in
Parameters
idintegerrequiredin pathThe person's id.post_idintegerrequiredin pathThe photo's or the video's id.
Answers
- 200approved, or it was already
- 400the request is not well formed, or a value in it is not one it may be
- 401no token, or one that has expired
- 403the viewer is not the person tagged
- 404no such tag, or no such photo or video the viewer can see
Request
curl -X PUT "https://api.example.org/people/<id>/tags/<post_id>" \
-H "Authorization: Bearer $TOKEN"
const response = await fetch('https://api.example.org/people/<id>/tags/<post_id>', {
method: 'PUT',
headers: { Authorization: `Bearer ${token}` },
});
const answer = await response.json();
import requests
response = requests.put(
"https://api.example.org/people/<id>/tags/<post_id>",
headers={"Authorization": f"Bearer {token}"},
)
answer = response.json()
Take somebody out of a photo or a video
/people/{id}/tags/{post_id}For the person, declining or changing their mind, and for the post's author.
Who: Somebody signed in
Parameters
idintegerrequiredin pathThe person's id.post_idintegerrequiredin pathThe photo's or the video's id.
Answers
- 204removed, or there was nothing to remove
- 400the request is not well formed, or a value in it is not one it may be
- 401no token, or one that has expired
- 403the viewer is neither the person nor the post's author
- 404there is no such photo or video the viewer can see
Request
curl -X DELETE "https://api.example.org/people/<id>/tags/<post_id>" \
-H "Authorization: Bearer $TOKEN"
const response = await fetch('https://api.example.org/people/<id>/tags/<post_id>', {
method: 'DELETE',
headers: { Authorization: `Bearer ${token}` },
});
const answer = await response.json();
import requests
response = requests.delete(
"https://api.example.org/people/<id>/tags/<post_id>",
headers={"Authorization": f"Bearer {token}"},
)
answer = response.json()
One person
/people/{username}By their username. To somebody they are not open to, but who may ask to follow them, what a stranger is shown of them.
Who: Anyone, signed in or not
Parameters
usernamestringrequiredin pathTheir username. At most 100 characters.
Answers
- 200them, or what a stranger is shown of them (LimitedActor)actor.PersonNode application/json
- 400the request is not well formed, or a value in it is not one it may be
- 403the viewer may not see them
- 404there is no such person
Request
curl "https://api.example.org/people/<username>"
const response = await fetch('https://api.example.org/people/<username>', {
method: 'GET',
});
const answer = await response.json();
import requests
response = requests.get(
"https://api.example.org/people/<username>",
)
answer = response.json()
Answer · 200
{
"access": "string",
"alias": "string",
"allow_download": false,
"allow_follow_request": false,
"archived_at": "2026-10-27T09:30:00Z",
"author": {
"alias": "string",
"avatar_urls": {
"key": null
},
"id": 42,
"name": "string",
"type": "string"
},
"authorized": {
"add_follower": false,
"administration": false,
"audiences": [
"string"
],
"block_from_owner": false,
"comment": false,
"composers": [
"string"
],
"delete": false,
"download": false,
"edit": false,
"hide": false,
"invite": false,
"like": false,
"pin": false,
"quote": false
},
"avatar_urls": {
"key": {
"size": null,
"url": "https://example.org/"
}
},
"body": "string",
"cover_urls": {
"key": {
"size": null,
"url": "https://example.org/"
}
},
"created_at": "2026-10-27T09:30:00Z",
"deleted_at": "2026-10-27T09:30:00Z",
"editor": {
"alias": "string",
"avatar_urls": {
"key": null
},
"id": 42,
"name": "string",
"type": "string"
},
"enabled": false,
"event": {
"address": {
"city": null,
"country": null,
"latitude": null,
"longitude": null,
"postal_code": null,
"state_province": null,
"street": null
},
"cancelled_at": "2026-10-27T09:30:00Z",
"capacity": 1,
"ends_at": "2026-10-27T09:30:00Z",
"going_count": 1,
"has_address": false,
"has_online_url": false,
"host": {
"alias": null,
"avatar_urls": null,
"id": null,
"name": null,
"type": null,
"verified": null
},
"is_full": false,
"maybe_count": 1,
"online_url": "https://example.org/",
"open_to_host_followers": false,
"starts_at": "2026-10-27T09:30:00Z",
"state": "string",
"timezone_name": "string",
"viewer_rsvp": "string"
},
"featured_at": "2026-10-27T09:30:00Z",
"features": [
{
"add_permissions": [
null
],
"composers": [
null
],
"enabled": false,
"node_types": [
null
],
"optional": false,
"ordering": 1,
"service": "string"
}
],
"follower_count": 1,
"id": 42,
"is_admined_by_viewer": false,
"is_blocked_by_viewer": false,
"is_following_viewer": false,
"is_invited": false,
"is_leading_viewer": false,
"language": "en",
"leader_count": 1,
"name": "string",
"origin_domain": "string",
"permissions": {
"key": "string"
},
"person_pronouns": "string",
"person_type": "string",
"quote_policy": "string",
"show_reposts_on_profile": false,
"type": "string",
"updated_at": "2026-10-27T09:30:00Z",
"uri": "https://example.org/",
"verified": false,
"website_url": "https://example.org/"
}
Change a person's profile
/people/{username}Who: Somebody signed in
Parameters
usernameintegerrequiredin pathHere, theid. The person's id.
Body application/x-www-form-urlencoded or multipart/form-data
bodystringWhat they say of themselves. At most 500 characters.languagestringThe language this person usually posts in, as a BCP 47 tag. It is what the composer starts on; each post can say otherwise. At most 12 characters.namestringrequiredTheir name. At most 64 characters.person_pronounsstringTheir pronouns, as free text:she/her,iel. At most 50 characters.website_urlstring (uri)One link on the profile. A bareexample.comis taken as https. At most 255 characters.
Answers
- 200OKactor.PersonNode application/json
- 400the request is not well formed, or a value in it is not one it may be
- 401no token, or one that has expired
- 403the viewer may not change it
- 404there is no such person
Request
curl -X PATCH "https://api.example.org/people/<username>" \
-H "Authorization: Bearer $TOKEN" \
--data-urlencode "body=string" \
--data-urlencode "language=en" \
--data-urlencode "name=string" \
--data-urlencode "person_pronouns=string" \
--data-urlencode "website_url=https://example.org/"
const form = new URLSearchParams();
form.append('body', "string");
form.append('language', "en");
form.append('name', "string");
form.append('person_pronouns', "string");
form.append('website_url', "https://example.org/");
const response = await fetch('https://api.example.org/people/<username>', {
method: 'PATCH',
headers: { Authorization: `Bearer ${token}` },
body: form,
});
const answer = await response.json();
import requests
response = requests.patch(
"https://api.example.org/people/<username>",
headers={"Authorization": f"Bearer {token}"},
data={"body": "string", "language": "en", "name": "string", "person_pronouns": "string", "website_url": "https://example.org/"},
)
answer = response.json()
Answer · 200
{
"access": "string",
"alias": "string",
"allow_download": false,
"allow_follow_request": false,
"archived_at": "2026-10-27T09:30:00Z",
"author": {
"alias": "string",
"avatar_urls": {
"key": null
},
"id": 42,
"name": "string",
"type": "string"
},
"authorized": {
"add_follower": false,
"administration": false,
"audiences": [
"string"
],
"block_from_owner": false,
"comment": false,
"composers": [
"string"
],
"delete": false,
"download": false,
"edit": false,
"hide": false,
"invite": false,
"like": false,
"pin": false,
"quote": false
},
"avatar_urls": {
"key": {
"size": null,
"url": "https://example.org/"
}
},
"body": "string",
"cover_urls": {
"key": {
"size": null,
"url": "https://example.org/"
}
},
"created_at": "2026-10-27T09:30:00Z",
"deleted_at": "2026-10-27T09:30:00Z",
"editor": {
"alias": "string",
"avatar_urls": {
"key": null
},
"id": 42,
"name": "string",
"type": "string"
},
"enabled": false,
"event": {
"address": {
"city": null,
"country": null,
"latitude": null,
"longitude": null,
"postal_code": null,
"state_province": null,
"street": null
},
"cancelled_at": "2026-10-27T09:30:00Z",
"capacity": 1,
"ends_at": "2026-10-27T09:30:00Z",
"going_count": 1,
"has_address": false,
"has_online_url": false,
"host": {
"alias": null,
"avatar_urls": null,
"id": null,
"name": null,
"type": null,
"verified": null
},
"is_full": false,
"maybe_count": 1,
"online_url": "https://example.org/",
"open_to_host_followers": false,
"starts_at": "2026-10-27T09:30:00Z",
"state": "string",
"timezone_name": "string",
"viewer_rsvp": "string"
},
"featured_at": "2026-10-27T09:30:00Z",
"features": [
{
"add_permissions": [
null
],
"composers": [
null
],
"enabled": false,
"node_types": [
null
],
"optional": false,
"ordering": 1,
"service": "string"
}
],
"follower_count": 1,
"id": 42,
"is_admined_by_viewer": false,
"is_blocked_by_viewer": false,
"is_following_viewer": false,
"is_invited": false,
"is_leading_viewer": false,
"language": "en",
"leader_count": 1,
"name": "string",
"origin_domain": "string",
"permissions": {
"key": "string"
},
"person_pronouns": "string",
"person_type": "string",
"quote_policy": "string",
"show_reposts_on_profile": false,
"type": "string",
"updated_at": "2026-10-27T09:30:00Z",
"uri": "https://example.org/",
"verified": false,
"website_url": "https://example.org/"
}
Delete a person
/people/{username}It is out of sight at once and destroyed after thirty days, unless it is restored before then.
Who: Somebody signed in, who has just proved who they are again
Parameters
usernameintegerrequiredin pathHere, theid. The person's id.
Answers
- 200it will be deleted
- 400the request is not well formed, or a value in it is not one it may be
- 401no token, or one that has expired
- 403
step_up_required: the viewer must prove who they are again first; or the viewer may not, without a bodyRefusal application/json - 404there is no such profile
Request
curl -X DELETE "https://api.example.org/people/<username>" \
-H "Authorization: Bearer $TOKEN"
const response = await fetch('https://api.example.org/people/<username>', {
method: 'DELETE',
headers: { Authorization: `Bearer ${token}` },
});
const answer = await response.json();
import requests
response = requests.delete(
"https://api.example.org/people/<username>",
headers={"Authorization": f"Bearer {token}"},
)
answer = response.json()
Destroy many persons for good
/people/purge-batchAs purging one, for up to 500 at once.
Who: A super administrator, who has just proved who they are again
Body application/json
confirmstringrequiredPURGEand how many there are (PURGE 12), typed, to say it is meant. At most 20 characters.idslist of integerrequiredThe profiles: up to 500. At least 1 of them. At most 500 of them.
Answers
- 200purged or queued alreadyPurgeQueued application/json
- 202queuedPurgeQueued application/json
- 400
confirmation_mismatch:confirmdoes not name how many there are; or not well formed, without a bodyRefusal application/json - 401no token, or one that has expired
- 403
step_up_required: the viewer must prove who they are again first; or the viewer may not, without a bodyRefusal application/json - 409some cannot be purged; nothing was queuedPurgeRefused application/json
Request
curl -X POST "https://api.example.org/people/purge-batch" \
-H "Authorization: Bearer $TOKEN" \
-H "Content-Type: application/json" \
-d '{
"confirm": "string",
"ids": [
1
]
}'
const response = await fetch('https://api.example.org/people/purge-batch', {
method: 'POST',
headers: { Authorization: `Bearer ${token}`, 'Content-Type': 'application/json' },
body: JSON.stringify({
"confirm": "string",
"ids": [
1
]
}),
});
const answer = await response.json();
import requests
response = requests.post(
"https://api.example.org/people/purge-batch",
headers={"Authorization": f"Bearer {token}"},
json={
"confirm": "string",
"ids": [
1
]
},
)
answer = response.json()
Answer · 200
{
"batch_id": "string",
"queued": 1,
"skipped": 1
}
How far a purge has got
/people/purge-batch/{batch_id}Asked every few seconds. Changes nothing, and needs no proof.
Who: A super administrator
Parameters
batch_idstring (uuid)requiredin pathWhat the purge request answered asbatch_id.
Answers
- 200OKPurgeProgress application/json
- 400the request is not well formed, or a value in it is not one it may be
- 401no token, or one that has expired
- 403the viewer is not a super administrator
- 404there is no such purge
Request
curl "https://api.example.org/people/purge-batch/<batch_id>" \
-H "Authorization: Bearer $TOKEN"
const response = await fetch('https://api.example.org/people/purge-batch/<batch_id>', {
method: 'GET',
headers: { Authorization: `Bearer ${token}` },
});
const answer = await response.json();
import requests
response = requests.get(
"https://api.example.org/people/purge-batch/<batch_id>",
headers={"Authorization": f"Bearer {token}"},
)
answer = response.json()
Answer · 200
{
"batch_id": "string",
"done": 1,
"failed": 1,
"items": [
{
"alias": "string",
"error": "string",
"id": 42,
"status": "string"
}
],
"queued": 1,
"total": 1
}
Who is in a photo or a video
/people/tagged-in/{post_id}In the order they were tagged. A tag waiting for the person's approval is listed only for them and the post's author, with pending.
Who: Anyone, signed in or not
Parameters
post_idintegerrequiredin pathThe photo's or the video's id.
Answers
- 200OKobject application/json
- 400the request is not well formed, or a value in it is not one it may be
- 404there is no such photo or video the viewer can see
Request
curl "https://api.example.org/people/tagged-in/<post_id>"
const response = await fetch('https://api.example.org/people/tagged-in/<post_id>', {
method: 'GET',
});
const answer = await response.json();
import requests
response = requests.get(
"https://api.example.org/people/tagged-in/<post_id>",
)
answer = response.json()
Answer · 200
{
"data": [
{
"pending": false,
"person": null
}
]
}
Websites
/websites/Those the viewer may see. Each a full profile, or, for one the viewer may only ask to follow, what a stranger is shown of it (restricted).
Who: Anyone, signed in or not
Parameters
startintegerin queryHow many to pass over. At least 0.limitintegerin queryThe most to send. At least 0.20unless given.qstringin queryWords the name, the handle or the description holds. At most 100 characters.orderingstringin queryWhat they are ordered by. At most 15 characters. One ofcreated_at,updated_at,enabled.updated_atunless given.dirstringin queryWhich way the order runs. At most 4 characters. One ofasc,desc.descunless given.disabledbooleanin queryDisabled ones as well, for whoever may see them.featuredbooleanin queryOnly the actors the installation features — what onboarding offers a new member to follow. Ordered most recently featured first unless the caller asks for an ordering; see the browse handlers.
Answers
- 200OKobject application/json
- 400the request is not well formed, or a value in it is not one it may be
- 403the viewer may not list Websites
Request
curl "https://api.example.org/websites/"
const response = await fetch('https://api.example.org/websites/', {
method: 'GET',
});
const answer = await response.json();
import requests
response = requests.get(
"https://api.example.org/websites/",
)
answer = response.json()
Answer · 200
{
"data": [
null
],
"pagination": {
"limit": 1,
"offset": 1,
"total": 1
}
}
One Website
/websites/{id}To somebody it is not open to, but who may ask to follow it, what a stranger is shown of it.
Who: Anyone, signed in or not
Parameters
idintegerrequiredin pathThe profile's id.
Answers
- 200it, or what a stranger is shown of it (LimitedActor)ActorNode application/json
- 400the request is not well formed, or a value in it is not one it may be
- 403the viewer may not see it
- 404there is no such Website
Request
curl "https://api.example.org/websites/<id>"
const response = await fetch('https://api.example.org/websites/<id>', {
method: 'GET',
});
const answer = await response.json();
import requests
response = requests.get(
"https://api.example.org/websites/<id>",
)
answer = response.json()
Answer · 200
{
"access": "string",
"administrators": [
{
"alias": "string",
"avatar_urls": {
"key": null
},
"id": 42,
"name": "string",
"type": "string"
}
],
"alias": "string",
"allow_download": false,
"allow_follow_request": false,
"archived_at": "2026-10-27T09:30:00Z",
"author": {
"alias": "string",
"avatar_urls": {
"key": null
},
"id": 42,
"name": "string",
"type": "string"
},
"authorized": {
"add_follower": false,
"administration": false,
"audiences": [
"string"
],
"block_from_owner": false,
"comment": false,
"composers": [
"string"
],
"delete": false,
"download": false,
"edit": false,
"hide": false,
"invite": false,
"like": false,
"pin": false,
"quote": false
},
"avatar_urls": {
"key": {
"size": null,
"url": "https://example.org/"
}
},
"body": "string",
"cover_urls": {
"key": {
"size": null,
"url": "https://example.org/"
}
},
"created_at": "2026-10-27T09:30:00Z",
"deleted_at": "2026-10-27T09:30:00Z",
"editor": {
"alias": "string",
"avatar_urls": {
"key": null
},
"id": 42,
"name": "string",
"type": "string"
},
"enabled": false,
"event": {
"address": {
"city": null,
"country": null,
"latitude": null,
"longitude": null,
"postal_code": null,
"state_province": null,
"street": null
},
"cancelled_at": "2026-10-27T09:30:00Z",
"capacity": 1,
"ends_at": "2026-10-27T09:30:00Z",
"going_count": 1,
"has_address": false,
"has_online_url": false,
"host": {
"alias": null,
"avatar_urls": null,
"id": null,
"name": null,
"type": null,
"verified": null
},
"is_full": false,
"maybe_count": 1,
"online_url": "https://example.org/",
"open_to_host_followers": false,
"starts_at": "2026-10-27T09:30:00Z",
"state": "string",
"timezone_name": "string",
"viewer_rsvp": "string"
},
"featured_at": "2026-10-27T09:30:00Z",
"features": [
{
"add_permissions": [
null
],
"composers": [
null
],
"enabled": false,
"node_types": [
null
],
"optional": false,
"ordering": 1,
"service": "string"
}
],
"follower_count": 1,
"id": 42,
"is_admined_by_viewer": false,
"is_blocked_by_viewer": false,
"is_following_viewer": false,
"is_invited": false,
"is_leading_viewer": false,
"leader_count": 1,
"name": "string",
"origin_domain": "string",
"permissions": {
"key": "string"
},
"quote_policy": "string",
"show_reposts_on_profile": false,
"type": "string",
"updated_at": "2026-10-27T09:30:00Z",
"uri": "https://example.org/",
"verified": false,
"website_url": "https://example.org/"
}
Change a Website
/websites/{id}Its name and its description. Its handle and its site stay as they were connected.
Who: Somebody signed in
Parameters
idintegerrequiredin pathThe website's id.
Body application/json or application/x-www-form-urlencoded or multipart/form-data
bodystringWhat it is, shown in its About card. At most 500 characters.namestringrequiredIts name. At most 64 characters.
Answers
- 200OKActorNode application/json
- 400the request is not well formed, or a value in it is not one it may be
- 401no token, or one that has expired
- 403the viewer may not change it
- 404there is no such Website
Request
curl -X PATCH "https://api.example.org/websites/<id>" \
-H "Authorization: Bearer $TOKEN" \
-H "Content-Type: application/json" \
-d '{
"body": "string",
"name": "string"
}'
const response = await fetch('https://api.example.org/websites/<id>', {
method: 'PATCH',
headers: { Authorization: `Bearer ${token}`, 'Content-Type': 'application/json' },
body: JSON.stringify({
"body": "string",
"name": "string"
}),
});
const answer = await response.json();
import requests
response = requests.patch(
"https://api.example.org/websites/<id>",
headers={"Authorization": f"Bearer {token}"},
json={
"body": "string",
"name": "string"
},
)
answer = response.json()
Answer · 200
{
"access": "string",
"administrators": [
{
"alias": "string",
"avatar_urls": {
"key": null
},
"id": 42,
"name": "string",
"type": "string"
}
],
"alias": "string",
"allow_download": false,
"allow_follow_request": false,
"archived_at": "2026-10-27T09:30:00Z",
"author": {
"alias": "string",
"avatar_urls": {
"key": null
},
"id": 42,
"name": "string",
"type": "string"
},
"authorized": {
"add_follower": false,
"administration": false,
"audiences": [
"string"
],
"block_from_owner": false,
"comment": false,
"composers": [
"string"
],
"delete": false,
"download": false,
"edit": false,
"hide": false,
"invite": false,
"like": false,
"pin": false,
"quote": false
},
"avatar_urls": {
"key": {
"size": null,
"url": "https://example.org/"
}
},
"body": "string",
"cover_urls": {
"key": {
"size": null,
"url": "https://example.org/"
}
},
"created_at": "2026-10-27T09:30:00Z",
"deleted_at": "2026-10-27T09:30:00Z",
"editor": {
"alias": "string",
"avatar_urls": {
"key": null
},
"id": 42,
"name": "string",
"type": "string"
},
"enabled": false,
"event": {
"address": {
"city": null,
"country": null,
"latitude": null,
"longitude": null,
"postal_code": null,
"state_province": null,
"street": null
},
"cancelled_at": "2026-10-27T09:30:00Z",
"capacity": 1,
"ends_at": "2026-10-27T09:30:00Z",
"going_count": 1,
"has_address": false,
"has_online_url": false,
"host": {
"alias": null,
"avatar_urls": null,
"id": null,
"name": null,
"type": null,
"verified": null
},
"is_full": false,
"maybe_count": 1,
"online_url": "https://example.org/",
"open_to_host_followers": false,
"starts_at": "2026-10-27T09:30:00Z",
"state": "string",
"timezone_name": "string",
"viewer_rsvp": "string"
},
"featured_at": "2026-10-27T09:30:00Z",
"features": [
{
"add_permissions": [
null
],
"composers": [
null
],
"enabled": false,
"node_types": [
null
],
"optional": false,
"ordering": 1,
"service": "string"
}
],
"follower_count": 1,
"id": 42,
"is_admined_by_viewer": false,
"is_blocked_by_viewer": false,
"is_following_viewer": false,
"is_invited": false,
"is_leading_viewer": false,
"leader_count": 1,
"name": "string",
"origin_domain": "string",
"permissions": {
"key": "string"
},
"quote_policy": "string",
"show_reposts_on_profile": false,
"type": "string",
"updated_at": "2026-10-27T09:30:00Z",
"uri": "https://example.org/",
"verified": false,
"website_url": "https://example.org/"
}
Delete a Website
/websites/{id}It is out of sight at once and destroyed after thirty days, unless it is restored before then.
Who: Somebody signed in, who has just proved who they are again
Parameters
idintegerrequiredin pathThe profile's id.
Answers
- 200it will be deleted
- 400the request is not well formed, or a value in it is not one it may be
- 401no token, or one that has expired
- 403
step_up_required: the viewer must prove who they are again first; or the viewer may not, without a bodyRefusal application/json - 404there is no such profile
Request
curl -X DELETE "https://api.example.org/websites/<id>" \
-H "Authorization: Bearer $TOKEN"
const response = await fetch('https://api.example.org/websites/<id>', {
method: 'DELETE',
headers: { Authorization: `Bearer ${token}` },
});
const answer = await response.json();
import requests
response = requests.delete(
"https://api.example.org/websites/<id>",
headers={"Authorization": f"Bearer {token}"},
)
answer = response.json()
A Website's administrators
/websites/{id}/admins/Who: Somebody signed in
Parameters
idintegerrequiredin pathThe group's or the event's id.startintegerin queryHow many to pass over. At least 0.limitintegerin queryThe most to send. At least 0.20unless given.dirstringin queryWhich way the order runs. At most 4 characters. One ofasc,desc.ascunless given.
Answers
- 200OKobject application/json
- 400the request is not well formed, or a value in it is not one it may be
- 401no token, or one that has expired
- 403the viewer may not see them
- 404there is no such Website
Request
curl "https://api.example.org/websites/<id>/admins/" \
-H "Authorization: Bearer $TOKEN"
const response = await fetch('https://api.example.org/websites/<id>/admins/', {
method: 'GET',
headers: { Authorization: `Bearer ${token}` },
});
const answer = await response.json();
import requests
response = requests.get(
"https://api.example.org/websites/<id>/admins/",
headers={"Authorization": f"Bearer {token}"},
)
answer = response.json()
Answer · 200
{
"data": [
{
"access": "string",
"alias": "string",
"allow_download": false,
"allow_follow_request": false,
"archived_at": "2026-10-27T09:30:00Z",
"author": {
"alias": null,
"avatar_urls": null,
"id": null,
"name": null,
"type": null
},
"avatar_urls": {
"key": null
},
"body": "string",
"cover_urls": {
"key": null
},
"created_at": "2026-10-27T09:30:00Z",
"deleted_at": "2026-10-27T09:30:00Z",
"enabled": false,
"event": {
"address": null,
"cancelled_at": null,
"capacity": null,
"ends_at": null,
"going_count": null,
"has_address": null,
"has_online_url": null,
"host": null,
"is_full": null,
"maybe_count": null,
"online_url": null,
"open_to_host_followers": null,
"starts_at": null,
"state": null,
"timezone_name": null,
"viewer_rsvp": null
},
"featured_at": "2026-10-27T09:30:00Z",
"follower_count": 1,
"id": 42,
"is_admined_by_viewer": false,
"is_blocked_by_viewer": false,
"is_following_viewer": false,
"is_invited": false,
"is_leading_viewer": false,
"leader_count": 1,
"name": "string",
"origin_domain": "string",
"quote_policy": "string",
"show_reposts_on_profile": false,
"type": "string",
"uri": "https://example.org/",
"verified": false,
"website_url": "https://example.org/"
}
]
}
Make somebody an administrator of a Website
/websites/{id}/admins/By one of its administrators. Answers with them.
Who: Somebody signed in
Parameters
idintegerrequiredin pathThe group's or the event's id.
Body application/x-www-form-urlencoded or multipart/form-data
admin_idintegerrequiredThe person to make an administrator.
Answers
- 201CreatedActorNodeItem application/json
- 400the request is not well formed, or a value in it is not one it may be
- 401no token, or one that has expired
- 403the viewer may not
- 404there is no such Website or person
Request
curl -X POST "https://api.example.org/websites/<id>/admins/" \
-H "Authorization: Bearer $TOKEN" \
--data-urlencode "admin_id=42"
const form = new URLSearchParams();
form.append('admin_id', "42");
const response = await fetch('https://api.example.org/websites/<id>/admins/', {
method: 'POST',
headers: { Authorization: `Bearer ${token}` },
body: form,
});
const answer = await response.json();
import requests
response = requests.post(
"https://api.example.org/websites/<id>/admins/",
headers={"Authorization": f"Bearer {token}"},
data={"admin_id": "42"},
)
answer = response.json()
Answer · 201
{
"access": "string",
"alias": "string",
"allow_download": false,
"allow_follow_request": false,
"archived_at": "2026-10-27T09:30:00Z",
"author": {
"alias": "string",
"avatar_urls": {
"key": null
},
"id": 42,
"name": "string",
"type": "string"
},
"avatar_urls": {
"key": {
"size": null,
"url": "https://example.org/"
}
},
"body": "string",
"cover_urls": {
"key": {
"size": null,
"url": "https://example.org/"
}
},
"created_at": "2026-10-27T09:30:00Z",
"deleted_at": "2026-10-27T09:30:00Z",
"enabled": false,
"event": {
"address": {
"city": null,
"country": null,
"latitude": null,
"longitude": null,
"postal_code": null,
"state_province": null,
"street": null
},
"cancelled_at": "2026-10-27T09:30:00Z",
"capacity": 1,
"ends_at": "2026-10-27T09:30:00Z",
"going_count": 1,
"has_address": false,
"has_online_url": false,
"host": {
"alias": null,
"avatar_urls": null,
"id": null,
"name": null,
"type": null,
"verified": null
},
"is_full": false,
"maybe_count": 1,
"online_url": "https://example.org/",
"open_to_host_followers": false,
"starts_at": "2026-10-27T09:30:00Z",
"state": "string",
"timezone_name": "string",
"viewer_rsvp": "string"
},
"featured_at": "2026-10-27T09:30:00Z",
"follower_count": 1,
"id": 42,
"is_admined_by_viewer": false,
"is_blocked_by_viewer": false,
"is_following_viewer": false,
"is_invited": false,
"is_leading_viewer": false,
"leader_count": 1,
"name": "string",
"origin_domain": "string",
"quote_policy": "string",
"show_reposts_on_profile": false,
"type": "string",
"uri": "https://example.org/",
"verified": false,
"website_url": "https://example.org/"
}
Remove an administrator of a Website
/websites/{id}/admins/{admin_id}Who: Somebody signed in
Parameters
idintegerrequiredin pathThe group's or the event's id.admin_idintegerrequiredin pathThe administrator to remove.
Answers
- 204removed
- 400the request is not well formed, or a value in it is not one it may be
- 401no token, or one that has expired
- 403the viewer may not
- 404there is no such Website or administrator
Request
curl -X DELETE "https://api.example.org/websites/<id>/admins/<admin_id>" \
-H "Authorization: Bearer $TOKEN"
const response = await fetch('https://api.example.org/websites/<id>/admins/<admin_id>', {
method: 'DELETE',
headers: { Authorization: `Bearer ${token}` },
});
const answer = await response.json();
import requests
response = requests.delete(
"https://api.example.org/websites/<id>/admins/<admin_id>",
headers={"Authorization": f"Bearer {token}"},
)
answer = response.json()
What deleting a Website would take with it
/websites/{id}/deletion-countsFor the Danger zone, for whoever may delete it.
Who: Somebody signed in
Parameters
idintegerrequiredin pathThe profile's id.
Answers
- 200OKactor.GroupDeletionCounts application/json
- 400the request is not well formed, or a value in it is not one it may be
- 401no token, or one that has expired
- 403the viewer may not delete it
- 404there is no such profile
Request
curl "https://api.example.org/websites/<id>/deletion-counts" \
-H "Authorization: Bearer $TOKEN"
const response = await fetch('https://api.example.org/websites/<id>/deletion-counts', {
method: 'GET',
headers: { Authorization: `Bearer ${token}` },
});
const answer = await response.json();
import requests
response = requests.get(
"https://api.example.org/websites/<id>/deletion-counts",
headers={"Authorization": f"Bearer {token}"},
)
answer = response.json()
Answer · 200
{
"admins": 1,
"followers": 1,
"member_since": "string",
"posts": 1,
"replies": 1
}
Change whether new photos and videos may be downloaded
/websites/{id}/download-defaultWhat a post starts with; each post can say otherwise.
Who: Somebody signed in
Parameters
idintegerrequiredin pathThe profile's id.
Body application/json or application/x-www-form-urlencoded or multipart/form-data
allowbooleanWhether its new photos and videos start out downloadable.
Answers
- 200OKActorNode application/json
- 400the request is not well formed, or a value in it is not one it may be
- 401no token, or one that has expired
- 403the viewer may not change it
- 404there is no such profile
Request
curl -X PATCH "https://api.example.org/websites/<id>/download-default" \
-H "Authorization: Bearer $TOKEN" \
-H "Content-Type: application/json" \
-d '{
"allow": false
}'
const response = await fetch('https://api.example.org/websites/<id>/download-default', {
method: 'PATCH',
headers: { Authorization: `Bearer ${token}`, 'Content-Type': 'application/json' },
body: JSON.stringify({
"allow": false
}),
});
const answer = await response.json();
import requests
response = requests.patch(
"https://api.example.org/websites/<id>/download-default",
headers={"Authorization": f"Bearer {token}"},
json={
"allow": False
},
)
answer = response.json()
Answer · 200
{
"access": "string",
"administrators": [
{
"alias": "string",
"avatar_urls": {
"key": null
},
"id": 42,
"name": "string",
"type": "string"
}
],
"alias": "string",
"allow_download": false,
"allow_follow_request": false,
"archived_at": "2026-10-27T09:30:00Z",
"author": {
"alias": "string",
"avatar_urls": {
"key": null
},
"id": 42,
"name": "string",
"type": "string"
},
"authorized": {
"add_follower": false,
"administration": false,
"audiences": [
"string"
],
"block_from_owner": false,
"comment": false,
"composers": [
"string"
],
"delete": false,
"download": false,
"edit": false,
"hide": false,
"invite": false,
"like": false,
"pin": false,
"quote": false
},
"avatar_urls": {
"key": {
"size": null,
"url": "https://example.org/"
}
},
"body": "string",
"cover_urls": {
"key": {
"size": null,
"url": "https://example.org/"
}
},
"created_at": "2026-10-27T09:30:00Z",
"deleted_at": "2026-10-27T09:30:00Z",
"editor": {
"alias": "string",
"avatar_urls": {
"key": null
},
"id": 42,
"name": "string",
"type": "string"
},
"enabled": false,
"event": {
"address": {
"city": null,
"country": null,
"latitude": null,
"longitude": null,
"postal_code": null,
"state_province": null,
"street": null
},
"cancelled_at": "2026-10-27T09:30:00Z",
"capacity": 1,
"ends_at": "2026-10-27T09:30:00Z",
"going_count": 1,
"has_address": false,
"has_online_url": false,
"host": {
"alias": null,
"avatar_urls": null,
"id": null,
"name": null,
"type": null,
"verified": null
},
"is_full": false,
"maybe_count": 1,
"online_url": "https://example.org/",
"open_to_host_followers": false,
"starts_at": "2026-10-27T09:30:00Z",
"state": "string",
"timezone_name": "string",
"viewer_rsvp": "string"
},
"featured_at": "2026-10-27T09:30:00Z",
"features": [
{
"add_permissions": [
null
],
"composers": [
null
],
"enabled": false,
"node_types": [
null
],
"optional": false,
"ordering": 1,
"service": "string"
}
],
"follower_count": 1,
"id": 42,
"is_admined_by_viewer": false,
"is_blocked_by_viewer": false,
"is_following_viewer": false,
"is_invited": false,
"is_leading_viewer": false,
"leader_count": 1,
"name": "string",
"origin_domain": "string",
"permissions": {
"key": "string"
},
"quote_policy": "string",
"show_reposts_on_profile": false,
"type": "string",
"updated_at": "2026-10-27T09:30:00Z",
"uri": "https://example.org/",
"verified": false,
"website_url": "https://example.org/"
}
Turn a profile on or off
/websites/{id}/enabledReversible, site administrators only. Off, it is out of sight and may not act; nothing is deleted.
Who: Somebody signed in
Parameters
idintegerrequiredin pathThe profile's id.
Body application/json
enabledbooleanrequiredWhether it is shown and may act. Off, it is out of sight until it is turned on again; nothing is deleted.
Answers
- 200done
- 204it was so already
- 400the request is not well formed, or a value in it is not one it may be
- 401no token, or one that has expired
- 403the viewer may not
- 404there is no such profile
Request
curl -X PATCH "https://api.example.org/websites/<id>/enabled" \
-H "Authorization: Bearer $TOKEN" \
-H "Content-Type: application/json" \
-d '{
"enabled": false
}'
const response = await fetch('https://api.example.org/websites/<id>/enabled', {
method: 'PATCH',
headers: { Authorization: `Bearer ${token}`, 'Content-Type': 'application/json' },
body: JSON.stringify({
"enabled": false
}),
});
const answer = await response.json();
import requests
response = requests.patch(
"https://api.example.org/websites/<id>/enabled",
headers={"Authorization": f"Bearer {token}"},
json={
"enabled": False
},
)
answer = response.json()
Destroy a Website for good
/websites/{id}/purgeEverything of it, at once and with no thirty days. Super administrators only, never on their own profile. Queued, and done by the sweeper.
Who: A super administrator, who has just proved who they are again
Parameters
idintegerrequiredin pathThe profile's id.
Answers
- 200purged or queued alreadyPurgeQueued application/json
- 202queuedPurgeQueued application/json
- 400the request is not well formed, or a value in it is not one it may be
- 401no token, or one that has expired
- 403
step_up_required: the viewer must prove who they are again first; or the viewer may not, without a bodyRefusal application/json - 409it cannot be purged; nothing was queuedPurgeRefused application/json
Request
curl -X DELETE "https://api.example.org/websites/<id>/purge" \
-H "Authorization: Bearer $TOKEN"
const response = await fetch('https://api.example.org/websites/<id>/purge', {
method: 'DELETE',
headers: { Authorization: `Bearer ${token}` },
});
const answer = await response.json();
import requests
response = requests.delete(
"https://api.example.org/websites/<id>/purge",
headers={"Authorization": f"Bearer {token}"},
)
answer = response.json()
Answer · 200
{
"batch_id": "string",
"queued": 1,
"skipped": 1
}
Restore a deleted Website
/websites/{id}/restoreWithin the thirty days. Answers with it.
Who: Somebody signed in
Parameters
idintegerrequiredin pathThe profile's id.
Answers
- 200OKActorNode application/json
- 400the request is not well formed, or a value in it is not one it may be
- 401no token, or one that has expired
- 403the viewer may not
- 404there is no such profile to restore
Request
curl -X POST "https://api.example.org/websites/<id>/restore" \
-H "Authorization: Bearer $TOKEN"
const response = await fetch('https://api.example.org/websites/<id>/restore', {
method: 'POST',
headers: { Authorization: `Bearer ${token}` },
});
const answer = await response.json();
import requests
response = requests.post(
"https://api.example.org/websites/<id>/restore",
headers={"Authorization": f"Bearer {token}"},
)
answer = response.json()
Answer · 200
{
"access": "string",
"administrators": [
{
"alias": "string",
"avatar_urls": {
"key": null
},
"id": 42,
"name": "string",
"type": "string"
}
],
"alias": "string",
"allow_download": false,
"allow_follow_request": false,
"archived_at": "2026-10-27T09:30:00Z",
"author": {
"alias": "string",
"avatar_urls": {
"key": null
},
"id": 42,
"name": "string",
"type": "string"
},
"authorized": {
"add_follower": false,
"administration": false,
"audiences": [
"string"
],
"block_from_owner": false,
"comment": false,
"composers": [
"string"
],
"delete": false,
"download": false,
"edit": false,
"hide": false,
"invite": false,
"like": false,
"pin": false,
"quote": false
},
"avatar_urls": {
"key": {
"size": null,
"url": "https://example.org/"
}
},
"body": "string",
"cover_urls": {
"key": {
"size": null,
"url": "https://example.org/"
}
},
"created_at": "2026-10-27T09:30:00Z",
"deleted_at": "2026-10-27T09:30:00Z",
"editor": {
"alias": "string",
"avatar_urls": {
"key": null
},
"id": 42,
"name": "string",
"type": "string"
},
"enabled": false,
"event": {
"address": {
"city": null,
"country": null,
"latitude": null,
"longitude": null,
"postal_code": null,
"state_province": null,
"street": null
},
"cancelled_at": "2026-10-27T09:30:00Z",
"capacity": 1,
"ends_at": "2026-10-27T09:30:00Z",
"going_count": 1,
"has_address": false,
"has_online_url": false,
"host": {
"alias": null,
"avatar_urls": null,
"id": null,
"name": null,
"type": null,
"verified": null
},
"is_full": false,
"maybe_count": 1,
"online_url": "https://example.org/",
"open_to_host_followers": false,
"starts_at": "2026-10-27T09:30:00Z",
"state": "string",
"timezone_name": "string",
"viewer_rsvp": "string"
},
"featured_at": "2026-10-27T09:30:00Z",
"features": [
{
"add_permissions": [
null
],
"composers": [
null
],
"enabled": false,
"node_types": [
null
],
"optional": false,
"ordering": 1,
"service": "string"
}
],
"follower_count": 1,
"id": 42,
"is_admined_by_viewer": false,
"is_blocked_by_viewer": false,
"is_following_viewer": false,
"is_invited": false,
"is_leading_viewer": false,
"leader_count": 1,
"name": "string",
"origin_domain": "string",
"permissions": {
"key": "string"
},
"quote_policy": "string",
"show_reposts_on_profile": false,
"type": "string",
"updated_at": "2026-10-27T09:30:00Z",
"uri": "https://example.org/",
"verified": false,
"website_url": "https://example.org/"
}
Written by Claude, reviewed by Rastin Mehr · About this