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 }

GET/api/public/org/{slug}

Fetch public organisation information.

bash
curl https://thethread.app/api/public/org/my-org

Response

json
{
  "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": {}
}
GET/api/public/org/{slug}/threads

List an organisation's public threads.

Query parameters

statusstring"active" (default) or "closed"
limitnumberMax results (1–100, default 20)
offsetnumberPagination offset (default 0)
bash
curl "https://thethread.app/api/public/org/my-org/threads?limit=6"

Response

json
{
  "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 }
}
GET/api/public/threads/{id}

Fetch a single thread with its engagements and hosts.

bash
curl https://thethread.app/api/public/threads/THREAD_ID

Response (abbreviated)

json
{
  "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": {}
}
GET/api/public/threads/{id}/agenda

Fetch the thread agenda grouped by date. Only works if the thread has public agenda enabled.

bash
curl https://thethread.app/api/public/threads/THREAD_ID/agenda

Response (abbreviated)

json
{
  "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": {}
}
GET/api/public/threads/{id}/hosts

Fetch the hosts for a thread.

bash
curl https://thethread.app/api/public/threads/THREAD_ID/hosts

Response

json
{
  "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

html
<script src="https://thethread.app/embed.js"></script>

Thread Listing

Displays a grid of upcoming threads for an organisation.

html
<div
  data-thread-widget="threads"
  data-org="my-org"
  data-limit="6"
  data-theme="light"
></div>
data-orgrequiredOrganisation slug
data-limitoptionalMax threads to show (default 6)
data-themeoptional"light" (default) or "dark"

Thread Agenda

Renders a date-grouped timeline of a thread's sessions.

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

html
<!-- 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.