Docs · Signing in · What Quill sends · Syndication and channels · Photos and the media endpoint · Food and drink · Keyboard shortcuts and bookmarklets
What Quill sends
Every post is a POST to your Micropub endpoint with Content-Type: application/json and Authorization: Bearer …. The body is the JSON syntax from the spec: a type and a properties object whose values are always lists. Quill expects 201 or 202 with a Location header naming the new post, and takes you there.
Properties that are empty are left out. The mp-* commands sit beside the ordinary properties.
Note
{
"type": ["h-entry"],
"properties": {
"content": ["Hello world"],
"category": ["indieweb", "quill"],
"photo": [{"value": "https://example.com/media/1.jpg", "alt": "A cat"}, "https://example.com/media/2.jpg"],
"in-reply-to": ["https://other.example/post"],
"rsvp": ["yes"],
"location": ["geo:45.5231,-122.6765;u=20"],
"published": ["2026-10-02T08:30:00-07:00"],
"mp-slug": ["hello"],
"mp-syndicate-to": ["https://fed.example/@me"],
"mp-channel": ["notes"],
"post-status": ["draft"],
"visibility": ["private"]
}
}
rsvp is only sent when replying to an event. published, mp-slug, mp-channel, post-status and visibility are only sent when you set them (the published date is behind Ctrl+Shift+D). p3k-content-type: text/markdown is added when you switch the content type to Markdown (Ctrl+Shift+M).
Article
Articles are written in Markdown. By default the HTML is sent: "content": [{"html": "<p>…</p>"}] with name, category, mp-slug and post-status (draft only; published is the default and is not sent). In Settings you can choose to send the Markdown source instead: "content": ["…"] plus "p3k-content-type": ["text/markdown"].
Bookmark, like, repost
bookmark-of (with optional name, content and category), like-of, repost-of, each with the URL. Editing a like or repost sends an update:
{"action": "update", "url": "https://example.com/likes/1", "replace": {"like-of": ["https://new.example/"]}}
Event
{
"type": ["h-event"],
"properties": {
"name": ["IndieWebCamp"],
"start": ["2026-11-01T09:00-07:00"],
"end": ["2026-11-02"],
"location": [{"type": ["h-card"], "properties": {"name": ["Venue"], "latitude": [45.52], "longitude": [-122.68], "locality": ["Portland"], "region": ["OR"], "country-name": ["United States"]}}],
"content": ["…"],
"mp-channel": ["events"]
}
}
Without a venue match, location is the text you typed. The presentation fields (Ctrl+Shift+P) add slides, slides-embed, video-link, video-embed and a nested conference h-event.
Review
{"type": ["h-review"], "properties": {"item": [{"type": ["h-product"], "properties": {"name": ["…"], "url": ["…"]}}], "rating": [4], "best": [5], "content": ["…"], "summary": ["…"]}}
Weight
{"type": ["h-entry"], "properties": {"weight": [{"type": ["h-measure"], "properties": {"num": [72.5], "unit": ["kg"]}}], "published": ["…"]}}
Itinerary
{"type": ["h-entry"], "properties": {"itinerary": [{"type": ["h-leg"], "properties": {"transit-type": ["air"], "operator": ["Alaska"], "number": ["123"], "origin": ["PDX"], "destination": ["SFO"], "departure": ["2026-10-10T08:00:00-07:00"], "arrival": ["2026-10-10T10:00:00-07:00"]}}]}}
Food and drink
{"type": ["h-entry"], "properties": {"published": ["…"], "summary": ["Just drank: Americano"], "location": ["geo:…"], "drank": [{"type": ["h-food"], "properties": {"name": ["Americano"]}}]}}
Food uses ate. The location is either a geo: URI or the URL of your most recent checkin post.
Troubleshooting
When a post fails, the page shows the exact request and the raw response from your endpoint. The last response is also kept on the Settings page.