Profiles
Websites
actor-service
A website's feed as a profile (websites.md), followed here and from the fediverse, and looked after by its admins. It is made by connecting the site, which proves its domain (syndication-service, POST /websites/_connect), so it has no route here to make one.
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)actor.WebsiteNode 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,
"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"
},
"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
- 200OKactor.WebsiteNode 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,
"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"
},
"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/"
}
As every profile
The same on every kind, at this kind’s address. What each does is under Profiles.
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 admins
/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 admin of a website
/websites/{id}/admins/By one of its admins. 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 admin 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 admin
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
- 200OKactor.WebsiteNode 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,
"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"
},
"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()
Feature a profile, or stop
/websites/{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/websites/<id>/featured" \
-H "Authorization: Bearer $TOKEN" \
-H "Content-Type: application/json" \
-d '{
"featured": false
}'
const response = await fetch('https://api.example.org/websites/<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/websites/<id>/featured",
headers={"Authorization": f"Bearer {token}"},
json={
"featured": 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
- 200OKactor.WebsiteNode 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,
"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"
},
"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