Snow goosesendletter

API Reference

Send physical letters anywhere in Canada programmatically. One endpoint, three modes.

Quick Start

Send a letter in one API call. You need an account with a payment method and an API key.

  1. Create an account at sendletter.app/signup
  2. Add a payment method on your profile
  3. Generate an API key on your profile
  4. Send a POST request:
curl -X POST https://sendletter.app/api/v1/send \
  -H "Authorization: Bearer sl_live_YOUR_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "mode": "draft",
    "letter_size": "standard",
    "from": {
      "name": "Jane Smith",
      "line1": "123 Maple St",
      "city": "Toronto",
      "province": "ON",
      "postal_code": "M5V 2T6",
      "country": "CA"
    },
    "to": {
      "name": "John Doe",
      "line1": "456 Oak Ave",
      "city": "Vancouver",
      "province": "BC",
      "postal_code": "V6B 1A1",
      "country": "CA"
    },
    "letter": {
      "date": "2026-03-23",
      "salutation": "Dear John,",
      "body": "This is a test letter sent via the sendletter API.",
      "closing": "Sincerely,",
      "signature": "Jane Smith"
    }
  }'

Authentication

All requests require a Bearer token in the Authorization header.

Authorization: Bearer sl_live_YOUR_API_KEY

API keys start with sl_live_. Keep your key secret. If compromised, regenerate it from your profile — this immediately invalidates the old key.

Your account must have a valid payment method on file. Requests without one return 402.

POST /api/v1/send

Creates a letter order. The letter is queued for printing and mailed within 1 business day via Canada Post.

Request Body

FieldTypeRequiredDescription
modestringYes"draft", "formatted", or "upload"
letter_sizestringNo"standard" (default), "large", or "legal"
fromobjectYesReturn address (see Addresses)
toobjectYesDelivery address — must be in Canada
letterobjectDraft onlyLetter content fields (see Draft mode)
htmlstringFormatted onlyHTML content for the letter body
cssstringNoAdditional CSS (formatted mode only)
filestringUpload onlyBase64-encoded PDF or DOCX
file_typestringUpload only"pdf" or "docx"
page_countnumberNoNumber of pages (upload mode, max 15)
fontstringNoFont family (see Options)
font_sizenumberNoFont size in pt (8–24, default 12)
vertical_centerbooleanNoVertically center content on page

Response

{
  "id": "uuid-of-order",
  "status": "queued",
  "letter_size": "standard",
  "amount_cents": 379
}

Modes

Draft Mode

Provide structured letter fields. We render them into a properly formatted letter page.

letter.*TypeRequiredDescription
bodystringYesMain letter text (max 50,000 chars). Whitespace is preserved.
datestringNoDate line (top-right)
salutationstringNoGreeting, e.g. "Dear John,"
subjectstringNoSubject line (rendered as bold Re: ...)
referencestringNoReference number
closingstringNoSign-off, e.g. "Sincerely,"
signaturestringNoPrinted name below closing
ccstringNoCC line
enclosuresstringNoEnclosures note
psstringNoPost-script (italic)

Formatted Mode

Send your own HTML content. We wrap it in a print-safe page template with proper dimensions (8.5×11" or 8.5×14" at 72dpi, 1" margins). Max 500 KB.

{
  "mode": "formatted",
  "html": "<h1>Hello World</h1><p>Custom HTML letter content.</p>",
  "css": "h1 { color: navy; }",
  "font": "Georgia",
  "font_size": 14
}

Upload Mode

Upload a pre-formatted PDF or DOCX file as a base64 string. Max 10 MB, max 15 pages.

{
  "mode": "upload",
  "file": "JVBERi0xLjQK...",
  "file_type": "pdf",
  "page_count": 2
}

Addresses

FieldTypeRequiredDescription
namestringYesFull name (max 200 chars)
line1stringYesStreet address (max 200 chars)
line2stringNoApt, suite, unit (max 200 chars)
citystringYesCity (max 200 chars)
provincestringCA/USProvince or state code (required for CA and US)
postal_codestringCA/USPostal or ZIP code (required for CA and US)
countrystringNo2-letter ISO code. Defaults to "CA"
Important: The to address must be in Canada ("country": "CA"). The from (return) address can be in any country. Canadian postal codes must match at least the FSA format (e.g. K1A) or full format (K1A 0B1).

Options

Letter Sizes

ValueDimensionsEnvelopeMax PagesPrice
standard8.5 × 11 in#10 (tri-fold)5$3.79 CAD
large8.5 × 11 in9 × 12 (flat)15$5.78 CAD
legal8.5 × 14 in10 × 15 (flat)15$5.78 CAD

Fonts

Available for draft and formatted modes:

Pricing

All prices are in Canadian dollars (CAD) and include printing, envelope, Canada Post postage, and tax.

SizePrice
Standard (tri-fold)$3.79
Large (flat 8.5×11)$5.78
Legal (flat 8.5×14)$5.78

Error Codes

StatusMeaningCommon Causes
400Bad RequestMissing/invalid fields, non-CA delivery address, invalid postal code, content too large
401UnauthorizedMissing or invalid API key
402Payment RequiredNo payment method on file — add one at sendletter.app/profile
500Server ErrorInternal error — contact support

All error responses include an error field with a human-readable message:

{ "error": "to.postal_code is not a valid Canadian postal code. Expected format: A1A 1A1" }

Billing

API usage is billed daily. Each letter is charged at the listed price. Charges are processed automatically against your saved payment method. You can view usage and billing history on your profile.

Rate Limits & Constraints

ConstraintLimit
Request bodyJSON, Content-Type: application/json
File upload (base64)10 MB
HTML content500 KB
Draft body text50,000 characters
Page count1–15
Font size8–24 pt
Address fields200 characters each
Delivery countryCanada only (to.country = "CA")