Developer Documentation
Integrate The Thread into your website with our public REST API and embeddable widgets. No authentication required.
REST API
Base URL: https://thethread.app/api/public · All responses follow the format { data, meta }
/api/public/org/{slug}Fetch public organisation information.
curl https://thethread.app/api/public/org/my-orgResponse
{
"data": {
"name": "My Organisation",
"slug": "my-org",
"logo_url": "https://...",
"hero_url": "https://...",
"brand_color": "#1a1a2e",
"dark_color": "#0d0d1a",
"about_html": "<p>About us...</p>"
},
"meta": {}
}/api/public/org/{slug}/threadsList an organisation's public threads.
Query parameters
statusstring"active" (default) or "closed"limitnumberMax results (1–100, default 20)offsetnumberPagination offset (default 0)curl "https://thethread.app/api/public/org/my-org/threads?limit=6"Response
{
"data": [
{
"id": "uuid",
"title": "Leadership Workshop",
"slug": "leadership-workshop",
"intention": "Grow together",
"starts_at": "2026-04-01T09:00:00Z",
"ends_at": "2026-04-03T17:00:00Z",
"is_paid": true,
"price_amount": 29500,
"price_currency": "eur",
"image_url": "https://...",
"status": "active"
}
],
"meta": { "total": 12, "limit": 6, "offset": 0 }
}/api/public/threads/{id}Fetch a single thread with its engagements and hosts.
curl https://thethread.app/api/public/threads/THREAD_IDResponse (abbreviated)
{
"data": {
"id": "uuid",
"title": "Leadership Workshop",
"slug": "leadership-workshop",
"engagements": [
{
"id": "uuid",
"title": "Opening Keynote",
"type": "event",
"scheduled_at": "2026-04-01T09:00:00Z",
"ends_at": "2026-04-01T10:00:00Z",
"duration": 60,
"location": "Main Hall",
"meeting_url": null,
"description": "..."
}
],
"hosts": [
{ "full_name": "Jane Smith", "avatar_url": "https://..." }
]
},
"meta": {}
}/api/public/threads/{id}/agendaFetch the thread agenda grouped by date. Only works if the thread has public agenda enabled.
curl https://thethread.app/api/public/threads/THREAD_ID/agendaResponse (abbreviated)
{
"data": {
"thread_id": "uuid",
"title": "Leadership Workshop",
"timezone": "Europe/Amsterdam",
"days": [
{
"date": "2026-04-01",
"label": "Wednesday, 1 April",
"items": [
{
"time": "09:00",
"title": "Opening Keynote",
"type": "event",
"duration": 60,
"location": "Main Hall",
"description": "..."
}
]
}
],
"unscheduled": []
},
"meta": {}
}/api/public/threads/{id}/hostsFetch the hosts for a thread.
curl https://thethread.app/api/public/threads/THREAD_ID/hostsResponse
{
"data": [
{ "full_name": "Jane Smith", "avatar_url": "https://..." },
{ "full_name": "John Doe", "avatar_url": null }
],
"meta": {}
}Embeddable Widgets
Add Thread content to any website with a single script tag. Widgets use Shadow DOM for style isolation and work with any framework.
Include the script
<script src="https://thethread.app/embed.js"></script>Thread Listing
Displays a grid of upcoming threads for an organisation.
<div
data-thread-widget="threads"
data-org="my-org"
data-limit="6"
data-theme="light"
></div>data-orgrequiredOrganisation slugdata-limitoptionalMax threads to show (default 6)data-themeoptional"light" (default) or "dark"Thread Agenda
Renders a date-grouped timeline of a thread's sessions.
<div
data-thread-widget="agenda"
data-thread="THREAD_ID"
data-theme="light"
></div>data-threadrequiredThread ID (UUID)data-themeoptional"light" (default) or "dark"Registration Button
A styled button that links to the registration page.
<!-- For a full thread -->
<div
data-thread-widget="register"
data-thread="THREAD_ID"
data-text="Register now"
></div>
<!-- For a single engagement -->
<div
data-thread-widget="register"
data-engagement="ENGAGEMENT_ID"
data-text="Sign up"
></div>data-threadrequired*Thread ID (provide thread or engagement)data-engagementrequired*Engagement ID (alternative to thread)data-textoptionalButton text (default "Register now")data-themeoptional"light" (default) or "dark"Notes
CORS
All endpoints return Access-Control-Allow-Origin: * so you can call them from any domain.
Error format
Errors return { "error": "message" } with an appropriate HTTP status code.
Rate limiting
Responses include an X-RateLimit-Remaining header (informational). Rate limiting is not enforced yet.