API
Roll your own integration.
Custom CMS? No CMS? Mobile app? The REST API and TypeScript SDK let you put anything you want behind the graph.
The shape.
# Authenticate with API key header
curl https://api.paragraphs.co.uk/v1/units \
-H "Authorization: Bearer pg_live_..." \
-d '{"unit_type":"paragraph","content":"Hello world"}'
# Get a translation by fingerprint
curl https://api.paragraphs.co.uk/v1/translations \
-H "Authorization: Bearer pg_live_..." \
-G --data-urlencode "fingerprint=A3F5C9E27K2P" \
--data-urlencode "locale=es-ES"
# Batch ingest (preferred for bulk)
curl https://api.paragraphs.co.uk/v1/units:batch \
-H "Authorization: Bearer pg_live_..." \
-d '{"units":[/* ... */]}' When you want types.
import { Paragraphs } from "@paragraphs/client";
const pg = new Paragraphs({
apiKey: process.env.PARAGRAPHS_API_KEY!,
projectId: process.env.PARAGRAPHS_PROJECT_ID!,
});
const unit = await pg.units.create({
unitType: "paragraph",
content: "Hello world",
});
const translation = await pg.translations.get({
fingerprint: unit.fingerprint,
locale: "es-ES",
}); Push, not poll.
Subscribe to translation.created, translation.approved, translation.rejected, unit.created. Webhooks are HMAC-signed with a per-endpoint secret you rotate from the dashboard.
For scripts and CI.
# Install
pnpm add -g @paragraphs/cli
paragraphs login
# Common operations
paragraphs units add ./content/*.md --unit-type=paragraph
paragraphs translate --locales=es-ES,fr-FR
paragraphs export --locale=es-ES --format=xliff > es.xliff Start free in 30 seconds.
No credit card. 100,000 words on the free tier. Self-serve onboarding.