AI Tools
AI-powered writing tools — title suggestions and streaming research via the MisarBlog API.
Generate Title Suggestions
/ai/titlesReturns AI-generated title options based on your article topic or outline.
Request body
topicstringbodyrequiredTopic, keywords, or a brief outline (max 500 chars).
tonestringbodytechnical | conversational | clickbait (default: conversational).
countintegerbodyNumber of suggestions (1–10, default: 5).
Response fields
titlesstring[]AI-generated title options.
{
"topic": "How to build a real-time chat app with Next.js and WebSockets",
"tone": "technical",
"count": 5
}{
"titles": [
"Building Real-Time Chat with Next.js 15 and WebSockets",
"WebSockets in Next.js: A Complete Guide to Real-Time Apps",
"How to Add Live Chat to Any Next.js App in Under an Hour",
"Next.js + WebSockets: From Zero to Production",
"Real-Time Communication in Next.js — The Practical Guide"
]
}AI Research (Streaming)
/ai/researchStreams AI-generated research on a topic using Server-Sent Events (SSE). Returns sourced insights, key points, and draft outlines.
Request body
topicstringbodyrequiredResearch topic (max 500 chars).
depthstringbodybrief | detailed | comprehensive (default: detailed).
Response fields
chunkstringPartial chunk of streamed research text, delivered as text/event-stream events until data: [DONE].
{
"topic": "Impact of large language models on software development productivity",
"depth": "detailed"
}data: {"chunk": "Large language models (LLMs) have significantly..."}
data: {"chunk": " transformed how developers write and review code..."}
data: [DONE]const es = new EventSource(
"https://api.misar.io/blog/v1/ai/research",
// EventSource doesn't support POST — use fetch with ReadableStream instead:
);
// Use fetch for POST + SSE:
const res = await fetch("https://api.misar.io/blog/v1/ai/research", {
method: "POST",
headers: {
Authorization: `Bearer ${apiKey}`,
"Content-Type": "application/json",
},
body: JSON.stringify({ topic: "LLMs in software development", depth: "detailed" }),
});
const reader = res.body!.getReader();
const decoder = new TextDecoder();
while (true) {
const { done, value } = await reader.read();
if (done) break;
const lines = decoder.decode(value).split("\n");
for (const line of lines) {
if (line.startsWith("data: ") && line !== "data: [DONE]") {
const { chunk } = JSON.parse(line.slice(6));
process.stdout.write(chunk);
}
}
}For more details on streaming, see the Streaming guide.
Status codes
400— Missingtopicor invaliddepth401— Invalid or missing API key429— Rate limit exceeded