Base URL
Authentication
This API uses API key authentication.
The key is tied to your account, so the server can identify you and verify permissions.
API access is available to paid subscribers. You can generate an API key in your blog settings.
or
X-API-KEY: <your_api_key>
- • Your API key is shown only once in the settings screen.
- • If you lose it, rotate the key to generate a new one—the old key will be revoked.
- • Only the author can perform POST/PATCH/DELETE. Use your own API key.
Endpoints
Images: Upload Workflow
TTL 30 minutes · Max 8 · WebPFor security reasons, the Mikihands API server does not fetch external URLs provided by users. To include images in a post, upload them via the Image Upload API first, then use the returned image_url and image_id.
- • On success, you’ll receive image_url (insert into the body) and image_id (include in the request payload).
- • image_id expires after 30 minutes. Expired IDs can’t be used in posts.
- • Up to 8 images, 5MB max per file, 2048×2048 max resolution.
- • Supported formats: PNG/JPEG/JPG/WebP. Uploaded images are converted to WebP and stored on the server.
- • Image uploads are rate-limited to 10 requests per minute.
Upload the image as multipart/form-data. Use file as the field name.
curl -sS -X POST \ "https://api.mikihands.com/api/blogcontroller/image-upload/" \ -H "X-API-KEY: <your_api_key>" \ -F "file=@/path/to/image.webp"
{
"success": true,
"image_url": "/media/<username>/blog_img/<image_id>.webp",
"image_id": "<image_id>"
}
In body, embed image_url using Markdown image syntax. In the request payload, include the image_id values in the image_ids array.
 Continue writing here...
{
"image_ids": ["<image_id>", "<image_id2>"]
}
- • When updating images via PATCH, you usually need to send the body as well.
- • Expired image_id values will cause an error. Submit your post within 30 minutes of uploading.
Payload Examples
POST /api/blogcontroller/posts/
{
"title": "My first post",
"slug": "my-first-post",
"status": "PB",
"categories": "Technology, AI",
"tags": "mikihands, automation",
"meta_description": "A concise meta description...",
"body": "# Hello\\nThis is markdown."
}
- • Send the post content in body as a Markdown string.
- • Any uppercase letters in tags are converted to lowercase on the server.
- • Upload images via the image-upload API, then use the returned image_url and image_id.
| Field | Type | Required | Notes |
|---|---|---|---|
| title | string | Required | Post Title |
| slug | string | Required | SEO-friendly slug (must be unique) |
| status | string | Required | DF(Draft) / PB(Published) |
| categories | string | Required | Comma-separated categories |
| tags | string | Optional | Comma-separated tags |
| meta_description | string | Required | SEO description (300-character limit) |
| body | string | Required | Markdown content |
| image_ids | string[] | Optional | Image IDs returned after upload (e.g. ["0e809...", "0e884..."]) |
PATCH /api/blogcontroller/{slug}/
{
"lang_code": "ja",
"primary_language": "en",
"translation_languages": ["ja","fr","de","ko"],
"title": "Updated title",
"status": "PB",
"categories": "Tech, AI",
"tags": "django, automation",
"meta_description": "Updated meta...",
"body": "# Updated\nNew markdown content",
"image_ids": ["0e809...", "0e884..."]
}
| Field | Type | Required | Notes |
|---|---|---|---|
| lang_code | string | Required | Target language code (e.g., en, ja) |
| primary_language | string | Required | User’s primary language (for lang_code validation) |
| translation_languages | string[] | Required | User translation languages (for lang_code validation) |
| title | string | Optional | Post Title |
| status | string | Optional | DF(Draft) / PB(Published) |
| categories | string | Optional | Comma-separated (e.g., "Tech","AI") |
| tags | string | Optional | Comma-separated (e.g., "python","automation") |
| meta_description | string | Optional | SEO description (recommended 120–160 characters) |
| body | string | Optional | Markdown string. Converted to HTML on the server. |
| image_ids | string[] | Optional | Image IDs returned after upload (e.g. ["0e809...", "0e884..."]) |
- • lang_code must be included in either primary_language or translation_languages.
- • When updating images via image_ids, you must also include the body.
- • The response may be 202 Accepted. Processing may take a short time.
DELETE /api/blogcontroller/posts/{slug}/
- • Only the author can delete a post. (Based on the user linked to the API key)
- • Deleted posts cannot be recovered.
Common Errors
- • Duplicate slug
- • Missing body in the CREATE request
- • Missing lang_code / primary_language / translation_languages in the PATCH request
- • Image update requested, but body is missing
- — Images —
- • Missing file (multipart field name: file)
- • Unsupported image format (PNG/JPEG/WebP only)
- • File size exceeds the 5MB limit
- • Image resolution exceeds the 2048×2048 limit
- • Too many image_ids in the posting request (max 8)
- • Author mismatch: you can’t edit or delete this post
- • Not a paid subscriber
- • Expired image_id (30-minute TTL)
- • Attempted to download or publish an image using an expired image_id
- • Too many image upload requests (rate limit / throttling)
Processing Notes
Some Mikihands Blog features may take a few seconds (or up to tens of seconds) to complete. This is normal—AI processing can take a moment.
- • Updates may take a moment: After saving, changes might not show immediately. Refresh shortly to see the latest result.
- • Translations run one by one: If you select multiple languages, they’re generated sequentially, so it may take longer.
- • Review AI output: AI can miss context or sound unnatural. Please do a final check in Preview before publishing.
- • Images & metadata: You can edit auto-generated items anytime to better fit your content.