I didn't realise this, so I'm documenting it to stop other people making the same silly mistake that I did.
Messages in ActivityPub have two distinct ID strings. Here's a (truncated) view of what happens when I send a new message on Mastodon:
JSON
"id": "https://mastodon.social/users/Edent/statuses/1234567890/activity", "type": "Create", "actor": "https://mastodon.social/users/Edent", "published": "2024-03-10T16:13:49Z", "object": { "id": "https://mastodon.social/users/Edent/statuses/1234567890", "type": "Note", "content": "Hello" ...
The "Note" has some human-readable content, some metadata, and an ID - in this case a URl ending with 1234567890
But that Note is wrapped in an Activity. In this case, it is a "Create" message, with some metadata, and it's own ID - in this case ending 1234567890/activity
What happens if I edit the post? Here's a truncated view of what the server sends:
JSON
"id": "https://mastodon.social/users/Edent/statuses/1234567890#updates/1710087334", "type": "Update", "actor": "https://mastodon.social/users/Edent", "published": "2024-03-10T16:15:34Z", "object": { "id": "https://mastodon.social/users/Edent/statuses/1234567890", "type": "Note", "content": "I meant Goodbye!" ...
The "Note" has the same ID as before - but the activity has a different ID.
Further updates follow the same pattern:
JSON
"id": "https://mastodon.social/users/Edent/statuses/1234567890#updates/1984651324", "type": "Update", "object": { "id": "https://mastodon.social/users/Edent/statuses/1234567890", ...
So what happens when I Delete a previously updated post?
Here's what's sent:
JSON
"id": "https://mastodon.social/users/Edent/statuses/1234567890#delete", "type": "Delete", "actor": "https://mastodon.social/users/Edent", "object": { "id": "https://mastodon.social/users/Edent/statuses/1234567890", "type": "Tombstone", ...
Again, the Activity has its own, unique, ID. But it is the original ID of the Note which is to be deleted!
The spec says that all IDs must be URls - but it doesn't say what format they should be in. Mastodon helpfully makes the Activity's ID somewhat related to the object's ID - but not all software will do that.
So, if you're doing something like saving messages to disk or a database, use the object ID as the canonical reference. The ID of the Activity isn't particularly important when it comes to receiving updates, deletes, replies, or anything else.
2 thoughts on “How updates work in ActivityPub / Mastodon”
@Edent@mastodon.social interesting... this might be related to why my updates don't propagate to Mastodon, might be the activity id needs to be unique.
Issue propagating Updates to Mastodon
| Reply to original comment on community.nodebb.org
@Edent yep, always useful to think of activities as its own kind of object.
in my implementation, i even have a separate activity database. keeping track of them (& assigning a distinct url to each one) becomes a lot easier.
| Reply to original comment on mastodon.top
More comments on Mastodon.