Skip to main content

List Contacts

Returns a paginated list of CRM contacts for a funnel.

GET /v1/funnels/{funnelId}/contacts

Authentication

Requires the x-perspective-api-key header. See Authentication for details.

Path parameters

NameTypeRequiredDescription
funnelIdstringYesThe ID of the funnel to retrieve contacts for.

Query parameters

NameTypeRequiredDefaultDescription
pageintegerNo0Page number, 0-based. Minimum: 0.
limitintegerNo50Number of contacts per page. Range: 1100.
sortFieldstringNops_converted_atField to sort by. One of: ps_converted_at, email, firstName, lastName.
sortOrderintegerNo-1Sort direction. -1 for descending, 1 for ascending.

Example request

curl "https://api.perspective.co/v1/funnels/fnl_abc123/contacts?page=0&limit=20&sortField=ps_converted_at&sortOrder=-1" \
-H "x-perspective-api-key: $PERSPECTIVE_API_KEY"

Response

Returns { data: Contact[], meta: Pagination }.

The Contact object

This is the canonical Contact object reference. All other contact endpoints return the same shape — use this table when reading any contact response.

Top-level fields

FieldTypeRequiredDescription
idstringYesUnique contact identifier.
statusstringYesContact lifecycle status (e.g. "lead", "converted").
emailstringNoPrimary email address.
phonestringNoPrimary phone number in E.164 format when available.
firstNamestringNoGiven name.
lastNamestringNoFamily name.
namestringNoFull display name when first/last are not split.
fullAddressstringNoSingle-line address as captured. Preferred over the structured address fields when present.
timezonestringNoIANA timezone of the contact. Deprecated — use meta.ps_timezone instead.
websitestringNoContact website URL.
birthdaystringNoBirthday as captured (typically an ISO date string).
addressobjectNoStructured address. Present only when at least one component is known. See Address fields.
metaobjectNoPerspective-managed metadata. Read-only — cannot be set via the API. See meta fields.
utmParamsobjectNoUTM tracking parameters from the contact's first attributed visit. Read-only. Present only when at least one UTM value exists. See utmParams fields.
propertiesobjectNoCustom contact properties keyed by property name. Values can be string, boolean, number, or null. Present only when the contact has at least one custom property. Read-only via direct field — use Update Contact Value to write custom properties.
messagesobject[]NoMessages sent to this contact. See ContactMessage fields.

Address fields

Nested inside the address object. All fields are optional.

FieldTypeDescription
postalCodestringPostal / ZIP code.
citystringCity.
statestringState, province, or region.
countrystringCountry.
streetstringStreet line.
houseNumberstringHouse number.

meta fields

Perspective-managed metadata captured during the funnel session. All fields are optional. Read-only — these values cannot be set via the API.

FieldTypeDescription
ps_timezonestringTimezone detected by Perspective (e.g. "Europe/Berlin").
ps_converted_atstring (ISO date-time)When the contact converted (submitted the funnel).
ps_first_seen_atstring (ISO date-time)Timestamp of the contact's first known visit.
ps_last_seen_atstring (ISO date-time)Timestamp of the contact's most recent visit.
ps_sourcestringHow the contact entered the system. One of: manual, funnel, zapier, make, external-api.
ps_start_slugstringSlug of the funnel page where the contact started.
ps_end_slugstringSlug of the funnel page where the contact converted.
ps_start_pagestringURL or title of the start page.
ps_result_pagestringURL or title of the result page reached.
ps_user_edited_atstring (ISO date-time)Timestamp of the last manual edit by a user.
ps_completed_atstring (ISO date-time)Timestamp when the contact completed all required steps.
ps_email_verifiedbooleanWhether the contact's email address has been verified.
ps_email_verified_atstring (ISO date-time)Timestamp of email verification.
ps_phone_verifiedbooleanWhether the contact's phone number has been verified.
ps_phone_verified_atstring (ISO date-time)Timestamp of phone verification.
ps_embedbooleantrue if the contact converted via an embedded funnel.
ps_cal_bookedbooleanCal.com meeting booked.
ps_ghl_bookedbooleanGoHighLevel meeting booked.
ps_hubspot_bookedbooleanHubSpot meeting booked.
ps_calendly_bookedbooleanCalendly meeting booked.

utmParams fields

UTM tracking parameters from the contact's first attributed visit. All fields are optional. Read-only.

FieldTypeDescription
utm_sourcestringMarketing source (e.g. "google", "newsletter").
utm_mediumstringMarketing medium (e.g. "cpc", "email").
utm_campaignstringMarketing campaign name.
utm_termstringPaid keyword search term.
utm_contentstringAd or content variant identifier.

ContactMessage fields

Each item in the messages array has the following fields.

FieldTypeRequiredDescription
idstringYesUnique message identifier.
namestringYesInternal name of the message.
typestringYesMessage channel (e.g. "email", "sms").
contentstringYesRendered message body.
subjectstringNoSubject line. Present for email messages only.

Pagination object

Returned in the meta field of the response envelope.

FieldTypeDescription
pageintegerCurrent page number (0-based).
limitintegerPage size used for this query.
totalintegerTotal number of matching contacts across all pages.
hasNextbooleantrue when another page of results is available.

Example response

{
"data": [
{
"id": "cnt_abc123",
"status": "lead",
"email": "jane.doe@example.com",
"phone": "+49151234567890",
"firstName": "Jane",
"lastName": "Doe",
"name": "Jane Doe",
"website": "https://janedoe.com",
"birthday": "1990-06-15",
"address": {
"postalCode": "10115",
"city": "Berlin",
"state": "Berlin",
"country": "DE",
"street": "Unter den Linden",
"houseNumber": "1"
},
"meta": {
"ps_timezone": "Europe/Berlin",
"ps_converted_at": "2025-05-01T14:32:00.000Z",
"ps_first_seen_at": "2025-05-01T14:30:00.000Z",
"ps_last_seen_at": "2025-05-02T09:15:00.000Z",
"ps_source": "funnel",
"ps_start_slug": "start",
"ps_end_slug": "result",
"ps_email_verified": true,
"ps_embed": false
},
"utmParams": {
"utm_source": "google",
"utm_medium": "cpc",
"utm_campaign": "spring-launch"
},
"properties": {
"quiz_answer": "Option A",
"score": 42
},
"messages": [
{
"id": "msg_xyz789",
"name": "Welcome Email",
"type": "email",
"subject": "Welcome to our program!",
"content": "<p>Hi Jane, welcome aboard!</p>"
}
]
}
],
"meta": {
"page": 0,
"limit": 20,
"total": 143,
"hasNext": true
}
}

Errors

See Errors for the full list of status codes and handling guidance.

StatusMeaning
400Invalid query parameters (e.g. limit out of range, unknown sortField).
401Missing or invalid API key.
403Your API key does not have crm:read permission.
500Internal server error.