/ डेव्हलपर मार्गदर्शक
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 द्वारे कनेक्ट करा” सुरू करा. तुमचा प्रोजेक्ट उघडा (Projects → तुमचा प्रोजेक्ट → Connections). WordPress कार्डच्या शेजारी API द्वारे कनेक्ट करा कार्ड आहे. तिथे तुमच्या endpoint चा URL टाका. गुप्त की फील्ड ऐच्छिक आहे: रिकामे ठेवल्यास Orova एक की तयार करते, किंवा तुमची साइट आधीच वापरत असलेली की पेस्ट करा. जतन केल्यावर की कार्डवर Copy बटणासह दिसते. एक प्रोजेक्ट फक्त एकाच ठिकाणी प्रकाशित करतो — API द्वारे कनेक्ट केल्यास WordPress बटण लॉक होते, आणि उलटही.
- 2
POST स्वीकारणारा endpoint तयार करा. तुमच्या स्वतःच्या साइटवर किंवा सर्व्हरवर JSON body सह HTTP POST ऐकणारा route तयार करा. हाच URL तुम्ही प्रोजेक्टच्या Connections स्क्रीनवर पेस्ट करता. Orova पूर्ण केलेल्या प्रत्येक लेखासाठी तो एकदा कॉल करते.
- 3
प्रत्येक विनंतीवर Bearer token पडताळा. Orova कडून येणाऱ्या प्रत्येक विनंतीत “Bearer <secret>” स्वरूपातील Authorization header असतो, जो तुमच्या प्रोजेक्टमध्ये दाखवलेली नेमकी गुप्त की वापरतो. तो तुमच्याकडे साठवलेल्या प्रतीशी तुलना करा आणि न जुळणारी प्रत्येक गोष्ट नाकारा — यामुळेच इतर कोणी तुमच्या साइटवर पोस्ट करू शकत नाही.
- 4
Payload मधून लेख तयार करा. JSON body वाचा आणि तुमच्या CMS किंवा डेटाबेसमध्ये पोस्ट तयार करा: लेखासाठी title, slug आणि content_html, meta description म्हणून excerpt, कव्हर प्रतिमा म्हणून featured_image_url, आणि metadata म्हणून keyword / lang / published_at वापरा.
- 5
लेखाचा लाइव्ह URL परत द्या. HTTP 200 किंवा 201 आणि { "url": "https://yoursite.com/the-new-article" } असा JSON body परत द्या. Orova तो URL लेखाची प्रकाशित लिंक म्हणून साठवते. तुम्ही non-2xx स्थिती परत दिल्यास किंवा url फील्ड वगळल्यास, Orova प्रकाशन अयशस्वी मानते.
- 6
Optimize इंजिनकडून येणाऱ्या अपडेट विनंत्या हाताळा. 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 खाली त्यांच्या स्वतंत्र विभागांत दाखवले आहेत.
| फील्ड | प्रकार | वर्णन |
|---|---|---|
| title | string | लेखाचे शीर्षक. |
| slug | string | URL-friendly identifier suggested for the post. |
| content_html | string | प्रकाशनासाठी तयार HTML स्वरूपातील संपूर्ण लेख. |
| excerpt | string | छोटा सारांश, meta description साठी. |
| featured_image_url | string | null | कव्हर प्रतिमेचा URL, किंवा नसल्यास null. |
| keyword | string | ज्या लक्ष्य SEO कीवर्डसाठी लेख लिहिला गेला. |
| lang | string | Language as an ISO code, e.g. "en" or "vi". |
| published_at | string | Orova ने लेख पाठवला तो क्षण, UTC मध्ये ISO 8601, timezone प्रत्ययाशिवाय. |
| status | string | undefined | ऐच्छिक. "draft" लेख अप्रकाशित ठेवतो; "publish", किंवा कोणतेही मूल्य नसल्यास, तो प्रकाशित होतो. |
| action | string | undefined | नवीन लेखांसाठी नसते. "delete" पोस्ट काढण्यास सांगते; "update" (Optimize इंजिनकडून पाठवलेले) अस्तित्वातील पोस्ट जागीच बदलण्यास सांगते. |
| target_url | string | फक्त action = "update" सह: बदलायच्या पोस्टचा लाइव्ह URL. URL तसाच ठेवा. |
| id | number | undefined | Only 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 ने कोणतीही non-2xx स्थिती परत दिल्यास, किंवा url फील्ड असलेला JSON object नसलेला body दिल्यास, Orova प्रकाशन अयशस्वी मानते आणि लेख तसा चिन्हांकित करते, जेणेकरून तुम्ही पुन्हा प्रयत्न करू शकता. 60 सेकंदांत उत्तर द्या — त्यानंतर Orova विनंतीचा time out करते (हे प्रकाशन, अपडेट आणि हटवणे या सर्वांना लागू आहे).
/ उदाहरण
कोड उदाहरण
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);/ करार — update
लेख अपडेट करणे (Optimize)
Orova चे Optimize इंजिन आधीच लाइव्ह असलेले लेख पुन्हा लिहिते — ताजी तथ्ये, चांगली शीर्षके, एकत्रित सामग्री — आणि मग अस्तित्वातील पोस्ट जागीच, 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), तिचे शीर्षक, body आणि meta description बदला, URL तसाच ठेवा, मग { "url": "<same post URL>" } सह 200 प्रतिसाद द्या. कोणतीही non-2xx स्थिती, किंवा url नसलेला body असल्यास Orova ते ऑप्टिमायझेशन अयशस्वी म्हणून चिन्हांकित करते (ते कधीही डुप्लिकेट पोस्ट तयार करत नाही). ज्या endpoint नी हे अद्याप लागू केलेले नाही ते नवीन लेख पूर्वीप्रमाणेच प्रकाशित करत राहतात — update लागू करणे फक्त तुम्ही Optimize स्क्रीन वापरता तेव्हाच आवश्यक आहे.
29 ऑगस्टपासून update body मध्ये id (target_url आधी त्यावर जुळवा), नवीन कव्हर प्रतिमेसाठी featured_image_url, आणि "publish" किंवा "draft" असलेले status देखील असू शकते. तिन्ही ऐच्छिक आहेत; रिकामे असल्यास ते body मधून वगळले जातात, कधीही null म्हणून पाठवले जात नाहीत.
/ करार — व्हिज्युअल एडिटर
लेख वाचणे (आवश्यक)
Orova ला तुमच्या साइटवर आधीच असलेले लेख वाचावे लागतात — डुप्लिकेट विषय टाळण्यासाठी, अंतर्गत लिंक्स जोडण्यासाठी आणि जुन्या पोस्ट्स ऑप्टिमाइझ करण्यासाठी. त्याच endpoint URL वर, त्याच Bearer token सह आणखी दोन actions जोडा: 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 कॉल करते. तुमची साइट या दोन actions ना उत्तर देत नसल्यास, नवीन लेखांना अंतर्गत लिंक्स मिळत नाहीत आणि जुने लेख ऑप्टिमाइझ करता येत नाहीत.
/ करार — व्हिज्युअल एडिटर
प्रतिमा अपलोड करणे (व्हिज्युअल एडिटर)
तुम्ही व्हिज्युअल एडिटरमध्ये प्रतिमा टाकता तेव्हा 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 पेक्षा मोठे काहीही नाकारा. फाइल साठवा, मग प्रतिमेच्या absolute URL सह उत्तर द्या: relative path असल्यास लेख इतरत्र दिसताच तुटतो. ही action फक्त व्हिज्युअल एडिटरसाठी आवश्यक आहे.
/ करार — delete
लेख हटवणे
वापरकर्ता Orova मध्ये (Write किंवा Reports स्क्रीनवरून) प्रकाशित लेख काढतो तेव्हा 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 न बदलता चालत राहतात — delete लागू करणे ऐच्छिक आहे पण शिफारसीय आहे.
/ सुरक्षा
सुरक्षा सूचना
- नेहमी Bearer token पडताळा. तुमचा endpoint एक सार्वजनिक URL आहे — कोणीही तो कॉल करू शकतो. विनंती खरोखर Orova कडून आली हे सिद्ध करणारी एकमेव गोष्ट म्हणजे Authorization header, त्यामुळे ज्या विनंतीचा token तुमच्या साठवलेल्या secret शी तंतोतंत जुळत नाही ती प्रत्येक नाकारा.
- Endpoint HTTPS वर चालवा. Secret header मधून जातो. HTTPS मुळे तो प्रवासात वाचला जात नाही.
- Secret तुमच्या कोडबाहेर ठेवा. ते environment variable किंवा secrets manager मध्ये साठवा, तुम्ही commit करत असलेल्या फाइलमध्ये कधीही hard-code करू नका. ते कधी उघड झाले तर Project → Connections मधून नवीन तयार करा.
- content_html ला सामग्री म्हणून हाताळा, विश्वासार्ह markup म्हणून नव्हे. तुमच्या CMS मधील कोणत्याही लेखाच्या body प्रमाणेच ते काळजीपूर्वक साठवा आणि दाखवा.
/ समारोप
हाच संपूर्ण करार आहे
Endpoint लाइव्ह होऊन तुमच्या प्रोजेक्टमध्ये नोंदवला गेल्यावर Orova तुमच्या साइटवर आपोआप प्रकाशित करते — अगदी WordPress वापरकर्त्यांप्रमाणे. पूर्ण झालेला प्रत्येक लेख तुमच्या सर्व्हरवर येतो, पोस्ट बनतो, आणि त्याचा सार्वजनिक URL Reports आणि Analysis मध्ये परत येतो, जेणेकरून तुम्ही त्याची कामगिरी पाहू शकता.
/ मदत हवी आहे?
तुमचा endpoint जोडताना अडकलात? तुमच्या वर्कस्पेसमधील Support विभाग उघडा, किंवा आम्हाला संदेश पाठवा.
