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, andclientIdare always required.emailis required whenisUseristrue(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
groupIdmust be provided through theupdateGroupsaction so the profile is assigned to at least one group.
The following fields are recommended:
jobTitleandorganization, plus any relevant custom fields, improve matchmaking and networking suggestions.biographyandphotoUrlare particularly useful for speakers.- A barcode (added through the
updateBarcodesaction) 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
isVisibletofalsehides 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
Phone number format
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!
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 whenisUseristrue; for People without an account,emailmay be omitted.isUser— Controls whether an account is created. Set totrueto create a Swapcard account alongside the profile; set tofalseto 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
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
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:
- Creates or updates the profile details of a person.
- Adds, removes, or replaces the groups the person belongs to.
- Adds, removes, or replaces the codes (QR code or file-based barcode) assigned to the person.
- Adds, removes, or replaces the sessions (plannings) on which the person is listed as a speaker.
- Adds, removes, or replaces the sessions (plannings) on which the person is listed as an attendee.
- 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 totrue, the import bypasses two integrity checks:- Email-to-
clientIdbinding. By default, each email is associated with one account, each account is associated with one community profile, and eachclientIdis associated with one community profile. Swapcard verifies that the account linked to theemailmatches the community profile retrieved by theclientId. Withforce: true, this check is skipped, which allows an existingclientIdto be reassigned to a different account. - One
clientIdper community profile. By default, each community profile is linked to a singleclientId. Withforce: true, additionalclientIds can be added to the same community profile. EveryclientIdmust 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.
- Email-to-
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
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="
]
}