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=50

Both 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=50

4

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 409 until 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.