makrly

For developers

Your workflow.
Our API.

Draft updates, manage your changelog, and bring product communication into the tools you already use.

Live request flow

From GitHub event to reviewed update

Repeats every few seconds
Request
POST /api/v1/posts/generate
{
  "repoId": 42,
  "content": "Made help search faster"
}
Response
200 OKReview ready
{
  "data": {
    "short": "Find the right help article faster."
  }
}

Quick Start

1

Get your API key

Go to Settings → API in your dashboard and create a new API key.

2

Make your first request

curl
curl -H "Authorization: Bearer mk_live_your_key_here" \
  https://www.makrly.com/api/v1/repos
3

Get your repos back

Response
{
  "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 automation

Server-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

DELETE/api/v1/repos

Remove a repository and its associated product content. Existing billing protections apply.

Required scopes: repos:write

GET/api/v1/repos

List only repositories accessible to this key.

Required scopes: repos:read

POST/api/v1/repos

Add 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.

GET/api/v1/repos/{repoId}

Read a tracked repository.

Required scopes: repos:read

GET/api/v1/repos/{repoId}/changelog/entries

Legacy page/limit changelog listing. Filters: status=published|draft|scheduled; categories=comma-separated IDs.

Required scopes: changelog:read

POST/api/v1/repos/{repoId}/changelog/entries

Legacy create route; same validated fields as /changelog/entries, with data response envelope.

Required scopes: changelog:write

GET/api/v1/repos/{repoId}/commits

List undismissed commits with notable=true filtering and page/limit pagination.

Required scopes: commits:read

GET/api/v1/repos/{repoId}/posts

List saved social drafts with platform and page/limit filtering.

Required scopes: posts:read

GET/api/v1/repos/{repoId}/settings

Read or update repository writing instructions.

Required scopes: settings:read

PATCH/api/v1/repos/{repoId}/settings

Read or update repository writing instructions.

Required scopes: settings:write

Accepted fields: customPrompt, customPromptMode. See OpenAPI for types and nullable fields.

POST/api/v1/repos/{repoId}/settings

Read or update repository writing instructions.

Required scopes: settings:write

Accepted fields: customPrompt, customPromptMode. See OpenAPI for types and nullable fields.

POST/api/v1/repos/{repoId}/sync

Sync 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

PATCH/api/v1/commits/{id}

Dismiss or restore a tracked commit.

Required scopes: commits:write

Accepted fields: isDismissed. See OpenAPI for types and nullable fields.

POST/api/v1/commits/dismiss

Dismiss 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

GET/api/v1/posts/{id}

Read a saved social draft.

Required scopes: posts:read

PATCH/api/v1/posts/{id}

Update saved social draft content.

Required scopes: posts:write

POST/api/v1/posts/generate

Generate 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.

POST/api/v1/posts/generate/commit

Generate 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.

POST/api/v1/posts/generate/custom/single

Generate 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.

POST/api/v1/posts/generate/single

Generate 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

POST/api/v1/changelog/create-from-commit

Create 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.

GET/api/v1/changelog/entries

List changelog entries with cursor/limit pagination and status=published|draft|scheduled.

Required scopes: changelog:read

POST/api/v1/changelog/entries

Create a changelog entry. publish=true publishes now or schedules publishedAt; an explicit publishedAt also schedules unless publish=false.

Required scopes: changelog:write

DELETE/api/v1/changelog/entries/{id}

Delete a changelog entry.

Required scopes: changelog:write

GET/api/v1/changelog/entries/{id}

Read a changelog entry.

Required scopes: changelog:read

PATCH/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

POST/api/v1/changelog/entries/{id}/regenerate

Regenerate an existing changelog entry using the configured AI payer.

Required scopes: changelog:write, ai:generate

POST/api/v1/changelog/entries/batch

Approve (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.

POST/api/v1/changelog/generate

Generate changelog drafts from pending commits.

Required scopes: changelog:write, ai:generate

Accepted fields: repoId. See OpenAPI for types and nullable fields.

POST/api/v1/changelog/logo

Upload 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

GET/api/v1/changelog/settings

Read or update all widget, Help Center and Ideas-tab settings. Automation fields additionally require automation:write.

Required scopes: settings:read

PATCH/api/v1/changelog/settings

Read 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.

POST/api/v1/changelog/settings

Read 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.

POST/api/v1/changelog/upload

Upload an entry image (JPG, PNG, GIF or WebP; maximum 4MiB). Multipart fields: file, repoId.

Required scopes: changelog:write

Ideas and Roadmap

POST/api/v1/ideas/comments

Add an owner comment to an idea.

Required scopes: ideas:write

Accepted fields: ideaId, content. See OpenAPI for types and nullable fields.

DELETE/api/v1/ideas/comments/{id}

Delete an owner-authorized idea comment.

Required scopes: ideas:write

GET/api/v1/ideas/entries

List ideas with cursor/limit pagination, category and status filters, including pending-review.

Required scopes: ideas:read

POST/api/v1/ideas/entries

Create an idea, including pending-review entries.

Required scopes: ideas:write

Accepted fields: repoId, title, description, status, category. See OpenAPI for types and nullable fields.

DELETE/api/v1/ideas/entries/{id}

Read, moderate, update roadmap order or delete an idea.

Required scopes: ideas:write

GET/api/v1/ideas/entries/{id}

Read, moderate, update roadmap order or delete an idea.

Required scopes: ideas:read

PATCH/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.

GET/api/v1/ideas/entries/changelog

Read available changelog links for Ideas.

Required scopes: ideas:read, changelog:read

POST/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.

GET/api/v1/ideas/settings

Read or update Ideas and Roadmap settings.

Required scopes: ideas:read

PATCH/api/v1/ideas/settings

Read 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.

POST/api/v1/ideas/settings

Read 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

GET/api/v1/help-docs/analytics

Read Help Center analytics.

Required scopes: help:read, analytics:read

GET/api/v1/help-docs/categories

List or create Help Center categories.

Required scopes: help:read

POST/api/v1/help-docs/categories

List or create Help Center categories.

Required scopes: help:write

Accepted fields: repoId, name, slug, parentId, icon, description. See OpenAPI for types and nullable fields.

DELETE/api/v1/help-docs/categories/{id}

Read, edit or delete a Help Center category.

Required scopes: help:write

GET/api/v1/help-docs/categories/{id}

Read, edit or delete a Help Center category.

Required scopes: help:read

PATCH/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.

POST/api/v1/help-docs/categories/reorder

Reorder categories and update their hierarchy; cycles are rejected.

Required scopes: help:write

Accepted fields: repoId, categories. See OpenAPI for types and nullable fields.

GET/api/v1/help-docs/entries

List or create FAQs and help articles.

Required scopes: help:read

POST/api/v1/help-docs/entries

List 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.

DELETE/api/v1/help-docs/entries/{id}

Read, edit, publish or delete a help entry.

Required scopes: help:write

GET/api/v1/help-docs/entries/{id}

Read, edit, publish or delete a help entry.

Required scopes: help:read

PATCH/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.

POST/api/v1/help-docs/entries/reorder

Move help entries within the authorized repository.

Required scopes: help:write

Accepted fields: repoId, entries. See OpenAPI for types and nullable fields.

POST/api/v1/help-docs/generate

Generate 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.

GET/api/v1/help-docs/sources

List or add public documentation URLs for generation.

Required scopes: help:read

POST/api/v1/help-docs/sources

List or add public documentation URLs for generation.

Required scopes: help:write

Accepted fields: repoId, url, label, fetchMode. See OpenAPI for types and nullable fields.

DELETE/api/v1/help-docs/sources/{id}

Update or delete a documentation source.

Required scopes: help:write

PATCH/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.

POST/api/v1/help-docs/sources/{id}/fetch

Fetch the source using its configured single, subpages or full mode.

Required scopes: help:write

Inbox

GET/api/v1/inbox

Read unified reactions, help feedback, ideas, comments and contact messages. Repository filtering also limits response metadata.

Required scopes: inbox:read

GET/api/v1/inbox/messages

Read contact messages for a repository.

Required scopes: inbox:read

DELETE/api/v1/inbox/messages/{id}

Mark a contact message read/unread or delete it.

Required scopes: inbox:write

PATCH/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.

POST/api/v1/inbox/messages/{id}/reply

Send 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

DELETE/api/v1/domains

Read, configure or remove a custom domain. Existing domain allowances apply.

Required scopes: domains:write

GET/api/v1/domains

Read, configure or remove a custom domain. Existing domain allowances apply.

Required scopes: domains:read

POST/api/v1/domains

Read, 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.

POST/api/v1/domains/verify

Verify DNS for the configured custom domain.

Required scopes: domains:write

Accepted fields: repoId. See OpenAPI for types and nullable fields.

Analytics

GET/api/v1/analytics

Read unified analytics. range=7d|30d|90d|all. metricBasis distinguishes range-filtered events, cumulative views and current snapshots.

Required scopes: analytics:read

Rate Limits

API Keys
100 requests per fixed 60-second window
Window
Per key

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"
}
CodeStatusDescription
unauthenticated401Missing authentication (no API key or session)
missing_auth401Missing or malformed Authorization header
invalid_format401Invalid API key format
invalid_key401API key not found in database
key_revoked401API key has been revoked
key_expired401API key has expired
key_in_query401API key sent as query param (use header instead)
insufficient_scope403API key lacks required scope
repo_scope_mismatch403Repo-scoped key accessing wrong repo
upgrade_required403New keys, writes and AI require active paid, trial or lifetime access
trial_allowance_exhausted403The trial AI request allowance has been reached
forbidden403The operation is not allowed for this resource
invalid_origin403Session-authenticated writes require a trusted first-party origin
not_found404Resource not found or not owned by you
repo_not_found404Repository not found or not owned by you
validation_error400Invalid request parameters
validation_error413The JSON or multipart request exceeds its size limit
validation_error415The request Content-Type is not supported
missing_repo_id400repoId is required for account-scoped keys
configuration_error400Required account configuration is missing
rate_limited429Too many requests (Retry-After header included)
server_error500Internal server error
internal_error500Internal server error
service_unavailable503Authentication 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 repos

Python (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 repos

Generate 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
  }'

AI Integration

Feed our docs to your AI assistant to build integrations faster:

llms.txtConcise product overview for AIView
llms-full.txtComplete docs for AI coding assistantsView
openapi.yamlOpenAPI 3.0 specificationView

Tip: Paste llms-full.txt into Claude, Cursor, or Copilot and ask it to build your integration.