API REFERENCE v1

DEVELOPERS

Team

The Membership object

Members, roles and invitations.

ATTRIBUTES

Schema: Membership

THE MEMBERSHIP OBJECT
{
  "object": "membership",
  "id": "mbr_cUfc8mTHAU7Eg2co",
  "role": "member",
  "user": {
    "id": "usr_Vv4SRgjqTic423gn",
    "email": "user1@example.test",
    "name": "User",
    "two_factor_enabled": false,
    "last_login_at": null
  },
  "created_at": "2026-11-04T10:00:00.000Z"
}

Change a member's role

  • Secret key (nc_test_… or nc_live_…). Restricted keys need write access.
  • AI apps (OAuth): not available.

PATH PARAMETERS

  • id string REQUIRED

HEADER PARAMETERS

BODY PARAMETERS

  • role enum REQUIRED
    • owner
    • admin
    • member

RETURNS

ERRORS

  • 409 conflict the last owner cannot step down
PATCH/v1/memberships/{id}
curl https://api.nochurn.sh/v1/memberships/mbr_3Sff9nvg44dKN6ME \
  -X PATCH \
  -H "Authorization: Bearer nc_test_…" \
  -H "Content-Type: application/json" \
  -d '{
    "role": "admin"
  }'
const res = await fetch("https://api.nochurn.sh/v1/memberships/mbr_3Sff9nvg44dKN6ME", {
  method: "PATCH",
  headers: {
    Authorization: "Bearer nc_test_…",
    "Content-Type": "application/json",
  },
  body: JSON.stringify({
    "role": "admin"
  }),
});
const membership = await res.json();
import requests

res = requests.patch(
    "https://api.nochurn.sh/v1/memberships/mbr_3Sff9nvg44dKN6ME",
    headers={
        "Authorization": "Bearer nc_test_…",
    },
    json={
      "role": "admin"
    },
)
membership = res.json()
require "net/http"
require "json"

uri = URI("https://api.nochurn.sh/v1/memberships/mbr_3Sff9nvg44dKN6ME")
req = Net::HTTP::Patch.new(uri)
req["Authorization"] = "Bearer nc_test_…"
req["Content-Type"] = "application/json"
req.body = {
  "role" => "admin"
}.to_json

res = Net::HTTP.start(uri.host, uri.port, use_ssl: true) { |http| http.request(req) }
membership = JSON.parse(res.body)
RESPONSE 200
{
  "object": "membership",
  "id": "mbr_3Sff9nvg44dKN6ME",
  "role": "admin",
  "user": {
    "id": "usr_9WtFa8kpPXoZueb9",
    "email": "user1@example.test",
    "name": "User",
    "two_factor_enabled": false,
    "last_login_at": null
  },
  "created_at": "2026-11-04T10:00:00.000Z"
}

Remove a member (or leave the account)

  • Secret key (nc_test_… or nc_live_…). Restricted keys need write access.
  • AI apps (OAuth): not available.

PATH PARAMETERS

  • id string REQUIRED

HEADER PARAMETERS

RETURNS

DELETE/v1/memberships/{id}
curl https://api.nochurn.sh/v1/memberships/mbr_P3Pc9sSuX3tF4giw \
  -X DELETE \
  -H "Authorization: Bearer nc_test_…"
const res = await fetch("https://api.nochurn.sh/v1/memberships/mbr_P3Pc9sSuX3tF4giw", {
  method: "DELETE",
  headers: {
    Authorization: "Bearer nc_test_…",
  },
});
const membership = await res.json();
import requests

res = requests.delete(
    "https://api.nochurn.sh/v1/memberships/mbr_P3Pc9sSuX3tF4giw",
    headers={
        "Authorization": "Bearer nc_test_…",
    },
)
membership = res.json()
require "net/http"
require "json"

uri = URI("https://api.nochurn.sh/v1/memberships/mbr_P3Pc9sSuX3tF4giw")
req = Net::HTTP::Delete.new(uri)
req["Authorization"] = "Bearer nc_test_…"

res = Net::HTTP.start(uri.host, uri.port, use_ssl: true) { |http| http.request(req) }
membership = JSON.parse(res.body)
RESPONSE 200
{
  "object": "membership",
  "id": "mbr_P3Pc9sSuX3tF4giw",
  "role": "admin",
  "user": {
    "id": "usr_VHAaeTFR9fDTrsq3",
    "email": "user1@example.test",
    "name": "User",
    "two_factor_enabled": false,
    "last_login_at": null
  },
  "created_at": "2026-11-04T10:00:00.000Z"
}

Team members of the account

  • Secret key (nc_test_… or nc_live_…). Restricted keys need read access.
  • AI apps (OAuth): not available.

RETURNS

GET/v1/memberships
curl https://api.nochurn.sh/v1/memberships \
  -H "Authorization: Bearer nc_test_…"
const res = await fetch("https://api.nochurn.sh/v1/memberships", {
  headers: {
    Authorization: "Bearer nc_test_…",
  },
});
const page = await res.json();
import requests

res = requests.get(
    "https://api.nochurn.sh/v1/memberships",
    headers={
        "Authorization": "Bearer nc_test_…",
    },
)
page = res.json()
require "net/http"
require "json"

uri = URI("https://api.nochurn.sh/v1/memberships")
req = Net::HTTP::Get.new(uri)
req["Authorization"] = "Bearer nc_test_…"

res = Net::HTTP.start(uri.host, uri.port, use_ssl: true) { |http| http.request(req) }
page = JSON.parse(res.body)
RESPONSE 200
{
  "object": "list",
  "data": [
    {
      "object": "membership",
      "id": "mbr_cUfc8mTHAU7Eg2co",
      "role": "member",
      "user": {
        "id": "usr_Vv4SRgjqTic423gn",
        "email": "user1@example.test",
        "name": "User",
        "two_factor_enabled": false,
        "last_login_at": null
      },
      "created_at": "2026-11-04T10:00:00.000Z"
    },
    {
      "object": "membership",
      "id": "mbr_6TshrrzHbJhPfMdK",
      "role": "owner",
      "user": {
        "id": "usr_zt28zC2o6Zn1qFiY",
        "email": "owner@acme.test",
        "name": "User",
        "two_factor_enabled": false,
        "last_login_at": "2026-11-04T10:00:00.000Z"
      },
      "created_at": "2026-11-04T10:00:00.000Z"
    }
  ],
  "has_more": false,
  "next_cursor": null
}

Pending invitations

  • Secret key (nc_test_… or nc_live_…). Restricted keys need read access.
  • AI apps (OAuth): not available.

HEADER PARAMETERS

RETURNS

GET/v1/invitations
curl https://api.nochurn.sh/v1/invitations \
  -H "Authorization: Bearer nc_test_…"
const res = await fetch("https://api.nochurn.sh/v1/invitations", {
  headers: {
    Authorization: "Bearer nc_test_…",
  },
});
const page = await res.json();
import requests

res = requests.get(
    "https://api.nochurn.sh/v1/invitations",
    headers={
        "Authorization": "Bearer nc_test_…",
    },
)
page = res.json()
require "net/http"
require "json"

uri = URI("https://api.nochurn.sh/v1/invitations")
req = Net::HTTP::Get.new(uri)
req["Authorization"] = "Bearer nc_test_…"

res = Net::HTTP.start(uri.host, uri.port, use_ssl: true) { |http| http.request(req) }
page = JSON.parse(res.body)
RESPONSE 200
{
  "object": "list",
  "data": [
    {
      "object": "invitation",
      "id": "inv_2ZfRhgxHtsGee7h6",
      "email": "a@acme.test",
      "role": "member",
      "status": "pending",
      "url": null,
      "invited_by": "owner@acme.test",
      "expires_at": "2026-11-11T10:00:00.000Z",
      "created_at": "2026-11-04T10:00:00.000Z"
    }
  ],
  "has_more": false,
  "next_cursor": null
}

Invite someone (returns the link to send, once)

  • Secret key (nc_test_… or nc_live_…). Restricted keys need write access.
  • AI apps (OAuth): not available.

HEADER PARAMETERS

BODY PARAMETERS

  • email string REQUIRED
  • role enum
    • owner
    • admin
    • member

RETURNS

ERRORS

POST/v1/invitations
curl https://api.nochurn.sh/v1/invitations \
  -H "Authorization: Bearer nc_test_…" \
  -H "Content-Type: application/json" \
  -d '{
    "email": "New@Acme.test",
    "role": "admin"
  }'
const res = await fetch("https://api.nochurn.sh/v1/invitations", {
  method: "POST",
  headers: {
    Authorization: "Bearer nc_test_…",
    "Content-Type": "application/json",
  },
  body: JSON.stringify({
    "email": "New@Acme.test",
    "role": "admin"
  }),
});
const invitation = await res.json();
import requests

res = requests.post(
    "https://api.nochurn.sh/v1/invitations",
    headers={
        "Authorization": "Bearer nc_test_…",
    },
    json={
      "email": "New@Acme.test",
      "role": "admin"
    },
)
invitation = res.json()
require "net/http"
require "json"

uri = URI("https://api.nochurn.sh/v1/invitations")
req = Net::HTTP::Post.new(uri)
req["Authorization"] = "Bearer nc_test_…"
req["Content-Type"] = "application/json"
req.body = {
  "email" => "New@Acme.test",
  "role" => "admin"
}.to_json

res = Net::HTTP.start(uri.host, uri.port, use_ssl: true) { |http| http.request(req) }
invitation = JSON.parse(res.body)
RESPONSE 201
{
  "object": "invitation",
  "id": "inv_myc1pyd2keYC2jWD",
  "email": "new@acme.test",
  "role": "admin",
  "status": "pending",
  "url": "http://localhost:5173/invite/Au8qSVmR1hhU9hjFeJsbn4JVkfrKT4Dj",
  "invited_by": "owner@acme.test",
  "expires_at": "2026-11-11T10:00:00.000Z",
  "created_at": "2026-11-04T10:00:00.000Z"
}

Cancel a pending invitation

  • Secret key (nc_test_… or nc_live_…). Restricted keys need write access.
  • AI apps (OAuth): not available.

PATH PARAMETERS

  • id string REQUIRED

HEADER PARAMETERS

RETURNS

ERRORS

  • 409 conflict already used or cancelled
DELETE/v1/invitations/{id}
curl https://api.nochurn.sh/v1/invitations/inv_EBdyWjdifwMigLWC \
  -X DELETE \
  -H "Authorization: Bearer nc_test_…"
const res = await fetch("https://api.nochurn.sh/v1/invitations/inv_EBdyWjdifwMigLWC", {
  method: "DELETE",
  headers: {
    Authorization: "Bearer nc_test_…",
  },
});
const invitation = await res.json();
import requests

res = requests.delete(
    "https://api.nochurn.sh/v1/invitations/inv_EBdyWjdifwMigLWC",
    headers={
        "Authorization": "Bearer nc_test_…",
    },
)
invitation = res.json()
require "net/http"
require "json"

uri = URI("https://api.nochurn.sh/v1/invitations/inv_EBdyWjdifwMigLWC")
req = Net::HTTP::Delete.new(uri)
req["Authorization"] = "Bearer nc_test_…"

res = Net::HTTP.start(uri.host, uri.port, use_ssl: true) { |http| http.request(req) }
invitation = JSON.parse(res.body)
RESPONSE 200
{
  "object": "invitation",
  "id": "inv_EBdyWjdifwMigLWC",
  "email": "bye@acme.test",
  "role": "member",
  "status": "revoked",
  "url": null,
  "invited_by": "owner@acme.test",
  "expires_at": "2026-11-11T10:00:00.000Z",
  "created_at": "2026-11-04T10:00:00.000Z"
}