makrly

Build with the Makrly API

Build product communication workflows on top of Makrly. Generate reviewed social-ready drafts, manage changelog entries, and connect release communication to your own systems.

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

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.

API keys are available on paid plans. You can create up to 10 active keys, scoped to specific repos and permissions.

Available Scopes

changelog:readRead changelog entrieschangelog:writeCreate, update, delete entriessettings:readRead widget settingssettings:writeUpdate widget settingsanalytics:readRead analytics data

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

Repositories

GET/api/v1/repos

List your tracked repositories

Response
{
  "data": [
    {
      "id": 1,
      "name": "my-app",
      "fullName": "username/my-app",
      "isPrivate": false,
      "isActive": true,
      "notableCommitCount": 42,
      "changelogEntryCount": 15,
      "lastSyncedAt": "2025-01-15T10:00:00Z"
    }
  ]
}
GET/api/v1/repos/:repoId

Get a single repository

Posts

GET/api/v1/repos/:repoId/posts?platform=x&page=1&limit=20

List generated draft posts for a repo

Response
{
  "data": [
    {
      "id": 1,
      "platform": "x",
      "content": "Shipped granular team permissions...",
      "createdAt": "2025-01-15T10:00:00Z",
      "commit": {
        "id": 42,
        "sha": "abc123",
        "message": "feat: add granular team permissions"
      }
    }
  ],
  "meta": { "page": 1, "limit": 20, "total": 5, "totalPages": 1 }
}
POST/api/v1/posts/generate

Generate draft posts from custom text

Request body
{
  "content": "Just shipped a new feature...",
  "repoId": 1,
  "provider": "openai",
  "model": "gpt-4o"
}
Response
{
  "data": {
    "short": "Shipped granular team permissions.",
    "thread": ["Post 1...", "Post 2..."],
    "linkedin": "Excited to announce...",
    "facebookProfile": "New feature alert!...",
    "facebookPage": "We're thrilled..."
  }
}
GET/api/v1/posts/:id

Get a single post

PATCH/api/v1/posts/:id

Update a post's content

Request body
{ "content": "Updated post text..." }

Changelog Entries

GET/api/v1/changelog/entries?repoId=1&status=published&cursor=abc&limit=20

List changelog entries (scope: changelog:read)

Response
{
  "entries": [{ "id": "abc", "title": "Team permissions", "categories": ["new"], ... }],
  "nextCursor": "def",
  "hasMore": true
}
POST/api/v1/changelog/entries

Create a changelog entry (scope: changelog:write)

Request body
{
  "repoId": 1,
  "title": "Team permissions",
  "content": "Admins can now invite teammates with scoped access.",
  "summary": "Added granular team permissions",
  "categories": ["new"],
  "publish": true,
  "publishedAt": "2025-01-15T10:00:00Z"
}
GET/api/v1/changelog/entries/:id

Get a single entry (scope: changelog:read)

PATCH/api/v1/changelog/entries/:id

Update an entry (scope: changelog:write)

Request body
{
  "title": "Updated Title",
  "categories": ["improved"],
  "publish": true,
  "pin": true
}
DELETE/api/v1/changelog/entries/:id

Delete an entry (scope: changelog:write)

Changelog Settings

GET/api/v1/changelog/settings?repoId=1

Get widget settings (scope: settings:read)

POST/api/v1/changelog/settings

Update widget settings (scope: settings:write)

Request body
{
  "repoId": 1,
  "theme": "dark",
  "position": "bottom-right",
  "primaryColor": "#6366f1",
  "isPublic": true
}

Commits

GET/api/v1/repos/:repoId/commits?notable=true&page=1&limit=20

List commits for a repo

Analytics

GET/api/v1/analytics?repoId=1&range=30d

Get unified analytics (scope: analytics:read, Indie plan or higher)

Rate Limits

API Keys
100 requests/minute
Window
Per key

Rate limit info is included in every response via headers:

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_required403The endpoint requires a paid plan
not_found404Resource not found or not owned by you
repo_not_found404Repository not found or not owned by you
validation_error400Invalid request parameters
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

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": "Shipped granular team permissions for my SaaS app.",
    "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": "Team permissions",
    "content": "Admins can now invite teammates with scoped access.",
    "categories": ["new"],
    "publish": true,
    "publishedAt": "2025-01-15T10:00:00Z"
  }'

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.