Build with the Makrly API
Automate your social media content and changelog programmatically. Generate posts, manage entries, and integrate Makrly into your workflow.
Quick Start
Get your API key
Go to Settings → API in your dashboard and create a new API key.
Make your first request
curl -H "Authorization: Bearer mk_live_your_key_here" \ https://makrly.com/api/v1/repos
Get your repos back
{
"data": [
{
"id": 1,
"fullName": "you/your-repo",
"notableCommitCount": 42,
"changelogEntryCount": 15
}
]
}Authentication
All API requests require a Bearer token in the Authorization header:
Authorization: Bearer mk_live_your_key_here
API keys start with mk_live_ and are shown once on creation.
You can create up to 10 active keys. Keys can be scoped to specific repos and permissions.
Available Scopes
changelog:readRead changelog entrieschangelog:writeCreate, update, delete entriessettings:readRead widget settingssettings:writeUpdate widget settingsServer-side only: API keys are designed for server-to-server requests. Do not expose your key in client-side code (browsers, mobile apps). CORS headers are not set on API endpoints.
Base URL
https://makrly.com/api/v1
Endpoints
Repositories
/api/v1/reposList your tracked repositories
{
"data": [
{
"id": 1,
"name": "my-app",
"fullName": "username/my-app",
"isPrivate": false,
"isActive": true,
"notableCommitCount": 42,
"changelogEntryCount": 15,
"lastSyncedAt": "2025-01-15T10:00:00Z"
}
]
}/api/v1/repos/:repoIdGet a single repository
Posts
/api/v1/repos/:repoId/posts?platform=x&page=1&limit=20List generated posts for a repo
{
"data": [
{
"id": 1,
"platform": "x",
"content": "Just shipped dark mode...",
"createdAt": "2025-01-15T10:00:00Z",
"commit": {
"id": 42,
"sha": "abc123",
"message": "feat: add dark mode toggle"
}
}
],
"meta": { "page": 1, "limit": 20, "total": 5, "totalPages": 1 }
}/api/v1/posts/generateGenerate posts from custom text
{
"content": "Just shipped a new feature...",
"repoId": 1,
"provider": "openai",
"model": "gpt-4o"
}{
"data": {
"short": "Just shipped dark mode! 🌙",
"thread": ["Post 1...", "Post 2..."],
"linkedin": "Excited to announce...",
"facebookProfile": "New feature alert!...",
"facebookPage": "We're thrilled..."
}
}/api/v1/posts/:idGet a single post
/api/v1/posts/:idUpdate a post's content
{ "content": "Updated post text..." }Changelog Entries
/api/v1/changelog/entries?repoId=1&status=published&cursor=abc&limit=20List changelog entries (scope: changelog:read)
{
"entries": [{ "id": "abc", "title": "Dark Mode", "categories": ["new"], ... }],
"nextCursor": "def",
"hasMore": true
}/api/v1/changelog/entriesCreate a changelog entry (scope: changelog:write)
{
"repoId": 1,
"title": "Dark Mode Support",
"content": "You can now toggle dark mode...",
"summary": "Added dark mode to the app",
"categories": ["new"],
"publish": true,
"publishedAt": "2025-01-15T10:00:00Z"
}/api/v1/changelog/entries/:idGet a single entry (scope: changelog:read)
/api/v1/changelog/entries/:idUpdate an entry (scope: changelog:write)
{
"title": "Updated Title",
"categories": ["improved"],
"publish": true,
"pin": true
}/api/v1/changelog/entries/:idDelete an entry (scope: changelog:write)
Changelog Settings
/api/v1/changelog/settings?repoId=1Get widget settings (scope: settings:read)
/api/v1/changelog/settingsUpdate widget settings (scope: settings:write)
{
"repoId": 1,
"theme": "dark",
"position": "bottom-right",
"primaryColor": "#6366f1",
"isPublic": true
}Commits
/api/v1/repos/:repoId/commits?notable=true&page=1&limit=20List commits for a repo
Rate Limits
Rate limit info is included in every response via headers:
X-RateLimit-Limit: 1000 X-RateLimit-Remaining: 999 X-RateLimit-Reset: 1705312800
X-RateLimit-Reset is a Unix timestamp (seconds) for when the window resets.
Errors
All errors return a consistent format:
{
"error": {
"code": "not_found",
"message": "Repository not found"
}
}| Code | Status | Description |
|---|---|---|
| unauthenticated | 401 | Missing authentication (no API key or session) |
| invalid_format | 401 | Invalid API key format |
| invalid_key | 401 | API key not found in database |
| key_revoked | 401 | API key has been revoked |
| key_expired | 401 | API key has expired |
| key_in_query | 401 | API key sent as query param (use header instead) |
| insufficient_scope | 403 | API key lacks required scope |
| repo_scope_mismatch | 403 | Repo-scoped key accessing wrong repo |
| not_found | 404 | Resource not found or not owned by you |
| validation_error | 400 | Invalid request parameters |
| rate_limited | 429 | Too many requests (Retry-After header included) |
| server_error | 500 | Internal server error |
Code Examples
JavaScript (fetch)
const response = await fetch("https://makrly.com/api/v1/repos", {
headers: {
"Authorization": "Bearer mk_live_your_key_here"
}
});
const { data } = await response.json();
console.log(data); // Your reposPython (requests)
import requests
response = requests.get(
"https://makrly.com/api/v1/repos",
headers={"Authorization": "Bearer mk_live_your_key_here"}
)
data = response.json()["data"]
print(data) # Your reposGenerate posts from text
curl -X POST https://makrly.com/api/v1/posts/generate \
-H "Authorization: Bearer mk_live_your_key_here" \
-H "Content-Type: application/json" \
-d '{
"content": "Just shipped dark mode for my SaaS app!",
"repoId": 1
}'Create a changelog entry
curl -X POST https://makrly.com/api/v1/repos/1/changelog/entries \
-H "Authorization: Bearer mk_live_your_key_here" \
-H "Content-Type: application/json" \
-d '{
"title": "Dark Mode Support",
"content": "You can now toggle between light and dark themes.",
"categories": ["new"],
"publishedAt": "2025-01-15T10:00:00Z"
}'