← All APIs

POST · JSON API

Image OCR API

Extract printed and handwritten text from a supplied image using OCR.

Start with the trial-only Agent quickstart

$0.017 USD / request

Covered: up to 2 calls if you use the entire initial $0.050 grant on this API. Shared credit, daily budget, and availability apply.

Run a trial without paying

Try eligible APIs with free service credit. Each verified EVM externally owned wallet receives $0.050 once, shared across APIs with no expiry. No deposit, payment, on-chain transaction, API key, or registration is required. Wallet sign-in (SIWX) is required; contract wallets are not supported. Credit is nontransferable. Execution requires sufficient credit, daily trial budget, and API availability.

Covered: up to 2 calls if you use the entire initial $0.050 grant on this API. Shared credit, daily budget, and availability apply.

Start here for a business result, not just a 402 response. The trial client handles wallet sign-in and never signs a payment or automatically retries.

Already have an Agent signer?

Install @x402/extensions and pass your existing EVM EOA signer to its official wrapFetchWithSIWx helper. No seller-specific download, private-key export, or new wallet is needed.

// npm install @x402/extensions
// existingSigner is your EVM EOA signer with address and signMessage({ message }).
// Use plain fetch, never a payment-wrapped fetch, for trial-only access.
import { wrapFetchWithSIWx } from "@x402/extensions/sign-in-with-x";

const trialFetch = wrapFetchWithSIWx(fetch, existingSigner);
const response = await trialFetch("https://manyfish-seller.redcliff-d7368db1.westus2.azurecontainerapps.io/api/v1/image/ocr", {
  method: "POST",
  headers: { "content-type": "application/json", accept: "application/json" },
  body: JSON.stringify({
  "imageBase64": "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",
  "contentType": "image/png",
  "locale": "en-US"
}),
  redirect: "error",
  signal: AbortSignal.timeout(30_000),
});
if (!response.ok) throw new Error(`Trial stopped: HTTP ${response.status}. Do not automatically retry or pay.`);
if (response.headers.get("x-access-mode") !== "trial" ||
    response.headers.get("x-trial-status") !== "charged" ||
    response.headers.get("x-trial-accounting-status") !== "confirmed" ||
    response.headers.has("payment-response") || response.headers.has("x-payment-response")) {
  throw new Error("Trial accounting is unconfirmed. Do not repeat this request or pay.");
}
console.log(await response.json());
// No payment signer, paid fallback, or application retry loop is installed.

Trial only: use plain fetch, not a payment-wrapped fetch. Adding a SIWX hook to a payment client can still fall through to payment; it is not a trial-only policy. Use the separate paid guide only after explicitly choosing to pay.

If the promise rejects, stop and inspect the error. Do not repeat uncertain business work or automatically switch to payment.

Run locally with an existing EOA key

Use Node.js 22+ in a new project directory. Supply TRIAL_PRIVATE_KEY securely in your local environment before running; never paste it into this site or into source code. Review downloaded code before executing it.

Download the complete trial.js example. Replace its documented example input with your own data where needed.

npm init -y
npm pkg set type=module
npm install @x402/extensions viem
curl --fail 'https://manyfish-seller.redcliff-d7368db1.westus2.azurecontainerapps.io/apis/ocr/trial.js' -o trial.js
node trial.js
// Node.js 22+ ES module. Use an existing EOA key locally; never send it to the seller.
// npm init -y && npm pkg set type=module && npm install @x402/extensions viem
import { privateKeyToAccount } from "viem/accounts";
const privateKey = process.env.TRIAL_PRIVATE_KEY;
if (!/^0x[0-9a-fA-F]{64}$/.test(privateKey ?? "")) throw new Error("Set an existing EOA's TRIAL_PRIVATE_KEY locally.");
const existingSigner = privateKeyToAccount(privateKey);
// npm install @x402/extensions
// existingSigner is your EVM EOA signer with address and signMessage({ message }).
// Use plain fetch, never a payment-wrapped fetch, for trial-only access.
import { wrapFetchWithSIWx } from "@x402/extensions/sign-in-with-x";

const trialFetch = wrapFetchWithSIWx(fetch, existingSigner);
const response = await trialFetch("https://manyfish-seller.redcliff-d7368db1.westus2.azurecontainerapps.io/api/v1/image/ocr", {
  method: "POST",
  headers: { "content-type": "application/json", accept: "application/json" },
  body: JSON.stringify({
  "imageBase64": "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",
  "contentType": "image/png",
  "locale": "en-US"
}),
  redirect: "error",
  signal: AbortSignal.timeout(30_000),
});
if (!response.ok) throw new Error(`Trial stopped: HTTP ${response.status}. Do not automatically retry or pay.`);
if (response.headers.get("x-access-mode") !== "trial" ||
    response.headers.get("x-trial-status") !== "charged" ||
    response.headers.get("x-trial-accounting-status") !== "confirmed" ||
    response.headers.has("payment-response") || response.headers.has("x-payment-response")) {
  throw new Error("Trial accounting is unconfirmed. Do not repeat this request or pay.");
}
console.log(await response.json());
// No payment signer, paid fallback, or application retry loop is installed.
Optional strict helper: quote, challenge, and accounting validation

The official SDK handles SIWX authentication. For additional advertised-grant, expected-price, network, timestamp and result checks, download the maintained trial-client.js and use fetchTrial. Neither approach automatically pays.

// Download from the trusted seller origin: curl --fail "https://manyfish-seller.redcliff-d7368db1.westus2.azurecontainerapps.io/assets/trial-client.js" -o trial-client.js
// existingSigner is your existing EVM EOA signer: address and signMessage({ message }).
// No deposit, payment signing, or private-key export is needed.
// Execution requires remaining credit, daily budget, and API availability.
import { fetchTrial } from "./trial-client.js";
const outcome = await fetchTrial({
    url: "https://manyfish-seller.redcliff-d7368db1.westus2.azurecontainerapps.io/api/v1/image/ocr",
    network: "eip155:8453", quotedAmountAtomic: "17000",
    body: {
  "imageBase64": "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",
  "contentType": "image/png",
  "locale": "en-US"
},
    signer: existingSigner,
  });
console.log(JSON.stringify(outcome.result, null, 2));
// A rejected promise stops this attempt. Do not automatically retry or pay.
Download the strict Node.js example
Manual authentication protocol

A valid request without payment headers can discover a SIWX challenge. Sign once and resend the identical URL, method, and body with SIGN-IN-WITH-X. Empty requests only discover the API. The canonical challenge is in the PAYMENT-REQUIRED header, not a cached directory entry.

Ready for continued use? Set up explicit paid API calls at the listed price. This quickstart never falls back to payment.

Inspect access requirements (returns 402)

POST /api/v1/image/ocr

Send the documented JSON body. Invalid input is rejected before payment or upstream execution. An empty request does not execute the API.

This curl example only inspects access requirements. It sends no payment or wallet proof and does not return a business result. HTTP 402 is expected. Use the trial-only quickstart above to request a result without paying. A paid call requires an explicit x402 payment using a compatible client.

Replace sample inputs with your data. Encoded file samples illustrate the JSON format and may not be complete usable files.

curl --request 'POST' 'https://manyfish-seller.redcliff-d7368db1.westus2.azurecontainerapps.io/api/v1/image/ocr' \
  --header 'Content-Type: application/json' \
  --data-raw '{
  "imageBase64": "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",
  "contentType": "image/png",
  "locale": "en-US"
}'

Illustrative response · Not live data

This is a synthetic contract example, not a live result. Actual results depend on the submitted input and upstream availability.

{
  "text": "HELLO",
  "textCharacters": 5,
  "lines": [
    {
      "text": "HELLO",
      "polygon": [
        70,
        40,
        180,
        40,
        180,
        75,
        70,
        75
      ]
    }
  ],
  "image": {
    "contentType": "image/png",
    "width": 200,
    "height": 120
  }
}

Schemas & documentation

These schemas come from the same API descriptor used for validation and discovery. Read the complete OpenAPI contract for responses, errors, and access requirements.

Request JSON Schema
{
  "type": "object",
  "additionalProperties": false,
  "required": [
    "imageBase64",
    "contentType"
  ],
  "properties": {
    "imageBase64": {
      "type": "string",
      "minLength": 8,
      "maxLength": 13981016,
      "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$"
    },
    "contentType": {
      "enum": [
        "image/jpeg",
        "image/png"
      ]
    },
    "locale": {
      "type": "string",
      "minLength": 2,
      "maxLength": 32,
      "pattern": "^[A-Za-z]{2,3}(?:-[A-Za-z0-9]{2,8})*$"
    }
  }
}
Response JSON Schema
{
  "type": "object",
  "additionalProperties": false,
  "required": [
    "text",
    "textCharacters",
    "lines",
    "image"
  ],
  "properties": {
    "text": {
      "type": "string"
    },
    "textCharacters": {
      "type": "integer",
      "minimum": 0
    },
    "lines": {
      "type": "array",
      "items": {
        "type": "object",
        "additionalProperties": false,
        "required": [
          "text",
          "polygon"
        ],
        "properties": {
          "text": {
            "type": "string"
          },
          "polygon": {
            "type": "array",
            "items": {
              "type": "number"
            },
            "minItems": 8
          }
        }
      }
    },
    "image": {
      "type": "object",
      "additionalProperties": false,
      "required": [
        "contentType",
        "width",
        "height"
      ],
      "properties": {
        "contentType": {
          "enum": [
            "image/jpeg",
            "image/png"
          ]
        },
        "width": {
          "type": "integer",
          "minimum": 1
        },
        "height": {
          "type": "integer",
          "minimum": 1
        }
      }
    }
  }
}
How your submitted data is used

Quality review is enabled: executed paid and trial request/response bodies, including uploaded documents and images, are retained in private storage for operator review. Deletion is scheduled after 30 days and runs asynchronously. Authentication and payment headers are not recorded. Do not submit secrets or unnecessary personal data.