Pagination

Page through list endpoints with limit and cursor.

List endpoints use cursor-based pagination.

Parameters

ParameterTypeDefaultConstraintsDescription
limitinteger101 to 50Number of records to return. A value above 50 returns 422 validation_error.
cursorstring—OpaqueThe nextCursor from the previous response. Omit on the first request.

Response

FieldDescription
dataThe records on this page.
nextCursorThe cursor for the next page, or null on the last page.

Lists are sorted by createdAt, oldest first, unless the endpoint states otherwise.

Example

# First page
curl "https://api.join.com/v3/candidates?limit=50" \
  -H "Authorization: Bearer $JOIN_API_TOKEN"

# Next page
curl "https://api.join.com/v3/candidates?limit=50&cursor=eyJpZCI6NDIxMH0" \
  -H "Authorization: Bearer $JOIN_API_TOKEN"
async function listAll(path) {
  const records = []
  let cursor = null

  do {
    const url = new URL(`https://api.join.com/v3${path}`)
    url.searchParams.set('limit', '50')
    if (cursor) url.searchParams.set('cursor', cursor)

    const res = await fetch(url, {
      headers: { Authorization: `Bearer ${process.env.JOIN_API_TOKEN}` },
    })
    if (!res.ok) throw new Error(`${res.status} ${(await res.json()).error.code}`)

    const body = await res.json()
    records.push(...body.data)
    cursor = body.nextCursor
  } while (cursor)

  return records
}

Rules

  • Cursors are opaque. Pass them back unchanged. Do not parse, build, or store them long term.
  • Keep the same filters. A cursor continues the query it came from. Send the same filters with every page.
  • An invalid or expired cursor returns 400 cursor_invalid. Restart from the first page.
  • No total count. Responses do not include a total. Page until nextCursor is null.

Filters

Filters combine with AND. A filter that matches nothing returns an empty list, not 404.

To sync changes incrementally, filter on the update time and keep the latest updatedAt you have processed:

curl "https://api.join.com/v3/applications?updatedAfter=2026-10-01T00:00:00Z&limit=50" \
  -H "Authorization: Bearer $JOIN_API_TOKEN"