Social guides
Guides

Reposts.

Share a post with no commentary. Reposts are regular post rows with kind='repost' and a source_post_id — the entire feed / reaction / comment pipeline picks them up automatically.


1

Repost a post

Idempotent: re-reposting the same source returns the existing repost with created: false. Visibility is inherited from the source — reposting a followers-only post produces a repost that also has visibility="followers".

bash
curl -X POST \
  -H "Authorization: Bearer pcft_live_..." \
  -H "Content-Type: application/json" \
  -d '{"actor_id":"<actorId>"}' \
  "https://social.productcraft.co/v1/communities/<communityId>/posts/<sourcePostId>/repost"
json
{
  "repost": {
    "id": "bbbbbbbb-...",
    "kind": "repost",
    "actor_id": "aaaaaaaa-...",
    "source_post_id": "bbbbbbbb-...",
    "body": null,
    "title": null,
    "visibility": "public",
    "status": "published",
    "...": "..."
  },
  "source": {
    "id": "bbbbbbbb-...",
    "kind": "text",
    "actor_id": "aaaaaaaa-other-...",
    "body": "the original post",
    "repost_count": 4,
    "...": "..."
  },
  "created": true
}

2

Undo a repost

Soft-deletes the repost row (status='removed') and decrements both counters. Idempotent — DELETE on a non-existent repost still 204s.

bash
curl -X DELETE \
  -H "Authorization: Bearer pcft_live_..." \
  -H "Content-Type: application/json" \
  -d '{"actor_id":"<actorId>"}' \
  "https://social.productcraft.co/v1/communities/<communityId>/posts/<sourcePostId>/repost"

3

See who reposted

Cursor-paginated newest-first. Each entry is the full repost post row — actor_id tells you who reposted, created_at when. Useful for an “X reposted this” UI line.

bash
curl -H "Authorization: Bearer pcft_live_..." \
  "https://social.productcraft.co/v1/communities/<communityId>/posts/<sourcePostId>/reposts?limit=20"

What changes

Downstream effects

  • Feed inclusion. Reposts are post rows so the regular actor feed picks them up automatically — followers of the reposter see the repost interleaved with the reposter's own posts. Both chronological and ranked modes work without changes.
  • Source counter. source.repost_count is bumped / decremented atomically. Visible on every read of the source post.
  • Author counter. The reposter's post_count goes up by 1 (reposts count as posts).
  • Notification. The source author gets a kind: "repost" notification. Suppressed for self-reposts (refused at 422 anyway), blocked-pair, and recipients who've muted the repost kind via notification preferences.
  • Engagement on the repost itself. Reactions, comments, bookmarks all work — the repost is just a post.

Refusals

What 422s

  • CANNOT_REPOST_SELF — reposting your own post.
  • CANNOT_REPOST_PRIVATE — the source has visibility="private". Private posts can't be shared by definition.

Cross-community / removed / draft / expired sources, and sources the reposter can't see (followers / close_friends), all return 404 (opaque) per the standard social boundary rule.


Permissions

PAK scopes

  • POST: social.create on pcft:agora:post/*.
  • DELETE: social.delete on pcft:agora:post/*.
  • GET: social.list on the community URN.