For developers
Your workflow.
Our API.
Draft updates, manage your changelog, and bring product communication into the tools you already use.
/api/v1/changelog/entries{
"repoId": 42,
"title": "Date-range exports",
"content": "Export the dates you need.",
"categories": ["improved"],
"publish": false
}From GitHub event to reviewed update
{
"repoId": 42,
"content": "Made help search faster"
}{
"data": {
"short": "Find the right help article faster."
}
}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://www.makrly.com/api/v1/repos
Get your repos back
{
"data": [
{
"id": 1,
"fullName": "you/your-repo",
"notableCommitCount": 42,
"changelogEntryCount": 15
}
]
}Authentication
Server integrations authenticate with 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.
API keys are available on paid plans, eligible trials and lifetime plans. You can create up to 10 active keys, scoped to specific repos and permissions. Active access is required for new keys, writes and AI generation. Existing authenticated reads and exports remain available after expiry.
Existing keys retain their permissions. Issue a new key to access new features. The dashboard defaults to read permissions; add writes, AI generation and email replies only as needed.
Available Scopes
repos:readRead repositoriesrepos:writeAdd, remove and sync repositoriescommits:readRead commitscommits:writeSync and dismiss commitsposts:readRead social draftsposts:writeEdit and save social draftschangelog:readRead changelog entrieschangelog:writeCreate, publish and delete updatessettings:readRead widget and project settingssettings:writeUpdate widget and project settingsanalytics:readRead analyticsideas:readRead Ideas and Roadmapideas:writeManage Ideas and Roadmaphelp:readRead Help Center contenthelp:writeManage Help Center content and sourcesinbox:readRead customer feedbackinbox:writeManage contact messagesinbox:replySend email repliesdomains:readRead domain configurationdomains:writeConfigure and verify domainsai:generateGenerate content using the configured AI payerautomation:writeChange automatic publishing and Ideas automationServer-side only: API keys are designed for server-to-server requests. Do not expose your key in client-side code (browsers, mobile apps), even though API responses include CORS headers for integration compatibility.
Base URL
https://www.makrly.com/api/v1
Endpoints
JSON bodies reject unknown fields and are capped at 128KiB. AI operations use your configured payer and the dashboard quality checks. Help generation publishes articles; Inbox reply sends a real email. Image Maker, team membership, billing and outbound webhook subscriptions have no v1 endpoints. Response envelopes vary by operation; consult the OpenAPI reference.
Repositories
/api/v1/reposRemove a repository and its associated product content. Existing billing protections apply.
Required scopes: repos:write
/api/v1/reposList only repositories accessible to this key.
Required scopes: repos:read
/api/v1/reposAdd a GitHub repository verified using the owner GitHub connection. Requires an account-wide key.
Required scopes: repos:write
Accepted fields: githubId, fullName. See OpenAPI for types and nullable fields.
/api/v1/repos/{repoId}Read a tracked repository.
Required scopes: repos:read
/api/v1/repos/{repoId}/changelog/entriesLegacy page/limit changelog listing. Filters: status=published|draft|scheduled; categories=comma-separated IDs.
Required scopes: changelog:read
/api/v1/repos/{repoId}/changelog/entriesLegacy create route; same validated fields as /changelog/entries, with data response envelope.
Required scopes: changelog:write
/api/v1/repos/{repoId}/commitsList undismissed commits with notable=true filtering and page/limit pagination.
Required scopes: commits:read
/api/v1/repos/{repoId}/postsList saved social drafts with platform and page/limit filtering.
Required scopes: posts:read
/api/v1/repos/{repoId}/settingsRead or update repository writing instructions.
Required scopes: settings:read
/api/v1/repos/{repoId}/settingsRead or update repository writing instructions.
Required scopes: settings:write
Accepted fields: customPrompt, customPromptMode. See OpenAPI for types and nullable fields.
/api/v1/repos/{repoId}/settingsRead or update repository writing instructions.
Required scopes: settings:write
Accepted fields: customPrompt, customPromptMode. See OpenAPI for types and nullable fields.
/api/v1/repos/{repoId}/syncSync only this repository from GitHub. fullSync requests up to 100 commits; otherwise up to 30. Existing sync access rules apply.
Required scopes: ai:generate, repos:write, commits:write
Accepted fields: repoId, fullSync. See OpenAPI for types and nullable fields.
Commits
/api/v1/commits/{id}Dismiss or restore a tracked commit.
Required scopes: commits:write
Accepted fields: isDismissed. See OpenAPI for types and nullable fields.
/api/v1/commits/dismissDismiss specific commitIds, or all skipped commits when dismissAll is true, within one repository.
Required scopes: commits:write
Accepted fields: repoId, commitIds, dismissAll. See OpenAPI for types and nullable fields.
Social drafts
/api/v1/posts/{id}Read a saved social draft.
Required scopes: posts:read
/api/v1/posts/{id}Update saved social draft content.
Required scopes: posts:write
/api/v1/posts/generateGenerate social drafts from custom text using the configured AI payer and quality checks. Returns data; does not save posts.
Required scopes: ai:generate
Accepted fields: repoId, content, provider, model. See OpenAPI for types and nullable fields.
/api/v1/posts/generate/commitGenerate and save all social drafts for a tracked commit. Returns data.
Required scopes: ai:generate, posts:write
Accepted fields: commitId, provider, model. See OpenAPI for types and nullable fields.
/api/v1/posts/generate/custom/singleGenerate one platform draft from custom text without saving.
Required scopes: ai:generate
Accepted fields: repoId, content, platform, provider, model, revisionIntent. See OpenAPI for types and nullable fields.
/api/v1/posts/generate/singleGenerate and save one platform draft for a tracked commit.
Required scopes: ai:generate, posts:write
Accepted fields: commitId, platform, provider, model, revisionIntent. See OpenAPI for types and nullable fields.
Changelog
/api/v1/changelog/create-from-commitCreate a changelog draft from an existing commit SHA in this repository.
Required scopes: changelog:write
Accepted fields: repoId, sha. See OpenAPI for types and nullable fields.
/api/v1/changelog/entriesList changelog entries with cursor/limit pagination and status=published|draft|scheduled.
Required scopes: changelog:read
/api/v1/changelog/entriesCreate a changelog entry. publish=true publishes now or schedules publishedAt; an explicit publishedAt also schedules unless publish=false.
Required scopes: changelog:write
/api/v1/changelog/entries/{id}Delete a changelog entry.
Required scopes: changelog:write
/api/v1/changelog/entries/{id}Read a changelog entry.
Required scopes: changelog:read
/api/v1/changelog/entries/{id}Edit, publish, unpublish, schedule or pin an entry. At most three entries can be pinned per repository.
Required scopes: changelog:write
/api/v1/changelog/entries/{id}/regenerateRegenerate an existing changelog entry using the configured AI payer.
Required scopes: changelog:write, ai:generate
/api/v1/changelog/entries/batchApprove (publish) or reject (delete) changelog drafts. Every ID must belong to the authorized repository.
Required scopes: changelog:write
Accepted fields: repoId, entryIds, action. See OpenAPI for types and nullable fields.
/api/v1/changelog/generateGenerate changelog drafts from pending commits.
Required scopes: changelog:write, ai:generate
Accepted fields: repoId. See OpenAPI for types and nullable fields.
/api/v1/changelog/logoUpload the authorized repository logo (JPG, PNG, GIF or WebP; maximum 2MB). Multipart fields: file, repoId; token is resolved securely from repoId.
Required scopes: settings:write
/api/v1/changelog/settingsRead or update all widget, Help Center and Ideas-tab settings. Automation fields additionally require automation:write.
Required scopes: settings:read
/api/v1/changelog/settingsRead or update all widget, Help Center and Ideas-tab settings. Automation fields additionally require automation:write.
Required scopes: settings:write
Accepted fields: repoId, theme, position, primaryColor, triggerIcon, title, customSlug, autoMode, autoCategory, websiteName, seoDescription, fontFamily, displayMode, slideInPosition, slideInWidth, slideInTabVertical, slideInTabLabel, slideInTabIcon, slideInTheme, slideInAccentColor, slideInTitle, defaultTab, combinedTitle, helpContactEmail, ideasDefaultTab, showBadge, showPulse, isPublic, autoPublish, slideInOverlay, slideInShowBadge, slideInHideTab, helpEnabled, changelogEnabled, ideasEnabled, ideasShowRoadmap, customCategories, entryTemplates, logoUrl, websiteUrl. See OpenAPI for types and nullable fields.
/api/v1/changelog/settingsRead or update all widget, Help Center and Ideas-tab settings. Automation fields additionally require automation:write.
Required scopes: settings:write
Accepted fields: repoId, theme, position, primaryColor, triggerIcon, title, customSlug, autoMode, autoCategory, websiteName, seoDescription, fontFamily, displayMode, slideInPosition, slideInWidth, slideInTabVertical, slideInTabLabel, slideInTabIcon, slideInTheme, slideInAccentColor, slideInTitle, defaultTab, combinedTitle, helpContactEmail, ideasDefaultTab, showBadge, showPulse, isPublic, autoPublish, slideInOverlay, slideInShowBadge, slideInHideTab, helpEnabled, changelogEnabled, ideasEnabled, ideasShowRoadmap, customCategories, entryTemplates, logoUrl, websiteUrl. See OpenAPI for types and nullable fields.
/api/v1/changelog/uploadUpload an entry image (JPG, PNG, GIF or WebP; maximum 4MiB). Multipart fields: file, repoId.
Required scopes: changelog:write
Ideas and Roadmap
/api/v1/ideas/commentsAdd an owner comment to an idea.
Required scopes: ideas:write
Accepted fields: ideaId, content. See OpenAPI for types and nullable fields.
/api/v1/ideas/comments/{id}Delete an owner-authorized idea comment.
Required scopes: ideas:write
/api/v1/ideas/entriesList ideas with cursor/limit pagination, category and status filters, including pending-review.
Required scopes: ideas:read
/api/v1/ideas/entriesCreate an idea, including pending-review entries.
Required scopes: ideas:write
Accepted fields: repoId, title, description, status, category. See OpenAPI for types and nullable fields.
/api/v1/ideas/entries/{id}Read, moderate, update roadmap order or delete an idea.
Required scopes: ideas:write
/api/v1/ideas/entries/{id}Read, moderate, update roadmap order or delete an idea.
Required scopes: ideas:read
/api/v1/ideas/entries/{id}Read, moderate, update roadmap order or delete an idea.
Required scopes: ideas:write
Accepted fields: title, description, status, category, roadmapOrder. See OpenAPI for types and nullable fields.
/api/v1/ideas/entries/changelogRead available changelog links for Ideas.
Required scopes: ideas:read, changelog:read
/api/v1/ideas/matches/{id}Approve or reject an automatic idea match. Approving completes the idea and adds a comment unless comment is false.
Required scopes: ideas:write
Accepted fields: action, comment. See OpenAPI for types and nullable fields.
/api/v1/ideas/settingsRead or update Ideas and Roadmap settings.
Required scopes: ideas:read
/api/v1/ideas/settingsRead or update Ideas and Roadmap settings.
Required scopes: ideas:write
Accepted fields: repoId, title, primaryColor, isPublic, customSlug, logoUrl, websiteUrl, websiteName, seoDescription, allowPublicSubmissions, requireEmailForSubmission, showVoteCounts, showRoadmap, categories, autoCloseMatchedIdeas, autoCommentOnAutoClose, autoCloseConfidenceThreshold. See OpenAPI for types and nullable fields.
/api/v1/ideas/settingsRead or update Ideas and Roadmap settings.
Required scopes: ideas:write
Accepted fields: repoId, title, primaryColor, isPublic, customSlug, logoUrl, websiteUrl, websiteName, seoDescription, allowPublicSubmissions, requireEmailForSubmission, showVoteCounts, showRoadmap, categories, autoCloseMatchedIdeas, autoCommentOnAutoClose, autoCloseConfidenceThreshold. See OpenAPI for types and nullable fields.
Help Center
/api/v1/help-docs/analyticsRead Help Center analytics.
Required scopes: help:read, analytics:read
/api/v1/help-docs/categoriesList or create Help Center categories.
Required scopes: help:read
/api/v1/help-docs/categoriesList or create Help Center categories.
Required scopes: help:write
Accepted fields: repoId, name, slug, parentId, icon, description. See OpenAPI for types and nullable fields.
/api/v1/help-docs/categories/{id}Read, edit or delete a Help Center category.
Required scopes: help:write
/api/v1/help-docs/categories/{id}Read, edit or delete a Help Center category.
Required scopes: help:read
/api/v1/help-docs/categories/{id}Read, edit or delete a Help Center category.
Required scopes: help:write
Accepted fields: repoId, name, slug, parentId, icon, description. See OpenAPI for types and nullable fields.
/api/v1/help-docs/categories/reorderReorder categories and update their hierarchy; cycles are rejected.
Required scopes: help:write
Accepted fields: repoId, categories. See OpenAPI for types and nullable fields.
/api/v1/help-docs/entriesList or create FAQs and help articles.
Required scopes: help:read
/api/v1/help-docs/entriesList or create FAQs and help articles.
Required scopes: help:write
Accepted fields: repoId, type, categoryId, category, question, title, slug, excerpt, answer, keywords, isPublished, order. See OpenAPI for types and nullable fields.
/api/v1/help-docs/entries/{id}Read, edit, publish or delete a help entry.
Required scopes: help:write
/api/v1/help-docs/entries/{id}Read, edit, publish or delete a help entry.
Required scopes: help:read
/api/v1/help-docs/entries/{id}Read, edit, publish or delete a help entry.
Required scopes: help:write
Accepted fields: repoId, type, categoryId, category, question, title, slug, excerpt, answer, keywords, isPublished, order. See OpenAPI for types and nullable fields.
/api/v1/help-docs/entries/reorderMove help entries within the authorized repository.
Required scopes: help:write
Accepted fields: repoId, entries. See OpenAPI for types and nullable fields.
/api/v1/help-docs/generateGenerate and publish Help Center articles and FAQs from fetched sources. Full mode replaces prior entries only after successful saves.
Required scopes: help:write, ai:generate
Accepted fields: repoId, regenerate, mode. See OpenAPI for types and nullable fields.
/api/v1/help-docs/sourcesList or add public documentation URLs for generation.
Required scopes: help:read
/api/v1/help-docs/sourcesList or add public documentation URLs for generation.
Required scopes: help:write
Accepted fields: repoId, url, label, fetchMode. See OpenAPI for types and nullable fields.
/api/v1/help-docs/sources/{id}Update or delete a documentation source.
Required scopes: help:write
/api/v1/help-docs/sources/{id}Update or delete a documentation source.
Required scopes: help:write
Accepted fields: label, fetchMode. See OpenAPI for types and nullable fields.
/api/v1/help-docs/sources/{id}/fetchFetch the source using its configured single, subpages or full mode.
Required scopes: help:write
Inbox
/api/v1/inboxRead unified reactions, help feedback, ideas, comments and contact messages. Repository filtering also limits response metadata.
Required scopes: inbox:read
/api/v1/inbox/messagesRead contact messages for a repository.
Required scopes: inbox:read
/api/v1/inbox/messages/{id}Mark a contact message read/unread or delete it.
Required scopes: inbox:write
/api/v1/inbox/messages/{id}Mark a contact message read/unread or delete it.
Required scopes: inbox:write
Accepted fields: repoId, isRead. See OpenAPI for types and nullable fields.
/api/v1/inbox/messages/{id}/replySend an email reply to the contact message sender, then mark it read.
Required scopes: inbox:reply
Accepted fields: repoId, subject, body. See OpenAPI for types and nullable fields.
Domains
/api/v1/domainsRead, configure or remove a custom domain. Existing domain allowances apply.
Required scopes: domains:write
/api/v1/domainsRead, configure or remove a custom domain. Existing domain allowances apply.
Required scopes: domains:read
/api/v1/domainsRead, configure or remove a custom domain. Existing domain allowances apply.
Required scopes: domains:write
Accepted fields: repoId, domain. See OpenAPI for types and nullable fields.
/api/v1/domains/verifyVerify DNS for the configured custom domain.
Required scopes: domains:write
Accepted fields: repoId. See OpenAPI for types and nullable fields.
Analytics
/api/v1/analyticsRead unified analytics. range=7d|30d|90d|all. metricBasis distinguishes range-filtered events, cumulative views and current snapshots.
Required scopes: analytics:read
Rate Limits
Authenticated requests include rate limit headers, including validation and scope failures:
X-RateLimit-Limit: 100 X-RateLimit-Remaining: 99 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": "Repository not found",
"code": "not_found"
}| Code | Status | Description |
|---|---|---|
| unauthenticated | 401 | Missing authentication (no API key or session) |
| missing_auth | 401 | Missing or malformed Authorization header |
| 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 |
| upgrade_required | 403 | New keys, writes and AI require active paid, trial or lifetime access |
| trial_allowance_exhausted | 403 | The trial AI request allowance has been reached |
| forbidden | 403 | The operation is not allowed for this resource |
| invalid_origin | 403 | Session-authenticated writes require a trusted first-party origin |
| not_found | 404 | Resource not found or not owned by you |
| repo_not_found | 404 | Repository not found or not owned by you |
| validation_error | 400 | Invalid request parameters |
| validation_error | 413 | The JSON or multipart request exceeds its size limit |
| validation_error | 415 | The request Content-Type is not supported |
| missing_repo_id | 400 | repoId is required for account-scoped keys |
| configuration_error | 400 | Required account configuration is missing |
| rate_limited | 429 | Too many requests (Retry-After header included) |
| server_error | 500 | Internal server error |
| internal_error | 500 | Internal server error |
| service_unavailable | 503 | Authentication or rate-limit storage is temporarily unavailable |
Code Examples
JavaScript (fetch)
const response = await fetch("https://www.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://www.makrly.com/api/v1/repos",
headers={"Authorization": "Bearer mk_live_your_key_here"}
)
data = response.json()["data"]
print(data) # Your reposGenerate draft posts from text
curl -X POST https://www.makrly.com/api/v1/posts/generate \
-H "Authorization: Bearer mk_live_your_key_here" \
-H "Content-Type: application/json" \
-d '{
"content": "Made help search faster for customers.",
"repoId": 1
}'Create a changelog entry
curl -X POST https://www.makrly.com/api/v1/changelog/entries \
-H "Authorization: Bearer mk_live_your_key_here" \
-H "Content-Type: application/json" \
-d '{
"repoId": 1,
"title": "Faster help search",
"content": "Search now finds the right help article faster.",
"categories": ["new"],
"publish": true
}'