GQL Endpoint
We also have a GraphQL endpoint which is authorised using a bearer token
and can be used to access crew and job data. Learn more about GraphQL over http here.
You have access to the following:
companyCrewAll(input: CompanyCrewAllInput): CompanyCrewAllResponse
companyCrewOne(crewId: Int!): CompanyCrew!
companyJobs(input: CompanyJobsInput): CompanyJobsResponse
companyCrewJobs(input: CompanyCrewJobsInput): CompanyCrewJobsResponse
companyLeavers(input: CompanyLeaversInput): CompanyLeaversResponse!
As a GQL endpoint, it is self-documenting if you have an API key.
Prior to access, here is the associated schema for planning purposes:
extend type Query {
companyJobs(input: CompanyJobsInput): CompanyJobsResponse
companyCrewJobs(input: CompanyCrewJobsInput): CompanyCrewJobsResponse
}
input CompanyJobsInput {
"""
Filters company crew based on different criteria
"""
filter: CompanyJobsFilter
"""
Pagination page. Default value is 1
"""
page: Int = 1
"""
Number of items per page. Default value is 100 and maximum is 100
"""
perPage: Int = 100
}
type CompanyJobsResponse {
"""
Paginated list of returned jobs.
"""
paginatedList: [Job!]!
"""
Pagination pager with total count and current page
"""
pager: Pager
}
input CompanyJobsFilter {
jobIds: [ID!]
fromRange: Time
toRange: Time
crewJobStatus: [CrewJobStatus]
}
input CompanyCrewJobsInput {
"""
Filters company crew based on different criteria
"""
filter: CompanyCrewJobsFilter
"""
Pagination page. Default value is 1
"""
page: Int = 1
"""
Number of items per page. Default value is 100 and maximum is 100
"""
perPage: Int = 100
}
type CompanyCrewJobsResponse {
"""
Paginated list of returned jobs.
"""
paginatedList: [CrewJobExtended!]!
"""
Pagination pager with total count and current page
"""
pager: Pager
}
input CompanyCrewJobsFilter {
crewJobIds: [ID!]
fromRange: Time
toRange: Time
crewJobStatus: [CrewJobStatus]
}
type Board {
id: ID
name: String
color: String
}
"""
Company Job Data
Get published jobs
"""
type Job {
id: ID
address: String
board: Board
color: String
date: Date
description: String
locationShortName: String
multiDayJobId: ID
title: String
groupId: ID
roles: [Role!]
labels: [Label!]
}
"""
Job Label
"""
type Label {
id: ID
name: String
type: LabelType
}
"""
Job Role
"""
type Role {
ageRestriction: Int
breakPeriod: Int
breakPeriodPaid: Boolean
crewJobs: [CrewJobSlim]
end: Time
expenses: Float
feeType: FeeType
id: ID
labels: [Label!]
linkedId: String
name: String
requiredCrewCount: Int
salary: Float
start: Time
subsistence: Float
total: Float
visibleOnJobBoard: Boolean
}
interface CrewJob {
breakPeriod: Int
breakPeriodPaid: Boolean
crewId: ID
feeType: FeeType
expenses: Float
id: ID
salary: Float
status: CrewJobStatus
subsistence: Float
total: Float
}
"""
Crew Job
"""
type CrewJobSlim implements CrewJob {
breakPeriod: Int
breakPeriodPaid: Boolean
crewId: ID
feeType: FeeType
expenses: Float
id: ID
salary: Float
status: CrewJobStatus
subsistence: Float
total: Float
}
type CrewJobExtended implements CrewJob {
activity: CrewJobActivity
jobId: ID
roleId: ID
board: Board
breakPeriod: Int
breakPeriodPaid: Boolean
crewId: ID
end: Time
expenses: Float
feeType: FeeType
id: ID
salary: Float
status: CrewJobStatus
start: Time
subsistence: Float
total: Float
}
type CrewJobActivity {
application: String
checkedInAt: Time
checkedOutAt: Time
checkInSentAt: Time
confirmAttendanceSentAt: Time
hasConfirmedAttendance: Boolean
confirmedAttendanceAt: Boolean
markedAsAbsentByAdminAt: Time
isCheckedIn: Boolean
isReserved: Boolean
isShortlisted: Boolean
isSupervisor: Boolean
wasBooked: Boolean
approvedByAdminAt: Time
sequence: Int
}
enum FeeType {
PER_HOUR
PER_JOB
NO_FEE
}
enum LabelType {
CUSTOM
CLIENT
PROJECT_NUMBER
}
enum CrewJobStatus {
PENDING
APPROVED
CANCELLED_BY_ADMIN
CANCELLED_BY_FREELANCER
CANCELLED_BY_SYSTEM
INVITED
}
extend type Query {
companyLeavers(input: CompanyLeaversInput): CompanyLeaversResponse!
}
input CompanyLeaversInput {
"""
Filters company crew based on different criteria
"""
filter: CompanyLeaversFilter
"""
Pagination page. Dafault value is 1
"""
page: Int = 1
"""
Number of items per page. Dafault value is 100 and maximum is 1000
"""
perPage: Int = 100
}
input CompanyLeaversFilter {
statusIn: [LeaverStatus!]
employmentTypeIn: [EmploymentType!]
updatedAfter: Time
}
type CompanyLeaversResponse {
"""
Paginated list of returned crew.
"""
paginatedList: [CompanyLeaversInList!]!
"""
Pagination pager with total count and current page
"""
pager: Pager
}
"""
Company Crew Leaver Data
Crew leaver information that can be used to match company records when a user is suspended or deletes their account
"""
type CompanyLeaversInList implements CompanyCrewLeaverData {
crewId: ID!
employmentType: EmploymentType!
workforceId: String!
status: LeaverStatus!
updatedAt: Time!
registeredAt: Time
}
interface CompanyCrewLeaverData {
crewId: ID!
workforceId: String!
status: LeaverStatus!
updatedAt: Time!
registeredAt: Time
employmentType: EmploymentType
}
"""
Leaver Status is a specific company
"""
enum LeaverStatus {
SUSPENDED
DELETED
}
extend type Query {
companyCrewAll(input: CompanyCrewAllInput): CompanyCrewAllResponse
companyCrewOne(crewId: Int!): CompanyCrew!
}
extend type Mutation {
updateCompanyCrew(input: UpdateCompanyCrewInput!): UpdateCompanyCrewResponse!
}
type UpdateCompanyCrewResponse {
success: Boolean!
"""
Errors object has next structure:
{
[property: [String!]!]
}
"""
errors: Map
}
input UpdateCompanyCrewInput {
crewId: Int!
update: CompanyCrewUpdate!
}
input CompanyCrewUpdate {
uniqueId: String
}
input CompanyCrewAllInput {
"""
Filters company crew based on different criteria
"""
filter: CompanyCrewAllFilter
"""
Pagination page. Default value is 1
"""
page: Int = 1
"""
Number of items per page. Default value is 100 and maximum is 1000
"""
perPage: Int = 100
}
type CompanyCrewAllResponse {
"""
Paginated list of returned crew.
"""
paginatedList: [CompanyCrewInList!]!
"""
Pagination pager with total count and current page
"""
pager: Pager
}
input CompanyCrewAllFilter {
statusIn: [UserStatus!]
employmentTypeIn: [EmploymentType!]
"""
Filters crew by full_name (first_name + last_name) or email or unique_id or phone
"""
search: String
updatedAfter: Time
}
"""
Company Crew Data
Is a combination of Company Specific and Shared Crew Data
"""
type CompanyCrewInList implements CompanyCrewData {
"""
'crewId' is an alias to 'userId'
"""
crewId: ID!
title: String!
firstName: String!
lastName: String!
email: String!
birthDay: Date
phone: String!
avatar: String!
gender: Gender!
status: UserStatus!
biography: String!
experience: String!
workCapacity: String!
employmentType: EmploymentType!
cv: String!
travelAbility: String!
disability: String!
linkedIdURL: String!
twitterURL: String!
facebookURL: String!
instagramURL: String!
emergencyContact1Phone: String!
emergencyContact1Name: String!
emergencyContact1Relationship: String!
emergencyContact2Phone: String!
emergencyContact2Name: String!
emergencyContact2Relationship: String!
uniqueId: String!
bankNumber: String!
sortCode: String!
taxCode: String!
city: String!
address: String!
address2: String!
postCode: String!
longitude: Float
latitude: Float
updatedAt: Time!
registeredAt: Time
countrySpecificData: CountrySpecificData!
firstJobStartDate: Date
tags: [Tag!]!
}
"""
Company Crew Data
Additionally to company crew data, have a lot of relational data.
"""
type CompanyCrew implements CompanyCrewData {
"""
'crewId' is an alias to 'userId'
"""
crewId: ID!
title: String!
firstName: String!
lastName: String!
email: String!
birthDay: Date
phone: String!
avatar: String!
gender: Gender!
status: UserStatus!
biography: String!
experience: String!
workCapacity: String!
employmentType: EmploymentType!
cv: String!
travelAbility: String!
disability: String!
linkedIdURL: String!
twitterURL: String!
facebookURL: String!
instagramURL: String!
emergencyContact1Phone: String!
emergencyContact1Name: String!
emergencyContact1Relationship: String!
emergencyContact2Phone: String!
emergencyContact2Name: String!
emergencyContact2Relationship: String!
uniqueId: String!
bankNumber: String!
sortCode: String!
taxCode: String!
city: String!
address: String!
address2: String!
postCode: String!
longitude: Float
latitude: Float
updatedAt: Time!
registeredAt: Time
countrySpecificData: CountrySpecificData!
alerts: [UserAlert]
firstJobStartDate: Date
}
interface CompanyCrewData {
crewId: ID!
title: String!
firstName: String!
lastName: String!
email: String!
birthDay: Date
phone: String!
avatar: String!
gender: Gender!
status: UserStatus!
biography: String!
experience: String!
workCapacity: String!
employmentType: EmploymentType!
cv: String!
travelAbility: String!
disability: String!
linkedIdURL: String!
twitterURL: String!
facebookURL: String!
instagramURL: String!
emergencyContact1Phone: String!
emergencyContact1Name: String!
emergencyContact1Relationship: String!
emergencyContact2Phone: String!
emergencyContact2Name: String!
emergencyContact2Relationship: String!
uniqueId: String!
bankNumber: String!
sortCode: String!
taxCode: String!
city: String!
address: String!
address2: String!
postCode: String!
longitude: Float
latitude: Float
updatedAt: Time!
registeredAt: Time
countrySpecificData: CountrySpecificData!
firstJobStartDate: Date
}
"""
User Status is a specific company
"""
enum UserStatus {
APPLICATION_IN_PROGRESS
APPLICANT
APPROVED
ACTIVE
PAUSED
WAITING_LIST
INVITED
DECLINED
SUSPENDED
DELETED
}
"""
Crew emplyment type in a company.
There also another type which can be added in the future: 'limited_company' (not supported for the moment)
"""
enum EmploymentType {
INCOMPLETE
EMPLOYED
SELF_EMPLOYED
}
enum Gender {
MALE
FEMALE
OTHER
}
type UserAlert {
id: Int!
text: String!
createdBy: CreatedBy
updatedAt: Time!
createdAt: Time!
}
type CreatedBy {
userId: Int!
firstName: String!
lastName: String!
avatar: String!
}
type CountrySpecificData {
countryId: Int!
code: String!
name: String!
values: [CrewCountryValue!]!
}
type CrewCountryValue {
id: Int!
name: String!
value: String!
}
type Tag {
id: Int!
name: String!
}
curl 'https://api.liveforce.co/gql' -H 'Accept-Encoding: gzip, deflate, br' -H 'Content-Type: application/json' -H 'Accept: application/json' -H 'Connection: keep-alive' -H 'DNT: 1' -H 'Origin: file://' -H 'Authorization: Bearer eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCIsImtpZCI6IkxvZjZpRm9EbWlGWHctSzA5Nkd4MyJ9.eyJodHRwczovL3N0YWdpbmcubGl2ZWZvcmNlLmNvL3Byb3h5L2NvbXBhbnktaWQiOiIxNzkiLCJpc3MiOiJodHRwczovL2xpdmVmb3JjZS5ldS5hdXRoMC5jb20vIiwic3ViIjoieXNWcVRZV2t6RFlYb1MxOFFWV2xJemRIS0dqVVJzREFAY2xpZW50cyIsImF1ZCI6Imh0dHBzOi8vc3RhZ2luZy5saXZlZm9yY2UuY28vcHJveHkvIiwiaWF0IjoxNjM1NzA1MzMyLCJleHAiOjE2MzU3OTE3MzIsImF6cCI6InlzVnFUWVdrekRZWG9TMThRVldsSXpkSEtHalVSc0RBIiwic2NvcGUiOiJyZWFkOnBheW1lbnRfcmVwb3J0cyByZWFkOmNvbXBhbnlfY3Jld19kYXRhIHdyaXRlOmNvbXBhbnlfY3Jld19kYXRhIiwiZ3R5IjoiY2xpZW50LWNyZWRlbnRpYWxzIn0.X7gQWmonqxa6Y_BWhfr75M-bHfiGI89SYAsFmazZC2ta1mh8Pd6Ji-HLtVpM1nyM29eza81KezjXpLB18Ur5yEAxg1XTxGdvpOnRPqiB8wDGykpMW3r0j70_MqNqGDsfwj_0Bt8iBnjn9IkeFQFtbrIqigki2R1jljYnZX2fguFl1sa-Ff6Q0xR5D2fc8tIwC5_WtrQ1ZTbkaDksjwAGUr_riOFY8QtTU4zYc_AWlwv6zZgXoVmh9QZhnf5qWh3GLdamXm-BwvgQRiohXMqymTva6H6vY3_fVmu_gVnIwIwRmMqzW4_H_IvCj-S48Be2fDQ-6S3XhA-ZpAbbfOs6Sg' --data-binary '{"query":"# Write your query or mutation here\nquery CompanyCrewAllByPage {\n companyCrewAll(input: { page: 1, perPage: 100 }) {\n paginatedList {\n title\n firstName\n lastName\n email\n phone\n }\n pager {\n pageCount\n perPage\n currentPage\n }\n }\n}\n"}' --compressed