Developer Documentation

jekcms API Reference

Integrate jekcms into your applications. Comprehensive REST API for content management, media uploads, webhook triggers, and statistics.

REST API v1 API Key Required JSON
Base URL https://yourdomain.com/api/v1

Authentication

All API requests require an API key that must be sent with every request. Generate your key from the jekcms admin panel under Settings → API.

Header Authentication (Recommended)

# X-API-Key header GET /api/v1/posts X-API-Key: your_api_key_here # Bearer token (alternative) GET /api/v1/posts Authorization: Bearer your_api_key_here

cURL Example

Terminal
$ curl -X GET "https://yourdomain.com/api/v1/posts" \ -H "X-API-Key: your_api_key_here" \ -H "Content-Type: application/json" {"status":"ok","data":[...],"total":42,"page":1}

Security note: Never embed your API key in client-side code (JavaScript, HTML). Use it only in server-side integrations or automation tools like n8n.

Posts

GET /api/v1/posts List all posts
GET /api/v1/posts/{id} Get single post
POST /api/v1/posts Create new post
PUT /api/v1/posts/{id} Update post
DELETE /api/v1/posts/{id} Delete post

Parameters - GET /posts

# Query parameters page integer - Page number (default: 1) per_page integer - Results per page (default: 20, max: 100) status string - "published" | "draft" | "all" (default: "published") category string - Filter by category slug search string - Full-text search in title and content order string - "desc" | "asc" (default: "desc") order_by string - "date" | "title" | "views" (default: "date")

Create Post - POST /posts

{ "title": "My Post Title", "content": "<p>Full HTML content here</p>", "excerpt": "Short description", "status": "published", // "published" | "draft" "category_id": 3, "featured_image": "images/2026/01/cover.avif", "tags": ["php", "cms", "tutorial"], "seo_title": "My Post Title | jekcms", "seo_description": "SEO meta description (max 160 chars)" }

n8n integration: Use HTTP Request node in n8n to post to jekcms. Method: POST, URL: /api/v1/posts, Headers: X-API-Key. Prepare JSON body with Set node.

Media

POST /api/v1/media Upload image
GET /api/v1/media Media library
DELETE /api/v1/media/{id} Delete media

jekcms automatically converts uploaded images to AVIF and WebP formats. The original file is also retained. The response includes all three URLs.

Upload Image - POST /media

# multipart/form-data POST /api/v1/media X-API-Key: your_api_key_here Content-Type: multipart/form-data # Form fields image file - JPG / PNG / WebP / AVIF (max 10MB) alt string - Alt text (optional) folder string - Target folder e.g. "2026/05" (optional)

Response Example

{ "success": "true", "id": 142, "filename": "photo.avif", "original_name": "photo.jpg", "path": "images/2026/05/photo.avif", "url": "https://yourdomain.com/uploads/images/2026/05/photo.avif", "size": 184320, "mime_type": "image/avif", "is_image": "true" }

Categories

GET /api/v1/categories List all categories
GET /api/v1/categories/{slug} Category detail

Category List Response

{ "status": "ok", "data": [ { "id": 1, "name": "Technology", "slug": "technology", "description": "Tech news and reviews", "post_count": 47 } ] }

Webhooks

Webhooks work in both directions. Inbound endpoints: n8n or any other system POSTs to the addresses below to publish a post, leave a draft, upload media or work the content queue. Authentication uses your API key; calls without one are verified against an X-Webhook-Signature HMAC. Outgoing webhooks: jekcms sends a signed JSON notification to a URL you define whenever a content event happens (below).

POST /api/v1/webhook/publish Publish a post
POST /api/v1/webhook/draft Create as draft (recommended)
POST /api/v1/webhook/schedule Schedule for later
POST /api/v1/webhook/media Upload an image from a URL
POST /api/v1/webhook/bulk-publish Bulk submission
GET /api/v1/webhook/queue-pending Pending content queue
POST /api/v1/webhook/test Connection test

The Request You Send

# POST /api/v1/webhook/draft { "title": "My New Article", "content": "<p>Article body as HTML</p>", "excerpt": "One-sentence summary", "category": "technology", "image": "https://example.com/cover.jpg" }

The Response You Get

{ "success": "true", "post_id": 256, "slug": "my-new-article", "status": "draft", "url": "https://yourdomain.com/my-new-article" }

Using with n8n: Add an HTTP Request node at the end of your flow, point it at /api/v1/webhook/draft and send your API key in the X-API-Key header. Generated content lands in your panel as a draft - the decision to publish stays yours.

Outgoing Webhooks

Create a webhook-type entry in the admin panel under Settings → API Keys: set your target URL and signing secret, and optionally restrict the entry to specific events. There are five events: post_published, post_updated, post_deleted, comment_created (a new comment: id, post_id, author_name, status) and member_registered (a new member who verified their e-mail: id, name, email). Every delivery is logged on the same screen; a failed delivery can be re-sent with one click.

The Request You Receive

# POST - sizin URL'inize / to your URL # X-Jek-Event: post_published # X-Jek-Signature: sha256=<HMAC-SHA256(body, secret)> { "event": "post_published", "site": "https://yourdomain.com", "timestamp": "2026-08-28T12:00:00+00:00", "data": { "id": 256, "title": "My New Article", "slug": "my-new-article", "status": "published", "url": "https://yourdomain.com/my-new-article" } }

Verifying the signature: compute the HMAC-SHA256 of the raw body with your secret and compare it to the sha256=… value in X-Jek-Signature. Reject requests that don't match.

Statistics

GET /api/v1/stats Site metrics

GET /stats Response

{ "posts": { "published": 318, "draft": 24, "scheduled": 6 }, "comments": { "total": 1204, "pending": 12, "approved": 1192 }, "media": { "total_files": 512, "images": 498, "total_size_formatted": "284.6 MB" }, "categories": 8, "tags": 46, "users": 3 }

Error Codes

All error responses use the same structure: {"status":"error","code":401,"message":"..."}. The table below lists possible error codes and recommended solutions.

Code Meaning Resolution
400 Bad Request Check JSON format and required fields.
401 Unauthorized Send your API key in the X-API-Key header.
403 Forbidden Your API key does not have permission to access this resource.
404 Not Found Check the ID or slug.
422 Validation Error Check the errors array in the response for field-level details.
429 Too Many Requests Rate limit exceeded (100 requests per hour per client IP). The response carries no headers, so slow your calls down and retry.
500 Internal Server Error An unexpected server-side error occurred. If the problem persists, contact support.

Retry on 429: Use exponential backoff - wait 1s, then 2s, then 4s between retries. In n8n, use the Wait node for this.

Start Using the API

Purchase jekcms, generate your API key, and start building integrations within minutes.

View Pricing
  • Full REST API access
  • n8n integration (drafts → editorial approval)
  • AVIF/WebP auto-conversion
  • Webhook support
  • API key management

Be the first to know

New features, release notes and CMS guides. We send a couple of emails a month.