---
title: "List contacts (cursor-paginated)"
method: GET
path: "/api/v1/contacts"
tags: ["Records"]
---

# List contacts (cursor-paginated)

`GET /api/v1/contacts`

## Request

- Base URL: `https://api.agendaforge.app`
- URL: `https://api.agendaforge.app/api/v1/contacts`
- Auth: one of:
  - HTTP bearer
  - API key in header `X-API-Key`

Lists the organization's contacts, newest first. Page with ?limit= (1-100, default 25) and ?cursor= (the previous response's nextCursor). The cursor is opaque; never construct one. Objects match the Contact shape emitted by webhooks and POST /api/v1/contacts.

## Query parameters

- `limit` integer
- `cursor` string

## Response `200`

One page of contacts, newest first.

- object
  - `data` Contact[], required
    - `id` string
    - `type` string: speaker | sponsor | attendee | vendor | partner | exhibitor | other.
    - `firstName` string
    - `lastName` string
    - `email` string
    - `phone` string, nullable
    - `company` string, nullable
    - `jobTitle` string, nullable
    - `bio` string, nullable
    - `avatarUrl` string, nullable
    - `location` string, nullable
    - `website` string, nullable
    - `socialLinks` object, nullable: Map of platform to URL.
    - `expertiseAreas` string[]
    - `tags` string[]
    - `customFields` object, nullable: Organization-defined custom fields.
    - `source` string, nullable
    - `status` string
    - `rating` number, nullable
    - `createdAt` string: ISO-8601 UTC timestamp.
    - `events` ContactEventRef[]
      - `eventId` string
      - `eventName` string
      - `eventNumber` number, nullable
      - `role` string
      - `status` string
  - `hasMore` boolean, required: True when another page exists after this one.
  - `nextCursor` string, nullable, required: Opaque cursor for the next page; pass it back as ?cursor=. Null on the last page.

## Other responses

- `400`: A required field is missing or invalid, an unknown event was supplied, or a referenced record is not owned by the key's organization.
- `401`: The API key is missing, malformed, invalid, expired, or revoked.
- `403`: The API key is valid but does not include the public_api scope. Create a key with the public_api scope in Settings > API Tokens.
- `404`: No such endpoint under /api/v1. The message lists the valid endpoints.
- `429`: The fixed window for this API key (120 requests per minute) or IP (30 per minute, unauthenticated) is exhausted. Wait Retry-After seconds and retry.
- `500`: An unexpected server failure. The body still follows the JSON error contract; retry with exponential backoff.
- `default`: Any other failure, including 404 NOT_FOUND for an unknown path and transient 5xx errors. Always the same JSON error contract.

---

[API](https://skmtc.dev/agendaforge/apis/agendaforge-public-rest-api.md) · [All operations](https://skmtc.dev/agendaforge/apis/agendaforge-public-rest-api/llms.txt) · [OpenAPI document](https://skmtc.dev/agendaforge/apis/agendaforge-public-rest-api/revisions/b8956ce1e5f3?raw)
