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).

textmajburiymatn, 10 000 belgigacha
tomajburiynew (Özbekça) | cyr (Ўзбекча) | lat (O‘zbekcha)
fromautoauto | new | cyr | lat
apostrophecurlycurly (‘ ’) | modifier (ʻ ʼ) | ascii (' ')
quoteskeepkeep | «» | “” | „“ | ""
keepForeigntruexorijiy 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

400bad_json, bad_text, bad_to, bad_from, bad_apostrophe, bad_quotes
404not_found
405method_not_allowed
413too_long (> 10 000), too_large (> 128 KB)
415unsupported_media_type
429rate_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 belgilarplan, convert, message — 10 000; check — 6 000; detect — 50 000
bir soʻrovda boʻlaklar / xabarlar500 / 100
soʻrov hajmi256 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.