OROVA.VN — BIZ AI AGENT

/ Хөгжүүлэгчийн гарын авлага

API-аар нийтлэх дурын вэбсайт дээр.

WordPress ашигладаггүй сайт руу Orova бэлэн нийтлэлээ нийтлэх боломжтой болгохын тулд өөрийн endpoint хэрхэн бүтээх тухай.

Orova бэлэн нийтлэлийг WordPress руу шууд нийтэлдэг. Хэрэв Таны вэбсайт WordPress биш бол — өөрийн CMS, headless тохиргоо, статик сайт эсвэл өөрийн backend — жижиг API-аар нийтлэл хүлээн авснаар Orova-д автоматаар нийтлүүлэх боломжтой хэвээр. Та нэг HTTP endpoint бичнэ; Orova нийтлэл бүрийг дуусгах бүртээ түүнийг дуудна. Энэ гарын авлага хөгжүүлэгчид зориулагдсан бөгөөд хүсэлтийн гэрээг бүрэн тайлбарлана.

/ Тойм

Хэрхэн ажилладаг вэ

Orova түлхүүр үгэнд зориулсан нийтлэлээ бичиж дуусмагц Таны бүртгүүлсэн endpoint URL руу нэг HTTP POST хүсэлт илгээнэ. Хүсэлтийн body нь JSON бөгөөд бүх нийтлэлийг агуулна. Таны endpoint өөр талдаа пост үүсгэж, нийтлэлийн эцсийн, нийтэд нээлттэй URL-ыг хариу болгон буцаана. Orova тэр URL-ыг WordPress пост шиг нийтлэгдсэн холбоос болгон хадгална. WordPress биш сайт дээр гар оролцоогүй нийтлэхийг хүсвэл, эсвэл постыг хэрхэн хадгалахыг бүрэн хянахыг хүсвэл үүнийг ашиглаарай.

/ Тохиргоо

Тохируулах — зургаан алхам

  • 1

    Төсөл дээрээ “API-аар холбох”-ыг асаах. Төслөө нээгээрэй (Төслүүд → Таны төсөл → Холболтууд). WordPress картын хажууд API-аар холбох карт бий. Тэнд endpoint-ийнхоо URL-ыг оруулаарай. Нууц түлхүүрийн талбар заавал биш: хоосон орхивол Orova үүсгэнэ, эсвэл сайтынхаа ашигладаг түлхүүрийг буулгаарай. Хадгалсны дараа түлхүүр Хуулах товчтой хамт карт дээр харагдана. Нэг төсөл зөвхөн нэг газар руу нийтэлнэ — API-аар холбоход WordPress товч түгжигдэнэ, мөн эсрэгээрээ.

  • 2

    POST хүлээн авах endpoint бүтээх. Өөрийн сайт эсвэл сервер дээрээ JSON body-той HTTP POST сонсох route үүсгээрэй. Энэ бол төслийн Холболтууд дэлгэцэнд буцааж буулгах URL юм. Orova нийтлэл бүрийг дуусгах бүрд нэг удаа дуудна.

  • 3

    Хүсэлт бүр дээр Bearer token-ийг шалгах. Orova-гийн хүсэлт бүр “Bearer <secret>” хэлбэрийн Authorization header агуулах бөгөөд Таны төсөлд харагдаж буй нууц түлхүүрийг яг тэр чигээр нь ашиглана. Хадгалсан хуулбартайгаа харьцуулж, таарахгүй бүхнийг татгалзаарай — энэ нь бусад хүн Таны сайт руу нийтлэхээс сэргийлнэ.

  • 4

    Payload-оос нийтлэл үүсгэх. JSON body-г уншаад CMS эсвэл өгөгдлийн сандаа пост үүсгээрэй: нийтлэлд title, slug, content_html, meta description-д excerpt, нүүр зурагт featured_image_url, мета өгөгдөлд keyword / lang / published_at ашиглана.

  • 5

    Нийтлэлийн шууд URL-ыг буцаах. HTTP 200 эсвэл 201 болон { "url": "https://yoursite.com/the-new-article" } JSON body-оор хариулаарай. Orova тэр URL-ыг нийтлэлийн нийтлэгдсэн холбоос болгон хадгална. 2xx биш статус буцаах эсвэл url талбарыг орхивол Orova нийтлэлтийг амжилтгүй гэж үзнэ.

  • 6

    Сайжруулах хөдөлгүүрийн шинэчлэх хүсэлтийг боловсруулах. Body-д action = "update" ирвэл одоо байгаа постыг target_url (эсвэл slug)-аар олж, title, content_html, excerpt-ийг байранд нь дарж бичээрэй — URL-ыг өөрчлөхгүй. Ижил пост руу заасан { "url": ... }-ээр 200 хариулна. Үүнийг хараахан боловсруулдаггүй endpoint-ийн хувьд Orova сайжруулалтыг амжилтгүй гэж мэдээлэх бөгөөд шинэ нийтлэл нийтлэх нь өмнөх шигээ ажилласаар байна.

/ Гэрээ

Orova-гийн илгээх хүсэлт

Дууссан нийтлэл бүр дараах хэлбэрийн нэг хүсэлтээр ирнэ:

POST <your endpoint URL>

Headers:
  Content-Type: application/json
  Authorization: Bearer <secret>     # the secret key shown in Project -> Connections
  User-Agent: Orova-SEO

Body (JSON):
  {
    "title": "...",                  # article headline
    "slug": "...",                   # URL-friendly identifier
    "content_html": "...",           # full article HTML
    "excerpt": "...",                # meta description
    "featured_image_url": "..." | null,
    "keyword": "...",                # target keyword
    "lang": "en",                    # ISO language code
    "published_at": "2026-05-17T09:00:00.482913",  # ISO 8601, UTC, no offset suffix
    "status": "draft"                # optional: "draft" keeps it unpublished
  }
  # Optional fields are left out of the body when empty — never sent as null.

/ Лавлах

Payload талбарууд

Нийтлэх (шинэ нийтлэл) хүсэлтийн талбарууд. Устгах болон шинэчлэх хүсэлт ижил endpoint-ийг доорх тусдаа хэсгүүдэд харуулсан жижиг body-оор ашиглана.

ТалбарТөрөлТайлбар
titlestringНийтлэлийн гарчиг.
slugstringURL-friendly identifier suggested for the post.
content_htmlstringНийтлэхэд бэлэн HTML хэлбэрийн нийтлэлийн бүрэн бие.
excerptstringMeta description-д зориулсан богино хураангуй.
featured_image_urlstring | nullНүүр зургийн URL, байхгүй бол null.
keywordstringНийтлэлийг бичсэн зорилтот SEO түлхүүр үг.
langstringLanguage as an ISO code, e.g. "en" or "vi".
published_atstringOrova нийтлэлийг илгээсэн мөч, UTC-ийн ISO 8601, цагийн бүсийн дагавааргүй.
statusstring | undefinedЗаавал биш. "draft" нийтлэлийг нийтлэхгүй үлдээнэ; "publish" эсвэл огт утгагүй бол нийтэлнэ.
actionstring | undefinedШинэ нийтлэлд байхгүй. "delete" постыг устгахыг хүснэ; "update" (Сайжруулах хөдөлгүүрээс илгээнэ) одоо байгаа постыг байранд нь дарж бичихийг хүснэ.
target_urlstringЗөвхөн action = "update" үед: дарж бичих постын шууд URL. URL-ыг өөрчлөхгүй.
idnumber | undefinedOnly sent when Orova knows your post id (from `list` or `get`): match on it before `target_url`.

Илгээх зүйлгүй үед заавал биш талбаруудыг body-оос бүрмөсөн хасна — Orova хэзээ ч null илгээдэггүй тул болгоомжтой уншаарай. status мөн заавал биш: "draft" нийтлэлийг ноорог болгон үүсгэх бол "publish" эсвэл status огт байхгүй бол шууд нийтэлнэ.

/ Гэрээ

Таны буцаах ёстой хариу

Пост үүсгэсний дараа HTTP 200 эсвэл 201 статус болон дараах JSON body-оор хариулаарай:

HTTP 200 (or 201)
Content-Type: application/json

{
  "url": "https://yoursite.com/published-article"
}

Orova тэр url-ыг нийтлэлийн нийтлэгдсэн холбоос болгон хадгална. Таны endpoint 2xx биш статус, эсвэл url талбартай JSON объект биш body буцаавал Orova нийтлэлтийг амжилтгүй гэж үзэж, дахин оролдох боломжтой болгон нийтлэлийг тэмдэглэнэ. 60 секунд-ын дотор хариулаарай — үүнээс хойш Orova хүсэлтийг таслана (нийтлэх, шинэчлэх, устгахад адилхан хамаарна).

/ Жишээ

Кодын жишээ

Node.js болон Express дээрх хамгийн энгийн хүлээн авах endpoint. Ижил алхмууд — token шалгах, action (update / delete)-аар салаалах, пост үүсгэх эсвэл өөрчлөх, URL буцаах — дурын хэл, framework-д хамаарна.

// Node.js / Express — a minimal receiving endpoint
import express from "express";

const app = express();
app.use(express.json({ limit: "5mb" }));

// The secret Orova generated for this project.
const OROVA_SECRET = process.env.OROVA_SECRET;

app.post("/orova/publish", async (req, res) => {
  // 1. Verify the Bearer token.
  const auth = req.get("authorization") || "";
  if (auth !== "Bearer " + OROVA_SECRET) {
    return res.status(401).json({ error: "unauthorized" });
  }

  // 2. Required: list your articles (duplicate check, internal links). action = "list".
  if (req.body.action === "list") {
    const posts = await listPosts(req.body.limit || 500); // newest first, 500 max
    // each post: { id, title, slug, link, date, modified, status, author, excerpt? }
    return res.status(200).json({ ok: true, posts });
  }

  // 3. Required: read one article in full (used when optimizing it). action = "get".
  if (req.body.action === "get") {
    const post = await findPost(req.body.id, req.body.target_url, req.body.slug);
    if (!post) return res.status(404).json({ ok: false, err: "not_found" });
    return res.status(200).json({ ok: true, post });
  }

  // 4. Visual Editor: store an image, answer with its absolute URL.
  if (req.body.action === "upload_image") {
    const { filename, mime, data_base64 } = req.body;
    if (!String(mime || "").startsWith("image/")) {
      return res.status(422).json({ error: "image files only" });
    }
    const bytes = Buffer.from(data_base64, "base64");
    if (bytes.length > 15 * 1024 * 1024) {
      return res.status(413).json({ error: "image too large" });
    }
    return res.status(200).json({ ok: true, url: await saveImage(filename, bytes) });
  }

  // 5. Delete requests: body carries action = "delete".
  if (req.body.action === "delete") {
    const removed = await deletePostByUrl(req.body.url, req.body.slug);
    if (!removed) return res.status(404).json({ deleted: true }); // already gone
    return res.status(200).json({ deleted: true });
  }

  // 6. Update requests: action = "update". Optional fields may be absent.
  if (req.body.action === "update") {
    const updated = await updatePost(req.body.id, req.body.target_url, {
      title: req.body.title,
      html: req.body.content_html,
      metaDescription: req.body.excerpt,
      coverImage: req.body.featured_image_url,  // optional
      status: req.body.status,                  // optional: "publish" | "draft"
    });
    if (!updated) return res.status(404).json({ error: "post not found" });
    return res.status(200).json({ url: updated.url });
  }

  // 7. New article: read the payload Orova sent.
  const {
    title, slug, content_html, excerpt,
    featured_image_url, keyword, lang, published_at, status,
  } = req.body;

  // 8. Create the article in your own CMS or database.
  const post = await createPost({
    title,
    slug,
    html: content_html,
    metaDescription: excerpt,
    coverImage: featured_image_url,
    keyword,
    lang,
    publishedAt: published_at,
    draft: status === "draft",   // status is optional; absent means publish now
  });

  // 9. Return 200/201 with the live URL.
  return res.status(201).json({
    url: "https://yoursite.com/" + post.slug,
  });
});

app.listen(3000);

/ Гэрээ — шинэчлэх

Нийтлэл шинэчлэх (Сайжруулах)

Orova-гийн Сайжруулах хөдөлгүүр аль хэдийн нийтлэгдсэн нийтлэлийг дахин бичдэг — шинэчилсэн баримт, илүү сайн гарчиг, нэгтгэсэн агуулга — дараа нь одоо байгаа постыг байранд нь, URL-ыг өөрчлөхгүйгээр дарж бичнэ. Хүсэлт ижил endpoint URL руу, ижил Bearer token-той POST хэлбэрээр очно:

POST <your endpoint URL>

Headers:
  Content-Type: application/json
  Authorization: Bearer <secret>
  User-Agent: Orova-SEO

Body (JSON):
  {
    "action": "update",          # always the literal string "update"
    "id": 123,                   # optional: post id, match on this first
    "target_url": "...",         # public URL of the post to overwrite (match next)
    "title": "...",              # new headline
    "slug": "...",               # slug fallback for matching, may be empty
    "content_html": "...",       # full new article body as HTML
    "excerpt": "...",            # new meta description
    "featured_image_url": "...", # optional: new cover image
    "status": "publish"          # optional: "publish" or "draft"
  }
  # Optional fields are left out of the body when empty — never sent as null.

Постыг target_url-аар олоорой (олдохгүй бол slug), гарчиг, бие, meta description-ийг солиод URL-ыг хэвээр нь үлдээж, { "url": "<same post URL>" }-ээр 200 хариулаарай. 2xx биш статус эсвэл url-гүй body ирвэл Orova тэр сайжруулалтыг амжилтгүй гэж тэмдэглэнэ (давхар пост хэзээ ч үүсгэхгүй). Үүнийг хараахан хэрэгжүүлээгүй endpoint шинэ нийтлэлийг өөрчлөлтгүй нийтэлсээр байна — шинэчлэхийг зөвхөн Сайжруулах дэлгэцийг ашиглах үед хэрэгжүүлэх шаардлагатай.

8-р сарын 29-өөс эхлэн шинэчлэх body-д id (target_url-аас өмнө үүгээр тулгана), шинэ нүүр зурагт featured_image_url, "publish" эсвэл "draft" утгатай status орж болно. Гурвуулаа заавал биш; хоосон бол body-оос хасагдана, хэзээ ч null болж илгээгдэхгүй.

/ Гэрээ — Visual Editor

Нийтлэл унших (заавал)

Orova Таны сайт дээр байгаа нийтлэлүүдийг унших шаардлагатай — давхар сэдвээс зайлсхийх, дотоод холбоос нэмэх, хуучин постыг сайжруулахын тулд. Ижил endpoint URL дээр ижил Bearer token-той хоёр action нэмээрэй: list Таны нийтлэлүүдийг, get тэдгээрийн нэгийг бүрэн буцаана.

POST <your endpoint URL>     # same endpoint, same Bearer secret

Body (JSON):
  {
    "action": "list",            # always the literal string "list"
    "limit": 500                 # newest article first, 500 maximum
  }

Response — HTTP 200:
  {
    "ok": true,
    "posts": [
      {
        "id": 123,               # your own post id, reused by "get" and "update"
        "title": "...",
        "slug": "...",
        "link": "https://yoursite.com/the-article",
        "date": "2026-08-29",    # published date, YYYY-MM-DD
        "modified": "2026-08-29",
        "status": "publish",     # "publish" or "draft"
        "author": "...",
        "excerpt": "..."         # optional: short summary, 300 characters max
      }
    ]
  }
  # Required: Orova reads this list to avoid duplicate topics,
  # add internal links and analyze the whole site.
POST <your endpoint URL>

Body (JSON):
  {
    "action": "get",             # always the literal string "get"
    "id": 123,                   # match on this first
    "target_url": "...",         # then the public URL
    "slug": "..."                # then the slug
  }

Response — HTTP 200:
  {
    "ok": true,
    "post": {
      "id": 123,
      "title": "...",
      "slug": "...",
      "link": "https://yoursite.com/the-article",
      "content_html": "...",     # full article body as HTML
      "excerpt": "...",
      "featured_image_url": "...",
      "status": "publish"        # "publish" or "draft"
    }
  }

No such post — HTTP 404:
  { "ok": false, "err": "not_found" }

limit хамгийн ихдээ 500 бөгөөд хамгийн шинэ нийтлэл эхэнд ирнэ. get-ийн хувьд Orova id, target_url, slug-ийг хамт илгээнэ — танигдсаныг нь энэ дарааллаар тулгаарай. Юу ч таарахгүй бол { "ok": false, "err": "not_found" }-тэй 404 хариулаарай. list дахь excerpt заавал биш (хамгийн ихдээ 300 тэмдэгт). Заавал: Orova аль нийтлэл байгааг мэдэхийн тулд list-ийг (давхардлаас зайлсхийх, дотоод холбоос нэмэх, бүх сайтыг шинжлэх), сайжруулахдаа нийтлэлийг уншихын тулд get-ийг дуудна. Таны сайт энэ хоёр action-д хариулахгүй бол шинэ нийтлэлд дотоод холбоос орохгүй, хуучин нийтлэлийг сайжруулах боломжгүй.

/ Гэрээ — Visual Editor

Зураг байршуулах (Visual Editor)

Та Visual Editor руу зураг оруулахад Orova үүнийг ижил endpoint URL руу JSON body дотор base64 хэлбэрээр илгээнэ — multipart байхгүй, хамгаалах хоёр дахь URL байхгүй.

POST <your endpoint URL>

Body (JSON):
  {
    "action": "upload_image",    # always the literal string "upload_image"
    "filename": "cover.png",     # original file name, extension included
    "mime": "image/png",         # image/* only
    "data_base64": "iVBORw0KGgo..."   # file bytes, base64, 15 MB maximum
  }

Response — HTTP 200 (or 201):
  {
    "ok": true,
    "url": "https://yoursite.com/uploads/cover.png"   # absolute URL
  }

Зөвхөн image/*-ийг хүлээн авч, 15 MB-аас их бүхнийг татгалзаарай. Файлыг хадгалаад зургийн абсолют URL-аар хариулаарай: харьцангуй зам нийтлэлийг өөр газар харуулмагц эвдэнэ. Энэ action зөвхөн Visual Editor-т хэрэгтэй.

/ Гэрээ — устгах

Нийтлэл устгах

Хэрэглэгч Orova дотор нийтлэгдсэн нийтлэлийг устгахад (Бичих эсвэл Тайлан дэлгэцээс) Orova Таны сайтаас ч устгахыг хүснэ. Хүсэлт ижил endpoint URL руу, ижил Bearer token-той POST хэлбэрээр очно — ганц ялгаа нь body:

POST <your endpoint URL>

Headers:
  Content-Type: application/json
  Authorization: Bearer <secret>
  User-Agent: Orova-SEO

Body (JSON):
  {
    "action": "delete",          # always the literal string "delete"
    "url": "...",                # public URL of the article to remove (match on this first)
    "slug": "...",               # slug fallback, may be empty
    "keyword": "..."             # the article's target keyword, for your logs
  }

Постыг url-аар хайгаарай (олдохгүй бол slug), устгах эсвэл нийтлэлтийг цуцлаад 200 болон { "deleted": true }-ээр хариулаарай — зөвхөн 204 ч болно. Пост аль хэдийн байхгүй бол 404 хариулахад Orova устгагдсан гэж үзнэ. { "deleted": false } буцаах нь пост устгагдаагүйг Orova-д мэдэгдэнэ. Энгийн нийтлэх хүсэлтэд action талбар хэзээ ч байдаггүй тул одоо байгаа endpoint өөрчлөлтгүй ажилласаар байна — устгахыг хэрэгжүүлэх нь заавал биш ч зөвлөж байна.

/ Аюулгүй байдал

Аюулгүй байдлын тэмдэглэл

  • Bearer token-ийг үргэлж шалгах. Таны endpoint нийтийн URL — хэн ч дуудаж болно. Authorization header нь хүсэлт үнэхээр Orova-гаас ирснийг батлах цорын ганц зүйл тул token нь хадгалсан нууцтай яг таарахгүй хүсэлт бүрийг татгалзаарай.
  • Endpoint-ийг HTTPS-ээр үйлчлүүлэх. Нууц header дотор дамждаг. HTTPS дамжуулалтын явцад уншигдахаас хамгаална.
  • Нууцыг кодоосоо гадуур хадгалах. Үүнийг орчны хувьсагч эсвэл нууц удирдагчид хадгалаарай, commit хийх файлд хэзээ ч шууд бичиж болохгүй. Хэрэв задарвал Төсөл → Холболтууд хэсгээс шинийг үүсгээрэй.
  • content_html-ийг итгэмжлэгдсэн тэмдэглэгээ биш, агуулга гэж үзэх. CMS дахь аливаа нийтлэлийн биеийн адил болгоомжтой хадгалж, харуулаарай.

/ Дүгнэлт

Гэрээ бүхэлдээ ийм

Endpoint ажиллаж, төсөлд тань бүртгэгдсэн бол Orova Таны сайт руу автоматаар нийтэлнэ — WordPress хэрэглэгчдэд хийдэгтэй яг адил. Дуусгасан нийтлэл бүр Таны сервер дээр ирж, пост болох бөгөөд нийтийн URL нь Тайлан болон Шинжилгээ рүү буцаж орж, гүйцэтгэлийг нь хянах боломжтой болно.

← Гарын авлагын сан руу буцах

/ Тусламж хэрэгтэй юу?

Endpoint-оо холбоход гацсан уу? Workspace доторх Тусламж хэсгийг нээх, эсвэл бидэнд мессеж илгээгээрэй.