Build a social app
05 · Social graph
Follow, mute, block.
Three edge kinds, one consistent shape. Follow shows up in your feed; mute hides someone's content from you without telling them; block is bidirectional and tears down anything in between.
1
Follow
bash
# Alice follows Bob
curl -X POST -H "Authorization: Bearer pcft_live_..." \
-H "content-type: application/json" \
-d '{ "src_actor_id": "<alice>", "dst_actor_id": "<bob>" }' \
https://agora.productcraft.co/v1/communities/<c>/follows
# Unfollow
curl -X DELETE -H "Authorization: Bearer pcft_live_..." \
https://agora.productcraft.co/v1/communities/<c>/follows/<alice>/<bob>2
Followers + following lists
bash
# Who follows Carol?
curl -H "Authorization: Bearer pcft_live_..." \
https://agora.productcraft.co/v1/communities/<c>/actors/<carol>/followers?limit=50
# Who does Alice follow?
curl -H "Authorization: Bearer pcft_live_..." \
https://agora.productcraft.co/v1/communities/<c>/actors/<alice>/following?limit=50Both responses are cursor-paginated edges. To render an avatar grid you'll typically want to expand each edge against your own user table — keep actor.id ↔ user.id mapped on your side at signup time (see stage 2).
3
Mute
Mute is one-directional and silent. Alice mutes Bob — Bob sees nothing, but Alice stops seeing Bob's posts in her feed.
bash
# Mute / unmute
curl -X POST -H "Authorization: Bearer pcft_live_..." \
-H "content-type: application/json" \
-d '{ "src_actor_id": "<alice>", "dst_actor_id": "<bob>" }' \
https://agora.productcraft.co/v1/communities/<c>/mutes
curl -X DELETE -H "Authorization: Bearer pcft_live_..." \
https://agora.productcraft.co/v1/communities/<c>/mutes/<alice>/<bob>
# List actors Alice has muted
curl -H "Authorization: Bearer pcft_live_..." \
https://agora.productcraft.co/v1/communities/<c>/actors/<alice>/mutes?limit=504
Block (and what it tears down)
Blocking is bidirectional and aggressive — creating a block from Bob → Alice:
- Drops any existing follow / mute between them (in both directions).
- Refuses any subsequent follow / mute / reaction between the pair with
409until the block is lifted. - Hides each one's content from the other's feed and profile.
bash
# Block / unblock
curl -X POST -H "Authorization: Bearer pcft_live_..." \
-H "content-type: application/json" \
-d '{ "src_actor_id": "<bob>", "dst_actor_id": "<alice>" }' \
https://agora.productcraft.co/v1/communities/<c>/blocks
curl -X DELETE -H "Authorization: Bearer pcft_live_..." \
https://agora.productcraft.co/v1/communities/<c>/blocks/<bob>/<alice>
# Trying to follow Bob during a block returns:
# {
# "statusCode": 409,
# "message": "Cannot create this edge — one or both actors have a block in place"
# }5
Edge listings, in summary
Four lists, all cursor-paginated, all under /actors/:actorId/<list>:
followers— who follows this actor.following— who this actor follows.mutes— who this actor has muted.blocks— who this actor has blocked.