Paddle Ocr API Documentation
Playground
Try it on WaveSpeedAI!PaddleOCR-VL is an ultra-compact 0.9B parameter vision-language model for document parsing, supporting 109 languages with text, table, formula, and chart recognition in JSON or Markdown output. Ready-to-use REST inference API, best performance, no cold starts, affordable pricing.
Features
Extract text from images with WaveSpeedAI PaddleOCR — a fast, accurate optical character recognition model. Simply upload an image and get clean, structured text output in JSON or Markdown format. Perfect for document digitization, data extraction, and text recognition tasks.
Why It Works Great
- High accuracy: Powered by PaddleOCR for reliable text recognition.
- Multi-language support: Recognizes text in multiple languages.
- Flexible output: Choose between JSON or Markdown format.
- Document-friendly: Handles scanned documents, screenshots, and photos.
- Ultra-affordable: Just $0.005 per image.
- Fast processing: Quick turnaround for high-volume workflows.
Parameters
| Parameter | Required | Description |
|---|---|---|
| image | Yes | Image containing text (upload or public URL). |
| output_format | No | Output format: json or markdown. Default: markdown. |
How to Use
- Upload your image — drag and drop or paste a public URL.
- Choose output format — select JSON for structured data or Markdown for readable text.
- Run — click the button to process.
- Copy or download — use the extracted text as needed.
Pricing
$0.005 per image.
Output Formats
| Format | Description | Best For |
|---|---|---|
| markdown | Clean, readable text with formatting | Documents, articles, readable output |
| json | Structured data with position info | Data processing, integration, automation |
Best Use Cases
- Document Digitization — Convert scanned documents to editable text.
- Data Extraction — Pull text from invoices, receipts, and forms.
- Screenshot Text — Extract text from screenshots and images.
- Business Cards — Digitize contact information quickly.
- Batch Processing — Process large volumes of documents affordably.
- Content Migration — Convert image-based content to text format.
Supported Content Types
- Scanned documents (PDF pages, printed text)
- Screenshots and screen captures
- Photos of documents and signs
- Handwritten text (with varying accuracy)
- Multi-column layouts
- Tables and structured content
Pro Tips for Best Results
- Use high-resolution images for better accuracy.
- Ensure good contrast between text and background.
- Straighten skewed documents before processing.
- Use JSON format when you need text positions or bounding boxes.
- Use Markdown format for clean, human-readable output.
- At $0.005 per image, batch processing is extremely cost-effective.
Notes
- If using a URL, ensure it is publicly accessible.
- Processing time is typically under a second per image.
- Accuracy depends on image quality and text clarity.
- Supports multiple languages and character sets.
Authentication
For authentication details, please refer to the Authentication Guide.
API Endpoints
Submit Task & Query Result
set -euo pipefail
export WAVESPEED_API_KEY="your-api-key"
REQUEST_BODY=$(cat <<'JSON'
{
"image": "https://interactive-examples.mdn.mozilla.net/media/cc0-images/painted-hand-298-332.jpg",
"output_format": "markdown"
}
JSON
)
# 1. Submit the prediction.
SUBMIT_RESPONSE=$(curl --silent --show-error --fail-with-body \
-X POST "https://api.wavespeed.ai/api/v3/wavespeed-ai/paddle-ocr" \
-H "Authorization: Bearer ${WAVESPEED_API_KEY}" \
-H "Content-Type: application/json" \
-d "${REQUEST_BODY}")
TASK=$(printf '%s' "${SUBMIT_RESPONSE}" | jq 'if type == "object" and has("data") then .data else . end')
PREDICTION_ID=$(printf '%s' "${TASK}" | jq -r '.id // empty')
if [ -z "${PREDICTION_ID}" ]; then
printf 'Submission response did not contain a prediction id
' >&2
exit 1
fi
RESULT_URL=$(printf '%s' "${TASK}" | jq -r '.urls.get // empty')
if [ -z "${RESULT_URL}" ]; then RESULT_URL="https://api.wavespeed.ai/api/v3/predictions/${PREDICTION_ID}/result"; fi
# 2. Poll until the prediction finishes.
while true; do
RESPONSE=$(curl --silent --show-error --fail-with-body \
"${RESULT_URL}" \
-H "Authorization: Bearer ${WAVESPEED_API_KEY}")
RESULT=$(printf '%s' "${RESPONSE}" | jq 'if type == "object" and has("data") then .data else . end')
STATUS=$(printf '%s' "${RESULT}" | jq -r '.status // empty')
case "${STATUS}" in
completed) printf '%s\n' "${RESULT}" | jq '.outputs'; break ;;
failed|cancelled|timeout) printf '%s\n' "${RESULT}" | jq . >&2; exit 1 ;;
created|processing) sleep 2 ;;
*) printf 'Unexpected status: %s
' "${STATUS}" >&2; exit 1 ;;
esac
doneParameters
Task Submission Parameters
Request Parameters
| Parameter | Type | Required | Default | Range | Description |
|---|---|---|---|---|---|
| image | string | Yes | - | Document image to parse. Supports text, tables, formulas, and charts recognition in 109 languages. | |
| output_format | string | No | markdown | json, markdown | Output format: 'json' for structured data or 'markdown' for human-readable text. |
| enable_sync_mode | boolean | No | false | - | If set to `true`, the request attempts to wait for the generated result and return outputs in the same response. If the result is not ready within the sync wait window, the API can return a timeout body while the task continues processing. This option is only available via the API and is supported only by some models. |
Response Parameters
| Parameter | Type | Description |
|---|---|---|
| code | integer | HTTP status code (e.g., 200 for success) |
| message | string | Status message (e.g., “success”) |
| data.id | string | Unique identifier for the prediction, Task Id |
| data.model | string | Model ID used for the prediction |
| data.outputs | array | Output values, usually URL strings; some models return text strings or structured result objects (empty when status is not completed) |
| data.urls | object | Object containing related API endpoints |
| data.urls.get | string | URL to retrieve the prediction result |
| data.status | string | Status of the task: created, processing, completed, or failed |
| data.created_at | string | ISO timestamp of when the request was created (e.g., “2023-04-01T12:34:56.789Z”) |
| data.error | string | Error message (empty if no error occurred) |
| data.timings | object | Object containing timing details |
| data.timings.inference | integer | Inference time in milliseconds |
Result Request Parameters
| Parameter | Type | Required | Default | Description |
|---|---|---|---|---|
| id | string | Yes | - | Task ID |
Result Response Parameters
| Parameter | Type | Description |
|---|---|---|
| code | integer | HTTP status code (e.g., 200 for success) |
| message | string | Status message (e.g., “success”) |
| data | object | The prediction data object containing all details |
| data.id | string | Unique identifier for the prediction |
| data.model | string | Model ID used for the prediction |
| data.outputs | array<string | object> | Array of generated outputs (empty when status is not completed). Items are usually URL strings, but may be text strings or structured result objects, depending on the model. |
| data.urls | object | Object containing related API endpoints |
| data.urls.get | string | URL to poll for the prediction result |
| data.status | string | Status: created, processing, completed, or failed |
| data.created_at | string | ISO timestamp of when the request was created |
| data.error | string | Error message (empty if no error occurred) |
| data.timings | object | Object containing timing details |
| data.timings.inference | integer | Inference time in milliseconds |