Skip to main content

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:
ParameterDescription
identifierMember’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:
FieldTypeRequiredDescription
emailstringYesMember’s email address. Must be unique (unless your integration allows duplicate emails in Custom ID mode).
namestringNoFull name
is_subscribedbooleanNoSubscribe to newsletters (default varies by integration)
notestringNoNotes or description. Omit the field if you don’t want to set a note — sending null will fail validation.
labelsarrayNoLabel names to apply. Labels are created automatically if they don’t exist.
tier_idstring | nullNoStripe product ID to associate the member with a tier. Pass null to leave the member free.
member_idstringCustom ID mode onlyRequired 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:
ParameterDescription
identifierMember’s email address, or custom member ID if your integration uses Custom ID mode
Request body:
FieldTypeDescription
emailstringUpdated email address
namestringUpdated name
is_subscribedbooleanUpdate newsletter subscription
notestringUpdated notes
labelsarrayUpdated label list
tier_idstring | nullUpdated 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:
ParameterDescription
identifierMember’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

CodeMeaning
200Success — 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.
401Invalid or missing integration key
404Member not found
429Rate limit exceeded (30 requests/minute)
500Unhandled server error