OpenAPI Specification
openapi: 3.0.3
info:
title: Lob Send API
version: 1.20.2
description: "Experience direct mail like never before, with unmatched personalization and scalability \x14 all in one intuitive platform."
license:
name: MIT
url: https://mit-license.org/
contact:
name: Lob Developer Experience
url: https://support.lob.com/
email: lob-openapi@lob.com
termsOfService: https://www.lob.com/legal
servers:
- url: https://api.lob.com/v1
description: production
security:
- basicAuth: []
tags:
- name: Send
paths:
/campaigns/{cmp_id}/send:
parameters:
- in: path
name: cmp_id
description: id of the campaign
required: true
schema:
$ref: '#/components/schemas/cmp_id'
post:
operationId: campaign_send
summary: Send Campaign
description: Sends a campaign. You need only supply the unique campaign identifier that was returned upon campaign creation.
tags:
- Send
responses:
'200':
description: Returns a campaign object
content:
application/json:
schema:
$ref: '#/components/schemas/campaign'
example:
id: cmp_e05ee61ff80764b
billing_group_id: bg_fe3079dcdd80e5ae
name: My Campaign
description: My Campaign's description
schedule_type: immediate
cancel_window_campaign_minutes: 60
metadata: {}
use_type: marketing
is_draft: true
deleted: false
creatives: []
uploads: []
auto_cancel_if_ncoa: false
date_created: '2017-09-05T17:47:53.767Z'
date_modified: '2017-09-05T17:47:53.767Z'
object: campaign
default:
$ref: '#/components/responses/campaigns_error'
x-codeSamples:
- lang: Shell
source: "curl https://api.lob.com/v1/campaigns/cmp_e05ee61ff80764b/send \\\n -u <YOUR API KEY>:\n"
label: CURL
components:
schemas:
date_created:
type: string
format: date-time
description: A timestamp in ISO 8601 format of the date the resource was created.
upl_id:
type: string
description: Unique identifier prefixed with `upl_`.
pattern: ^upl_[a-zA-Z0-9]+$
custom_envelope_returned:
type: object
description: A nested custom envelope object containing more information about the custom envelope used or `null` if a custom envelope was not used.
required:
- id
- url
- object
properties:
id:
type: string
description: The unique identifier of the custom envelope used.
maxLength: 40
url:
type: string
description: The url of the envelope asset used.
object:
type: string
enum:
- envelope
default: envelope
nullable: true
merge_variable_column_mapping:
title: Merge Variable Mapping
type: object
nullable: true
default: null
example:
name: recipient_name
gift_code: code
qr_code_redirect_url: redirect_url
description: The mapping of column headers in your file to the merge variables present in your creative. See our <a href="https://help.lob.com/print-and-mail/building-a-mail-strategy/campaign-or-triggered-sends/campaign-audience-guide#step-3-map-merge-variable-data-if-applicable-7" target="_blank">Campaign Audience Guide</a> for additional details. <br />If a merge variable has the same "name" as a "key" in the `requiredAddressColumnMapping` or `optionalAddressColumnMapping` objects, then they **CANNOT** have a different value in this object. If a different value is provided, then when the campaign is processing it will get overwritten with the mapped value present in the `requiredAddressColumnMapping` or `optionalAddressColumnMapping` objects. The redirect URLs for QR codes can also be customized using this mapping. If the URL has a variable and the variable mapping existsing here, then data from the respective column in the audience file will be merged into the URL template.
optional_address_column_mapping:
title: Optional Address Columns
type: object
required:
- address_line2
- company
- address_country
properties:
address_line2:
type: string
nullable: true
default: null
description: The column header from the csv file that should be mapped to the optional field "address_line2"
company:
type: string
nullable: true
default: null
description: The column header from the csv file that should be mapped to the optional field "company"
address_country:
type: string
nullable: true
default: null
description: The column header from the csv file that should be mapped to the optional field "address_country"
example:
address_line2: secondary_line
company: company
address_country: country,
description: The mapping of column headers in your file to Lob-optional fields for the resource created. See our <a href="https://help.lob.com/print-and-mail/building-a-mail-strategy/campaign-or-triggered-sends/campaign-audience-guide#optional-columns-3" target="_blank">Campaign Audience Guide</a> for additional details.
uploads_metadata:
title: Metadata
type: object
required:
- columns
properties:
columns:
type: array
description: The list of column names from the csv file which you want associated with each of your mailpieces
default: []
items:
type: string
default:
columns: []
example:
columns:
- recipient_name
description: The list of column headers in your file as an array that you want as metadata associated with each mailpiece. See our <a href="https://help.lob.com/print-and-mail/building-a-mail-strategy/campaign-or-triggered-sends/campaign-audience-guide#required-columns-2" target="_blank">Campaign Audience Guide</a> for additional details.
error:
type: object
description: Lob uses RESTful HTTP response codes to indicate success or failure of an API request. In general, 2xx indicates success, 4xx indicate an input error, and 5xx indicates an error on Lob's end.
required:
- error
properties:
error:
type: object
required:
- message
- status_code
- code
properties:
message:
type: string
description: A human-readable message with more details about the error
example: Rate limit exceeded. Please wait 5 seconds and try your request again.
status_code:
$ref: '#/components/schemas/failure_status_code'
code:
type: string
enum:
- bad_request
- conflict
- feature_limit_reached
- internal_server_error
- invalid
- not_deletable
- not_found
- request_timeout
- service_unavailable
- unrecognized_endpoint
- unsupported_lob_version
- address_length_exceeds_limit
- bank_account_already_verified
- bank_error
- billing_address_required
- custom_envelope_inventory_depleted
- deleted_bank_account
- failed_deliverability_strictness
- file_pages_below_min
- file_pages_exceed_max
- file_size_exceeds_limit
- foreign_return_address
- inconsistent_page_dimensions
- invalid_bank_account
- invalid_bank_account_verification
- invalid_check_international
- invalid_country_covid
- invalid_file
- invalid_file_dimensions
- invalid_file_download_time
- invalid_file_url
- invalid_image_dpi
- invalid_international_feature
- invalid_perforation_return_envelope
- invalid_template_html
- mail_use_type_can_not_be_null
- merge_variable_required
- merge_variable_whitespace
- payment_method_unverified
- pdf_encrypted
- special_characters_restricted
- unembedded_fonts
- email_required
- invalid_api_key
- publishable_key_not_allowed
- rate_limit_exceeded
- unauthorized
- unauthorized_token
description: 'A pre-defined string identifying an error. Error codes fall into three categories:
**GENERIC**
* `bad_request` - 422: an invalid request was made. See error message for details.
* `conflict` - 409/422: this operation would leave data in a conflicted state.
* `feature_limit_reached` - 403: the account has reached its resource limit and requires upgrading to add more.
* `internal_server_error` - 500: an error has occured on Lob''s servers. Please try request again.
* `invalid` - 422: an invalid request was made. See error message for details.
* `not_deletable` - 422: an attempt was made to delete a resource, but the resource cannot be deleted.
* `not_found` - 404: the requested resource was not found.
* `request_timeout` - 408: the request took too long. Please try again.
* `service_unavailable` - 503: the Lob servers are temporarily unavailable. Please try agian.
* `unrecognized_endpoint` - 404: the requested endpoint doesn''t exist.
* `unsupported_lob_version` - 422: an unsupported Lob API version was requested.
**ADVANCED**
* `address_length_exceeds_limit` - 422: the sum of to.address_line1 and to.address_line2 cannot surpass 50 characters.
* `bank_account_already_verified` - 422: the bank account has already been verified.
* `bank_error` - 422: there''s an issue with the bank account.
* `billing_address_required` - 403: in order to create a live mail piece, your account needs to set up a billing address.
* `custom_envelope_inventory_depleted` - 422: custom envelope inventory is depleted, and more will need to be ordered.
* `deleted_bank_account` - 404: checks cannot be created with a deleted bank account.
* `failed_deliverability_strictness` - 422: the `to` address doesn''t meet strictness requirements. See <a href="https://dashboard.lob.com/#/settings/account" target="_blank">Account Settings</a> to configure strictness.
* `file_pages_below_min` - 422: not enough pages.
* `file_pages_exceed_max` - 422: too many pages.
* `file_size_exceeds_limit` - 422: the file size is too large. See description for details.
* `foreign_return_address` - 422: the `from` address must be a US address.
* `inconsistent_page_dimensions` - 422: all pages of the input file must have the same dimensions.
* `invalid_bank_account` - 422: the provided bank routing number is invalid.
* `invalid_bank_account_verification` - 422: verification amounts do not match.
* `invalid_check_international` - 422: checks cannot be sent internationally.
* `invalid_country_covid` - 422: the postal service in the specified country is currently unable to process the request due to COVID-19 restrictions.
* `invalid_file` - 422: the file is invalid.
* `invalid_file_dimensions` - 422: file dimensions are incorrect for the selected mail type.
* `invalid_file_download_time` - 422: file download from remote server took too long.
* `invalid_file_url` - 422: the file URL when creating a resource is invalid.
* `invalid_image_dpi` - 422: DPI must be at least 300.
* `invalid_international_feature` - 422: the specified product cannot be sent to the destination.
* `invalid_perforation_return_envelope` - 422: both `return_envelope` and `perforation` must be used together.
* `invalid_template_html` - 422: the provided HTML is invalid.
* `mail_use_type_can_not_be_null` - 422: use_type must be one of "marketing" or "operational". Alternatively, an admin can set the account default use type in Account Settings.
* `merge_variable_required` - 422: a required merge variable is missing.
* `merge_variable_whitespace` - 422: merge variable names cannot contain whitespace.
* `payment_method_unverified` - 401: you must have a verified bank account or credit card to submit live requests.
* `pdf_encrypted` - 422: an encrypted PDF was provided.
* `special_characters_restricted` - 422: cannot use special characters for merge variable names.
* `unembedded_fonts` - 422: the provided PDF contains non-standard unembedded fonts. See description for details.
**AUTHENTICATION**
* `email_required` - 401: account must have a verified email address before creating live resources.
* `invalid_api_key` - 401/403: the API key is invalid.
* `publishable_key_not_allowed` - 403: the requested operation needs a secret key, not a publishable key. See [API Keys](#section/API-Keys) for more information.
* `rate_limit_exceeded` - 429: requests were sent too quickly and must be slowed down.
* `unauthorized` - 401: the request isn''t authorized.
* `unauthorized_token` - 401: token isn''t authorized.
'
adr_id:
type: string
description: Unique identifier prefixed with `adr_`.
pattern: ^adr_[a-zA-Z0-9]+$
crv_id:
type: string
description: Unique identifier prefixed with `crv_`.
pattern: ^crv_[a-zA-Z0-9]+$
example: crv_2a3b096c409b32c
company:
type: string
description: 'Either `name` or `company` is required, you may also add both. Must be no longer than 40 characters. If both `name` and `company` are provided, they will be printed on two separate lines above the rest of the address. This field can be used for any secondary recipient information which is not part of the actual mailing address (Company Name, Department, Attention Line, etc).
'
maxLength: 40
nullable: true
returned_resource:
oneOf:
- allOf:
- title: Postcard Creative
required:
- resource_type
- details
properties:
resource_type:
type: string
description: Mailpiece type for the creative
enum:
- postcard
details:
$ref: '#/components/schemas/returned'
- $ref: '#/components/schemas/creative_base'
- allOf:
- title: Letter Creative
required:
- from
- resource_type
- details
properties:
resource_type:
type: string
description: Mailpiece type for the creative
enum:
- letter
details:
$ref: '#/components/schemas/letter_details_returned'
- $ref: '#/components/schemas/creative_base'
- allOf:
- title: Self Mailer Creative
required:
- resource_type
- details
properties:
resource_type:
type: string
description: Mailpiece type for the creative
enum:
- self_mailer
details:
$ref: '#/components/schemas/self_mailer_details_returned'
- $ref: '#/components/schemas/creative_base'
creative_base:
type: object
properties:
from:
$ref: '#/components/schemas/from_attribute'
description:
$ref: '#/components/schemas/resource_description'
metadata:
$ref: '#/components/schemas/metadata'
extra_service:
type: string
enum:
- certified
- certified_return_receipt
- registered
- null
description: "Add an extra service to your letter. Can only be non-`null` if `mail_type` isn't `usps_standard`. See <a href=\"https://www.lob.com/pricing/print-mail#compare\" target=\"_blank\">pricing</a> for extra costs incurred.\n * `certified` - track and confirm delivery for domestic destinations. An extra sheet (1 PDF page single-sided or 2 PDF pages double-sided) is added to the beginning of your letter for address and barcode information. See here for templates: <a href=\"https://s3-us-west-2.amazonaws.com/public.lob.com/assets/templates/letter_certified_template.pdf\" target=\"_blank\">#10 envelope</a> and <a href=\"https://s3-us-west-2.amazonaws.com/public.lob.com/assets/templates/letter_certified_flat_template.pdf\" target=\"_blank\">flat envelope</a> (used for letters over 6 pages single-sided or 12 pages double-sided). You will not be charged for this extra sheet.\n * `certified_return_receipt` - request an electronic copy of the recipient's signature to prove delivery of your certified letter\n * `registered` - provides tracking and confirmation for international addresses\n \nNot available for `us_legal` letter size.\n"
nullable: true
color:
type: boolean
description: Set this key to `true` if you would like to print in color. Set to `false` if you would like to print in black and white.
required_address_column_mapping:
title: Required Address Columns
type: object
required:
- name
- address_line1
- address_city
- address_state
- address_zip
properties:
name:
type: string
nullable: true
default: null
description: The column header from the csv file that should be mapped to the required field `name`
address_line1:
type: string
nullable: true
default: null
description: The column header from the csv file that should be mapped to the required field `address_line1`
address_city:
type: string
nullable: true
default: null
description: The column header from the csv file that should be mapped to the required field `address_city`
address_state:
type: string
nullable: true
default: null
description: The column header from the csv file that should be mapped to the required field `address_state`
address_zip:
type: string
nullable: true
default: null
description: The column header from the csv file that should be mapped to the required field `address_zip`
example:
name: recipient_name
address_line1: primary_line
address_city: city
address_state: state
address_zip: zip_code
description: The mapping of column headers in your file to Lob-required fields for the resource created. See our <a href="https://help.lob.com/print-and-mail/building-a-mail-strategy/campaign-or-triggered-sends/campaign-audience-guide#required-columns-2" target="_blank">Campaign Audience Guide</a> for additional details.
inline_address_us:
allOf:
- $ref: '#/components/schemas/address_editable_us'
- type: object
required:
- address_line1
- address_city
- address_state
- address_zip
cmp_schedule_type:
description: How the campaign should be scheduled. Only value available today is `immediate`.
type: string
enum:
- immediate
card_id:
type: string
description: Unique identifier prefixed with `card_`.
pattern: ^card_[a-zA-Z0-9]+$
resource_description:
type: string
description: 'An internal description that identifies this resource. Must be no longer than 255 characters.
'
maxLength: 255
nullable: true
upload_writable:
type: object
required:
- campaignId
properties:
campaignId:
allOf:
- $ref: '#/components/schemas/cmp_id'
- description: Associated Campaign ID
type: string
example: cmp_1933ad629bae1408
requiredAddressColumnMapping:
$ref: '#/components/schemas/required_address_column_mapping'
optionalAddressColumnMapping:
$ref: '#/components/schemas/optional_address_column_mapping'
metadata:
$ref: '#/components/schemas/uploads_metadata'
mergeVariableColumnMapping:
$ref: '#/components/schemas/merge_variable_column_mapping'
description: test
address_placement:
type: string
enum:
- top_first_page
- insert_blank_page
- bottom_first_page_center
- bottom_first_page
description: "Specifies the location of the address information that will show through the double-window envelope. To see how this will impact your letter design, view our letter template.\nSome values are exclusive to certain customers. Upgrade to the appropriate <a href=\"https://dashboard.lob.com/#/settings/editions\" target=\"_blank\">Print & Mail Edition</a> to gain access.\n * `top_first_page` - (default) print address information at the top of your provided first page\n * `insert_blank_page` - insert a blank address page at the beginning of your file (you will be charged for the extra page)\n * `bottom_first_page_center` - **(exclusive, deprecation planned within a few months)** print address information at the bottom center of your provided first page\n * `bottom_first_page` - **(exclusive)** print address information at the bottom of your provided first page\n"
default: top_first_page
self_mailer_size:
type: string
enum:
- 6x18_bifold
- 11x9_bifold
- 12x9_bifold
- 17.75x9_trifold
description: Specifies the size of the self mailer. The `17.75x9_trifold` size is in beta. Contact support@lob.com or your account contact to learn more.
default: 6x18_bifold
upload_state:
title: Upload State
enum:
- Preprocessing
- Draft
- Ready for Validation
- Validating
- Scheduled
- Cancelled
- Errored
default: Draft
type: string
description: The `state` property on the `upload` object. As the file is processed, the `state` will change from `Ready for Validation` to `Validating` and then will be either `Scheduled` (successfully processed) or `Errored` (Unsuccessfully processed).
campaign_item:
allOf:
- $ref: '#/components/schemas/campaign_writable'
- type: object
required:
- id
- name
- description
- schedule_type
- use_type
- is_draft
- creatives
- uploads
- auto_cancel_if_ncoa
- date_created
- date_modified
- object
properties:
id:
$ref: '#/components/schemas/cmp_id'
is_draft:
description: Whether or not the campaign is still a draft.
type: boolean
default: true
creatives:
description: An array of creatives that have been associated with this campaign.
type: array
uploads:
description: A single-element array containing the upload object that is assocated with this campaign.
type: array
minItems: 0
maxItems: 1
object:
type: string
description: Value is resource type.
enum:
- campaign
default: campaign
date_created:
$ref: '#/components/schemas/date_created'
date_modified:
$ref: '#/components/schemas/date_modified'
deleted:
$ref: '#/components/schemas/deleted'
postcard_size:
type: string
enum:
- 4x6
- 6x9
- 6x11
description: 'Specifies the size of the postcard. Only `4x6` postcards can be sent to international destinations.
'
default: 4x6
double_sided:
type: boolean
description: Set this attribute to `true` for double sided printing, or `false` for for single sided printing. Defaults to `true`.
default: true
campaign:
allOf:
- $ref: '#/components/schemas/lob_base'
- $ref: '#/components/schemas/campaign_writable'
- type: object
required:
- id
- name
- description
- schedule_type
- use_type
- is_draft
- creatives
- uploads
- auto_cancel_if_ncoa
- date_created
- date_modified
- object
properties:
id:
$ref: '#/components/schemas/cmp_id'
is_draft:
description: Whether or not the campaign is still a draft.
type: boolean
default: true
creatives:
description: An array of creatives that have been associated with this campaign.
type: array
items:
$ref: '#/components/schemas/creative'
minItems: 0
uploads:
description: A single-element array containing the upload object that is assocated with this campaign.
type: array
items:
$ref: '#/components/schemas/upload'
minItems: 0
maxItems: 1
object:
type: string
description: Value is resource type.
enum:
- campaign
default: campaign
use_type:
$ref: '#/components/schemas/cmp_use_type'
mail_type:
type: string
enum:
- usps_first_class
- usps_standard
description: 'A string designating the mail postage type:
* `usps_first_class` - (default)
* `usps_standard` - a <a href="https://lob.com/pricing/print-mail#compare" target="_blank">cheaper option</a> which is
less predictable and takes longer to deliver. `usps_standard` cannot be used with `4x6`
postcards or for any postcards sent outside of the United States.
'
default: usps_first_class
deleted:
type: boolean
description: Only returned if the resource has been successfully deleted.
from_attribute:
title: From
description: Must either be an address ID or an inline object with correct address parameters. All addresses will be standardized into uppercase without being modified by verification.
oneOf:
- $ref: '#/components/schemas/adr_id'
- $ref: '#/components/schemas/inline_address_us'
creative:
allOf:
- $ref: '#/components/schemas/lob_base'
- $ref: '#/components/schemas/returned_resource'
- type: object
required:
- id
- description
- from
- resource_type
- details
- metadata
- template_preview_urls
- template_previews
- campaigns
- date_created
- date_modified
- object
- deleted
properties:
deleted:
type: boolean
description: Whether the resource has been deleted.
id:
$ref: '#/components/schemas/crv_id'
template_preview_urls:
title: Template Preview URLs
type: object
description: Preview URLs associated with a creative's artwork asset(s) if the creative uses HTML templates as assets. An empty object will be returned if no `template_preview`s have been generated.
template_previews:
title: Template Previews
type: array
items:
type: object
description: A list of template preview objects if the creative uses HTML template(s) as artwork asset(s). An empty array will be returned if no `template_preview`s have been generated for the creative.
campaigns:
$ref: '#/components/schemas/campaign_list'
object:
type: string
description: Value is resource type.
enum:
- creative
default: creative
letter_details_returned:
description: Properties that the letters in your Creative should have. See the `qr_code` attribute below to add a QR code to your creative.
properties:
address_placement:
$ref: '#/components/schemas/address_placement'
buckslips:
description: A single-element array containing an existing buckslip id in a string format. See [buckslips](#tag/Buckslips) for more information.
type: array
items:
$ref: '#/components/schemas/buckslip_id'
minItems: 0
maxItems: 1
nullable: true
cards:
description: A single-element array containing an existing card id in a string format. See [cards](#tag/Cards) for more information.
type: array
items:
$ref: '#/components/schemas/card_id'
minItems: 0
maxItems: 1
nullable: true
custom_envelope:
$ref: '#/components/schemas/custom_envelope_returned'
color:
$ref: '#/components/schemas/color'
double_sided:
$ref: '#/components/schemas/double_sided'
extra_service:
$ref: '#/components/schemas/extra_service'
file_original_url:
description: The original URL of the `file` template.
type: string
mail_type:
$ref: '#/components/schemas/mail_type'
upload:
allOf:
- $ref: '#/components/schemas/upload_writable'
- type: object
required:
- id
- accountId
- campaignId
- requiredAddressColumnMapping
- optionalAddressColumnMapping
- metadata
- mergeVariableColumnMapping
- mode
- state
- totalMailpieces
- failedMailpieces
- validatedMailpieces
- bytesProcessed
- dateCreated
- dateModified
properties:
id:
$ref: '#/components/schemas/upl_id'
accountId:
title: Account ID
type: string
description: Account ID that made the request
example: fa9ea650fc7b31a89f92
mode:
enum:
- test
- live
type: string
description: The environment in which the mailpieces were created. Today, will only be `live`.
failuresUrl:
title: Failures URL
type: string
example: https://www.example.com
description: Url where your campaign mailpiece failures can be retrieved
originalFilename:
title: Original Filename
type: string
example: my_audience.csv
description: Filename of the upload
state:
$ref: '#/components/schemas/upload_state'
totalMailpieces:
title: Total Mailpieces
type: integer
example: 100
description: Total number of recipients for the campaign
failedMailpieces:
title: Failed Mailpieces
type: integer
example: 5
description: Number of mailpieces that failed to create
validatedMailpieces:
title: Validated Mailpieces
type: integer
example: 95
description: Number of mailpieces that were successfully created
bytesProcessed:
title: Bytes Processed
type: integer
example: 17268
description: Number of bytes processed in your CSV
dateCreated:
title: Date Created
type: string
format: date-time
description: A timestamp in ISO 8601 format of the date the upload was created
dateModified
# --- truncated at 32 KB (42 KB total) ---
# Full source: https://raw.githubusercontent.com/api-evangelist/lob/refs/heads/main/openapi/lob-send-api-openapi.yml