query contactAuthenticated
Fetches a contact by its ID.
Returns Contact
Arguments
| Argument | Type | Description |
|---|---|---|
id | ID! |
Example request
curl -X POST 'https://graph.clientloop.com/' \
-H 'Content-Type: application/json' \
-H 'Authorization: Bearer <api-key>' \
-d '{
"query": "query Contact($id: ID!) { contact(id: $id) { id orgId ownerId name givenName familyName email phone deletedAt createdAt updatedAt idv { status createdAt completedAt documents { category } selfieVideoUrl nameMatch dateOfBirthMatch phoneNumberMatch addressMatch taxIdMatch livenessCheck facialComparisonCheck } } }",
"variables": {
"id": "abc123"
}
}'const response = await fetch('https://graph.clientloop.com/', {
method: 'POST',
headers: {
'Content-Type': 'application/json',
'Authorization': 'Bearer <api-key>',
},
body: JSON.stringify({
query: `
query Contact($id: ID!) {
contact(id: $id) {
id
orgId
ownerId
name
givenName
familyName
email
phone
deletedAt
createdAt
updatedAt
idv {
status
createdAt
completedAt
documents {
category
}
selfieVideoUrl
nameMatch
dateOfBirthMatch
phoneNumberMatch
addressMatch
taxIdMatch
livenessCheck
facialComparisonCheck
}
}
}
`,
variables: {
"id": "abc123"
},
}),
});
const { data, errors } = await response.json();<?php
$body = <<<'JSON'
{
"query": "query Contact($id: ID!) { contact(id: $id) { id orgId ownerId name givenName familyName email phone deletedAt createdAt updatedAt idv { status createdAt completedAt documents { category } selfieVideoUrl nameMatch dateOfBirthMatch phoneNumberMatch addressMatch taxIdMatch livenessCheck facialComparisonCheck } } }",
"variables": {
"id": "abc123"
}
}
JSON;
$ch = curl_init('https://graph.clientloop.com/');
curl_setopt_array($ch, [
CURLOPT_RETURNTRANSFER => true,
CURLOPT_POST => true,
CURLOPT_HTTPHEADER => [
'Content-Type: application/json',
'Authorization: Bearer <api-key>',
],
CURLOPT_POSTFIELDS => $body,
]);
$response = curl_exec($ch);
curl_close($ch);
$result = json_decode($response, true);import java.net.URI;
import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;
var body = """
{
"query": "query Contact($id: ID!) { contact(id: $id) { id orgId ownerId name givenName familyName email phone deletedAt createdAt updatedAt idv { status createdAt completedAt documents { category } selfieVideoUrl nameMatch dateOfBirthMatch phoneNumberMatch addressMatch taxIdMatch livenessCheck facialComparisonCheck } } }",
"variables": {
"id": "abc123"
}
}
""";
var request = HttpRequest.newBuilder(URI.create("https://graph.clientloop.com/"))
.header("Content-Type", "application/json")
.header("Authorization", "Bearer <api-key>")
.POST(HttpRequest.BodyPublishers.ofString(body))
.build();
var response = HttpClient.newHttpClient()
.send(request, HttpResponse.BodyHandlers.ofString());
System.out.println(response.body());using System.Net.Http;
using System.Text;
var body = """
{
"query": "query Contact($id: ID!) { contact(id: $id) { id orgId ownerId name givenName familyName email phone deletedAt createdAt updatedAt idv { status createdAt completedAt documents { category } selfieVideoUrl nameMatch dateOfBirthMatch phoneNumberMatch addressMatch taxIdMatch livenessCheck facialComparisonCheck } } }",
"variables": {
"id": "abc123"
}
}
""";
using var client = new HttpClient();
using var content = new StringContent(body, Encoding.UTF8, "application/json");
client.DefaultRequestHeaders.Add("Authorization", "Bearer <api-key>");
var response = await client.PostAsync("https://graph.clientloop.com/", content);
var result = await response.Content.ReadAsStringAsync();Types
type Contact
| Field | Type | Description |
|---|---|---|
id | ID! | Unique ID of the contact. |
orgId | ID! | ID of the organization that owns the contact. |
ownerId | ID! | Global ID of the owning organization ( |
name | String! | Full name of the contact. |
givenName | String | Given name of the contact. |
familyName | String | Family name of the contact. |
email | Email | Email address of the contact. |
phone | Phone | Phone number of the contact. This will be validated and normalized to the E.164 format. |
deletedAt | String | Set when the contact has been soft-deleted; null for an active contact. |
createdAt | String! | Date and time when the contact was created. |
updatedAt | String! | Date and time when the contact was last updated. |
idv | ContactIdvSessionDetail | The latest Plaid identity-verification session for this contact. On the public graph this exposes the session timestamps, the captured selfie video, the captured identity documents, and the individual check outcomes; the remaining detail is private-graph only. Null when the contact has never started a session. Fetched on demand from Plaid — request it only when needed. |
scalar Email
An email address
scalar Phone
E.164 formatted phone number. Ex. +14155554345
type ContactIdvSessionDetail
Details of a contact's Plaid identity-verification session, fetched on demand from Plaid. The public graph exposes the timestamps, the captured selfie video, the captured identity documents, and the individual check outcomes; the remaining fields — including the raw Plaid pass-throughs they are derived from — are private-graph only.
| Field | Type | Description |
|---|---|---|
status | ContactIdvSessionStatus! | Where the verification as a whole stands. Success, Failed and PendingReview are all terminal and all carry captured identity; Active is still in progress, and Expired or Canceled never produced one. |
createdAt | DateTime! | |
completedAt | DateTime | |
documents | [ContactIdvDocument!]! | Captured identity documents, pulled out of documentary_verification: each document's category and its captured images. |
selfieVideoUrl | String | URL of the captured selfie video, pulled out of selfieCheck for direct access. Plaid-hosted and expiring; null when the template did not capture a selfie video. |
nameMatch | IdvMatchSummary | How the name that the contact supplied compared against Plaid's data sources. Null when the KYC step has not run. |
dateOfBirthMatch | IdvMatchSummary | How the date of birth compared against Plaid's data sources. Null when the KYC step has not run. |
phoneNumberMatch | IdvMatchSummary | How the phone number compared against Plaid's data sources. Null when the KYC step has not run. |
addressMatch | IdvMatchSummary | How the address compared against Plaid's data sources. Null when the KYC step has not run. |
taxIdMatch | IdvMatchSummary | How the tax id (SSN) compared against Plaid's data sources, from Plaid's id_number check. Null when the KYC step has not run. |
livenessCheck | IdvLivenessStatus | Whether the captured selfie passed liveness detection. Null when the selfie step has not run or captured no analysis. |
facialComparisonCheck | IdvFacialComparisonStatus | Whether the captured selfie matched the face on the identity document. Null when the selfie step has not run or captured no analysis. |
enum ContactIdvSessionStatus
Where a contact's verification stands. Mirrors the shared IdvSessionStatus but is declared separately so the contact graph's public surface does not depend on a type owned by the application module.
ActiveExpiredCanceledSuccessFailedPendingReview
scalar DateTime
ISO 8601 formatted date time. Ex. 2023-11-23T14:30:00Z
type ContactIdvDocument
A captured identity document from a contact's Plaid documentary verification.
| Field | Type | Description |
|---|---|---|
category | String | Document category as classified by Plaid (e.g. drivers_license, id_card, passport). Null when Plaid could not classify the document. |
images | [ContactIdvDocumentImage!]! | Captured images for this document (e.g. originalFront, croppedBack, face). |
enum IdvMatchSummary
How one value that the contact supplied compared against the data sources that Plaid checked it against. NoData means Plaid held nothing to compare with; NoInput means the contact supplied nothing to compare.
MatchPartialMatchNoMatchNoDataNoInput
enum IdvLivenessStatus
Whether the captured selfie passed liveness detection — that a live person was present rather than a photograph or a screen.
SuccessFailed
enum IdvFacialComparisonStatus
How the captured selfie compared against the face on the captured identity document. NoInput means one of the two was never captured.
MatchNoMatchNoInput
type ContactIdvDocumentImage
A single captured image belonging to a ContactIdvDocument. Plaid-hosted and expiring.
| Field | Type | Description |
|---|---|---|
name | String | Image identifier (e.g. originalFront, croppedBack, face). |
url | String | Plaid-hosted URL of the image. Expires. |