المستندات
أرسل صفحة، واحصل على نصها.
تعمل واجهة برمجة التطبيقات (API) في Kindi Labs بالنماذج نفسها المتاحة في تجربة النماذج. أرسل صورة، وانتظر المهمة، واقرأ النتيجة.
Base URLhttps://api.asnb.sa/v1
البدء
- 1
- 2
- 3
أرسل صفحة
أرسل صورة إلى /v1/jobs، ثم اقرأ المهمة حتى تكتمل.
المصادقة
أرسل مفتاحك في ترويسة Authorization مع كل طلب. احفظ المفاتيح على خادمك، ولا تضعها في صفحة ويب أو تطبيق للأجهزة الجوّالة. يمكنك إبطال أي مفتاح في أي وقت من حسابك.
Authorization: Bearer asnb_live_…إرسال صفحة
أرسل الصورة بصيغة multipart مع اسم النموذج. تردّ الواجهة فورًا بمهمة في قائمة الانتظار.
POST/v1/jobs
| الحقل | المعنى |
|---|---|
model | asnb-ocr للنص العربي المطبوع، وasnb-htr للكتابة اليدوية. |
file | صورة الصفحة: PNG أو JPEG أو WebP. |
curl https://api.asnb.sa/v1/jobs \
-H "Authorization: Bearer $KINDI_API_KEY" \
-F model=asnb-ocr \
-F [email protected]import os, time, requests
API = "https://api.asnb.sa/v1"
HEADERS = {"Authorization": f"Bearer {os.environ['KINDI_API_KEY']}"}
# 1. Send the page
with open("page.jpg", "rb") as f:
job = requests.post(f"{API}/jobs", headers=HEADERS,
data={"model": "asnb-ocr"},
files={"file": ("page.jpg", f, "image/jpeg")}).json()["job"]
# 2. Wait for the result
while job["status"] in ("queued", "running"):
time.sleep(1.5)
job = requests.get(f"{API}/jobs/{job['id']}", headers=HEADERS).json()["job"]
if job["status"] == "succeeded":
print(job["result"]["text"])
else:
print("failed:", job["error"])import fs from "node:fs";
const API = "https://api.asnb.sa/v1";
const headers = { Authorization: `Bearer ${process.env.KINDI_API_KEY}` };
// 1. Send the page
const form = new FormData();
form.append("model", "asnb-ocr");
form.append("file", new Blob([await fs.promises.readFile("page.jpg")], { type: "image/jpeg" }), "page.jpg");
let { job } = await (await fetch(`${API}/jobs`, { method: "POST", headers, body: form })).json();
// 2. Wait for the result
while (job.status === "queued" || job.status === "running") {
await new Promise((r) => setTimeout(r, 1500));
({ job } = await (await fetch(`${API}/jobs/${job.id}`, { headers })).json());
}
console.log(job.status === "succeeded" ? job.result.text : job.error);قراءة النتيجة
اقرأ المهمة حتى تصبح حالتها succeeded أو failed. يكفي الانتظار ثانية أو ثانيتين بين كل قراءة.
GET/v1/jobs/{id}
curl https://api.asnb.sa/v1/jobs/job_8f2k1x9q3m7d \
-H "Authorization: Bearer $KINDI_API_KEY"مثال على الاستجابة لإحدى الصفحات التجريبية (صفحة مجلة من عام 1899)، مختصرًا. قيم درجة الثقة للتوضيح.
{
"job": {
"id": "job_8f2k1x9q3m7d",
"model": "asnb-ocr",
"model_version": "v1.0",
"status": "succeeded",
"created_at": "2026-10-09T09:41:12Z",
"finished_at": "2026-10-09T09:41:15Z",
"file": {
"name": "muqtataf-1899.jpg",
"type": "image/jpeg",
"size": 204803
},
"error": null,
"result": {
"text": "فقلنا وهل تدّعي ان الآلة التي تشير اليها ترفع الماء من نفسها من غير قوة تساعدها على رفعه.\nفقال كلاً بل اننا نضع ماءً في جانب منها فتدور به وتغرف الماء من النيل وترفعه. فقلنا ومن اين\n…",
"pages": [
{
"index": 0,
"width": 940,
"height": 772,
"lines": [
{
"text": "فقلنا وهل تدّعي ان الآلة التي تشير اليها ترفع الماء من نفسها من غير قوة تساعدها على رفعه.",
"bbox": [8, 106, 920, 43],
"confidence": 0.98
},
{
"text": "فقال كلاً بل اننا نضع ماءً في جانب منها فتدور به وتغرف الماء من النيل وترفعه. فقلنا ومن اين",
"bbox": [8, 155, 920, 44],
"confidence": 0.96
}
]
}
]
}
}
}كائن المهمة
| الحقل | المعنى |
|---|---|
id | معرّف المهمة. |
model, model_version | النموذج الذي قرأ الصفحة، وإصداره. |
status | queued أو running أو succeeded أو failed. |
created_at, finished_at | وقت إنشاء المهمة واكتمالها (ISO 8601، بتوقيت UTC). |
file | اسم الملف المرفوع ونوعه وحجمه. |
error | عند فشل المهمة: رمز ورسالة. |
result.text | النص كاملًا، سطرًا بسطر، وبين كل صفحتين سطر فارغ. |
result.pages[].lines[] | نص كل سطر، ومربعه [x, y, width, height] بوحدات بكسل الصورة، ودرجة ثقة من 0 إلى 1. |
الأخطاء
تعود الأخطاء مع رمز حالة HTTP وجسم JSON. اعتمد على قيمة code، لا على الرسالة، في منطق برنامجك.
{ "error": { "code": "file_too_large", "message": "The file is over 10 MB." } }| HTTP | code | المعنى |
|---|---|---|
| 401 | unauthorized | المفتاح مفقود أو خاطئ أو مُبطَل. |
| 400 | invalid_request | حقل مفقود أو نموذج غير معروف. |
| 413 | file_too_large | الملف أكبر من الحد المسموح. |
| 415 | unsupported_type | الملف ليس PNG أو JPEG أو WebP. |
| 403 | quota_exceeded | استُهلكت صفحات هذا الشهر. |
| 404 | not_found | لا توجد مهمة بهذا المعرّف في حسابك. |
| 429 | rate_limited | طلبات كثيرة. انتظر عدد الثواني في Retry-After. |
| 500 | server_error | حدث خطأ من جهتنا. حاول مرة أخرى. |
الحدود
صور حتى 10 ميغابايت، بصيغة PNG أو JPEG أو WebP. تُحتسب كل صورة صفحةً واحدة. تظهر صفحاتك الشهرية وما استخدمته منها في حسابك.
النماذج
model | الاسم | الاستخدام |
|---|---|---|
asnb-ocr | Kindi OCR v1.0 | النص العربي المطبوع: الصحف والكتب والمستندات. |
asnb-htr | Kindi HTR v0.12 | الكتابة اليدوية العربية بخمسة خطوط. قيد التطوير. |