Print Partner API

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

Request API Tokens

How it works

With the Checkeeper authorized partner API you can submit checks 24 hours a day directly to the Checkeeper print server. As soon as your data is submitted, its processed and queued for high-quality, industrial-grade printing.

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 support@checkeeper with questions and for more information on getting a partner API token.

Looking for the Parter API v1 docs? Look here.

Creating a check

To have a new check printed by Checkeeper, create a new check order by making a POST request of the outlined JSON object. A JSON object will be returned with either an error, or a check_id string if successful.

Field Type Required Description
token string req API auth token string provided by Checkeeper.
amount double req Numeric value of check. No currency signs.
date string (YYYY-mm-dd) opt If no date is set, the current date will be used.
check_number string req Number used for check.
bank_routing integer req 9-digit ABA routing number.
bank_account integer req bank account number associated with routing number
memo string opt Optional memo message for the check. (about 50 characters shown)
note string opt Optional note for the check. Field will automatically wrap on the check stub. Use \n to manually force a line break.
return_pdf boolean opt 1 for a pdf of the check to be returned. Defaults to 0 to have the check fulfilled through Checkeeper.
pdf_background boolean opt 1 for the pdf to have a background. Defaults to 1.
test boolean opt Set to 1 if this is a test transaction. It WILL NOT be printed. Defaults to 0
signature string req SHA256 hash of the request with your secret key on the end.
void_after int opt will print a line under the amount, "Void After x Days"
payer array req The entity writing the check
-name string req Name or business of entity writing the checks
-address array
 --line1 string req Street address line 1 of entity writing the check
 --line2 string opt Street address line 2 of entity writing the check
-city string req U.S. city of entity writing the check
-state string req U.S. State of entity writing the check
-zip string req 5 or 9-digit U.S. zip code
-signer string opt Name to appear on 'authorized signature' line. Either signer or signer_image is required.
-signer_image string opt base64 encoded PNG or GIF with transparent background, used as the signiture. Either signer or signer_image is required.
payee array req The entity receiving the check
-name string req Name or business of entity receiving the checks
-address array
 --line1 string req Street address line 1 of entity writing the check
 --line2 string opt Street address line 2 of entity writing the check
-city string req U.S. City of entity receiving the checks
-state string req U.S. State of entity receiving the checks
-zip string req 5-digit or 9-digit U.S. zip code of entity receiving the checks

Example JSON post

POST- https://my.checkeeper.com/api/v2/check/create/

{
    "token": "ilojdH7hskwiHgqpomanhhakHQka872i",
    "amount": "5,320.00",
    "date": "2015-01-19",
    "check_number": "37285",
    "bank_routing": "012345678",
    "bank_account": "938763720122",
    "memo": "Widget supply order",
    "note": "15 hours",
    "return_pdf": 1,
    "pdf_background" : 1,
    "test": 1,
    "signature": "6849f1fce30ff713773ae31ef8263091a152ecb07bb5eb9a42fddf90aefaf2ac",
    "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"
    }
}
  	

Response

{
    "success": 1,
    "status": 200,
    "message": "check created successfully",
    "check": {
        "id": "sCOrlJiwfAjokyfjtBGu",
        "amount": "5.00",
        "date": "2015-01-19",
        "check_number": "37285",
        "bank_routing": "012345678",
        "bank_account": "938763720122",
        "memo": "Widget supply order",
        "note": "15 hours",
        "return_pdf": 1,
        "pdf_background": 1,
        "test": 1,
        "payer": {
            "name": "Widgets Inc.",
            "address": {
                "line1": "827 Random Street",
                "line2": "Suite 102"
            },
            "city": "Anytown",
            "state": "NY",
            "zip": "14850",
            "signer": "John Hancock",
            "signer_image": null
        },
        "payee": {
            "name": "Bob's Supplies",
            "address": {
                "line1": "114 Project Lane",
                "line2": ""
            },
            "city": "Tinkertown",
            "state": "CA",
            "zip": "90210"
        }
    },
    "pdf": "…[base64 encoded pdf]…",
    "remaining_credits": "107.60"
}
  	

 

Check check status

Want to know the whereabouts of a check just submitted to Checkeeper? Make a POST request with your check_id and you shall have the answer you seek.

POST - https://my.checkeeper.com/api/v2/check/status/

Field Type Required Description
token string req API auth token string provided by Checkeeper.
check_id string req Check ID that was returned during the create check call
signature string req SHA256 hash of the request with your secret key on the end.

Example JSON post

POST- https://my.checkeeper.com/api/v2/check/create/

{
    "token": "ilojdH7hskwiHgqpomanhhakHQka872i",
    "check_id": "sCOrlJiwfAjokyfjtBGu",
    "signature": "561fec456b70b2ae8addb00cd043a9e2c4396195aa3251f3a416fda8b4853967"
}
  	

Response

{
    "success": 1,
    "message": "Check Found",
    "check": {
        "check_id": "sCOrlJiwfAjokyfjtBGu",
        "status": "pdf",
        "created": "2015-01-19",
        "printed": null,
        "mailed": null
    }
}
  	

 

Verify a Bank Account

Have a bank routing number and need to make sure it's valid? This is for you!

POST - https://my.checkeeper.com/api/v2/bank/lookup/

Field Type Required Description
token string req API auth token string provided by Checkeeper.
country string req The country code the bank is in. Valid options are 'US' and 'CA'
routing_number string opt Routing number of the bank in the US (Required when country = 'US').
institution string opt Institution number of the bank in Canada (Required when country = 'CA')
branch string opt Branch number of the bank in Canada (Required when country = 'CA')
signature string req SHA256 hash of the request with your secret key on the end.

Example JSON post

POST- https://my.checkeeper.com/api/v2/bank/lookup/

{
    "token": "ilojdH7hskwiHgqpomanhhakHQka872i",
    "country": "US",
    "routing_number": "011100915",
    "signature": "980bc3e711d6435b161808777f12e83482756b50ac517be9b606aa836eed787e"
}
  	

Response

{
    "success": 1,
    "message": "Bank Found",
    "bank": {
        "routing": "011100915",
        "name": "BANK OF AMERICA N.A.",
        "address": "P.O. BOX 27025",
        "city": "RICHMOND",
        "state": "VA",
        "zip": "23261",
        "updated": "2014-08-18 12:49:31",
        "country": "US"
    }
}
  	

 

Get your Account Information

Need to know some informaiton about your account? Look no further!

POST - https://my.checkeeper.com/api/v2/account/info/

Field Type Required Description
token string req API auth token string provided by Checkeeper.
signature string req SHA256 hash of the request with your secret key on the end.

Example JSON post

POST- https://my.checkeeper.com/api/v2/account/info/

{
    "token": "ilojdH7hskwiHgqpomanhhakHQka872i",
    "signature": "153f7b6a050f6c517bf908b8d159c6d889a0938b6264e4cdb96280d1ce5ba5df"
}
  	

Response

{
    "success": 1,
    "message": "Partner Found",
    "account": {
        "token": "ilojdH7hskwiHgqpomanhhakHQka872i",
        "company": "Checkeeper",
        "name": "Justin & Jeff",
        "email": "support@checkeeper.com",
        "credits": "107.60",
        "logo_small": "blank.gif",
        "logo_large": "blank.gif",
        "pdf_cost": "0.55"
    }
}
  	

 

Building the Signature

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.

Signature Creation Examples

PHP
        
$json_string = '{"token":"ilojdH7hskwiHgqpomanhhakHQka872i","routing_number":"011100915","country":"US"}';

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

//sort the array based on the keys
ksort($request_array);

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

//create the hmac hash of the newly-sorted query string
$raw_signature = hash_hmac('sha256', $query_string, [YOUR SECRET KEY], TRUE);

//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);
        
        
Perl
        
sub flatten {
  my ($args, $prefix) = @_;

  my $vars = [];

  foreach (keys %{$args} ) {
    next unless defined $args->{$_};

    if ( ref($args->{$_}) && ! JSON::is_bool($args->{$_})) {
      if ( $prefix ) {
  my $this_prefix = $prefix . '[' . $_ . ']';
  push @{$vars}, @{flatten( $args->{$_}, $this_prefix)};
      }
      else {
  push @{$vars}, @{flatten( $args->{$_}, $_)};
      }
    }
    else {
      
      my $val = $args->{$_};

      if ( JSON::is_bool($args->{$_}) ) {
  $val = ( $val eq 'true' ) ? 1 : 0;
      }

      $val = uri_escape($val);
      $val =~s/%20/+/g;

      if ( $prefix ) {
  push @{$vars}, sprintf("%s%%5B%s%%5D=%s", uri_escape($prefix), $_, $val );
      }
      else {
  push @{$vars}, sprintf("%s=%s", $_, $val );
      }
    }
  }

  my @sorted = sort @{$vars};

  return \@sorted;
}


sub sign_request {
  my ($self, $args) = @_;
  
  my @vars = @{flatten( $args )};

  my $str = join('&', @vars);

  my $signature = hmac_sha256_base64( $str, $self->config->{secret_key} );

  # pad to multiple of 4
  while (length($signature) % 4) {
    $signature .= '=';
  }

  $args->{signature} = $signature;

  return $args;
}