LogoSignature Detection API

Signature detection for lending packets

Loan files are a stack of pages, and only some of those pages must be signed. Run detection on the pages you require, and hold the file when one of them comes back with no mark.

Open the playground

A new account starts with 10 detection credits. The playground asks you to sign in, then calls the same API.

A checklist, not a model of the loan

Underwriting already knows which exhibits need a signature: the note, the application, a rider. Encode that as data on your side (signatureRequired on a page). Ask the detector only whether a mark is present. Amazon Textract's Analyze Lending API is a different product. It classifies mortgage packages and is priced on the Textract pricing page (the examples there use $0.07 per supported page). This API does not classify documents. The price comparison for signature-only calls is on the Textract alternative page.

Per-page images

This sample matches the image API that is live today. pages is your own list. The endpoint does not take an array of URLs. One request, one image.

Node.js
async function missingSignaturePages(pages, apiKey) {
  const missing = [];

  for (const page of pages) {
    const response = await fetch("https://signature-detector.com/api/detect", {
      method: "POST",
      headers: {
        "Content-Type": "application/json",
        "x-api-key": apiKey,
      },
      body: JSON.stringify({ imageUrl: page.imageUrl }),
    });
    const data = await response.json();
    if (!response.ok) {
      throw new Error(data.error || `Page ${page.number} failed (${response.status})`);
    }
    if (page.signatureRequired && data.result.count === 0) {
      missing.push(page.number);
    }
  }

  return missing;
}

Parallelize with Promise.all if you need to. The route does not apply its own rate limit. A 402 means the account is out of credits. Stop the batch there instead of failing one page at a time with the same error. Refunds happen when the detector fails, not when you simply run out of credits.

One PDF, pages in the JSON

With PDF input, you do not loop requests. Send pdfUrl or pdfBase64 and read the top-level pages array. Page numbers in that array are 1-based. creditsUsed is the page count, or 0 when the same file is cached. Compare page numbers to your required-page list. Empty detections on a required page is the same hold as count === 0 in the sample above. The field contract is on PDF signature detection, and a Python version is in Detect signatures in PDFs with Python.

Hand the box to a processor

A count is a coarse filter. The processor still needs to see the mark on the right line. Pass bbox through, or crop it with the method in extracting signature crops. Do not infer the borrower's identity from the box position.

Credits

FAQ

Can the API tell a note from a disclosure?

No. You decide which page numbers require a signature. The API returns marks on the image or PDF page you send. It does not classify the document type.

How should a multi-page PDF be sent?

Prefer pdfUrl or pdfBase64. pages, count, and creditsUsed are top-level fields. You can still render each required page to an image and send imageUrl or imageBase64, one request per page. An uncached image spends 1 credit. A PDF spends 1 credit per page.

Does this satisfy a lending regulation?

No. Finding a visual mark is not a compliance opinion, a TRID check, or confirmation that the borrower signed the right line. It is a filter so underwriters do not open a packet that is blank where a signature was required.

What does a 12-page packet cost?

A 12-page PDF that is not cached costs 12 credits, one per page, including pages with no mark. At $0.0001 per credit that is $0.0012. Sending 12 page images is the same 12 credits. If the balance is below 12, the PDF call returns HTTP 402 and nothing is charged. The same PDF bytes sent again return creditsUsed 0.

Do unused credits roll off at month end?

No. Credits do not expire. A new account starts with 10 credits. The minimum purchase is $1 for 10,000 credits. There is no monthly plan.

Related reading

Try it on your own file

Upload an image in the playground, or create an API key from the dashboard after signup. Read the API docs for the request fields.

Open the playground