ActivityPub은 2개의 레이어를 제공한다:
이 작업은 엔드포인트를 통해 이루어지며, 이에 대한 예시는 다음과 같다:
{"@context": "<https://www.w3.org/ns/activitystreams>",
"type": "Person",
"id": "<https://social.example/alyssa/>",
"name": "Alyssa P. Hacker",
"preferredUsername": "alyssa",
"summary": "Lisp enthusiast hailing from MIT",
"inbox": "<https://social.example/alyssa/inbox/>",
"outbox": "<https://social.example/alyssa/outbox/>",
"followers": "<https://social.example/alyssa/followers/>",
"following": "<https://social.example/alyssa/following/>",
"liked": "<https://social.example/alyssa/liked/>"}
포스팅은 다음과 같이 이루어진다: (여기서의 포스트는 DM)
{"@context": "<https://www.w3.org/ns/activitystreams>",
"type": "Note",
"to": ["<https://chatty.example/ben/>"],
"attributedTo": "<https://social.example/alyssa/>",
"content": "Say, did you finish reading that book I lent you?"}
이는 Activity 오브젝트가 아니므로 서버는 이를 새 오브젝트가 생성되는 것으로 인지, Create 액티비티를 감싼다.
{"@context": "<https://www.w3.org/ns/activitystreams>",
"type": "Create",
"id": "<https://social.example/alyssa/posts/a29a6843-9feb-4c74-a7f7-081b9c9201d3>",
"to": ["<https://chatty.example/ben/>"],
"actor": "<https://social.example/alyssa/>",
"object": {"type": "Note",
"id": "<https://social.example/alyssa/posts/49e2d03d-b53a-4c4c-a95c-94a6abf45a19>",
"attributedTo": "<https://social.example/alyssa/>",
"to": ["<https://chatty.example/ben/>"],
"content": "Say, did you finish reading that book I lent you?"}}
여기에 답장을 보내 보면…
{"@context": "<https://www.w3.org/ns/activitystreams>",
"type": "Create",
"id": "<https://chatty.example/ben/p/51086>",
"to": ["<https://social.example/alyssa/>"],
"actor": "<https://chatty.example/ben/>",
"object": {"type": "Note",
"id": "<https://chatty.example/ben/p/51085>",
"attributedTo": "<https://chatty.example/ben/>",
"to": ["<https://social.example/alyssa/>"],
"inReplyTo": "<https://social.example/alyssa/posts/49e2d03d-b53a-4c4c-a95c-94a6abf45a19>",
"content": "<p>Argh, yeah, sorry, I'll get it back to you tomorrow.</p>
<p>I was reviewing the section on register machines,
since it's been a while since I wrote one.</p>"}}
<aside> 💡
"type": "Note"
블록에서 content
는 평문 텍스트 또는 유효한 HTML DOM을 지원한다.
이 HTML DOM은 Javascript나 인라인 CSS를 지원하지 않는다.
이 때문에 Misskey에서도 content
에는 HTML DOM으로 넣고 (특수효과 부분은 <i>...</i>
로 처리) 별도의 블록(”content-mfm: array<string>”이었나?)에 MFM을 담고 있다.
</aside>
그리고 좋아요를 표시하면 이렇다:
{"@context": "<https://www.w3.org/ns/activitystreams>",
"type": "Like",
"id": "<https://social.example/alyssa/posts/5312e10e-5110-42e5-a09b-934882b3ecec>",
"to": ["<https://chatty.example/ben/>"],
"actor": "<https://social.example/alyssa/>",
"object": "<https://chatty.example/ben/p/51086>"}
<aside> 💡
여기서와 같이, 이모지로 반응하기의 경우는 표준이 아닙니다.
</aside>
"to": "array<string>"
블록에 "<https://www.w3.org/ns/activitystreams#Public>"
을 포함하면 전체 공개(연합 타임라인 공개)로 포스팅한다. 이때 www.w3.org/ns/...
부분은 실제 AP 서버가 아니라 이를 통해 연합되지 않으므로, 팔로워를 태워 연합시키는 것이 일반적이다.