Monetization
Enable paid newsletter subscriptions, sponsor placements, and tip jars for your audience
Overview
MisarMail supports three monetization models for newsletter creators:
| Model | Description | Auth |
|---|---|---|
| Sponsors | Sell ad placements in your emails (header, footer, inline) | Session |
| Paid subscriptions | Charge readers for access to premium newsletters | Session |
| Tip jar | Accept one-time tips from readers | API key (monetization or send scope) |
All amounts are in the smallest currency unit (cents for USD/EUR/GBP).
Sponsors
List Sponsor Slots
Returns all active and upcoming sponsor placements for your account.
GET /v1/monetization/sponsors
Headers
Authorization: Bearer msk_...
Response
[
{
"id": "spon_01j9xkz3p",
"sponsor_name": "Acme Corp",
"logo_url": "https://cdn.example.com/acme-logo.png",
"target_url": "https://acme.example.com",
"position": "header",
"active_from": "2025-12-01T00:00:00Z",
"active_until": "2025-12-31T23:59:59Z"
}
]position values: "header" · "footer" · "inline"
Create a Sponsor Slot
Creates a new sponsor placement. Requires the monetization scope on your API key.
POST /v1/monetization/sponsors
Headers
Authorization: Bearer msk_...
Request body
{
"sponsor_name": "Acme Corp",
"logo_url": "https://cdn.example.com/acme-logo.png",
"target_url": "https://acme.example.com",
"position": "header",
"active_from": "2025-12-01T00:00:00Z",
"active_until": "2025-12-31T23:59:59Z",
"price_cents": 29900,
"currency": "USD"
}| Field | Type | Required | Description |
|---|---|---|---|
sponsor_name | string | Yes | Display name of the sponsor |
logo_url | string | Yes | HTTPS URL to sponsor logo |
target_url | string | Yes | Click-through URL |
position | string | Yes | header, footer, or inline |
active_from | ISO 8601 | Yes | Placement start date |
active_until | ISO 8601 | Yes | Placement end date |
price_cents | integer | No | Amount paid by sponsor (for records) |
currency | string | No | ISO 4217 currency code (default: USD) |
Response 201
{
"success": true,
"data": {
"id": "spon_01j9xkz3p",
"sponsor_name": "Acme Corp",
"position": "header",
"active_from": "2025-12-01T00:00:00Z",
"active_until": "2025-12-31T23:59:59Z"
}
}Paid Subscriptions
List Subscriptions
Returns all paid newsletter subscriber records for your account. Requires session auth.
GET /v1/monetization/subscriptions
Response
[
{
"id": "sub_01j8abc12",
"subscriber_email": "[email protected]",
"plan": "monthly",
"amount_cents": 799,
"currency": "USD",
"status": "active",
"created_at": "2025-10-15T08:30:00Z"
}
]status values: "active" · "cancelled" · "past_due"
Create a Subscription Record
Records a new paid subscriber. Typically called from your Stripe webhook handler after a successful payment. Requires the monetization scope.
POST /v1/monetization/subscriptions
Request body
{
"subscriber_email": "[email protected]",
"plan": "monthly",
"amount_cents": 799,
"currency": "USD",
"stripe_subscription_id": "sub_1OaBcDeFgHiJkL"
}| Field | Type | Required | Description |
|---|---|---|---|
subscriber_email | string | Yes | Subscriber's email address |
plan | string | Yes | Your plan identifier (e.g. monthly, annual) |
amount_cents | integer | Yes | Recurring charge amount in cents |
currency | string | Yes | ISO 4217 currency code |
stripe_subscription_id | string | No | Stripe subscription ID for reconciliation |
Response 201
{
"success": true,
"data": {
"id": "sub_01j8abc12",
"subscriber_email": "[email protected]",
"plan": "monthly",
"status": "active"
}
}Tip Jar
Record a Tip
Records a reader tip and calculates the platform fee. The tip endpoint accepts an API key with the monetization or send:transactional scope.
POST /v1/monetization/tip
Headers
Authorization: Bearer msk_...
Request body
{
"email": "[email protected]",
"name": "Alex",
"amount_cents": 500,
"currency": "USD",
"message": "Love your weekly deep-dives — keep it up!",
"stripe_payment_id": "pi_3OaBcDeFgHiJkL"
}| Field | Type | Required | Description |
|---|---|---|---|
amount_cents | integer | Yes | Tip amount in cents. Min: 50 (¢50). Max: 100000 ($1,000) |
currency | string | No | ISO 4217 code. Default: USD |
email | string | No | Tipper's email address |
name | string | No | Tipper's display name |
message | string | No | Optional message, max 500 characters |
stripe_payment_id | string | No | Stripe payment intent ID for reconciliation |
Response
{
"success": true,
"tip_id": "tip_01j7xyz99",
"gross_amount_cents": 500,
"platform_fee_cents": 25,
"net_amount_cents": 475,
"timestamp": "2025-11-20T16:45:00Z"
}Platform fees are calculated server-side and deducted from payouts. The fee percentage is based on your current plan — higher-tier plans have lower fees. Check your dashboard for the exact rate.
curl -X POST https://api.misar.io/mail/v1/monetization/tip \
-H "Authorization: Bearer msk_..." \
-H "Content-Type: application/json" \
-d '{
"email": "[email protected]",
"name": "Alex",
"amount_cents": 500,
"currency": "USD",
"message": "Great newsletter!"
}'const res = await fetch('https://api.misar.io/mail/v1/monetization/tip', {
method: 'POST',
headers: {
'Authorization': 'Bearer msk_...',
'Content-Type': 'application/json',
},
body: JSON.stringify({
email: '[email protected]',
name: 'Alex',
amount_cents: 500,
currency: 'USD',
message: 'Great newsletter!',
}),
});
const data = await res.json();
console.log(data.net_amount_cents); // amount after platform feeimport httpx
response = httpx.post(
"https://api.misar.io/mail/v1/monetization/tip",
headers={"Authorization": "Bearer msk_..."},
json={
"email": "[email protected]",
"name": "Alex",
"amount_cents": 500,
"currency": "USD",
"message": "Great newsletter!",
},
)
print(response.json())Required Scopes
| Endpoint | Required scope |
|---|---|
GET /v1/monetization/sponsors | Session |
POST /v1/monetization/sponsors | Session + monetization |
GET /v1/monetization/subscriptions | Session |
POST /v1/monetization/subscriptions | Session + monetization |
POST /v1/monetization/tip | API key: monetization or send:transactional |