← Integrations

API reference

13 endpoints, one header, no handshake. Everything an integration can do in joyn is on this page.

Quickstart

Create a key in space settings under Integrations, then confirm it works. If this returns 200, everything else on this page will too.

curl https://api.getjoyn.io/api/v1/integrations/me \
  -H "Authorization: Bearer joyn_sk_your_key_here"

{
  "id": 12,
  "name": "Zapier",
  "space": { "id": 3, "name": "Acme" },
  "group": { "id": 7, "name": "Design" }
}

Base URL https://api.getjoyn.io/api

Authentication

Send the key as a bearer token on every request. There is no OAuth flow, no token exchange and no refresh.

Authorization: Bearer joyn_sk_7Kd2mQ...

Keys are shown once when created and stored only as a hash, so joyn cannot recover one for you. If a key is lost, regenerate it - the old one stops working the same second.

Key scoping

Where a key was created decides what it can reach. This is the single most common cause of an unexpected 403.

Space key

reaches The whole space

Created in space settings. Can invite members. Has no group memberships, so it cannot post until it is added to a group.

Group key

reaches One group

Created inside a group. Can post, create to-dos and create events in that group only. Cannot invite to the space.

Conventions

Ids in lists are integers, message ids are strings

Message ids are 64-bit snowflakes returned as strings. Never parse one into a number: values above 2^53 lose precision and you will corrupt them silently.

{
  "id": "7231904455168000"
}

Every list is paginated the same way

List endpoints return rows plus a cursor. Pass the cursor back as next_page to continue. limit defaults to 100 and caps at 100.

{
  "rows": [ ... ],
  "has_next": true,
  "next_page": 42
}

Timestamps are ISO-8601 with a timezone

Send and expect full datetimes. A date-only value is rejected, so 2026-09-15 fails where 2026-09-15T14:00:00.000Z succeeds.

Omit optional fields, do not send them empty

An empty string is not a valid date or a valid note. Leave the property out entirely when you have no value for it.

Errors

Failures carry an error_code alongside the status, so you can branch on the code rather than parsing prose.

400

The body or query failed validation. Check formats before anything else.

401

The key is unknown, was regenerated, or its integration was deleted.

403

ROUTE_NOT_PERMITTED

Valid key, but this endpoint is not part of the api surface.

403

GROUP_SCOPED_KEY

A group key tried to do something space-level, such as inviting a member.

403

The key is not a member of the group, or the space withholds the permission the action needs.

404

The target does not exist, or is outside what this key can reach.

Endpoints

Anything not listed here returns 403 ROUTE_NOT_PERMITTED, even with a valid key. The surface is deliberately small.

Limits and gaps

Things worth knowing before you build something load bearing on this.

Retries can duplicate writes

There are no idempotency keys yet. If a request times out but actually succeeded, retrying it creates a second message, to-do or event. Prefer triggers that fire once.

There are no triggers or webhooks

The api is one directional. Nothing in joyn can start an automation elsewhere, so a Zap cannot begin with a joyn event.

Keys never expire

A key works until you regenerate it or delete its integration. Rotate it on the same schedule you would rotate any other credential.

Rate limits are not published yet

Please stay well below anything that looks like a burst. Sensible limits will arrive, and they will be announced before they are enforced.

A Danish company

Joyn ApS
Kochsgade 31D, 5000 Odense C, Denmark
CVR 40966293
contact@getjoyn.io
Dansk

© 2026 Joyn ApS. All rights reserved.

Made with ♥ for communities