personal activity index (bluesky, leaflet, substack)
pai.desertthunder.dev
rss
bluesky
1{
2 "name": "Personal Activity Index API",
3 "version": "0.0.0",
4 "description": "Aggregate and query your personal activity across multiple platforms",
5 "endpoints": [
6 {
7 "method": "GET",
8 "path": "/",
9 "description": "API documentation",
10 "response": "This documentation in JSON format"
11 },
12 {
13 "method": "GET",
14 "path": "/status",
15 "description": "Health check and version information",
16 "response": {
17 "status": "ok",
18 "version": "string"
19 }
20 },
21 {
22 "method": "GET",
23 "path": "/api/feed",
24 "description": "List items from all sources with optional filtering",
25 "parameters": [
26 {
27 "name": "source_kind",
28 "type": "string",
29 "required": false,
30 "description": "Filter by source type",
31 "values": ["substack", "bluesky", "leaflet", "bearblog"]
32 },
33 {
34 "name": "source_id",
35 "type": "string",
36 "required": false,
37 "description": "Filter by specific source identifier (domain or handle)"
38 },
39 {
40 "name": "limit",
41 "type": "integer",
42 "required": false,
43 "default": 20,
44 "description": "Maximum number of items to return"
45 },
46 {
47 "name": "since",
48 "type": "string",
49 "required": false,
50 "description": "ISO 8601 timestamp - only return items published after this time"
51 },
52 {
53 "name": "q",
54 "type": "string",
55 "required": false,
56 "description": "Search query - matches against title and summary"
57 }
58 ],
59 "response": {
60 "items": [
61 {
62 "id": "string",
63 "source_kind": "bluesky|substack|leaflet|bearblog",
64 "source_id": "string",
65 "author": "string?",
66 "title": "string?",
67 "summary": "string?",
68 "url": "string",
69 "content_html": "string?",
70 "published_at": "ISO 8601 timestamp",
71 "created_at": "ISO 8601 timestamp"
72 }
73 ]
74 }
75 },
76 {
77 "method": "GET",
78 "path": "/api/item/:id",
79 "description": "Get a single item by its unique ID",
80 "parameters": [
81 {
82 "name": "id",
83 "type": "string",
84 "required": true,
85 "description": "The unique identifier of the item"
86 }
87 ],
88 "response": "Single item object or 404 if not found"
89 },
90 {
91 "method": "POST",
92 "path": "/api/sync",
93 "description": "Manually trigger synchronization from all configured sources",
94 "response": {
95 "status": "success",
96 "message": "Sync completed successfully"
97 }
98 }
99 ],
100 "sources": {
101 "substack": "RSS feeds from Substack publications",
102 "bluesky": "Posts from Bluesky via AT Protocol API",
103 "leaflet": "Publications from Leaflet (Bluesky-based blogging)",
104 "bearblog": "Posts from Bear Blog RSS feeds"
105 },
106 "scheduled_sync": {
107 "description": "Automatic synchronization runs on a scheduled basis",
108 "schedule": "Configured via cron triggers in wrangler.toml"
109 }
110}