This is the java wrapper for the Lob.com API.
lob-java uses Guava's ListenableFuture, the Ning AsyncHttpClient, and the Jackson serialization library to make robust, asynchronous integration with Lob's API easy.
- Installation
- Project Structure
- Usage
- Supported Image Types
- Initialization and Configuration
- API Reference
- Testing
Include the following in your pom.xml for Maven:
<dependencies>
<dependency>
<groupId>com.lob</groupId>
<artifactId>lob-java</artifactId>
<version>2.0.0</version>
</dependency>
...
</dependencies>
- lob-java contains the actual client for interacting with Lob's API. It depends on:
- guava
- asynchttpclient
- netty
- joda-money
- joda-time
- jackson-annotations
- two jackson-databind packages
- lob-java-examples contains usage examples and is not intended to be consumed by your code.
We've provided examples in the lob-java-examples/ package that has examples of
how to use the lob-java wrapper with some of our core endpoints.
The Lob.com API supports the following image types:
- PNG
- JPEG
For more information on prepping the images please see the Lob documentation.
The Lob.com API also supports HTML strings in lieu of a file of the above type. See below for examples of submitting with HTML strings.
For templates and more information regarding HTML, please see the Lob documentation.
To initialize the wrapper, create an instance of AsyncLobClient as follows:
import com.lob.client.AsyncLobClient;
import com.lob.client.LobClient;
final LobClient client = AsyncLobClient.createDefault("yourApiKey");You can customize your http client configuration by passing in an AsyncHttpClientConfiguration:
import com.lob.client.AsyncLobClient;
import com.lob.client.LobClient;
final AsyncHttpClientConfiguration.Builder configBuilder = new AsyncHttpClientConfiguration.Builder();
// configuration...
final LobClient client = AsyncLobClient.create("yourApiKey", configBuilder.build());You may optionally set an API version. This is useful for testing your code against new API versions before you upgrade.
Note that setting the API version only affects future instances of LobClients, so be sure to set it before creating your client.
import com.lob.client.AsyncLobClient;
import com.lob.client.LobClient;
Lob.setApiVersion("apiVersion");
final LobClient client = AsyncLobClient.createDefault("yourApiKey");Please ensure any callbacks attached to the ListenableFutures returned from the LobClient have a dedicated Executor
for their execution. Otherwise, the callbacks will be executed on internal I/O threads, adversely affecting performance.
- Simple Print Service
- Simple Postcard Service
- Simple Letter Service
- Simple Check Service
- Simple Area Mail
- Address Verification
// Returns a list of Job objects
final ListenableFuture<JobResponseList> jobs = client.getJobs();
// Can specify count and offset as well
final ListenableFuture<JobResponseList> jobs = client.getJobs(Filters.ofCount(5).withOffset(1));// Retrieve a specific job by id
final ListenableFuture<JobResponse> job = client.getJob(<id>);// Create Job Using IDs for Address and Object
final JobRequest.Builder jobBuilder = JobRequest.builder();
final JobRequest jobRequest = builder
.to(<addressId>)
.from(<addressId)
.objectId(<objectId>)
.build();
final ListenableFuture<JobResponse> job = client.createJob(jobRequest);
// Create a Job Using Lob Java Objects
final AddressResponseList addresses = client.getAddresses(2).get();
final LobObject object = client.getLobObjects(1).get().get(0);
final JobRequest jobRequest = JobRequest.builder()
.to(addresses.get(0))
.from(addresses.get(1))
.object(object)
.build();
final ListenableFuture<JobResponse> job = client.createJob(jobRequest);
// Create Job Using Inline Address and Object
final JobRequest jobRequest = JobRequest.builder()
.to(AddressRequest.builder()
.name("Lob")
.line1("185 Berry Street")
.line2("Suite 1510")
.city("San Francisco")
.state("CA")
.zip("94107")
.country("US")
.build())
.from(AddressRequest.builder()
.name("Lob")
.line1("185 Berry Street")
.line2("Suite 1510")
.city("San Francisco")
.state("CA")
.zip("94107")
.country("US")
.build())
.object(LobObjectRequest.builder()
.file("https://s3-us-west-2.amazonaws.com/lob-assets/test.pdf")
.setting(200)
.build())
.build();
final ListenableFuture<JobResponse> jobResponse = client.createJob(jobRequest);
// Create a Multi-Object Job
final JobRequest jobRequest = JobRequest.builder()
.to(AddressRequest.builder()
.name("Lob")
.line1("185 Berry Street")
.line2("Suite 1510")
.city("San Francisco")
.state("CA")
.zip("94107")
.country("US")
.build())
.from(AddressRequest.builder()
.name("Lob")
.line1("185 Berry Street")
.line2("Suite 1510")
.city("San Francisco")
.state("CA")
.zip("94107")
.country("US")
.build())
.objects(
LobObjectRequest.builder()
.file("https://s3-us-west-2.amazonaws.com/lob-assets/test.pdf")
.setting(201)
.build(),
LobObjectRequest.builder()
.file("https://s3-us-west-2.amazonaws.com/lob-assets/test.pdf")
.setting(200)
.build())
.build();
final ListenableFuture<JobResponse> jobResponse = client.createJob(jobRequest);// List addresses
final ListenableFuture<AddressResponseList> addresses = client.getAddresses();
// List Addresses with Count and Offset
final ListenableFuture<AddressResponseList> addresses = client.getAddresses(Filters.ofCount(5).withOffset(2));// You can query an address with its `ID`
final ListenableFuture<AddressResponse> address = client.getAddress(<id>);// Basic Address Create
final AddressRequest addressRequest = AddressRequest.builder()
.name("Joe Smith")
.line1("104, Printing Boulevard")
.city("Boston")
.state("MA")
.zip("12345")
.country("US")
.build();
final ListenableFuture<AddressResponse> address = client.createAddress(addressRequest);
// Create Address with Optional Parameters
final AddressRequest addressRequest = AddressRequest.builder()
.name("Joe Smith")
.email("[email protected]")
.phone("555-555-5555")
.line1("104, Printing Boulevard")
.line2("Sunset Town")
.city("Boston")
.state("MA")
.zip("12345")
.country("US")
.build();
final ListenableFuture<AddressResponse> address = client.createAddress(addressRequest);// Delete an address
final ListenableFuture<AddressDeleteResponse> deleteResponse = client.deleteAddress(<id>);// Returns a list of Country objects
final ListenableFuture<CountryResponseList> countries = client.getCountries();// Returns a list of State objects
final ListenableFuture<StateResponseList> states = client.getStates();// Returns a list of lob objects
final ListenableFuture<LobObjectResponseList> objects = client.getLobObjects();
// Can specify count and offset
final ListenableFuture<LobObjectResponseList> objects = client.getLobObjects(Filters.ofCount(4).withOffset(2));// Retrieve a specifc object
final ListenableFuture<LobObjectResponse> object = client.getLobObject(<id>);// Create an Object using a URL
final LobObjectRequest objectRequest = LobObjectRequest.builder()
.file("https://s3-us-west-2.amazonaws.com/lob-assets/test.pdf")
.setting(200)
.quantity(1)
.build();
final ListenableFuture<LobObjectResponse> object = client.createLobObject(objectRequest);
// Create an Object using a local file
final File file = new File("/path/to/local/file");
final LobObjectRequest objectRequest = LobObjectRequest.builder()
.file(file)
.setting(200)
.quantity(1)
.build();
final ListenableFuture<LobObjectResponse> object = client.createLobObject(objectRequest);
// Create an Object using HTML
final LobObjectRequest objectRequest = LobObjectRequest.builder()
.file("<html style="margin: 130px; font-size: 50;">HTML here</html>")
.setting(200)
.quantity(1)
.build();
final ListenableFuture<LobObjectResponse> object = client.createLobObject(objectRequest);// Delete an object via its ID
final ListenableFuture<LobObjectDeleteResponse> objectDeleteResponse = client.deleteLobObject(<id>);// List All Settings
final ListenableFuture<SettingResponseList> settings = client.getSettings();// Retrieve a Setting
final ListenableFuture<SettingResponseList> settings = client.getSetting(SettingId.parse(100));// List All Services
final ListenableFuture<ServiceResponseList> services = client.getServices();// Returns a list of Postcard objects
final ListenableFuture<PostcardResponseList> postcards = client.getPostcards();
// Can specify count and offset
final ListenableFuture<PostcardResponseList> postcards = client.getPostcards(Filters.ofCount(4).withOffset(2));// Retrieve a specific postcard by id
final ListenableFuture<PostcardResponse> postcard = client.getPostcard(<id>);// Create a Postcard Using IDs for Address
final PostcardRequest postcardRequest = PostcardRequest.builder()
.to(<addressId>)
.from(<addressId>)
.front("https://s3-us-west-2.amazonaws.com/lob-assets/test.pdf")
.back("https://s3-us-west-2.amazonaws.com/lob-assets/test.pdf")
.build();
final ListenableFuture<PostcardResponse> postcard = client.createPostcard(postcardRequest);
// Create a Postcard Using Lob Java Objects
final AddressResponseList addresses = client.getAddresses(2).get();
final PostcardRequest postcardRequest = PostcardRequest.builder()
.to(addresses.get(0))
.from(addresses.get(1))
.front("https://s3-us-west-2.amazonaws.com/lob-assets/test.pdf")
.back("https://s3-us-west-2.amazonaws.com/lob-assets/test.pdf")
.build();
final ListenableFuture<PostcardResponse> postcard = client.createPostcard(postcardRequest);
// Create Postcard Using Inline Addresses
final PostcardRequest postcardRequest = PostcardRequest.builder()
.to(AddressRequest.builder()
.name("Lob")
.line1("185 Berry Street")
.line2("Suite 1510")
.city("San Francisco")
.state("CA")
.zip("94107")
.country("US")
.build())
.from(AddressRequest.builder()
.name("Lob")
.line1("185 Berry Street")
.line2("Suite 1510")
.city("San Francisco")
.state("CA")
.zip("94107")
.country("US")
.build())
.front("https://s3-us-west-2.amazonaws.com/lob-assets/test.pdf")
.back("https://s3-us-west-2.amazonaws.com/lob-assets/test.pdf")
.build();
final ListenableFuture<PostcardResponse> postcard = client.createPostcard(postcardRequest);
// Create Postcard Using Inline Addresses and Local File
final File file = new File("/path/to/local/file");
final PostcardRequest postcardRequest = PostcardRequest.builder()
.to(AddressRequest.builder()
.name("Lob")
.line1("185 Berry Street")
.line2("Suite 1510")
.city("San Francisco")
.state("CA")
.zip("94107")
.country("US")
.build())
.from(AddressRequest.builder()
.name("Lob")
.line1("185 Berry Street")
.line2("Suite 1510")
.city("San Francisco")
.state("CA")
.zip("94107")
.country("US")
.build())
.front(file)
.back(file)
.build();
final ListenableFuture<PostcardResponse> postcard = client.createPostcard(postcardRequest);
// Create a Postcard Using HTML
final PostcardRequest postcardRequest = PostcardRequest.builder()
.to(<addressId>)
.from(<addressId>)
.front("<html style="margin: 130px; font-size: 50;">Front HTML</html>")
.back("<html style="margin: 130px; font-size: 50;">Back HTML</html>")
.build();
final ListenableFuture<PostcardResponse> postcard = client.createPostcard(postcardRequest);
// Create Postcard with Message Instead of Back
final PostcardRequest postcardRequest = PostcardRequest.builder()
.to(AddressRequest.builder()
.name("Lob")
.line1("185 Berry Street")
.line2("Suite 1510")
.city("San Francisco")
.state("CA")
.zip("94107")
.country("US")
.build())
.from(AddressRequest.builder()
.name("Lob")
.line1("185 Berry Street")
.line2("Suite 1510")
.city("San Francisco")
.state("CA")
.zip("94107")
.country("US")
.build())
.front(file)
.message("Hello, this is the message!")
.build();
final ListenableFuture<PostcardResponse> postcard = client.createPostcard(postcardRequest);// Returns a list of Letter objects
final ListenableFuture<LetterResponseList> letters = client.getLetters();
// Can specify count and offset
final ListenableFuture<LetterResponseList> letters = client.getLetters(Filters.ofCount(4).withOffset(2));// Retrieve a specific postcard by id
final ListenableFuture<LetterResponse> letters = client.getLetter(<id>);// Create a Letter Using IDs for Address
final LetterRequest letterRequest = LetterRequest.builder()
.to(<addressId>)
.from(<addressId>)
.file("https://s3-us-west-2.amazonaws.com/lob-assets/letter-goblue.pdf")
.color(true)
.build();
final ListenableFuture<LetterResponse> letter = client.createLetter(letterRequest);
// Create Letter Using Inline Addresses
final LetterRequest letterRequest = LetterRequest.builder()
.to(AddressRequest.builder()
.name("Lob")
.line1("185 Berry Street")
.line2("Suite 1510")
.city("San Francisco")
.state("CA")
.zip("94107")
.country("US")
.build())
.from(AddressRequest.builder()
.name("Lob")
.line1("185 Berry Street")
.line2("Suite 1510")
.city("San Francisco")
.state("CA")
.zip("94107")
.country("US")
.build())
.file("https://s3-us-west-2.amazonaws.com/lob-assets/letter-goblue.pdf")
.color(true)
.build();
final ListenableFuture<LetterResponse> letter = client.createLetter(letterRequest);
// Create Letter Using Inline Addresses and Local File
final File file = new File("/path/to/local/file");
final LetterRequest letterRequest = LetterRequest.builder()
.to(AddressRequest.builder()
.name("Lob")
.line1("185 Berry Street")
.line2("Suite 1510")
.city("San Francisco")
.state("CA")
.zip("94107")
.country("US")
.build())
.from(AddressRequest.builder()
.name("Lob")
.line1("185 Berry Street")
.line2("Suite 1510")
.city("San Francisco")
.state("CA")
.zip("94107")
.country("US")
.build())
.file(file)
.color(true)
.build();
final ListenableFuture<LetterResponse> letter = client.createLetter(letterRequest);
// Create a Letter Using HTML
final LetterRequest letterRequest = LetterRequest.builder()
.to(<addressId>)
.from(<addressId>)
.file("<html style="margin: 130px; font-size: 50;">Front HTML</html>")
.color(true)
.build();
final ListenableFuture<LetterResponse> letter = client.createLetter(letterRequest);// Returns a list of Check objects
final ListenableFuture<CheckResponseList> checks = client.getChecks();
// Can specify count and offset
final ListenableFuture<CheckResponseList> checks = client.getChecks(Filters.ofCount(4).withOffset(2));// Retrieve a specific Check by id
final ListenableFuture<CheckResponse> check = client.getCheck(<id>);// Create Check with Address Id
final CheckRequest checkRequest = CheckRequest.builder()
.to(<addressId>)
.bankAccount(<bankAccountId>)
.amount(1000)
.memo("Services Rendered")
.logo("https://s3-us-west-2.amazonaws.com/lob-assets/lob_check_logo.png")
.build();
final ListenableFuture<CheckResponse> check = client.createCheck(checkRequest);
// Create Check with Inline Address
final CheckRequest checkRequest = CheckRequest.builder()
.to(AddressRequest.builder()
.name("Lob")
.line1("185 Berry Street")
.line2("Suite 1510")
.city("San Francisco")
.state("CA")
.zip("94107")
.country("US")
.build())
.bankAccount(<bankAccountId>)
.amount(1000)
.memo("Services Rendered")
.logo("https://s3-us-west-2.amazonaws.com/lob-assets/lob_check_logo.png")
.build();
final ListenableFuture<CheckResponse> check = client.createCheck(checkRequest);// Returns a list of BankAccount objects
final ListenableFuture<BankAccountResponseList> bankAccounts = client.getBankAccounts();
// Can specify count and offset
final ListenableFuture<BankAccountResponseList> bankAccounts = client.getBankAccounts(Filters.ofCount(4).withOffset(2));// Retrieve a specific BankAccount by id
final ListenableFuture<BankAccountResponse> bankAccount = client.getBankAccount(<id>);// Create Bank Account Using Address Ids
final BankAccountRequest bankAccountRequest = BankAccountRequest.builder()
.routingNumber("123456789")
.accountNumber("123456789")
.signatory("John Doe")
.bankAddress(<addressId>)
.accountAddress(<addressId>)
.build();
final ListenableFuture<BankAccountResponse> bankAccount = client.createBankAccount(bankAccountRequest);
// Create Bank Account with Inline Addresses
final BankAccountRequest bankAccountRequest = BankAccountRequest.builder()
.routingNumber("123456789")
.accountNumber("123456789")
.signatory("John Doe")
.bankAddress(AddressRequest.builder()
.line1("123 Wall Street")
.city("San Francisco")
.state("CA")
.zip("94158")
.country("US")
.build())
.accountAddress(AddressRequest.builder()
.name("Lob")
.line1("185 Berry Street")
.line2("Suite 1510")
.city("San Francisco")
.state("CA")
.zip("94107")
.country("US")
.build())
.build();
final ListenableFuture<BankAccountResponse> bankAccount = client.createBankAccount(bankAccountRequest);// Delete a specific BankAccount by id
final ListenableFuture<BankAccountDeleteResponse> bankAccountDeleteResponse = client.deleteBankAccount(<id>);// List areas
final ListenableFuture<AreaMailResponseList> areaMails = client.getAreaMails();
// Can specify count and offset
final ListenableFuture<AreaMailResponseList> areaMails = client.getAreaMails(Filters.ofCount(4).withOffset(2));// You can query an area with its `ID`
final ListenableFuture<AreaMailResponse> areaMail = client.getAreaMail(<id>);// Basic Area Create with Zip Codes
final AreaMailRequest areaMailRequest = AreaMailRequest.builder()
.front("https://s3-us-west-2.amazonaws.com/lob-assets/areafront.pdf")
.back("https://s3-us-west-2.amazonaws.com/lob-assets/areafront.pdf")
.routesForZips("94158", "60031")
.targetType(TargetType.ALL)
.build();
final ListenableFuture<AreaMailResponse> areaMail = client.createAreaMail(areaMailRequest);
// Basic Area Create with Routes Object
final ZipCodeRouteResponseList routes = client.getZipCodeRoutes(
ZipCodeRouteRequest.builder()
.addStringZips("94158", "60031")
.build())
.get();
final AreaMailRequest areaMailRequest = AreaMailRequest.builder()
.front("https://s3-us-west-2.amazonaws.com/lob-assets/areafront.pdf")
.back("https://s3-us-west-2.amazonaws.com/lob-assets/areafront.pdf")
.routes(routes)
.targetType(TargetType.ALL)
.build();
final ListenableFuture<AreaMailResponse> areaMail = client.createAreaMail(areaMailRequest);
// Basic Area Create with HTML
final AreaMailRequest areaMailRequest = AreaMailRequest.builder()
.front("<html style="margin: 130px; font-size: 50;">Front HTML</html>")
.back("<html style="margin: 130px; font-size: 50;">Back HTML</html>")
.routesForZips("94158", "60031")
.targetType(TargetType.ALL)
.build();
final ListenableFuture<AreaMailResponse> areaMail = client.createAreaMail(areaMailRequest);
// Create Area without Optional Parameters
final AreaMailRequest areaMailRequest = AreaMailRequest.builder()
.front("https://s3-us-west-2.amazonaws.com/lob-assets/areafront.pdf")
.back("https://s3-us-west-2.amazonaws.com/lob-assets/areafront.pdf")
.routesForZips("94158")
.build();
final ListenableFuture<AreaMailResponse> areaMail = client.createAreaMail(areaMailRequest);// Retrieve routes for given zip codes
final ListenableFuture<ZipCodeRouteResponseList> zipCodeRoutes = client.getZipCodeRoutes(
ZipCodeRouteRequest.builder()
.addStringZips("94158", "60031")
.build());// You can verify an address using the following code:
System.out.println(client.verifyAddress(VerifyAddressRequest.builder()
.line1("185 Berry Street")
.line2("Suite 1510")
.city("San Francisco")
.state("CA")
.zip("94107")
.country("US")
.build()).get());This will output:
{
"address": {
"address_city": "SAN FRANCISCO",
"address_country": "US",
"address_line1": "185 BERRY ST STE 1510",
"address_line2": "",
"address_state": "CA",
"address_zip": "94107-5705"
},
}You can run all tests with the command mvn test in the main directory.

