Documentation Index
Fetch the complete documentation index at: https://documentation.outpost.pub/llms.txt
Use this file to discover all available pages before exploring further.
Get a member
Retrieve a single member by email address (or custom ID in Custom ID mode).
GET /integration/members/{identifier}
Authorization: Bearer your_integration_key
Path parameters:
| Parameter | Description |
|---|
identifier | Member’s email address, or custom member ID if your integration uses Custom ID mode |
Response (200):
{
"success": true,
"data": {
"guid": "abc-123-def",
"email": "jane@example.com",
"name": "Jane Smith",
"is_subscribed": true,
"note": "Subscriber since launch",
"labels": ["newsletter", "podcast-listener"],
"tier_id": "prod_abc123",
"member_id": null,
"status": "paid",
"created_at": "2026-01-15T10:30:00Z",
"updated_at": "2026-03-01T14:20:00Z"
},
"message": "Member retrieved successfully."
}
Error (404):
{
"success": false,
"message": "Member not found."
}
Create a member
Create a new free member. The member is automatically synced to Ghost.
POST /integration/members
Authorization: Bearer your_integration_key
Content-Type: application/json
{
"email": "jane@example.com",
"name": "Jane Smith",
"is_subscribed": true,
"note": "Signed up via partner form",
"labels": ["partner", "newsletter"],
"tier_id": null
}
Request body:
| Field | Type | Required | Description |
|---|
email | string | Yes | Member’s email address. Must be unique (unless your integration allows duplicate emails in Custom ID mode). |
name | string | No | Full name |
is_subscribed | boolean | No | Subscribe to newsletters (default varies by integration) |
note | string | No | Notes or description. Omit the field if you don’t want to set a note — sending null will fail validation. |
labels | array | No | Label names to apply. Labels are created automatically if they don’t exist. |
tier_id | string | null | No | Stripe product ID to associate the member with a tier. Pass null to leave the member free. |
member_id | string | Custom ID mode only | Required when your integration uses Custom ID mode. Your external system’s unique identifier for this member. |
Response (200):
{
"success": true,
"data": {
"guid": "abc-123-def",
"email": "jane@example.com",
"name": "Jane Smith",
"is_subscribed": true,
"note": "Signed up via partner form",
"labels": ["partner", "newsletter"],
"tier_id": null,
"status": "free",
"created_at": "2026-03-16T10:30:00Z",
"updated_at": "2026-03-16T10:30:00Z"
},
"message": "Member created successfully."
}
Validation error:
{
"success": false,
"message": "The email has already been taken."
}
The response body uses the same success: false shape for any failed request. Inspect message to surface the reason to your caller.
Creating a member via the API creates a free member. Paid subscriptions require a Stripe checkout. You can set tier_id to associate the member with a tier, but billing is handled separately through Stripe.
Update a member
Update an existing member’s information. Only include the fields you want to change.
PUT /integration/members/{identifier}
Authorization: Bearer your_integration_key
Content-Type: application/json
{
"name": "Jane Williams",
"labels": ["partner", "newsletter", "annual-reader"]
}
Path parameters:
| Parameter | Description |
|---|
identifier | Member’s email address, or custom member ID if your integration uses Custom ID mode |
Request body:
| Field | Type | Description |
|---|
email | string | Updated email address |
name | string | Updated name |
is_subscribed | boolean | Update newsletter subscription |
note | string | Updated notes |
labels | array | Updated label list |
tier_id | string | null | Updated tier association |
All fields are optional — only send the fields you want to change.
The labels field replaces the member’s entire label set. To add a label without removing existing ones, first retrieve the member, merge your new label into the existing list, then send the combined array.
Response (200):
{
"success": true,
"data": {
"guid": "abc-123-def",
"email": "jane@example.com",
"name": "Jane Williams",
"is_subscribed": true,
"note": "Signed up via partner form",
"labels": ["partner", "newsletter", "annual-reader"],
"tier_id": null,
"status": "free",
"created_at": "2026-01-15T10:30:00Z",
"updated_at": "2026-03-16T14:45:00Z"
},
"message": "Member updated successfully."
}
Delete a member
Permanently delete a member from Outpost and Ghost.
DELETE /integration/members/{identifier}
Authorization: Bearer your_integration_key
Path parameters:
| Parameter | Description |
|---|
identifier | Member’s email address, or custom member ID if your integration uses Custom ID mode |
Response (200):
{
"success": true,
"data": [],
"message": "Member deleted successfully."
}
What gets deleted:
- Member record in Outpost
- Member record in Ghost
- All labels and relationships
What’s preserved:
- Stripe customer and payment records (retained for financial compliance)
- Mailgun email delivery logs
Deletion is permanent and irreversible. For members who are simply cancelling, consider removing their tier or unsubscribing them instead.
Response codes
| Code | Meaning |
|---|
200 | Success — also returned with "success": false for validation failures and other handled errors. Always inspect the response body’s success field, not just the HTTP status. |
401 | Invalid or missing integration key |
404 | Member not found |
429 | Rate limit exceeded (30 requests/minute) |
500 | Unhandled server error |