CAN Member API
Version 2.5 (2026)
· Gateway: https://www.creativeapplications.net/wp-json
Terms of Use
By accessing the CAN Member API, you agree to the following conditions:
Permitted Uses
- Personal research and data analysis
- Creating custom notifications or alerts for your own use
- Building tools that extend or complement CAN's functionality in novel ways
- Academic research and educational projects
- Integrations with other platforms that add unique value
Prohibited Uses
-
No replication of CAN services.
You may not use this API to create, distribute, or operate any application, website, or service that replicates, emulates, or substitutes the functionality provided by CreativeApplications.Net, including but not limited to:
- The CAN website (creativeapplications.net)
- Any future official CAN applications or services
- No competing products. You may not build alternative clients, readers, or interfaces that serve as replacements for official CAN platforms.
- No bulk data harvesting. Systematic downloading of content for the purpose of creating derivative databases or services is prohibited.
- No automated agents or "AI Skills." You may not use the API or site credentials to train, power, or operate automated AI agents, "agentic" software, or third-party automation frameworks (e.g., OpenClaw, MultiOn, or custom "Skills"). The Service is intended for direct interaction by human users; the delegation of account access to autonomous scripts for the purpose of navigating, summarizing, or interacting with the API is strictly prohibited.
- No redistribution. Content accessed via this API may not be republished or redistributed without explicit permission.
Enforcement
CAN reserves the right to revoke API access at any time for violations of these terms or for any activity deemed harmful to the CAN community or platform.
Changes to Terms
These terms may be updated at any time. Continued use of the API constitutes acceptance of any modifications.
Authentication
Basic Authentication — All requests require a username and app-generated password
- Log in to creativeapplications.net
- Go to Edit Profile > App Password
- Generate a 24-character password
- Use username and password with curl, or pass as Authorization header
curl -u "username:app_password" https://www.creativeapplications.net/wp-json/wp/v2/activity-logs
Testing these URLs directly in a browser tab will result in a 401 rest_forbidden error. Authenticated requests must be made via scripts, terminal, or API clients.
- Revocation: Regenerate a new password in your profile settings to invalidate the old one
- Storage: Never commit app passwords to version control; use environment variables
- Permissions: App password has the same permissions as your account
Rate Limiting
API requests are rate limited — 60 requests per 60 seconds. Exceeding it returns HTTP 429.
Silent Polling
By default, fetching page 1 of the activity feed stamps a server-side "last visited" timestamp for your account. This timestamp is used by the CAN website to show a dot indicator when new content has been published since your last visit. If you are building a background polling client (e.g. a menu bar app or notification tool), pass silent=1 to avoid clearing this indicator unintentionally.
curl -u "your_username:your_app_password" \
"https://www.creativeapplications.net/wp-json/wp/v2/activity-logs?page=1&per_page=20&silent=1"
Recommended pattern for a polling client
1. On startup — sync last-visit state from the server
curl -u "your_username:your_app_password" \
"https://www.creativeapplications.net/wp-json/can/v1/member/your_username"
Use the lastActivityVisit Unix timestamp from the response as your baseline.
2. On each background poll — fetch silently
curl -u "your_username:your_app_password" \
"https://www.creativeapplications.net/wp-json/wp/v2/activity-logs?page=1&per_page=20&silent=1"
Count entries with an id greater than your last known ID, or a date newer than lastActivityVisit.
3. When the user acknowledges — stamp the visit
curl -u "your_username:your_app_password" \
"https://www.creativeapplications.net/wp-json/wp/v2/activity-logs?page=1&per_page=1"
Fetch without silent=1 to update the server-side timestamp, clearing the website dot indicator.
Activity Response Fields
Activity log responses (the feed, channels, member activities and threads) include additional data fields based on the activity type. These fields are only present when relevant.
author_meta
Included when the activity is a profile update. Fields depend on the update type: User Location Updated → location, latitude, longitude; User Bio Updated → description; User Website URL Updated → url; User Discord Updated → discord; User TwitterX Updated → twitterx; User Instagram Updated → instagram; User Other Updated → other; User Skills Updated → skills (comma-separated string).
{
"id": 12345,
"title": { "rendered": "User Location Updated by filip" },
"author_meta": {
"location": "London, UK",
"latitude": "51.5074",
"longitude": "-0.1278"
}
}
term_data
Included for: People Saved, Tools Saved, Term Comment, Term Description Added.
{
"id": 12345,
"title": { "rendered": "People Saved by filip" },
"term_data": {
"name": "Zach Lieberman",
"description": "Artist and educator based in New York...",
"link": "https://www.creativeapplications.net/people/zach-lieberman/",
"image_urls": [
"https://www.creativeapplications.net/wp-content/uploads/...",
"https://www.creativeapplications.net/wp-content/uploads/..."
]
}
}
event_data
Included for: Event Added.
{
"id": 12345,
"title": { "rendered": "Event Added by filip" },
"event_data": {
"title": "Creative Coding Meetup",
"excerpt": "Join us for an evening of creative coding...",
"image_url": "https://www.creativeapplications.net/wp-content/uploads/...",
"start_date": "2026-03-15",
"end_date": "2026-03-15",
"location": "London, UK",
"event_type": "Meetup",
"link": "https://www.creativeapplications.net/events/creative-coding-meetup/"
}
}
memberData
Included for: Member Saved.
{
"id": 12345,
"title": { "rendered": "Member Saved by filip" },
"memberData": {
"name": "John Doe",
"username": "johndoe",
"description": "Creative developer based in Berlin...",
"link": "https://www.creativeapplications.net/author/johndoe/",
"location": "Berlin, Germany"
}
}
gallery_images
Included when the activity references a post containing a WordPress gallery block. Returns medium-sized image URLs. Posts without galleries will not have this field.
{
"id": 12345,
"title": { "rendered": "Post Published by filip" },
"gallery_images": [
"https://www.creativeapplications.net/wp-content/uploads/2026/02/image1-1200x750.jpg",
"https://www.creativeapplications.net/wp-content/uploads/2026/02/image2-1200x750.jpg"
]
}
activity_entry
Included for activities of type Activity Entry (posts created via the composer). thumbnail_url and thumbnail_filename are null when no image was attached. The author_meta object for activity entries only contains username; other profile fields are null. Entries also carry top-level live_url and code_block fields when set (both absent otherwise). live_url additionally appears on post activities when the referenced article has a live URL.
{
"id": 12345,
"title": { "rendered": "Activity Entry by filip" },
"activity_entry": {
"thumbnail_url": "https://www.creativeapplications.net/wp-content/uploads/2026/02/activity-filip-20260226.jpg",
"thumbnail_filename": "activity-filip-20260226.jpg"
},
"live_url": "https://example.com/sketch",
"code_block": "vec3 c = mix(a, b, t);",
"author_meta": {
"username": "filip"
}
}
save_data
Always included. Indicates whether the current user has saved the referenced item (post, term, or member).
{
"save_data": {
"is_saved": false
}
}
like_data
Always included. Note that like_count and liker_names are only visible to the post author for privacy reasons.
// Response for the post author:
{
"like_data": {
"is_liked": false,
"like_count": 5,
"is_author": true,
"liker_names": ["user1", "user2", "user3", "user4", "user5"]
}
}
// Response for other users:
{
"like_data": {
"is_liked": true,
"is_author": false
}
}
Error Codes
| Code | Name | Description |
|---|---|---|
| 200 | OK | Request successful |
| 400 | Bad Request | Invalid parameters (e.g., missing required field). Check the response message for details. |
| 401 | Unauthorized | Missing or invalid credentials. Verify username and app password. |
| 403 | Forbidden | You don't have permission for this action (e.g., editing another user's profile) |
| 404 | Not Found | Resource doesn't exist (e.g., invalid activity ID or username) |
| 429 | Too Many Requests | Rate limit exceeded. Wait before retrying. |
| 500 | Server Error | Something went wrong on the server. Try again later. |
Error Response Format
{
"code": "rest_forbidden",
"message": "You must be logged in to view activity logs.",
"data": {
"status": 401
}
}
Common Issues
401 Unauthorized
- Double-check your username (case-sensitive)
- Ensure you're using an App Password, not your regular login password
- Verify the App Password hasn't been revoked
- Make sure there are no extra spaces in credentials
403 Forbidden
- You may be trying to access a resource you don't have permission for
- Some security plugins may block requests — ensure your User-Agent header is set
404 Not Found
- The activity ID or username doesn't exist
- Check for typos in the endpoint URL
Best Practices
- Cache responses when possible: Avoid fetching the same data repeatedly. Use conditional requests or local caching.
- Use pagination for large datasets: Don't fetch thousands of items at once. Use per_page and page parameters.
- Use silent=1 for background polling: If you're polling for new content in the background, use silent=1 to avoid clearing the 'new activity' indicator on the website.
- Respect rate limits: If you get a 429 response, wait before retrying. The response includes a retry_after field.
- Handle errors gracefully: Always check the response status code. API errors return JSON with code, message, and data fields.
- Use filter parameters: Use the filter parameter instead of fetching all activities and filtering locally. This is faster and more efficient.
Support & Contact
If you encounter API bugs or unexpected behavior, please report them by email. Feature requests and ideas for new endpoints are welcome at the same address. API support is provided on a best-effort basis — for urgent account issues, use the standard contact form on the website.
Email: api@creativeapplications.net
Browse Activity
Fetch and filter the activity feed with pagination and various filter options. This is the core feature for reading what's happening on CAN.
/wp/v2/activity-logs
Fetch Activity Feed
Get paginated activity logs with optional filtering and sorting. This is the main endpoint for reading the activity stream.
/wp/v2/activity-logs/{id}
Get Single Activity
Fetch a specific activity log entry by ID with all metadata and conditional fields.
Interact with Activity
Like, comment, and save activities. React to and engage with other members' posts and updates.
/can/v1/toggle-like
Like/Unlike Activity
Like or unlike (Dap) an activity. This toggles your like status.
/can/v1/activity-comment
Post Comment
Post a comment on an activity. Supports @mentions.
/can/v1/activity-thread/{id}
Get Activity Thread
Get an activity and all its comments/replies, forming a complete conversation thread.
/can/v1/toggle-save
Save/Unsave Post
Save or unsave a post (article or event).
/can/v1/toggle-save-archive
Save/Unsave Member or Term
Save or unsave a member (author) or taxonomy term (People/Tools).
/can/v1/report-block
Report / Block a Member
Report that you have blocked a member. Sends a moderation report to the CAN team recording who blocked whom and from which activity. Hiding the blocked member's content is handled client-side; this endpoint records the report.
/can/v1/delete-activity
Delete Activity
Move an activity log entry to trash. Allowed for the entry's author (or CAN editors). Channel counts are updated accordingly, and the CAN team is notified when a member deletes their own entry. Returns 404 for an unknown ID and 403 when you're not the author.
Create Activity
Post new activity entries, upload images, and add content to your feed. Share text, photos, and code with the community.
/can/v1/post-activity-entry
Post Activity Entry
Create a new activity entry (text post, optionally with image). Max 500 characters, up to 5 #channels.
/can/v1/upload-activity-image
Upload Image
Upload an image for use in an activity entry. Returns attachment_id for use in post-activity-entry.
Manage Profile
Update your profile information, customize your theme, and manage account preferences.
/can/v1/new-activity-count
Count New Activities
Get the number of activities published since your last visit. Lightweight alternative to fetching the full feed.
/can/v1/update-profile
Update Profile
Update your profile information. Logs the change as a User activity.
/can/v1/theme
Get Custom Theme
Fetch the authenticated user's custom theme colour variables.
/can/v1/theme
Save Custom Theme
Save custom theme colour variables. Posting an empty object clears the theme.
/can/v1/theme
Clear Custom Theme
Remove your saved custom theme entirely, reverting to the site defaults. Equivalent to posting an empty variables object.
Explore
Discover members, browse channels, and search for content. Find people and topics of interest.
/can/v1/member/{username}
Get Member Profile
Get a member's profile information including bio, skills, location, social links, and metadata.
/can/v1/member-activities/{user_id}
Get Member's Activity Feed
Get a member's activity feed, filtered to their contributions.
/can/v1/channels
List Channels
Get all channels sorted by activity count. Channels are automatically created when #channelname is used in activity entries.
/can/v1/channels/{channel}
Get Channel Feed
Fetch paginated activity for a specific channel.
/can/v1/stats
Community Stats
Aggregated community statistics: headline summary (days active, participants, total actions), a 90-day activity graph, community and content stats, site analytics goals, and activity counts by type. Powers the stats screen in the iOS app.
Search
Token-based search across the whole CAN ecosystem — articles, books, events, jobs, People/Tools/Tags, members, and activity. Multiple comma-separated tokens are combined with AND.
/can/v1/search
Search
Search across articles, books, events, jobs, terms (People/Tools/Tags), members, and activity. Results come back grouped per section, each with a has_more flag for pagination. Excerpts wrap matched tokens in <mark> tags — strip or style them client-side. Responses are cached server-side for 5 minutes. Members only (401 when logged out).
Browse Archives
Browse published CAN articles and pages — project cards filtered by tools, people, or keywords, plus direct access to individual posts.
/can/v1/projects
Browse Projects
Fetch paginated project cards. Card-shaped, lightweight response with title, excerpt, thumbnail, author, tools, and people. tool and people may be combined — results match both. Responses are cached server-side for 10 minutes.
/can/v1/projects/tools
List Tools
Get all Tools that have at least one project, sorted by project count. Use this to discover valid tool slugs for filtering.
/wp/v2/posts/{id}
Get a Post
Fetch a standard post/article — use it to resolve articles referenced by an activity's object_id. Standard WordPress REST response format.
/wp/v2/pages/{id}
Get a Page
Fetch a page referenced by an activity's object_id. Standard WordPress REST response format.
Mentions & Notifications
Fetch and manage mentions and notifications. Stay updated when someone mentions you.
/can/v1/mentions
Get Mentions
Fetch activities where the current user is mentioned.
/can/v1/mark-mentions-read
Mark Mentions as Read
Clear the notification indicator for unread mentions.
Session & App Configuration
Validate credentials, create WordPress sessions for WebViews, and fetch server-managed app configuration like the live URL blocklist.
/wp/v2/users/me
Validate Credentials
Get the current user. A lightweight way to check that a username + App Password pair is valid before making other requests.
/can/v1/auth-session
Create Session
Create a WordPress session for the authenticated user — returns auth cookies. Used for WebView authentication, so an app can open logged-in website views without asking for credentials again.
/can/v1/live-url-blocklist
Live URL Blocklist
Fetch the server-managed list of blocked link domains. Domains in this list should be treated as unsafe when rendering user-submitted links. The list is updated server-side without requiring an app release.
Version History
Changes to the CAN Member API, most recent first.
Version 2.5 (2026)
- Added GET /can/v1/projects — paginated, card-shaped list of published CAN articles (title, url, live_url, excerpt, thumbnail, author, people, tools, date); supports page, per_page (max 50), tool, people and search; scoped to the Project category; cached 10 minutes
- Added GET /can/v1/projects/tools — all Tools with at least one project, sorted by count, for discovering valid tool values
Version 2.4 (2026)
- Documented GET /can/v1/new-activity-count — number of activity logs published since your last feed visit
- Documented POST /can/v1/theme — saves custom theme colour variables (validated key list); posting an empty object clears the theme
- Corrected the /can/v1/theme note — custom themes can be set via the API (per-member only)
Version 2.3 (March 2026)
- Added GET /can/v1/live-url-blocklist — server-managed list of blocked domains for safe link rendering
- Added GET /can/v1/theme — the authenticated user's custom theme colour variables
Version 2.2 (March 2026)
- Added GET /can/v1/channels — all channels sorted by post count
- Added GET /can/v1/channels/{channel} — paginated activity feed for a channel, same enriched format as the main feed
- Channels are created automatically on first use of #channelname in an entry or comment
Version 2.1 (February 2026)
- Added POST /can/v1/post-activity-entry — new activity entries (text and/or image); rate limited to one post per 2 minutes (429 with retry_after)
- Added POST /can/v1/upload-activity-image — image upload via multipart form data
- URLs auto-linkified; @mentions trigger notifications; new activity_entry field in feed responses
- Added silent=1 to /wp/v2/activity-logs for background polling; lastActivityVisit added to own member profile
Version 2.0 (February 2026)
- Added /can/v1/member-activities/{user_id} — a member's activity feed, paginated, enriched format
- Added id to member profile response
Version 1.9 (February 2026)
- Gallery images now inline in activity log responses via gallery_images (medium size); removed the separate post-gallery endpoint
Version 1.7 (February 2026)
- Added /can/v1/mentions and /can/v1/mark-mentions-read; Mentions filter option
Version 1.6 (February 2026)
- Added the filter query parameter to activity logs — My Actions, My Daps, My Saved, action-type lists (comma-separated), persists across pagination
Version 1.5 (February 2026)
- Added toggle-save and toggle-save-archive; save_data on activity responses; memberData for Member Saved; isSaved on member profiles
Version 1.4 (February 2026)
- Added auth-session for WebView authentication; comprehensive documentation, Terms of Use, conditional response data docs
Version 1.3 (January 2026)
- Added toggle-like, activity-comment, activity-thread, update-profile and member/{username}; like_data, author_meta, term_data and event_data on responses
Version 1.0 (January 2026)
- Initial API release — Basic Auth with App Passwords, activity logs endpoint, standard WordPress posts/pages endpoints
