A small tool to view real-world ActivityPub objects as JSON! Enter a URL
or username from Mastodon or a similar service below, and we'll send a
request with
the right
Accept
header
to the server to view the underlying object.
{
"@context": [
"https://www.w3.org/ns/activitystreams",
{
"ostatus": "http://ostatus.org#",
"atomUri": "ostatus:atomUri",
"inReplyToAtomUri": "ostatus:inReplyToAtomUri",
"conversation": "ostatus:conversation",
"sensitive": "as:sensitive",
"toot": "http://joinmastodon.org/ns#",
"votersCount": "toot:votersCount"
}
],
"id": "https://mastodon.ar.al/users/aral/statuses/113913102247405922/replies",
"type": "Collection",
"first": {
"id": "https://mastodon.ar.al/users/aral/statuses/113913102247405922/replies?page=true",
"type": "CollectionPage",
"next": "https://mastodon.ar.al/users/aral/statuses/113913102247405922/replies?only_other_accounts=true&page=true",
"partOf": "https://mastodon.ar.al/users/aral/statuses/113913102247405922/replies",
"items": [
{
"id": "https://mastodon.ar.al/users/aral/statuses/113913105866977655",
"type": "Note",
"summary": null,
"inReplyTo": "https://mastodon.ar.al/users/aral/statuses/113913102247405922",
"published": "2025-01-29T18:40:53Z",
"url": "https://mastodon.ar.al/@aral/113913105866977655",
"attributedTo": "https://mastodon.ar.al/users/aral",
"to": [
"https://mastodon.ar.al/users/aral/followers"
],
"cc": [
"https://www.w3.org/ns/activitystreams#Public"
],
"sensitive": false,
"atomUri": "https://mastodon.ar.al/users/aral/statuses/113913105866977655",
"inReplyToAtomUri": "https://mastodon.ar.al/users/aral/statuses/113913102247405922",
"conversation": "tag:mastodon.ar.al,2025-01-29:objectId=48497388:objectType=Conversation",
"content": "<p>Alt text for first screenshot continued here to due to arbitrary Mastodon character limit on alt text:</p><p>Code lines shown are lines 90-128:</p><p>class ImportProgress extends kitten.Component {<br /> importStarted = false<br /> importEnded = false<br /> message = 'Uploading…'<br /> /** @type {boolean|string} */<br /> error = false<br /> stats = {<br /> domainsFound: 0,<br /> domainsImported: 0,<br /> duplicatesIgnored: 0<br /> }</p><p> html () {<br /> return kitten.html`<br /> <div id='import-status'><br /> <if ${this.importStarted}><br /> <if ${this.importEnded && !this.error}><br /> <then><br /> <markdown><br /> #### Import complete!</p><p> | Domains | |<br /> | -------------------- | ---------------------------------------- |<br /> | Found | ${this.stats.domainsFound} |<br /> | Imported | ${this.stats.domainsImported} |<br /> | Ignored (duplicates) | ${this.stats.duplicatesIgnored} |<br /> <br /> [View places](/settings/places/)<br /> </markdown><br /> <style><br /> table {<br /> table-layout: auto;<br /> }<br /> </style><br /> </then><br /> <else><br /> <div><${SvgSpinner} /> ${this.message}</div><br /> </else><br /> </if><br /> </if><br /> <if ${this.error}><br /> <div class='error'>❌ ${this.error}</div><br /> </if><br /> </div><br /> `<br /> }</p><p> onConnect () {<br /> this.addEventHandler(this.page.request.session, 'placesExportUploaded', /** @this {ImportProgress} */ async function (upload) {</p>",
"contentMap": {
"en": "<p>Alt text for first screenshot continued here to due to arbitrary Mastodon character limit on alt text:</p><p>Code lines shown are lines 90-128:</p><p>class ImportProgress extends kitten.Component {<br /> importStarted = false<br /> importEnded = false<br /> message = 'Uploading…'<br /> /** @type {boolean|string} */<br /> error = false<br /> stats = {<br /> domainsFound: 0,<br /> domainsImported: 0,<br /> duplicatesIgnored: 0<br /> }</p><p> html () {<br /> return kitten.html`<br /> <div id='import-status'><br /> <if ${this.importStarted}><br /> <if ${this.importEnded && !this.error}><br /> <then><br /> <markdown><br /> #### Import complete!</p><p> | Domains | |<br /> | -------------------- | ---------------------------------------- |<br /> | Found | ${this.stats.domainsFound} |<br /> | Imported | ${this.stats.domainsImported} |<br /> | Ignored (duplicates) | ${this.stats.duplicatesIgnored} |<br /> <br /> [View places](/settings/places/)<br /> </markdown><br /> <style><br /> table {<br /> table-layout: auto;<br /> }<br /> </style><br /> </then><br /> <else><br /> <div><${SvgSpinner} /> ${this.message}</div><br /> </else><br /> </if><br /> </if><br /> <if ${this.error}><br /> <div class='error'>❌ ${this.error}</div><br /> </if><br /> </div><br /> `<br /> }</p><p> onConnect () {<br /> this.addEventHandler(this.page.request.session, 'placesExportUploaded', /** @this {ImportProgress} */ async function (upload) {</p>"
},
"attachment": [],
"tag": [],
"replies": {
"id": "https://mastodon.ar.al/users/aral/statuses/113913105866977655/replies",
"type": "Collection",
"first": {
"type": "CollectionPage",
"next": "https://mastodon.ar.al/users/aral/statuses/113913105866977655/replies?only_other_accounts=true&page=true",
"partOf": "https://mastodon.ar.al/users/aral/statuses/113913105866977655/replies",
"items": []
}
},
"likes": {
"id": "https://mastodon.ar.al/users/aral/statuses/113913105866977655/likes",
"type": "Collection",
"totalItems": 0
},
"shares": {
"id": "https://mastodon.ar.al/users/aral/statuses/113913105866977655/shares",
"type": "Collection",
"totalItems": 0
}
}
]
}
}