LinkArtemis API
The LinkArtemis API lets you fetch your completed articles programmatically and push them into any CMS, website builder, or custom app including Lovable, Webflow, Framer, or anything you've built yourself.
Step 1: Get your API key
- In your workspace, go to Integrations
- Click the API card, then Manage
- Click Generate new key
- Give it a descriptive name
- Click Generate
- Copy the key immediately, it looks like this:
la_live_AbCdEfGhIjKlMnOpQrStUvWxYz012345678901234
Important: The full key is only shown once. We never store it in plain text. If you lose it, revoke it and generate a new one.
Step 2: Make your first request
Pass your key on every request using the X-API-Key header:
curl https://app.linkartemis.com/api/v1/articles \ -H "X-API-Key: la_live_your_key_here"
Or use Authorization: Bearer if your HTTP client prefers it:
curl https://app.linkartemis.com/api/v1/articles \ -H "Authorization: Bearer la_live_your_key_here"
Your key is tied to your workspace, every response is automatically scoped to your articles only.
Endpoints
List articles
GET https://app.linkartemis.com/api/v1/articles
Returns a paginated list of your completed articles, newest first.
Query parameters:
| Parameter | Default | Max | Description |
|---|---|---|---|
limit
|
20
|
100
|
How many articles to return
|
offset
|
0
|
—
|
How many to skip (for paging)
|
Example:
curl "https://app.linkartemis.com/api/v1/articles?limit=10&offset=0" \ -H "X-API-Key: la_live_your_key_here"
Response:
[
{
"id": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
"title": "10 Best Practices for E-commerce SEO",
"slug": "best-practices-ecommerce-seo",
"excerpt": "A concise guide to improving your store's search visibility.",
"meta_description": "A concise guide to improving your store's search visibility.",
"hero_image_url": "https://images.pexels.com/photos/123456/pexels-photo.jpg",
"keywords": ["ecommerce seo"],
"language_code": "US",
"created_at": "2026-05-20T10:30:00.000Z"
}
]
The list endpoint returns summaries only — no article body. Use the detail endpoint below to get the full content.
Get a single article
GET https://app.linkartemis.com/api/v1/articles/:id
Returns the full article including the HTML and Markdown body.
Example:
curl https://app.linkartemis.com/api/v1/articles/a1b2c3d4-e5f6-7890-abcd-ef1234567890 \ -H "X-API-Key: la_live_your_key_here"
Response:
{
"id": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
"title": "10 Best Practices for E-commerce SEO",
"slug": "best-practices-ecommerce-seo",
"excerpt": "A concise guide to improving your store's search visibility.",
"meta_description": "A concise guide to improving your store's search visibility.",
"hero_image_url": "https://images.pexels.com/photos/123456/pexels-photo.jpg",
"keywords": ["ecommerce seo"],
"language_code": "US",
"created_at": "2026-05-20T10:30:00.000Z",
"content_html": "<p>When it comes to e-commerce...</p><h2>1. Optimise product pages</h2>...",
"content_markdown": "When it comes to e-commerce...\n\n## 1. Optimise product pages\n..."
}
Which format should I use?
content_html— for most CMSs, website builders, and custom appscontent_markdown— for Markdown-based tools like Notion, MDX, or Obsidian
The
<h1>title is stripped from bothcontent_htmlandcontent_markdown— it's provided separately in thetitlefield, so you won't get a duplicate heading when you render the content.
Pagination
Articles are sorted newest first. To page through them:
# Page 1 curl "https://app.linkartemis.com/api/v1/articles?limit=20&offset=0" \ -H "X-API-Key: la_live_your_key_here" # Page 2 curl "https://app.linkartemis.com/api/v1/articles?limit=20&offset=20" \ -H "X-API-Key: la_live_your_key_here"
When a response contains fewer items than your limit , you've reached the end.
Code examples
Fetch all articles (JavaScript)
async function fetchAllArticles() {
const allArticles = [];
let offset = 0;
const limit = 50;
while (true) {
const res = await fetch(
`https://app.linkartemis.com/api/v1/articles?limit=${limit}&offset=${offset}`,
{ headers: { 'X-API-Key': process.env.LINKARTEMIS_API_KEY } }
);
if (!res.ok) throw new Error(`API error: ${res.status}`);
const articles = await res.json();
if (articles.length === 0) break;
allArticles.push(...articles);
if (articles.length < limit) break;
offset += limit;
}
return allArticles;
}
Push a single article to your CMS (JavaScript)
async function syncArticle(articleId) {
const res = await fetch(
`https://app.linkartemis.com/api/v1/articles/${articleId}`,
{ headers: { 'X-API-Key': process.env.LINKARTEMIS_API_KEY } }
);
if (!res.ok) throw new Error(`Failed to fetch article: ${res.status}`);
const article = await res.json();
// Map to your CMS fields
await fetch('https://your-cms.example.com/posts', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({
title: article.title,
slug: article.slug,
body: article.content_html,
description: article.meta_description,
featured_image: article.hero_image_url,
}),
});
}
Rate limits
You can make up to 60 requests per minute per API key. If you exceed this, you'll get a 429 response with a Retry-After header telling you how many seconds to wait before retrying.
Error codes
| Code | Meaning |
|---|---|
401
|
Missing, invalid, or revoked API key
|
404
|
Article not found (wrong ID, or article isn't complete yet)
|
429
|
Rate limit exceeded — wait and retry
|
500
|
Server error — try again in a moment
|
Managing keys
You can have multiple active keys at the same time which is useful for separating environments or integrations.
To revoke a key: Go to Integrations → API → Manage, find the key by name, and click Revoke. Revocation is instant.
To rotate a key:
- Generate a new key and update your app to use it
- Confirm it works
- Revoke the old key