Harfsoz API
Ishlayapti. Kalit va roʻyxatdan oʻtish shart emas. Bepul, cheklovlari pastda. Oʻgirish qoidalari va lugʻat faqat serverda: sahifa, Word qoʻshimcha dasturi, kengaytmalar va bot ham shu API orqali ishlaydi.
Manzil: https://harfsoz.uz/api/
Ochiq API
Har kim uchun: oʻz saytingiz, botingiz yoki dasturingizdan chaqiring. CORS ochiq (Access-Control-Allow-Origin: *).
POST /api/convert
Matnni oʻgiradi. Soʻrov va javob — JSON (Content-Type: application/json).
text | majburiy | matn, 10 000 belgigacha |
to | majburiy | new (Özbekça) | cyr (Ўзбекча) | lat (O‘zbekcha) |
from | auto | auto | new | cyr | lat |
apostrophe | curly | curly (‘ ’) | modifier (ʻ ʼ) | ascii (' ') |
quotes | keep | keep | «» | “” | „“ | "" |
keepForeign | true | xorijiy soʻzlar va brendlar lotinda qoladi |
Qoʻshtirnoqlar « » “ ” " ' oʻzgarmaydi (quotes berilmasa). Heshteg yonida oʻgirilgan nusxasi qavsda qoʻshiladi: #yangiliklar (#янгиликлар). Kirill matndagi rus tilidagi gaplar oʻzgarmaydi. auto — yozuv har bir qator va soʻz uchun aniqlanadi.
curl
curl -s https://harfsoz.uz/api/convert \
-H 'Content-Type: application/json' \
-d '{"text": "O‘zbekiston «Salom» dedi", "to": "cyr"}'
{"text":"Ўзбекистон «Салом» деди","from":"lat","to":"cyr","changed":3}
JavaScript
const r = await fetch("https://harfsoz.uz/api/convert", {
method: "POST",
headers: { "Content-Type": "application/json" },
body: JSON.stringify({ text: "Ўзбекистон “шаҳар”", to: "new" })
});
const { text } = await r.json(); // "Özbekiston “şahar”"
Python
import requests
r = requests.post("https://harfsoz.uz/api/convert", json={"text": "Shahar #yangiliklar", "to": "cyr"}, timeout=10)
r.raise_for_status()
print(r.json()["text"]) # Шаҳар #yangiliklar (#янгиликлар)
POST /api/detect
Matn qaysi yozuvda ekanini aniqlaydi: cyr, lat, new yoki null (harf yoʻq). Matn — 10 000 belgigacha.
curl -s https://harfsoz.uz/api/detect -H 'Content-Type: application/json' -d '{"text": "Салом дунё"}'
{"script":"cyr"}
GET /api/ · GET /api/health
Server ishlayaptimi va qaysi versiya: /api/ — qisqa tavsif va cheklovlar, /api/health — holat.
{"ok":true,"version":"2026.10.28.2340","api":["v1"]}
Xatolar va cheklovlar
400 | bad_json, bad_text, bad_to, bad_from, bad_apostrophe, bad_quotes |
404 | not_found |
405 | method_not_allowed |
413 | too_long (> 10 000), too_large (> 128 KB) |
415 | unsupported_media_type |
429 | rate_limited — bir IP manzildan 10 soniyada taxminan 10 tadan koʻp soʻrov (Retry-After sarlavhasida necha soniya kutish kerakligi) |
Javob: {"error": "...", "message": "..."} — error inglizcha kod, message oʻzbekcha izoh. Matnlar saqlanmaydi va jurnalga yozilmaydi (faqat hajmi va javob kodi). Katta hajm uchun soʻrovlarni ketma-ket yuboring yoki matnni boʻlaklarga boʻling; Telegram uchun — bot.
Harfsoz ilovalari uchun: /api/v1/*
Sayt, Word qoʻshimcha dasturi, brauzer kengaytmalari, Google Hujjatlar, WordPress, Adobe va Telegram bot shu manzillardan foydalanadi. Ular hujjatni formatlashi bilan birga oʻgirishi uchun kerak: javobda tayyor matn emas, aniq tuzatishlar keladi.
Sarlavha X-Harfsoz-Client: site | word | ext | wp | adobe | gdocs | kanal | bot (maxfiy emas, faqat cheklov va statistika uchun). Brauzerdan faqat Harfsoz sahifalari va kengaytmalari chaqira oladi (boshqa sayt — 403 origin_not_allowed); Originsiz soʻrovlar (server, Apps Script, bot) qabul qilinadi. Oʻrinlar (start, end, offset) — UTF-16 birliklarida (JavaScript satr indekslari).
POST /api/v1/plan | {segments: [{text, from?}], to, options?} → {to, results: [{edits, from}]} | Boʻlaklar roʻyxati uchun tuzatishlar: [start, end, yangi matn]. Har boʻlakka bitta natija, shu tartibda. Ilova faqat shu joylardagi harflarni almashtiradi — formatlash, havolalar va rasmlar oʻz joyida qoladi. |
POST /api/v1/convert | {text | texts, from?, to, options?} → {text | texts, from, to, changed} | Bitta matn (text) yoki roʻyxat (texts) — tayyor matn qaytadi. |
POST /api/v1/check | {segments: [{text, from?}], options?} → {results: [[{start, end, word, reason, suggestion}]]} | Imlo tekshiruvi: shubhali soʻzlar va tavsiya. |
POST /api/v1/detect | {text | texts} → {script | scripts} | Bitta matn yoki roʻyxat yozuvini aniqlaydi. |
POST /api/v1/message | {items: [{text, entities}], to, settings?} → {items: [{text, entities, changed, lang}]} | Telegram xabarlari (matn va entities): oʻgirilgandan keyin qalin, havola va boshqa bezaklar oʻz joyiga suriladi. |
options: apostrophe, quotes, keepForeign (yuqoridagidek), skipRussian (rus tilidagi gaplarga tegilmasin), hashtags: append | keep | convert, dict: {"pairs": [[lotin, кирилл]…], "skip": [soʻz…]} — jamoaviy lugʻat (har biri 2 000 tagacha).
curl -s https://harfsoz.uz/api/v1/plan \
-H 'Content-Type: application/json' -H 'X-Harfsoz-Client: word' \
-d '{"segments": [{"text": "Salom, dunyo!"}, {"text": "Toshkent"}], "to": "cyr"}'
{"to":"cyr","results":[{"edits":[[0,5,"Салом"],[7,12,"дунё"]],"from":"lat"},{"edits":[[0,8,"Тошкент"]],"from":"lat"}]}
/api/v1 cheklovlari
| bir soʻrovda jami belgilar | plan, convert, message — 10 000; check — 6 000; detect — 50 000 |
| bir soʻrovda boʻlaklar / xabarlar | 500 / 100 |
| soʻrov hajmi | 256 KB |
| soʻrovlar 10 soniyada (bir IP va ilova uchun) | site, word — 120; kanal, ext, wp, adobe, gdocs — 60; bot — 300; boshqalar — 30. Uzun matnni ilova oʻzi boʻlaklarga boʻlib yuboradi. |