curl --request PATCH \
--url https://api-sandbox.ledgersyncappv2.com/v3/accounts/{account_id}/checks/{check_id} \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"ocr": {
"pay_to": "Parkway Business Solutions",
"amount": 424.87,
"check_date": "2026-07-14"
}
}
'import requests
url = "https://api-sandbox.ledgersyncappv2.com/v3/accounts/{account_id}/checks/{check_id}"
payload = { "ocr": {
"pay_to": "Parkway Business Solutions",
"amount": 424.87,
"check_date": "2026-07-14"
} }
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.patch(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'PATCH',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({
ocr: {pay_to: 'Parkway Business Solutions', amount: 424.87, check_date: '2026-07-14'}
})
};
fetch('https://api-sandbox.ledgersyncappv2.com/v3/accounts/{account_id}/checks/{check_id}', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://api-sandbox.ledgersyncappv2.com/v3/accounts/{account_id}/checks/{check_id}",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "PATCH",
CURLOPT_POSTFIELDS => json_encode([
'ocr' => [
'pay_to' => 'Parkway Business Solutions',
'amount' => 424.87,
'check_date' => '2026-07-14'
]
]),
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>",
"Content-Type: application/json"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://api-sandbox.ledgersyncappv2.com/v3/accounts/{account_id}/checks/{check_id}"
payload := strings.NewReader("{\n \"ocr\": {\n \"pay_to\": \"Parkway Business Solutions\",\n \"amount\": 424.87,\n \"check_date\": \"2026-07-14\"\n }\n}")
req, _ := http.NewRequest("PATCH", url, payload)
req.Header.Add("Authorization", "Bearer <token>")
req.Header.Add("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.patch("https://api-sandbox.ledgersyncappv2.com/v3/accounts/{account_id}/checks/{check_id}")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"ocr\": {\n \"pay_to\": \"Parkway Business Solutions\",\n \"amount\": 424.87,\n \"check_date\": \"2026-07-14\"\n }\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api-sandbox.ledgersyncappv2.com/v3/accounts/{account_id}/checks/{check_id}")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Patch.new(url)
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"ocr\": {\n \"pay_to\": \"Parkway Business Solutions\",\n \"amount\": 424.87,\n \"check_date\": \"2026-07-14\"\n }\n}"
response = http.request(request)
puts response.read_body{
"id": "chk_FDE_742778",
"account_id": "acc_FDE_77",
"source": "FINICITY",
"download_url": "<string>",
"check_number": "1234",
"amount": 123,
"pay_to": "<string>",
"description": "<string>",
"transaction_date": "2023-12-25",
"ocr": {
"pay_to": "<string>",
"amount": 123,
"check_number": "<string>",
"bank_name": "<string>",
"check_date": "2023-12-25",
"memo": "<string>"
}
}{
"error": {
"code": "unknown_api_key",
"message": "The API key you presented doesn't match any active key.",
"type": "auth_error",
"doc_url": "https://portal.ledgersyncappv2.com/errors/unknown_api_key",
"category": "AUTH_ERROR",
"is_user_actionable": true,
"source_diagnostic_code": "FIN-103",
"param": "client.email",
"trace_id": "4bf92f3577b34da6a3ce929d0e0e4736",
"errors": [
{
"param": "client.email",
"message": "must be a valid email address",
"code": "invalid_email"
}
]
}
}{
"error": {
"code": "unknown_api_key",
"message": "The API key you presented doesn't match any active key.",
"type": "auth_error",
"doc_url": "https://portal.ledgersyncappv2.com/errors/unknown_api_key",
"category": "AUTH_ERROR",
"is_user_actionable": true,
"source_diagnostic_code": "FIN-103",
"param": "client.email",
"trace_id": "4bf92f3577b34da6a3ce929d0e0e4736",
"errors": [
{
"param": "client.email",
"message": "must be a valid email address",
"code": "invalid_email"
}
]
}
}{
"error": {
"code": "unknown_api_key",
"message": "The API key you presented doesn't match any active key.",
"type": "auth_error",
"doc_url": "https://portal.ledgersyncappv2.com/errors/unknown_api_key",
"category": "AUTH_ERROR",
"is_user_actionable": true,
"source_diagnostic_code": "FIN-103",
"param": "client.email",
"trace_id": "4bf92f3577b34da6a3ce929d0e0e4736",
"errors": [
{
"param": "client.email",
"message": "must be a valid email address",
"code": "invalid_email"
}
]
}
}{
"error": {
"code": "unknown_api_key",
"message": "The API key you presented doesn't match any active key.",
"type": "auth_error",
"doc_url": "https://portal.ledgersyncappv2.com/errors/unknown_api_key",
"category": "AUTH_ERROR",
"is_user_actionable": true,
"source_diagnostic_code": "FIN-103",
"param": "client.email",
"trace_id": "4bf92f3577b34da6a3ce929d0e0e4736",
"errors": [
{
"param": "client.email",
"message": "must be a valid email address",
"code": "invalid_email"
}
]
}
}Correct a check's OCR readings
Corrects what LedgerSync read off the check image: the values in
the check’s ocr object. Use it when a reading is wrong, the same
way a firm fixes a check in the LedgerSync app.
Send only the values you want to change, inside ocr. Omitted
values stay as they are. null clears a value, and so does an
empty string for the text fields and check_date. The
bank-reported fields (check_number, amount, pay_to and the
rest of the top level) are read-only; sending one is a 400.
The correction is saved in LedgerSync, where the firm sees it, and
the check is matched again to its bank transaction when it has
both an OCR amount and an OCR check date. Later refreshes from the
bank feed keep the correction: once any reading of a check is
corrected, all six of its ocr readings stay as they are.
Requires the write:checks scope.
curl --request PATCH \
--url https://api-sandbox.ledgersyncappv2.com/v3/accounts/{account_id}/checks/{check_id} \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"ocr": {
"pay_to": "Parkway Business Solutions",
"amount": 424.87,
"check_date": "2026-07-14"
}
}
'import requests
url = "https://api-sandbox.ledgersyncappv2.com/v3/accounts/{account_id}/checks/{check_id}"
payload = { "ocr": {
"pay_to": "Parkway Business Solutions",
"amount": 424.87,
"check_date": "2026-07-14"
} }
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.patch(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'PATCH',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({
ocr: {pay_to: 'Parkway Business Solutions', amount: 424.87, check_date: '2026-07-14'}
})
};
fetch('https://api-sandbox.ledgersyncappv2.com/v3/accounts/{account_id}/checks/{check_id}', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://api-sandbox.ledgersyncappv2.com/v3/accounts/{account_id}/checks/{check_id}",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "PATCH",
CURLOPT_POSTFIELDS => json_encode([
'ocr' => [
'pay_to' => 'Parkway Business Solutions',
'amount' => 424.87,
'check_date' => '2026-07-14'
]
]),
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>",
"Content-Type: application/json"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://api-sandbox.ledgersyncappv2.com/v3/accounts/{account_id}/checks/{check_id}"
payload := strings.NewReader("{\n \"ocr\": {\n \"pay_to\": \"Parkway Business Solutions\",\n \"amount\": 424.87,\n \"check_date\": \"2026-07-14\"\n }\n}")
req, _ := http.NewRequest("PATCH", url, payload)
req.Header.Add("Authorization", "Bearer <token>")
req.Header.Add("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.patch("https://api-sandbox.ledgersyncappv2.com/v3/accounts/{account_id}/checks/{check_id}")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"ocr\": {\n \"pay_to\": \"Parkway Business Solutions\",\n \"amount\": 424.87,\n \"check_date\": \"2026-07-14\"\n }\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api-sandbox.ledgersyncappv2.com/v3/accounts/{account_id}/checks/{check_id}")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Patch.new(url)
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"ocr\": {\n \"pay_to\": \"Parkway Business Solutions\",\n \"amount\": 424.87,\n \"check_date\": \"2026-07-14\"\n }\n}"
response = http.request(request)
puts response.read_body{
"id": "chk_FDE_742778",
"account_id": "acc_FDE_77",
"source": "FINICITY",
"download_url": "<string>",
"check_number": "1234",
"amount": 123,
"pay_to": "<string>",
"description": "<string>",
"transaction_date": "2023-12-25",
"ocr": {
"pay_to": "<string>",
"amount": 123,
"check_number": "<string>",
"bank_name": "<string>",
"check_date": "2023-12-25",
"memo": "<string>"
}
}{
"error": {
"code": "unknown_api_key",
"message": "The API key you presented doesn't match any active key.",
"type": "auth_error",
"doc_url": "https://portal.ledgersyncappv2.com/errors/unknown_api_key",
"category": "AUTH_ERROR",
"is_user_actionable": true,
"source_diagnostic_code": "FIN-103",
"param": "client.email",
"trace_id": "4bf92f3577b34da6a3ce929d0e0e4736",
"errors": [
{
"param": "client.email",
"message": "must be a valid email address",
"code": "invalid_email"
}
]
}
}{
"error": {
"code": "unknown_api_key",
"message": "The API key you presented doesn't match any active key.",
"type": "auth_error",
"doc_url": "https://portal.ledgersyncappv2.com/errors/unknown_api_key",
"category": "AUTH_ERROR",
"is_user_actionable": true,
"source_diagnostic_code": "FIN-103",
"param": "client.email",
"trace_id": "4bf92f3577b34da6a3ce929d0e0e4736",
"errors": [
{
"param": "client.email",
"message": "must be a valid email address",
"code": "invalid_email"
}
]
}
}{
"error": {
"code": "unknown_api_key",
"message": "The API key you presented doesn't match any active key.",
"type": "auth_error",
"doc_url": "https://portal.ledgersyncappv2.com/errors/unknown_api_key",
"category": "AUTH_ERROR",
"is_user_actionable": true,
"source_diagnostic_code": "FIN-103",
"param": "client.email",
"trace_id": "4bf92f3577b34da6a3ce929d0e0e4736",
"errors": [
{
"param": "client.email",
"message": "must be a valid email address",
"code": "invalid_email"
}
]
}
}{
"error": {
"code": "unknown_api_key",
"message": "The API key you presented doesn't match any active key.",
"type": "auth_error",
"doc_url": "https://portal.ledgersyncappv2.com/errors/unknown_api_key",
"category": "AUTH_ERROR",
"is_user_actionable": true,
"source_diagnostic_code": "FIN-103",
"param": "client.email",
"trace_id": "4bf92f3577b34da6a3ce929d0e0e4736",
"errors": [
{
"param": "client.email",
"message": "must be a valid email address",
"code": "invalid_email"
}
]
}
}Authorizations
Pass your secret key in the Authorization header as a Bearer
token: Authorization: Bearer sk_test_... (sandbox) or
Bearer sk_live_... (production).
Keys are created in the developer portal and the plaintext secret is shown exactly once at creation. Treat them like passwords — never embed them in mobile apps or front-end code.
Query Parameters
The Client (cli_…) to scope the read to. Required on account,
transaction, and statement reads — LedgerSync's backend data APIs
are scoped per end-user, so these resources are resolved within a
single Client. Check corrections are scoped the same way.
Body
A correction to a check's OCR readings. ocr is the only field accepted; any other field is rejected with a 400.
The readings to correct. Omitted fields keep their value and null clears one; for the text fields and check_date an empty string clears it too, and leading or trailing spaces are removed. Any other field is rejected with a 400.
Show child attributes
Show child attributes
Response
The corrected Check.
One paper check captured from an account, with its image. FDE-only — no other source delivers check images. LedgerSync captures the front of a check only, so a check is exactly one image and there is no side field.
"chk_FDE_742778"
The owning account id.
"acc_FDE_77"
Financial-data source backing an account. Aggregator sources
(FINICITY, MX) and FDE back a Connection; PDF does not.
Values:
FINICITY— Finicity aggregationMX— MX aggregationFDE— Financial Document Extraction (LedgerSync proprietary)PDF— Uploaded bank statements. Read-only: exposed on/accountsand/transactions(statements are not served for PDF), and never as a Connection (PDF accounts haveconnection_id: null).
FINICITY, MX, FDE, PDF Relative v3 URL to download the check image, auth-scoped to your API key. Resolves to GET /accounts/{account_id}/checks/{check_id}/download.
Check number as reported by the bank.
"1234"
Check amount as reported by the bank.
Payee as reported by the bank.
Free-text description carried on the check record.
Date of the bank transaction this check belongs to.
What OCR read off the image, or a person's correction of that reading, kept separate from the bank-reported fields above so you can always tell the two apart. Absent when nothing was recognised.
Show child attributes
Show child attributes
