Check Print Partner API

You can now integrate Checkeeper's check print and mail capabilities into your own web or desktop applications with an easy to use API from Checkeeper! Accept payment from customers faster, simplify accounting tasks for staff, automate bill payment, or simply offer your own white-labeled check fulfillment service.

Request API Access

Key API Features

  • Mail a check with only a few lines of code
  • Request a formatted check returned as a PDF
  • First Class or UPS Next Day delivery options
  • Attach additional documents to be mailed with a check

Getting Started

You must obtain a Checkeeper auth token first to begin using the Checkeeper check fulfillment API. With this, you can create new check fulfillment orders, as well as request the status of fulfillment orders. Please contact with questions or for more information on getting a partner API token.

NOTICE: By accessing or using the Checkeeper API you agree to the Checkeeper API Terms of Service

Creating a check
  "token" : "xxxxxx",
  "test" : "1",
  "date" : "2020-06-14",
  "check_number" : "5004",
  "amount" : "5,230.00",
  "memo" : "Widget supply order",
  "bank_routing": "012345678",
  "bank_account": "9320122",
  "payer": {
    "name": "Widgets Inc.",
    "address": {
      "line1": "827 Random Street",
      "line2": "Suite 102"
    "city": "Anytown",
    "state": "NY",
    "zip": "14850",
    "signer": "John Hancock"
  "payee": {
      "name": "Bob's Supplies",
      "address": {
        "line1": "114 Project Lane"
      "city": "Tinkertown",
      "state": "CA",
      "zip": "90210",
      "country": "US"
  "signature": "6849f1fce30ff713773ae31ef8263091a152ecb07bb5eb9a42fddf90aefaf2ac"

The most basic and minimal example of creating a new check to be mailed. Assume all fields are required unless otherwise stated.

token: required

We provide you with this once you register.

test: optional boolean

Default false (we assume you're ready to print checks!) Set 1 credits will not be used and checks will not be mail. PDFs will be returned voided.

memo: optional

Prints on the check, string truncated to 73 characters.

date: optional

Format should be YYYY-MM-DD. If no date is provided, the date of the request will be used.

payer: required

The business or person writing the check. All fields except address line2 are required.

signer: optional

The name of the person signing for the check. A handwriting font is used to generate the look of a pen signature. Replace signer with signer_image to include a base64 encoded image of your signature.

payee: required

The business or person receiving the check. Just like payer, all fields are required except for address line 2. Country codes should be their two-letter USPS codes (US = Unites States, CA = Canada, GB = United Kingdom, etc)

signature: required

Not to be confused with signer. This is a SHA256 hash of the whole request with your secret key on the end.

Extra Goodies

Include these with the basic check call for additional functionality.

  "payer" : {
    logo : base64 string
logo: optional

Include a pretty little logo in the top left corner of your check (next to the payer name/address). This will also show through the envelope window for the return address. Logo should be square, 300dpi sized to 2 inch x 2 inch. Sending the same logo in every call? Contact us to store the logo on our end rather than passing it every time.

  "return_pdf" : "1",
  "template" : "cityscape"
return_pdf: optional boolean

instead of Checkeeper printing and mailing the check for you, an encoded PDF of a formatted check will be returned and the check will NOT be mailed.

template: optional

Specify the style of check that is returned in the PDF. Contact us for a list of available styles or to have a custom template created just for your business.

  "mail_method" : "next_day",
  "mail_address" : {
    "name" : "Karen in Accounting",
    "line1" : "101 North Main Street",
    "line2" : "Suite 308",
    "state" : "SC",
    "zip" : "29601"
mail_method: optional

Select to have a check mailed USPS First Class or UPS Next Day. Methods can be first_class (default) or next_day

A successfully created check with next_day will return a tracking URL and tracking number.

mail_address: optional

Specific address to mail the check to if different than the payee address. Karen in Accounting couldn't be happier with this option!

    "attachment" : base64 string
attachment: optional

Include additional pages to be printed with your check! This must be a base64 encoded PDF no larger than 6 total pages and 1.5mb file size. Each page is 0.50 credits.

  "invoice_table" : {
    "headings" : [
    "rows" : [
invoice_table: optional

Want to list details of the payment being made? This option is for you. We call it an invoice table, but you can rename the headings to be whatever you want and we'll put a beautiful looking table with the details on the stub of your check. Try to limit the headings to no more than 6.

Sample output

Invoice Date Amount
30093 2020-06-14 $75.00
30096 2020-05-14 $75.00

Get Check Status
  "token": "xxxxxx",
  "check_id": "sCOrlJiwfAjokyfjtBGu",
  "signature": "561fec456b70b2ae8addb00cd043a9e2c4396195aa3251f3a416fda8b4853967"
check_id: required

Returns the status of a check you've created with the API. Pending, Printed, Mailed, Canceled are all possible responses.

Cancel Check
  "token": "xxxxxx",
  "check_id": "sCOrlJiwfAjokyfjtBGu",
  "signature": "561fec456b70b2ae8addb00cd043a9e2c4396195aa3251f3a416fda8b4853967"
check_id: required

If a check does not have the status of mailed yet, you can request we cancel it and not mail or print it.

Get Checks Created
"token": "xxxxxx",
"start_date": "2021-02-26 08:00:00",
"end_date": "2021-02-28 21:15:00",
"signature": "561fec456b70b2ae8addb00cd043a9e2c4396195aa3251f3a416fda8b4853967"

Get a list of all the checks you've sent us between a date range. This is not a paginated request. Based on your throughput, you may need to use a smaller date range. All times are in US Eastern time zone (UTC -5 or UTC -4)

start_date: required

Format: YYYY-MM-DD HH:mm:ss This is the start date and time.

end_date: required

Format: YYYY-MM-DD HH:mm:ss This is the end date and time.

Get Account Information
  "token": "xxxxxx",
  "signature": "561fec456b70b2ae8addb00cd043a9e2c4396195aa3251f3a416fda8b4853967"

Simple end-point that will return the details of your account, specifically, how many credits you have remaining.

Building the Signature

$json_string = '{

// convert the JSON into an array for easy sorting
$request_array = json_decode($json_string, true);

// sort the array based on the keys

// build out the url encoded query string
$query_string = http_build_query($request_array);

// create the HMAC hash of the sorted query string
$raw_signature = hash_hmac(

// encode the raw signature into base64
$signature = base64_encode($raw_signature);

// add the signature back to the array
$request_array['signature'] = $signature;

// convert request back to JSON for sending
$json_payload = json_encode($request_array);

Each request you make must be signed by an SHA256 HMAC hash. Here's an example of creating it.

Sort your request based on the keys, lexicographically. Capital letters come before lower-case ones. Sort all levels of the request. For example, you need to sort the main level, the payee, the payer, and the address levels of the Create Check.

Convert your request to a URL-encoded string. All keys with blank/null values must be removed. All non-numeric characters except "-" (dash), "_" (underscore), and "." (period) need to be replaced with a % (percent sign) followed by the two character's two-digit hex digits. Spaces should be encoded as "+" (plus signs) See RFC 3986 for encoding, but note that spaces are to be encoded as "+" and NOT "%20".

Create a signature by making an HMAC-SHA256 (hash-based message authentication code) hash using your API Secret Key.

Include your newly created signature with the JSON payload in the root.

For more detailed information, and samples in other languages (provided by our partners), be sure to check out our blog post that goes into more detail about the how and why we're using a request signature.