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

Endpoints

The shape.

REST bash
# 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":[/* ... */]}'
TypeScript SDK

When you want types.

@paragraphs/client ts
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",
});
Webhooks

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.

CLI

For scripts and CI.

terminal bash
# 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.