Parse a document by URL
curl --request POST \
--url https://api.hanji.dev/v1/extract \
--header 'Content-Type: application/json' \
--header 'X-API-KEY: <api-key>' \
--data '
{
"url": "<string>",
"extract_text": true,
"extract_images": true,
"ocr": "auto",
"table_output_format": "markdown"
}
'import requests
url = "https://api.hanji.dev/v1/extract"
payload = {
"url": "<string>",
"extract_text": True,
"extract_images": True,
"ocr": "auto",
"table_output_format": "markdown"
}
headers = {
"X-API-KEY": "<api-key>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {'X-API-KEY': '<api-key>', 'Content-Type': 'application/json'},
body: JSON.stringify({
url: '<string>',
extract_text: true,
extract_images: true,
ocr: 'auto',
table_output_format: 'markdown'
})
};
fetch('https://api.hanji.dev/v1/extract', 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.hanji.dev/v1/extract",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => json_encode([
'url' => '<string>',
'extract_text' => true,
'extract_images' => true,
'ocr' => 'auto',
'table_output_format' => 'markdown'
]),
CURLOPT_HTTPHEADER => [
"Content-Type: application/json",
"X-API-KEY: <api-key>"
],
]);
$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.hanji.dev/v1/extract"
payload := strings.NewReader("{\n \"url\": \"<string>\",\n \"extract_text\": true,\n \"extract_images\": true,\n \"ocr\": \"auto\",\n \"table_output_format\": \"markdown\"\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("X-API-KEY", "<api-key>")
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.post("https://api.hanji.dev/v1/extract")
.header("X-API-KEY", "<api-key>")
.header("Content-Type", "application/json")
.body("{\n \"url\": \"<string>\",\n \"extract_text\": true,\n \"extract_images\": true,\n \"ocr\": \"auto\",\n \"table_output_format\": \"markdown\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.hanji.dev/v1/extract")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["X-API-KEY"] = '<api-key>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"url\": \"<string>\",\n \"extract_text\": true,\n \"extract_images\": true,\n \"ocr\": \"auto\",\n \"table_output_format\": \"markdown\"\n}"
response = http.request(request)
puts response.read_body{
"chunks": [
{
"page_no": 123,
"page_content": "",
"bbox": [
123
],
"chunk_type": "text",
"confidence": 123,
"image_url": "<string>",
"image_b64": "<string>",
"image_mime": "<string>",
"image_width": 123,
"image_height": 123,
"cells": [
{
"row": 123,
"col": 123,
"text": "",
"row_span": 1,
"col_span": 1,
"bbox": [
123
],
"confidence": 123,
"page_no": 123
}
],
"n_rows": 123,
"n_cols": 123,
"merged_from_pages": [
123
]
}
]
}{
"detail": [
{
"loc": [
"<string>"
],
"msg": "<string>",
"type": "<string>",
"input": "<unknown>",
"ctx": {}
}
]
}Parse (sync)
Parse a document by URL
Download the document at url, parse it, and return text, table, and image chunks in reading order. Every chunk carries its page number and bounding box. Billed per page.
POST
/
v1
/
extract
Parse a document by URL
curl --request POST \
--url https://api.hanji.dev/v1/extract \
--header 'Content-Type: application/json' \
--header 'X-API-KEY: <api-key>' \
--data '
{
"url": "<string>",
"extract_text": true,
"extract_images": true,
"ocr": "auto",
"table_output_format": "markdown"
}
'import requests
url = "https://api.hanji.dev/v1/extract"
payload = {
"url": "<string>",
"extract_text": True,
"extract_images": True,
"ocr": "auto",
"table_output_format": "markdown"
}
headers = {
"X-API-KEY": "<api-key>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {'X-API-KEY': '<api-key>', 'Content-Type': 'application/json'},
body: JSON.stringify({
url: '<string>',
extract_text: true,
extract_images: true,
ocr: 'auto',
table_output_format: 'markdown'
})
};
fetch('https://api.hanji.dev/v1/extract', 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.hanji.dev/v1/extract",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => json_encode([
'url' => '<string>',
'extract_text' => true,
'extract_images' => true,
'ocr' => 'auto',
'table_output_format' => 'markdown'
]),
CURLOPT_HTTPHEADER => [
"Content-Type: application/json",
"X-API-KEY: <api-key>"
],
]);
$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.hanji.dev/v1/extract"
payload := strings.NewReader("{\n \"url\": \"<string>\",\n \"extract_text\": true,\n \"extract_images\": true,\n \"ocr\": \"auto\",\n \"table_output_format\": \"markdown\"\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("X-API-KEY", "<api-key>")
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.post("https://api.hanji.dev/v1/extract")
.header("X-API-KEY", "<api-key>")
.header("Content-Type", "application/json")
.body("{\n \"url\": \"<string>\",\n \"extract_text\": true,\n \"extract_images\": true,\n \"ocr\": \"auto\",\n \"table_output_format\": \"markdown\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.hanji.dev/v1/extract")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["X-API-KEY"] = '<api-key>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"url\": \"<string>\",\n \"extract_text\": true,\n \"extract_images\": true,\n \"ocr\": \"auto\",\n \"table_output_format\": \"markdown\"\n}"
response = http.request(request)
puts response.read_body{
"chunks": [
{
"page_no": 123,
"page_content": "",
"bbox": [
123
],
"chunk_type": "text",
"confidence": 123,
"image_url": "<string>",
"image_b64": "<string>",
"image_mime": "<string>",
"image_width": 123,
"image_height": 123,
"cells": [
{
"row": 123,
"col": 123,
"text": "",
"row_span": 1,
"col_span": 1,
"bbox": [
123
],
"confidence": 123,
"page_no": 123
}
],
"n_rows": 123,
"n_cols": 123,
"merged_from_pages": [
123
]
}
]
}{
"detail": [
{
"loc": [
"<string>"
],
"msg": "<string>",
"type": "<string>",
"input": "<unknown>",
"ctx": {}
}
]
}Authorizations
Body
application/json
Input to a parse request.
Server-side limits (page count, file size) are not user-configurable.
Unknown fields are accepted and ignored for backward compatibility.
The ocr knob is deprecated and currently has no effect.
Deprecated. Accepted for backward compatibility but currently has no effect.
Available options:
auto, never, force How table chunks are structured. 'markdown' (default) keeps the existing markdown-derived cells; 'cell_grid' returns true per-cell bounding boxes on table chunks (cells become the primary representation; page_content remains a markdown render).
Available options:
markdown, cell_grid Response
Successful Response
Show child attributes
Show child attributes
⌘I