Skip to main content

People

People are the individuals who take part in an event in any role — visitors, attendees, speakers, moderators, organizer staff, exhibitor members, partner members, and so on.

A profile can belong to someone with a Swapcard account or to someone without one.

  • People with an account can log in and access the event through the Swapcard web and mobile apps.
  • People without an account are listed in the event but cannot sign in. This is useful for individuals who should appear in the app (for example, a VIP speaker) or whose badge needs to be scanned for lead retrieval, but who are not expected to use the app themselves.

In Studio, people without an account are surfaced as People without account.

Fields

When creating a profile, the following rules apply:

  • firstName, lastName, and clientId are always required.
  • email is required when isUser is true (an account is being created). It must be unique within the community and cannot be updated through the API once the profile has been created.
  • A groupId must be provided through the updateGroups action so the profile is assigned to at least one group.

The following fields are recommended:

  • jobTitle and organization, plus any relevant custom fields, improve matchmaking and networking suggestions.
  • biography and photoUrl are particularly useful for speakers.
  • A barcode (added through the updateBarcodes action) is required if the profile needs to work with Lead Capture, Session Scanning, or Check-in.

Visibility

By default, every profile is visible to other participants in the event. Private contact details (email address, phone numbers, and postal address) are never exposed to other participants regardless of visibility settings.

Visibility can be adjusted in two ways:

  • Organizers can configure group-to-group visibility rules in Studio to hide one group of people from another.
  • Setting isVisible to false hides a profile from every other participant while still letting that person access the event. Participants can also toggle their own visibility from the web or mobile app at any time.

Object

Unique clientId at community level

Each profile is unique within a community. The clientId field is the external identifier for that profile and must be unique across the entire community.

Phone number format

Phone numbers must follow the E.164 format (http://en.wikipedia.org/wiki/E.164): a leading + followed by the country code and subscriber number, with no spaces or separators. For example, the US number 415 555 0101 must be sent as +14155550101, where + is mandatory and 1 is the US country code.

Fetch People on an Event

Search one or more profiles

This query searches for one or more profiles within an event.

Arguments

  • emails — A list of email addresses to look up. Pass multiple values to fetch several profiles in a single request.

Other useful filters include eventPeopleIds, clientIds, and lastUpdatedSince. The full list is documented on the EventPersonFilter input.

Query

query eventPerson($eventId: ID!, $filters: [EventPersonFilter!]) {
eventPerson(eventId: $eventId, filters: $filters) {
nodes {
createdAt
firstName
id
lastName
jobTitle
organization
userId
}
}
}

Variables

{
"eventId": "RXZlbnDY1Nc4",
"filters": {
"emails": [
"test@test.fr",
"test1@test1.com"
]
}
}

Arguments

  • search — A free-text string used to find a profile within an event. Matches across name, email, organization, and other indexed fields.

Query

query eventPerson($eventId: ID!, $search: String!) {
eventPerson(eventId: $eventId, search: $search) {
nodes {
createdAt
firstName
id
lastName
jobTitle
organization
userId
}
}
}

Variables

{
"eventId": "RXZlbnDY1Nc4",
"search":"test@test.fr"
}

Fetch the first 100 People

This query paginates across all the people of an event, returning the first 100 profiles.

Heads up!

For paginated queries, we recommend a page size of no more than 100 records.

Query

query eventPerson($eventId: ID!, $cursor: CursorPaginationInput) {
eventPerson(eventId: $eventId, cursor: $cursor) {
pageInfo {
hasNextPage
endCursor
totalItems
startCursor
lastPage
hasPreviousPage
currentPage
}
totalCount
nodes {
id
clientIds
email
firstName
lastName
jobTitle
organization
photoUrl
websiteUrl
biography
address {
street
city
zipCode
state
country
}
phoneNumbers {
formattedNumber
type
number
}
socialNetworks {
profile
type
}
groups {
id
name
}
source
updatedAt
createdAt
withEvent(eventId: $eventId) {
fields {
... on SelectField {
translations {
value
language
}
definition {
id
translations {
name
language
}
}
}
}
badges {
... on BadgeBarcode {
__typename
barcode
createdAt
}
}
}
}
}
}

Variables

{
"eventId": "RXZlbnDY1Nc4",
"cursor": {
"first": 100
}
}

Fetch the next 100 People

This query fetches the next 100 People in the event, starting from the cursor returned by the previous request. Use the endCursor value from pageInfo as the after argument.

Query

query eventPerson($eventId: ID!, $cursor: CursorPaginationInput) {
eventPerson(eventId: $eventId, cursor: $cursor) {
pageInfo {
hasNextPage
endCursor
totalItems
startCursor
lastPage
hasPreviousPage
currentPage
}
totalCount
nodes {
id
clientIds
email
firstName
lastName
jobTitle
photoUrl
organization
websiteUrl
biography
address {
state
street
city
country
zipCode
place
}
phoneNumbers {
formattedNumber
type
number
}
socialNetworks {
profile
type
}
groups {
id
name
}
source
updatedAt
createdAt
}
}
}

Variables

{
"eventId": "RXZlbnDY1Nc4",
"cursor": {
"first": 100,
"after": "cursorId"
}
}

Create a basic profile

This mutation creates a basic profile in Swapcard. The same mutation is used for both People with an account and People without an account.

Arguments

  • clientId — The unique identifier for the profile on the customer's side. It can be any alphanumeric value, must be unique within the community, and cannot be changed after the profile is created.
  • firstName — The first name of the person.
  • lastName — The last name of the person.
  • email — The email address linked to the profile. It must be unique and cannot be updated through the API after creation. Only required when isUser is true; for People without an account, email may be omitted.
  • isUser — Controls whether an account is created. Set to true to create a Swapcard account alongside the profile; set to false to create a profile only.

Query

mutation importEventPeople($eventId: ID!, $data: [ImportEventPersonInput!]!) {
importEventPeople(eventId: $eventId, validateOnly: false, data: $data) {
errors {
inputId
errorCode
message
}
results {
inputId
eventPerson {
id
email
}
}
eventPeopleCreated
}
}

Variables

{
"eventId": "RXZlbnDY1Nc4",
"data": [
{
"clientId": "9876543210",
"create": {
"isUser": true,
"isVisible": true,
"email": "test@test.com",
"firstName": "John",
"lastName": "Doe"
},
"actions": {
"updateGroups": {
"action": "ADD",
"groupIds": [
"RXZlbnR8xNjcyMjI="
]
}
}
},
{
"clientId": "1234567890",
"create": {
"isUser": false,
"isVisible": false,
"firstName": "Dummy",
"lastName": "User"
},
"actions": {
"updateGroups": {
"action": "ADD",
"groupIds": [
"RXZlbnR8xNjcyMjI="
]
}
}
}
]
}

Update a basic profile

This mutation updates an existing basic profile. The same mutation is used for both people with an account and people without an account.

Arguments

  • clientId — The same alphanumeric value used when the profile was created.
  • email — The email address linked to the profile. Required only for people with an account.

Query

mutation importEventPeople($eventId: ID!, $data: [ImportEventPersonInput!]!) {
importEventPeople(eventId: $eventId, validateOnly: false, data: $data) {
errors {
inputId
errorCode
message
}
results {
inputId
eventPerson {
id
email
}
}
eventPeopleUpdated
}
}

Variables

{
"eventId": "RXZlbnDY1Nc4",
"data": [
{
"clientId": "987654321",
"update": {
"isUser": true,
"isVisible": true,
"email": "test@test.com",
"firstName": "UpdateJohn",
"lastName": "UpdateDoe"
}
},
{
"clientId": "1234567890",
"update": {
"isUser": false,
"isVisible":false,
"firstName": "UpdateDummy",
"lastName": "UpdateUser"
}
}
]
}

Create or update a detailed profile

This mutation creates or updates a detailed profile, including custom fields, social networks, and other optional attributes.

Arguments

  • clientId — The unique identifier for the profile on the customer's side. It can be any alphanumeric value, must be unique within the community, and cannot be changed after the profile is created.
  • firstName — The first name of the person.
  • lastName — The last name of the person.
  • email — The email address linked to the profile.

Query

mutation importEventPeople($eventId: ID!, $data: [ImportEventPersonInput!]!) {
importEventPeople(eventId: $eventId, validateOnly: false, data: $data) {
errors {
inputId
errorCode
message
}
results {
inputId
eventPerson {
id
email
}
}
eventPeopleCreated
eventPeopleUpdated
}
}

Variables

{
"eventId": "RXZlbnDY1Nc4",
"data": [
{
"clientId": "987654321",
"create": {
"isUser": true,
"email": "test@test.com",
"firstName": "John",
"lastName": "Doe",
"jobTitle": "CEO",
"organization": "Tesla",
"biography": "Lorem ipsum dolor sit amet, odio prima pri te, id sanctus recteque deterruisset vel. Dico tractatos eam eu, dolor inciderint in est.",
"websiteUrl": "https://www.tesla.com",
"photoUrl": "https://fakeimg.pl/300/picture.jpg",
"mobilePhone": "+1-541-754-3010",
"address": {
"city": "Paris",
"country": "France",
"zipCode": "75010",
"street": "6 rue de Paradis"
},
"socialNetworks": [
{
"type": "LINKEDIN",
"profile": "johndoe"
}
],
"customFields": [
{
"groupId": "RXZlbnRQZW9wZEdyb3VwXzExMA==",
"action": "SET_VALUE",
"value": "Research & Development"
},
{
"groupId": "RXZlbnRQZW9wZEdyb3VwXzExMQ==",
"action": "SET_VALUE",
"value": "France"
},
{
"groupId": "RXZlbnRQZW9wZEdyb3VwXzExMg==",
"action": "SET_VALUE",
"value": "Robotics"
},
{
"groupId": "RXZlbnRQZW9wZEdyb3VwXzExMg==",
"action": "SET_VALUE",
"value": "Blockchain"
},
{
"groupId": "RXZlbnRQZW9wZEdyb3VwXzExMg==",
"action": "SET_VALUE",
"value": "AI"
}
]
},
"update": {
"isUser": true,
"email": "test@test.com",
"firstName": "UpdateJohn",
"lastName": "UpdateDoe",
"jobTitle": "CTO",
"organization": "Tesla New",
"biography": "Lorem ipsum dolor sit amet, odio prima pri te, id sanctus recteque deterruisset vel. Dico tractatos eam eu, dolor inciderint in est.",
"websiteUrl": "https://www.teslanew.com",
"photoUrl": "https://fakeimg.pl/300/picture.jpg",
"mobilePhone": "+1-541-754-3010",
"address": {
"city": "Paris",
"country": "France",
"zipCode": "75010",
"street": "6 rue de Paradis"
},
"socialNetworks": [
{
"type": "LINKEDIN",
"profile": "updatejohndoe"
}
],
"customFields": [
{
"groupId": "RXZlbnRQZW9wZEdyb3VwXzExMA==",
"action": "SET_VALUE",
"value": "Research & Development 1"
},
{
"groupId": "RXZlbnRQZW9wZEdyb3VwXzExMQ==",
"action": "SET_VALUE",
"value": "France 1"
},
{
"groupId": "RXZlbnRQZW9wZEdyb3VwXzExMg==",
"action": "SET_VALUE",
"value": "Robotics 1"
},
{
"groupId": "RXZlbnRQZW9wZEdyb3VwXzExMg==",
"action": "SET_VALUE",
"value": "Blockchain 1"
},
{
"groupId": "RXZlbnRQZW9wZEdyb3VwXzExMg==",
"action": "SET_VALUE",
"value": "AI 1"
}
]
},
"actions": {
"updateGroups": {
"action": "ADD",
"groupIds": [
"RXZlbnR8xNjcyMjI="
]
}
}
}
]
}

Perform multiple actions on a profile

This mutation creates or updates a profile while applying several related actions in a single request.

Arguments

  • clientId — The unique identifier for the profile on the customer's side. It can be any alphanumeric value, must be unique within the community, and cannot be changed after the profile is created.
  • firstName — The first name of the person.
  • lastName — The last name of the person.
  • email — The email address linked to the profile.

The example below performs the following actions in a single request:

  1. Creates or updates the profile details of a person.
  2. Adds, removes, or replaces the groups the person belongs to.
  3. Adds, removes, or replaces the codes (QR code or file-based barcode) assigned to the person.
  4. Adds, removes, or replaces the sessions (plannings) on which the person is listed as a speaker.
  5. Adds, removes, or replaces the sessions (plannings) on which the person is listed as an attendee.
  6. Adds, removes, or replaces the exhibitors the person is a member of.

Groups must already exist before they can be assigned, either through Studio or through the Content API. See the mutation to create a new group.

The email address of People with an account cannot be updated through the API.

Several barcodes can be attached to a profile. All of them remain valid for scanning, but only the most recently added one is shown in the app's ticket section.

The action field accepts the following values:

  • ADD — Append the supplied items to the existing list.
  • REMOVE — Remove the supplied items from the existing list.
  • REPLACE — Replace the existing list with the supplied items.

Additional optional arguments

  • force — When set to true, the import bypasses two integrity checks:

    • Email-to-clientId binding. By default, each email is associated with one account, each account is associated with one community profile, and each clientId is associated with one community profile. Swapcard verifies that the account linked to the email matches the community profile retrieved by the clientId. With force: true, this check is skipped, which allows an existing clientId to be reassigned to a different account.
    • One clientId per community profile. By default, each community profile is linked to a single clientId. With force: true, additional clientIds can be added to the same community profile. Every clientId must still be unique within the community.

    When to use force: true

    • Your Swapcard community is new and no event has taken place yet.
    • [OR] The people you are importing are new to Swapcard (they do not already have an account).
    • [OR] You do not need to preserve the data (contacts, bookmarks, meetings, profile details, etc.) that people may have from previous events.
    • [AND] You do not have multiple events running simultaneously within the same community.

    When not to use force: true

    • You have several events running at the same time within the community.
    • [OR] Some users already have an account in the community and you want them to keep their data (contacts, bookmarks, meetings, profile details, etc.) from previous events.

Query

mutation importEventPeople($eventId: ID!, $data: [ImportEventPersonInput!]!) {
importEventPeople(eventId: $eventId, validateOnly: false, data: $data) {
errors {
inputId
errorCode
message
}
results {
inputId
eventPerson {
id
email
updatedAt
speakerOnPlannings {
id
title
}
userId
memberOnExhibitors {
id
name
}
}
}
eventPeopleUpdated
}
}

Variables

{
"eventId": "RXZlbnDY1Nc4",
"data": [
{
"clientId": "987654321",
"create": {
"isUser": true,
"email": "test@test.com",
"firstName": "John",
"lastName": "Doe"
},
"actions": {
"updateGroups": {
"action": "ADD",
"groupIds": [
"RXZlbnR8xNjcyMjI="
]
},
"updateBarcodes": {
"action": "ADD",
"barcodes": [
{
"type": "QR_CODE",
"value": "1234567890"
},
{
"type": "QR_CODE",
"value": "9876543210"
},
{
"type": "FILE",
"value": "https://www.test.com/badge.pdf"
}
]
},
"isSpeakerOnPlannings": {
"action": "ADD",
"planningIds": [
"UGxhbmODAwMzk1"
]
},
"isAttendeeOnPlannings": {
"action": "ADD",
"planningIds": [
"UGxhbmwMzk1"
]
},
"isMemberOnExhibitors": {
"action": "ADD",
"exhibitorIds": [
"RXhoaWJzk2Nw=="
]
}
},
"force": true
}
]
}

Delete People

This mutation deletes one or more profiles from an event.

Arguments

  • eventId — The ID of the event the profiles belong to.
  • eventPeopleIds — The IDs of the profiles to delete. Pass multiple values to delete several profiles in a single request.

Query

mutation deleteEventPeople($eventId: ID!, $eventPeopleIds: [ID!]!) {
deleteEventPeople(eventId: $eventId, eventPeopleIds: $eventPeopleIds) {
eventPeopleDeleted
}
}

Variables

{
"eventId": "RXZlbnDY1Nc4",
"eventPeopleIds": [
"RXZlbnRQZW9wI5NjI3Nzg=",
"RXZlbnRQZW9wM5NjI3ODA="
]
}