Agent Reference

For AI Agents

This page is a machine-readable reference for AI agents. Point your bot at https://serssly.com/docs/agent.txt for a plain-text version optimized for context windows.

Usage hint

Tell your AI agent: "Read https://serssly.com/docs/agent.txt and use it to manage my RSS feeds. My API key is in the SERSSLY_API_KEY environment variable."

# SeRSSly API Reference — For AI Agents
# https://serssly.com

## What is SeRSSly?
Email-to-RSS service. Create @serssly.com email addresses, subscribe them
to newsletters, read the content as RSS feeds. All via REST API.

## Authentication
All requests require: Authorization: Token <api-key>
The key is typically in env var SERSSLY_API_KEY.

## Base URL
https://serssly.com/api/v1

## Endpoints

### Email Addresses
GET    /email_addresses
  List all addresses. Paginated (keyset). Returns email_addresses[] + pagination.

GET    /email_addresses/:id
  Get a single address.

POST   /email_addresses
  Body: {"name": "Label", "folder_id": null}
  Both fields optional. Returns new address with rss_token.
  The email is: {rss_token}@serssly.com
  The RSS feed is: https://serssly.com/e/{rss_token}.rss

PATCH  /email_addresses/:id
  Body: {"name": "New Label", "folder_id": "uuid"}

DELETE /email_addresses/:id
  Deletes address and all its emails. Returns 204.

### Emails
GET    /email_addresses/:id/emails
  List received emails for an address. Newest first. Paginated.
  Each email has: id, sender, to, cc, subject, body_text, body_html,
  body_markdown, body_raw, received_at.

DELETE /emails/:id
  Delete a single email. Returns 204.

### Folders
GET    /folders
  List root folders with nested children and email_addresses included.

POST   /folders
  Body: {"name": "Folder Name", "parent_id": null}
  name is required. parent_id enables nesting.

PATCH  /folders/:id
  Body: {"name": "New Name", "parent_id": "uuid"}

DELETE /folders/:id
  Deletes folder. Addresses in it are unassigned, not deleted. Returns 204.

Folder RSS feed: https://serssly.com/f/{folder_rss_token}.rss
  Combines all emails from all addresses in the folder and subfolders.

### API Keys
GET    /api_keys
  List all keys. Token is NEVER shown in list responses.

POST   /api_keys
  Body: {"name": "Key Name"}
  name is required. Response includes "token" field ONCE. Save it.

DELETE /api_keys/:id
  Revoke a key immediately. Returns 204.

### Account
GET    /account
  Returns plan, limits, usage, renewal info.
  { plan, display_name, price_cents, limits, usage, renews_at, cancel_at_period_end }

POST   /account/checkout_url
  Body: {"price": "starter"|"standard"|"premium"}
  Returns {"url": "..."} to upgrade plan via Stripe Checkout.

POST   /account/portal_url
  Returns {"url": "..."} to manage subscription via Stripe Customer Portal.

## RSS Feeds (no auth required)
GET /e/{token}.rss  — RSS feed for a single email address
GET /f/{token}.rss  — RSS feed for a folder (includes subfolders)

Feeds are RSS 2.0. Items contain full HTML content with inlined CSS.
Feed URLs are unguessable (token-based) but require no authentication.

## Pagination
List endpoints return the resource under its own key (e.g. "email_addresses"
for GET /email_addresses, "emails" for GET /email_addresses/:id/emails) plus
"pagination": { "limit": 20, "next_url": "...", "previous_url": "..." }.
Follow next_url to get the next page. null means no more pages.

## Errors
401 — Bad or missing token
402 — Plan limit exceeded (include upgrade_url in future)
404 — Not found or belongs to another user
422 — Validation error, check "errors" array

## Common Workflows

# Create a feed for a newsletter:
1. POST /email_addresses {"name": "Newsletter Name"}
2. Tell user to subscribe at the newsletter using the returned email
3. Read new issues via GET /e/{token}.rss or GET /email_addresses/:id/emails

# Organize feeds into a folder:
1. POST /folders {"name": "Tech"}
2. POST /email_addresses {"name": "Feed 1", "folder_id": folder_id}
3. Read all feeds combined via GET /f/{folder_token}.rss

# Summarize recent newsletters:
1. GET /email_addresses/:id/emails (get latest emails)
2. Read body_text or body_markdown fields
3. Summarize the content for the user
Previous
← OpenClaw Agents