Social posts and replies
Paths are relative to https://api.vrchatlegends.com/api. Public reads respect profile visibility, feed settings and moderation. Write requests use a bearer credential; examples of API-key scopes below do not replace ownership checks.
Timeline
GET /social/feed returns posts, total, limit, offset, and hasMore.
| Parameter | Meaning |
|---|---|
q | Search post text and VRChat photo metadata |
feed | latest, following, trending; omitted for For you |
type | text, image, video, media; omitted for all posts |
limit | Page size, 1–100; default 50 |
offset | Non-negative offset |
Following requires a signed-in website viewer; a logged-out request returns an empty result with requiresAuth: true. Reposts may refer to the same original post: retain feedKey for timeline identity. Use hasMore to stop pagination and handle changes to a live timeline without duplicating cards.
Profile feed
| Method and path | Behavior / API-key scope |
|---|---|
GET /players/:id/feed?q=… | Profile feed; feed:read if authenticated as an API key |
GET /players/:id/feed/:postId | One post, including sharing metadata |
POST /players/:id/feed | Create own post; feed:write, profile:write, or legends:write |
DELETE /players/:id/feed/:postId | Delete own post; feed:delete, profile:write, or legends:write |
POST /players/:id/feed/:postId/like | Toggle like; comments:write or legends:write |
POST /players/:id/feed/:postId/repost | Toggle repost; comments:write or legends:write |
POST /players/:id/feed/:postId/report | Report; comments:write |
The profile owner must enable Feed. A new post's JSON body accepts body, media (up to four previously uploaded media descriptors), and an optional quote containing playerId and postId. At least text, media, or a valid quote is required. API-created posts retain their API attribution after reload.
{
"body": "A world worth visiting.",
"media": [],
"quote": { "playerId": "PROFILE_ID", "postId": "POST_ID" }
}
Use GET /social/limits with the current viewer's credentials instead of hardcoding composer limits. Current tiers are:
| Membership | Post characters | Image upload | Video upload |
|---|---|---|---|
| Free | 100 | 8 MB | Not available |
| Bronze Legend | 150 | 15 MB | Not available |
| Gold Legend | 200 | 25 MB | 25 MB |
| Platinum Legend / Platinum Legend+ | 300 | 50 MB | 50 MB |
The backend independently validates limits. Oversized posts return 400; upload sizes return 413. Posting cooldowns, hourly caps and duplicate detection can return 429. Keep drafts intact when a request fails.
Replies
Method and path under /players/:id/feed/:postId | Input / behavior |
|---|---|
GET /comments | Read replies |
POST /comments | JSON body, optional parentId |
PUT /comments/:commentId | JSON body; author edits |
DELETE /comments/:commentId | Author, profile owner or authorized moderator |
POST /comments/:commentId/like | Toggle a reply like |
POST /comments/:commentId/report | Report a reply |
Reply writes require comments:write for API keys and a linked profile. Text is limited to 500 characters. Replies remain subject to block lists, content filtering and nesting limits. Do not treat 403 as a transient error or repeatedly retry it.