Issues API
Create, manage, and send newsletter issues via the API.
Endpoints
| Method | Endpoint | Description |
|---|---|---|
GET |
/api/v1/issues | List all issues |
GET |
/api/v1/issues/:id | Get an issue |
POST |
/api/v1/issues | Create an issue |
PATCH |
/api/v1/issues/:id | Update an issue |
DELETE |
/api/v1/issues/:id | Delete an issue |
POST |
/api/v1/issues/:id/send_now | Queue issue for immediate sending |
POST |
/api/v1/issues/:id/publish | Publish to web archive |
List Issues
GET /api/v1/issues
Parameters
| Parameter | Type | Description |
|---|---|---|
page |
integer | Page number (default: 1) |
per_page |
integer | Results per page (default: 25, max: 100) |
status |
string | Filter by status: draft, approved, scheduled, sending, sent |
Response
{
"issues": [
{
"id": 1,
"newsletter_id": 12,
"subject": "Weekly Tech Digest #42",
"status": "sent",
"scheduled_for": null,
"sent_at": "2025-01-10T09:00:00Z",
"articles_count": 5,
"created_at": "2025-01-09T12:00:00Z",
"updated_at": "2025-01-10T09:00:00Z"
}
],
"meta": {
"page": 1,
"per_page": 25,
"has_more": false
}
}
Get Issue
GET /api/v1/issues/:id
Response
{
"id": 1,
"newsletter_id": 12,
"subject": "Weekly Tech Digest #42",
"status": "draft",
"scheduled_for": null,
"sent_at": null,
"articles_count": 3,
"content_markdown": "# This Week in Tech\n\n...",
"articles": [
{
"id": 101,
"title": "AI Breakthrough...",
"url": "https://example.com/article",
"position": 1,
"summarized_article": "Researchers announce..."
}
],
"created_at": "2025-01-09T12:00:00Z",
"updated_at": "2025-01-10T08:00:00Z"
}
Create Issue
POST /api/v1/issues
Request Body
{
"issue": {
"subject": "Weekly Newsletter #43",
"content_markdown": "# Hello Subscribers\n\nHere's what happened this week...",
"status": "draft"
}
}
Parameters
| Parameter | Type | Required | Description |
|---|---|---|---|
issue[subject] |
string | Yes | Email subject line |
issue[content_markdown] |
string | No | Full newsletter content in Markdown |
issue[scheduled_for] |
datetime | No | ISO 8601 datetime to schedule send |
issue[status] |
string | No | Defaults to draft. Accepted: draft, scheduled, approved. |
Response
Returns the created issue object (201 Created).
Update Issue
PATCH /api/v1/issues/:id
Request Body
{
"issue": {
"subject": "Updated Subject Line",
"content_markdown": "# Updated Content\n\n...",
"status": "approved"
}
}
Parameters
| Parameter | Type | Required | Description |
|---|---|---|---|
issue[subject] |
string | No | Email subject line |
issue[content_markdown] |
string | No | Full newsletter content in Markdown |
issue[status] |
string | No | Accepted: draft, scheduled, approved. Passing null leaves the current status unchanged. |
issue[scheduled_for] |
datetime | No | ISO 8601 datetime to schedule send |
Note: You can only update issues that haven't been sent yet.
Delete Issue
DELETE /api/v1/issues/:id
Returns 204 No Content on success.
Note: You can only delete draft issues. Sent issues cannot be deleted.
Send Issue
Queue an approved issue for immediate sending to all active subscribers:
POST /api/v1/issues/:id/send_now
Response
{
"message": "Newsletter queued for sending",
"issue": {
"id": 520,
"newsletter_id": 59,
"subject": "My Newsletter",
"status": "approved",
"scheduled_for": null,
"sent_at": null,
"articles_count": 3,
"created_at": "2025-01-10T09:00:00Z",
"updated_at": "2025-01-10T09:00:00Z"
},
"subscribers": 1500
}
Async: Sending is asynchronous. The issue
status in this response reflects the current value at queue time (e.g. approved). It transitions to sending then sent as the background job runs.
Requirements (validated before queuing):
- Issue must have status
approvedorscheduled - Newsletter must have at least one active subscriber
- Newsletter must be on a paid plan
- Issue must have content (
content_markdownor articles)
422 with a descriptive error before any background job is queued.
Publish to Web
Make an issue publicly viewable on your newsletter archive:
POST /api/v1/issues/:id/publish
Response
{
"message": "Issue published to web",
"issue": {
"id": 1,
"newsletter_id": 12,
"subject": "Weekly Tech Digest #42",
"status": "sent",
"scheduled_for": null,
"sent_at": "2025-01-10T09:00:00Z",
"articles_count": 5,
"created_at": "2025-01-09T12:00:00Z",
"updated_at": "2025-01-10T09:05:00Z"
},
"web_url": "https://your-newsletter.dailydraft.ai/p/weekly-tech-digest-42"
}
Issue Status Values
| Status | Description |
|---|---|
draft |
Not yet approved, can be edited freely |
scheduled |
Approved and scheduled for a future send time |
approved |
Approved and ready to send via send_now |
sending |
Background job is actively dispatching emails |
sent |
All emails dispatched successfully |
Error Codes
| Code | Description |
|---|---|
402 |
Newsletter is not on a paid plan |
422 |
Issue is not in approved or scheduled status, or has no active subscribers |
Still need help?
Can't find what you're looking for? Chat with our AI assistant or create a support ticket.
Sign in to get support