Who can use it
API access is included with the Growth plan and above. Keys are created in the Growth Hub under API & agents; each key authenticates as you and can only do what your account can do in the Growth Hub itself.
| Level | Plans | What it allows |
|---|---|---|
| No API access | Free, Starter | Use the Growth Hub in your browser. Upgrade to Growth or above to create API keys. |
| Limited | Growth | Manage your listings and read your leads and promotions programmatically. |
| Full | Pro, Enterprise | Everything in Limited plus acting on leads and buying promotions. |
Monthly call quotas follow the plan (Growth 10,000, Pro 100,000, Enterprise unlimited) and every key is limited per minute. See pricing.
Authentication
Send your key as a bearer token. Keys start with tlk_live_, are shown once when created, and can be revoked at any time.
curl https://backend.trustlist.uk/api/users/my/dashboard \
-H "Authorization: Bearer tlk_live_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"Scopes
Each key carries the scopes you choose. A call needs the matching scope, and your plan level must include it.
| Scope | Allows | From |
|---|---|---|
account:read | Read your profile, dashboard summary, plan entitlements and usage. | Growth |
listings:read | Read the companies, products and articles you own, including drafts. | Growth |
listings:write | Create drafts, edit content, upload media, publish and unpublish — subject to the listing guidelines and your plan's slot caps. | Growth |
leads:read | Read the lead inbox: demo, quote, project and job requests aimed at your listings, with responses. | Growth |
leads:write | Qualify, dismiss and respond to leads (qualifying a lead uses your plan's lead allowance or wallet). | Pro |
promotions:read | See sponsored-placement availability, your active placements and open award editions. | Growth |
promotions:write | Place orders for sponsored placements and other offerings using your saved payment method or credits. | Pro |
Endpoints
The API is the same set of owner-scoped endpoints the Growth Hub uses, so anything you can do there you can automate. Base URL: https://backend.trustlist.uk.
| Method | Path | Scope | Purpose |
|---|---|---|---|
GET | /api/users/me | account:read | The key owner's profile. |
GET | /api/users/my/dashboard | account:read | Dashboard summary: your listings, counts and status. |
GET | /api/billing/growth-status | account:read | Plan, usage (leads, invitations, placements) and listing verification status. |
GET | /api/billing/entitlements | account:read | Your plan's entitlements, including API level and monthly call quota. |
GET | /api/users/my/{company|product|article} | listings:read | List the listings you own of that type. |
GET | /api/users/my/{company|product|article}/{id} | listings:read | One listing with its content sections. |
POST | /api/users/my/add/{company|product|article} | listings:write | Create a draft listing. Body: name, type_listing (slug or id), then content fields. |
PUT | /api/users/my/update/{company|product|article}/{id} | listings:write | Edit a listing. Include { publish: { is_published: true } } to publish; articles must meet the quality minimums. |
POST | /api/users/my/listing-move/change-type | listings:write | Move a listing to another (non staff-only) listing type. |
POST | /api/upload | listings:write | Upload an image (multipart) for use in a listing. |
POST | /api/launches/submit | listings:write | Announce a launch for a listing you own (pending review). |
GET | /api/requests/inbox | leads:read | Verified leads aimed at your companies and products, with responses. |
POST | /api/requests/{id}/qualify | leads:write | Mark a lead qualified (consumes plan allowance or wallet). |
POST | /api/requests/{id}/respond | leads:write | Reply to a lead, optionally with a quote. |
POST | /api/requests/{id}/dismiss | leads:write | Dismiss a lead. |
GET | /api/billing/placement-availability | promotions:read | Which sponsored slots are available for a category or search. |
GET | /api/billing/placements | promotions:read | Sponsored placements currently active. |
POST | /api/billing/orders | promotions:write | Order an offering (e.g. a sponsored placement) for one of your listings. |
GET | /api/type-listings | public | Listing types / categories (public). |
GET | /api/terms | public | Taxonomy terms (public). |
Publishing an article
# 1. create a draft
curl -X POST https://backend.trustlist.uk/api/users/my/add/article \
-H "Authorization: Bearer $TRUSTLIST_API_KEY" -H "Content-Type: application/json" \
-d '{"name":"How we cut onboarding time in half","type_listing":"blog",
"contents":{"long_desc":"# How we cut onboarding time in half\n\n## Why it mattered ..."}}'
# 2. publish it (fails with 422 and the counts if the body is under the minimums)
curl -X PUT https://backend.trustlist.uk/api/users/my/update/article/<id> \
-H "Authorization: Bearer $TRUSTLIST_API_KEY" -H "Content-Type: application/json" \
-d '{"publish":{"is_published":true}}'The same rules as the Growth Hub
Automation doesn't bypass the listing guidelines. Articles publish only with at least 2,000 words, 1 main heading and 4section headings; staff-managed listing types can't be selected; plan slot caps still apply. These checks run on the server for every write, whichever client made it.
Companies and products have their own bar, and it applies at publish — never to a draft. A listing goes live only with a description of at least 120 characters, at least 1 category, and a working http(s) website. Publishing without them returns 400 with a machine-readable body naming exactly what is missing, so an agent can fix and retry without guessing:
{
"error": {
"status": 400,
"message": "This listing is not ready to publish: the description is 18 characters and needs at least 120. pick at least 1 category so buyers can find it.",
"details": {
"missing": ["description", "categories"],
"descriptionChars": 18,
"minDescriptionChars": 120,
"categories": 0,
"minCategories": 1,
"website": "https://example-vendor.co.uk"
}
}
}There is also a ceiling: a listing may carry at most 20 categories, and unlike the checks above this one applies to every write, not just publishing — a PUT that would leave the listing above the cap is refused with 400 and { "categories": 47, "maxCategories": 20 }. Attaching every category and every town does not widen reach; it dilutes the category pages other businesses earned their place on, and listings already stuffed beyond the cap are trimmed back.
Write the listing properly the first time rather than publishing a stub and filling it in later: a thin page earns nothing, and listings whose website stops resolving are eventually marked closed. If you are generating listings from your own data, populate the description, categories and website in the same call that creates them.
Errors and limits
| Status | Meaning |
|---|---|
401 | Missing, invalid, expired or revoked key. |
403 | Endpoint not available to keys, scope missing from the key, plan level too low, or listing guideline violated (staff-only listing type). |
422 | Article quality minimums not met (the response lists word and heading counts). |
429 | Per-minute rate limit or monthly plan quota reached. |
AI agents and Claude
Because the API is plain HTTPS with a bearer key, any agent framework that can make web requests can use it today: give the agent your key as a secret and this page as its reference. Keep the key scoped to what the agent needs (for example listings:read and listings:write for a content agent), set an expiry, and revoke it when the job is done.
For Claude Desktop, Claude Code and other MCP-aware assistants there is an MCP server that wraps these endpoints as tools (list and edit listings, check an article against the publishing minimums before publishing, read and answer leads, check placement availability). It lives in the TrustList repository under packages/mcp-server and runs locally with your key:
{ "mcpServers": { "trustlist": {
"command": "node",
"args": ["/path/to/TrustList/packages/mcp-server/src/index.js"],
"env": { "TRUSTLIST_API_KEY": "tlk_live_..." } } } }The server holds no privilege beyond the key you give it, so revoking the key cuts the assistant off instantly.
Questions or a use case we don't cover yet? Contact us.