Billing — delivery, preparation and your own content

Delivery billing is not a folder observation

The hourly billing sweep selects campaign recipients with stage=SENT, sent_at at least 24 hours old and no recorded BOUNCED final status. It charges once per recipient. A later bounce refunds the delivery amount actually charged. The billing event does not inspect a final recipient’s mailbox or require an Inbox result from that mailbox. See Deliverability testing for what seed tests measure.

Current rates and content source

The public registry is GET /api/public/pricing. At the 2026-09-06 snapshot, rates in USD are: inbox_placement 0.015; inbox_placement_byoc 0.005; creative_approval 5; platform_render 0; audit 0; audit_failed 0.0005; send 0. These are a dated example, not a fixed quote. Always use the registry or your effective workspace prices for a new calculation.

The lower delivery operation is selected by recipient contentSource=byoc: BYOC = bring your own finished content. Connecting your own sending account does not by itself select this price. API, MCP and web UI share the same operation registry; there is no separate web UI rate in this registry.

Render modes

Set renderMode at campaign create (PLATFORM | BYOC). The mode locks as soon as any recipient passes SCREENED. BYOC is incompatible with canvas multi-step flows (v1). In BYOC the platform never spends its AI on your emails: the render cron skips the campaign, prepare only audits content you already submitted, and recipients/rerender just resets rows to SCREENED awaiting your resubmission.

BYOC intake

Submission itself is free. Limits: ≤100 items per call, subject ≤998 chars, bodyHtml ≤256 KB, bodyText ≤64 KB. Content must be FINISHED text — unresolved {{placeholders}} are rejected per-item at intake. Rows must be in stage SCREENED.

curl -s -X POST "https://api.live-direct-marketing.online/api/campaigns/$CAMPAIGN/recipients/content" \
  -H "Authorization: Bearer $LDM_KEY" -H "Content-Type: application/json" \
  -d '{
    "items": [
      { "recipientId": "cmx...", "subject": "Hi Anna", "bodyHtml": "<p>Finished personalised email</p>" }
    ]
  }'
# → { "accepted": 1, "rejected": [], "awaitingAudit": 1 }

Content audits and approval are separate operations

  • A content audit checks the prepared message. It is not an observation of a mailbox folder. A chargeable pass uses audit; a chargeable rejection uses audit_failed. Free validation/preflight failures are not automatically paid audit attempts.
  • audit_failed is independently priced. Do not calculate it as 50% of audit: the current public successful-audit price is zero while the failed-audit price is nonzero. A new chargeable attempt may incur another charge, even if the message is never sent.
  • platform_render applies to platform preparation and any repeat preparation at the configured rate. BYOC intake is free; any external model or data-provider costs you incur are outside this LDM calculation.
  • send is charged separately when the campaign queues a message for sending. It is currently zero in the public registry. The later delivery charge is a different event.
  • creative_approval applies to a non-system approval of a mailing task, including approval by an authorised agent. Automatic system:* approval is exempt. Check the task approval step before including this charge; it is not automatically incurred for every prepared message.

Worked example: 10 drafts, 2 revisions, 9 billable deliveries

Illustration at the dated public rates above, using platform content and no workspace overrides. Prepare 10 messages. Two fail the chargeable audit; prepare those two again, and both pass. Send all 10. One bounces before delivery billing; nine remain billable after 24 hours.

  • 12 preparations × $0 = $0.
  • 2 failed audits × $0.0005 + 10 successful audits × $0 = $0.001.
  • 10 send operations × $0 = $0.
  • 9 billable deliveries × $0.015 = $0.135. The early bounce has no delivery charge.
  • Total campaign operations: $0.136. If you additionally perform one paid task / creative approval, add $5: $5.136.
  • If one of the nine later bounces, refund the $0.015 actually charged for it. Earlier preparation, audit or approval costs remain. Test copies and external provider costs are not estimated by this example.

Balance, journal and top-ups

Use GET /api/billing/balance (scope billing:read) for effective prices and topUpUrl. Use GET /api/billing/ledger for itemised charges, credits and refunds, including background operations. Zero-priced operations do not debit the balance and do not create charge entries. Paid responses expose _billing metadata; consult the journal for the complete history.

curl https://api.live-direct-marketing.online/api/billing/balance \
  -H "Authorization: Bearer $LDM_KEY"
curl https://api.live-direct-marketing.online/api/billing/ledger \
  -H "Authorization: Bearer $LDM_KEY"

The payment mode is currently demo/manual: no connected payment gateway. Request a top-up through support in the web workspace; customers cannot top up through API or MCP. On insufficient funds, a paid operation can return 402 insufficient_balance; the background campaign can pause. Follow the returned topUpUrl and inspect campaign status before resuming.