Trigger custom postcards at scale

Try it Now Full Pricing

Grow your business with recurring, event-driven postcards

Send customized postcards based on specific actions your customers take or events you define. Reactivate lapsed users with personalized postcards or verify your customers' physical addresses for identity purposes. Lob triggers each piece of mail on demand, no batching required.

Take control with flexible templating

With full control over every element in HTML, you can easily A/B test layout, messaging, and more to optimize your postcard campaigns. No need to send in proofs or wait for approvals—the Lob Postcard API does it all.

Track everything along the way

Monitor your postcards as they make their way to their intended recipients, at no additional cost. Keep an eye on your delivery stats and add any additional campaign tracking you'd like, from promo codes to unique URLs and phone numbers.


Simple, on-demand pricing

Lob's prices are determined based on your volume over time—not batch by batch. Printing, mailing, and postage are all included in one low price. Start by paying for only what you send, or leverage our subscription plans to see additional savings and gain access to special features. No setup costs or guesswork, only the clearest billing structure possible to help you get up and running smoothly.

Pricing Calculator




$0.70 per postcard

Check out our pricing plans for further discounts at higher volumes.

Full Pricing

See how Couchsurfing uses Lob to verify user addresses

Before discovering Lob, Couchsurfing sent address verification postcards through a traditional direct mail vendor which relied on a manual process. Now, they've automated everything—from making sure users provide deliverable addresses to programmatically sending address verification postcards on-demand. Read more…


Easy integration via REST API

Include your postcard HTML along with a shipping address in one simple API call. Integration is dead simple with pre-built wrappers and code examples in Ruby, Python, PHP, Java, and Node.js.

Read the Docs View Libraries
  • curl

  • Node

  • Ruby

  • Python

  • PHP

  • Java

  • 
    curl https://api.lob.com/v1/postcards \
      -u test_0dc8d51e0acffcb1880e0f19c79b2f5b0cc: \
      -d "description=Demo Postcard job" \
      -d "to[name]=Harry Zhang" \
      -d "to[address_line1]=123 Test Street" \
      -d "to[address_city]=Mountain View" \
      -d "to[address_state]=CA" \
      -d "to[address_zip]=94041" \
      -d "to[address_country]=US" \
      --data-urlencode "front=<html style='padding: 1in; font-size: 50;'>Front HTML for {{name}}</html>" \
      --data-urlencode "back=<html style='padding: 1in; font-size: 20;'>Back HTML for {{name}}</html>" \
      -d "merge_variables[name]=Harry"
    
              
    
    Lob.postcards.create({
      description: 'Demo Postcard job',
      to: {
        name: 'Harry Zhang',
        address_line1: '123 Main Street',
        address_city: 'Mountain View',
        address_state: 'CA',
        address_zip: '94041'
      },
      front: '<html style="padding: 1in; font-size: 50;">Front HTML for {{name}}</html>',
      back: '<html style="padding: 1in; font-size: 20;">Back HTML for {{name}}</html>',
      merge_variables: {
        name: 'Harry'
      }
    }, function (err, res) {
      console.log(err, res);
    });
    
              
    
    @lob.postcards.create(
      description: "Demo Postcard job",
      to: {
        name: "Harry Zhang",
        address_line1: "123 Test Street",
        address_city: "Mountain View",
        address_state: "CA",
        address_country: "US",
        address_zip: 94041
      },
      front: "<html style='padding: 1in; font-size: 50;'>Front HTML for {{name}}</html>",
      back: "<html style='padding: 1in; font-size: 20;'>Back HTML for {{name}}</html>",
      merge_variables: {
        name: "Harry"
      }
    )
    
              
    
    lob.Postcard.create(
      to_address = {
        'name': 'Harry Zhang',
        'address_line1': '123 Test Street',
        'address_city': 'Mountain View',
        'address_state': 'CA',
        'address_zip': '94041',
        'address_country': 'US'
      },
      front = '<html style="padding: 1in; font-size: 50;">Front HTML for {{name}}</html>',
      back = '<html style="padding: 1in; font-size: 20;">Back HTML for {{name}}</html>',
      merge_variables = {
        'name': 'Harry'
      }
    )
    
              
    
    $lob->postcards()->create(array(
      'description' => 'Demo Postcard job',
      'to'      => array(
        'name'          => 'Harry Zhang',
        'address_line1' => '123 Main Street',
        'address_city'  => 'Mountain View',
        'address_state' => 'CA',
        'address_zip'   => '94041',
      ),
      'front'                 => '<html style="padding: 1in; font-size: 50;">Front HTML for {{name}}</html>',
      'back'                  => '<html style="padding: 1in; font-size: 20;">Back HTML for {{name}}</html>',
      'merge_variables[name]' => 'Harry'
    ));
    
              
    
    final Map<String, String> mergeVariables = Maps.newHashMap();
    mergeVariables.put("name", "Harry");
    
    final PostcardRequest postcardRequest = PostcardRequest.builder()
      .to(AddressRequest.builder()
        .name("Harry Zhang")
        .line1("123 Test Street")
        .city("Mountain View")
        .state("CA")
        .zip("94041")
        .country("US")
        .build())
      .front("<html style='padding: 1in; font-size: 50;'>Front HTML for {{name}}</html>")
      .back("<html style='padding: 1in; font-size: 20;'>Back HTML for {{name}}</html>")
      .mergeVariables(mergeVariables)
      .build();
    final PostcardResponse postcard = client.createPostcard(postcardRequest).get();