Skip to content

Leads

The “lead” resource is table_entries — every row in a Lead Pool is a lead entry. Use these endpoints to push leads from your CRM, update lead state as your team works through the pipeline, or sync external systems.

MethodPathScope
POST/connect/table_entries/write
PATCH/connect/table_entries/:idwrite
GET/connect/tables/read
GET/connect/tables/:idread

For interactive try-it and the canonical schemas, see the reference at /docs. Everything below is concept-level — semantics, gotchas, and what the endpoint shapes look like at a glance.

  • data is free-form, customFieldData is validated. data accepts any keys (the table’s schema is inferred over time). customFieldData rejects unknown custom-field IDs with 400.
  • PATCH uses RFC 7396 merge patch. Provide null to delete a key, omit a key to leave it untouched. See Merge patch.
  • Initial leadStateId is required on create. Look it up from /connect/tables/:id (the default: true lead state is the canonical “new” state).
  • Both endpoints fire automation events. Create fires table.entry.added + initial table.entry.leadState.changed. Patch fires leadState.changed only when the state actually changes. See Automation triggers.

Request body:

{
// The ID of the table the entry belongs to
tableId: string;
data: Record<string, Record<string, unknown>>;
// JSON object keyed by customField ID with the corresponding value
customFieldData?: Record<string, Record<string, unknown>>;
leadStateId: string;
// Optional UUID of an appointment type the lead expressed interest in. Typically set at form submission when the form includes an `appointment-type` field (RKTL-455). Cleared to null when the referenced appointment type is deleted.
interestedInAppointmentTypeId?: string | unknown;
}

Response:

{
// The ID of the table the entry belongs to
tableId: string;
id: string;
organizationId: string;
archived: boolean;
createdAt: string /* ISO-8601 */;
updatedAt: string /* ISO-8601 */;
data: Record<string, Record<string, unknown>>;
// JSON object keyed by customField ID with the corresponding value
customFieldData?: Record<string, Record<string, unknown>>;
leadStateId: string;
firstOpenedAt: string /* ISO-8601 */ | unknown;
followUpDate: string /* ISO-8601 */ | unknown;
// Optional UUID of an appointment type the lead expressed interest in. Typically set at form submission when the form includes an `appointment-type` field (RKTL-455). Cleared to null when the referenced appointment type is deleted.
interestedInAppointmentTypeId?: string | unknown;
}

Request body (merge-patch — every field optional):

{
data?: unknown | Record<string, Record<string, unknown> | unknown>;
customFieldData?: unknown | Record<string, Record<string, unknown> | unknown>;
leadStateId?: string;
firstOpenedAt?: string /* ISO-8601 */ | unknown;
followUpDate?: string /* ISO-8601 */ | unknown;
// Optional UUID of an appointment type the lead expressed interest in. Typically set at form submission when the form includes an `appointment-type` field (RKTL-455). Cleared to null when the referenced appointment type is deleted.
interestedInAppointmentTypeId?: string | unknown;
}

Response:

{
// The ID of the table the entry belongs to
tableId: string;
id: string;
organizationId: string;
archived: boolean;
createdAt: string /* ISO-8601 */;
updatedAt: string /* ISO-8601 */;
data: Record<string, Record<string, unknown>>;
// JSON object keyed by customField ID with the corresponding value
customFieldData?: Record<string, Record<string, unknown>>;
leadStateId: string;
firstOpenedAt: string /* ISO-8601 */ | unknown;
followUpDate: string /* ISO-8601 */ | unknown;
// Optional UUID of an appointment type the lead expressed interest in. Typically set at form submission when the form includes an `appointment-type` field (RKTL-455). Cleared to null when the referenced appointment type is deleted.
interestedInAppointmentTypeId?: string | unknown;
}

Fetch a Lead Pool with its lead states (you’ll need a leadStateId for create).

Record<string, unknown>