Skip to Content
The AKIN Travel developer platform is in beta — APIs may change. Get started →
GraphQL referenceReference

GraphQL reference

Operations and types available to partner integrations (the React SDK and direct API clients alike). The schema is filtered server-side by @PartnerSdkExposed; this page mirrors what __schema returns when introspected with a valid partner API key.

Queries

bookingsByMember

Get bookings by member

bookingsByMember(limit: Int, memberId: String!, offset: Int): [Booking!]!

loyaltyTransactionsWithMetrics

Get loyalty transactions with tier metrics from v_booking_metrics view

loyaltyTransactionsWithMetrics(excludeDuplicates: Boolean, limit: Int, memberId: String!, offset: Int, partnerId: String): LoyaltyTransactionsWithMetricsResult!

memberByEmail

Partner-scoped server-to-server read: member identity + tier + points by email. Requires a partner API key; limited to members the calling partner holds a qualifying tie to.

memberByEmail(email: String!): PartnerMemberRead!

memberByExternalId

Partner-scoped server-to-server read: member identity + tier + points by the partner’s own external ID. Requires a partner API key; limited to members enrolled with that partner.

memberByExternalId(externalId: String!): PartnerMemberRead!

memberProfile

Get comprehensive member profile with statistics

memberProfile(id: ID!): MemberProfile

memberTierHistory

Get member tier change history

memberTierHistory(memberId: String!, pagination: PaginationInput): MemberTierHistoryConnection!

tierBenefits

Get all tier benefits for a partner - rewards grouped by tier and scope

tierBenefits(locale: String, originPartnerId: String, partnerId: String!): [TierBenefits!]!

tierConfigs

Get tier configs for a partner (with global fallback) or global configs if no partnerId

tierConfigs(locale: String, partnerId: String): [LoyaltyTierConfig!]!

Mutations

enrollMember

Partner SDK: enrol a member by email + profile (server-to-server, no user login). Requires a partner API key with the member:write scope.

enrollMember(input: EnrollMemberInput!): EnrollMemberResult!

loginMemberGIP

Website member login via GIP (Google Identity Platform)

loginMemberGIP(input: LoginMemberGIPInput!): GIPMemberAuthPayload!

passkeyAuthenticate

Verify passkey authentication and return Firebase custom token with tenant ID

passkeyAuthenticate(authenticationResponse: JSONObject!, expectedChallenge: String): PasskeyAuthResponse!

passkeyAuthenticationOptions

Generate WebAuthn authentication options

passkeyAuthenticationOptions(tenantId: String, userEmail: String, userId: String, userType: String): JSONObject!

recordLoyaltyTransaction

Partner SDK: credit or debit a member’s AKIN points (server-to-server, idempotent). Requires a partner API key with the loyalty:write scope.

recordLoyaltyTransaction(input: RecordLoyaltyTransactionInput!): RecordLoyaltyTransactionResult!

redeemReward

Partner SDK: record that a member redeemed one of the partner’s rewards (server-to-server, idempotent). Requires a partner API key with the loyalty:write scope.

redeemReward(input: RedeemRewardInput!): RedeemRewardResult!

Request a magic link for login. Sends email to existing users.

requestMagicLink(email: String!, locale: String, partnerId: ID, partnerSlug: String, redirectUrl: String, userType: String!): RequestMagicLinkResult!

signUpPasswordless

Creates a member account via an email verification link (website/white-label). NOT the passkey flow (passkeys are enrolled post-signup); NOT the removed iOS OTP login.

signUpPasswordless(input: SignUpPasswordlessInput!): SignUpResult!

updateMember

Update member

updateMember(id: ID!, input: UpdateMemberInput!): Member!

verifyAuthToken

Verify auth token from email link and return Firebase custom token for sign-in.

verifyAuthToken(token: String!): AuthTokenResult!

Types

AuthTokenResult

Object

Result of token verification

FieldTypeDescription
customTokenStringFirebase custom token for sign-in
errorStringError message if failed
initialSyncInitialSyncSummaryInitial sync summary for new members (past + future stays)
isNewUserBooleanWhether this is a new user (first verification)
memberDataMemberMember data if user is a member
requiresPasskeyBooleanWhether passkey setup is required
successBoolean!Whether verification was successful
tenantIdStringTenant ID used when creating the custom token
userIdStringUser ID
userTypeStringUser type: MEMBER or DASHBOARD_USER

Booking

Object

Booking/reservation record

FieldTypeDescription
adultCountInt
averageNightlyRateFloat!Average nightly rate (total price / nights), in the booking currency — cents preserved
balanceOwedFloatBalance the guest owes the property on arrival: stay total − the AKIN 15% reservation deposit (bookingFee). NULL when no AKIN deposit was collected (a PMS-synced reservation where the property takes the whole amount at the desk) — clients render NULL as a fallback (the dashboard uses ”—“).
bookingDateDateTimeISO
bookingFeeFloatBooking fee amount (10% of total)
bookingFeePaidBoolean!Whether the booking fee has been paid
bookingFeePaidAtDateTimeISOWhen the booking fee was confirmed paid
bookingSourceIdStringFK to booking_sources table for channel attribution
cashDepositCollectedFloatActual cash Stripe collected for this booking (the 15% deposit minus any travel credit applied), in the booking currency. Computed by the Stripe webhook as booking_fee * (chargeAmount / baseChargeAmount). The PMS push orchestrator posts THIS to the Cloudbeds folio instead of total_price, so the folio matches what AKIN charged the card. NULL = not recorded; 0 = travel credit covered the full deposit.
channelGuestConfirmationNumberStringOTA guest-facing confirmation number (e.g. Booking.com 6044.913.102 the guest sees on their confirmation email). Distinct from pms_confirmation_number, which carries the channel-feed property-facing reservation id. Populated for OTA-channel bookings only. See akin-travel/issues#1551.
channelNameStringBooking channel from PMS (e.g., Direct, Booking.com, Expedia). Used for loyalty eligibility.
checkInStringCheck-in date (YYYY-MM-DD, property-local). NULL for bad-data rows with no recorded check-in.
checkOutStringCheck-out date (YYYY-MM-DD, property-local). NULL for bad-data rows with no recorded check-out.
childCountInt
confirmationNumberString
consolidatedFrom[String!]Array of original booking IDs that were merged into this one
createdAtDateTimeISO!
currencyString
depositRefundAmountFloatDeposit amount refunded on an in-window (flexible-rate) cancellation, in depositRefundCurrency
depositRefundCurrencyStringISO currency of the deposit refund
depositRefundTypeDepositRefundTypeHow the deposit refund was issued: CASH (Stripe) or CREDIT (travel credit)
depositRefundedAtDateTimeISOWhen the deposit refund was issued
eligibilityReasonString⚠️ Deprecated. Sunset 2026-09-08: Use eligibilityReasonCode and translate client-side. — Deprecated alias of eligibilityReasonCode. Populated identically during migration.
exchangeRateFloatUSD exchange rate used for conversion
feesFloat
guestEmailStringGuest email for non-member bookings (for future member linking)
guestIdentityWithheldBooleanTrue when guest identity on this row was withheld by the Customer Data Availability Policy post-stay cutoff (the stay checked out over 60 days ago and the caller is partner/property staff). NULL = the policy did not act. Read this instead of inferring ‘not linked’ from a blank memberId — a withheld row and a genuinely member-less row look identical otherwise. Discloses nothing about whether a member is attached: every lapsed row is anonymised, linked or not.
guestPhoneStringGuest phone (E.164) for non-member bookings — orphan-link signal alongside guest_email
guestsInt
idID!
isAkinManagedBoolean!True when AKIN owns this booking’s lifecycle — created through AKIN direct-booking checkout (source=WEBSITE / trip flow) — vs a reservation synced in from the property PMS. Member-facing cancel / perks / edit controls gate on this so a synced reservation can’t be cancelled or have rewards changed through AKIN. See akin-travel/issues#1925.
isConsolidatedBoolean!True if this booking was created by merging manual + PMS bookings
isLinkedBoolean!True when the booking is linked to a member account (memberId is set). False = OTA/non-member booking.
isOriginBookingBoolean!True if booking is at member origin partner (member.partnerId == property.partnerId)
memberIdStringMember ID (null for non-member OTA bookings)
membershipYearIntMembership year (-1 = pre-membership, 1+ = membership years, null = unknown). Computed, not stored.
mergedIntoBookingIdStringIf this booking was merged, points to the consolidated booking ID
metadataBookingMetadataBooking metadata
nightsInt!Number of nights (minimum 1 for same-day stays)
numberOfGuestsInt⚠️ Deprecated. Sunset 2026-10-10: duplicate of guests (same bookings.number_of_guests column); read guests instead. Removed with the bookings.guests column drop — akin-travel/issues#2656 Phase B.
paymentStatusPaymentStatus
pmsBookingIdString
pmsCancelStatusStringOutbound PMS cancel push state — tracked separately from create
pmsConfirmationNumberStringPMS confirmation number (from property management system)
pmsCustomerIdStringGuest ID in the PMS (Mews CustomerId etc.)
pmsLastErrorStringMost recent PMS push error message
pmsLastSyncedAtDateTimeISOLast successful PMS push timestamp
pmsPaymentPostedAtDateTimeISOWhen the Stripe-collected payment was posted to the PMS folio (Cloudbeds postPayment). NULL = not yet posted. Guards against double-post on retry. Set ONLY after a confirmed post (akin-travel/issues#1909), so a crash before the post leaves this NULL and the deposit stays retryable.
pmsSyncAttemptsIntNumber of attempts made to push this booking to the PMS
pmsSyncStatusStringOutbound PMS push state: NOT_APPLICABLE, PENDING, SYNCING, SYNCED, FAILED
pointsEarnedIntPoints earned from this booking (derived from total_price + currency exchange rate)
propertyIdString!
propertyPartnerIdStringPartner ID of the property (resolved via property, for scope calculation)
rateCurrencyStringCurrency of the rate charged (from availability)
ratePlanIdStringRate plan ID
roomCountInt
roomTypeIdStringRoom type ID
sourceString
specialRequestsString
spendUsdFloatSpend converted to USD via exchange rate
statusBookingStatus
stripePaymentIntentIdStringStripe PaymentIntent ID for booking fee
subtotalFloat
taxesFloat
totalPriceFloat
tripIdStringTrip ID (when booked via trip flow)
updatedAtDateTimeISO!

BookingMetadata

Object

Booking metadata

FieldTypeDescription
confirmationSentBoolean
internalNotesString
notesString
reminderSentBoolean
sourceString

BookingStatus

Enum

ValueDescription
CANCELLED
CHECKED_IN
CHECKED_OUT
COMPLETED
CONFIRMED
MERGED
NO_SHOW
PENDING

DateTimeISO

Scalar

A date-time string at UTC, such as 2007-12-03T10:15:30Z, compliant with the date-time format outlined in section 5.6 of the RFC 3339 profile of the ISO 8601 standard for representation of dates and times using the Gregorian calendar.This scalar is serialized to a string in ISO 8601 format and parsed from a string in ISO 8601 format.

DepositRefundType

Enum

ValueDescription
CASH
CREDIT

DeviceInfoInput

Input

Device information for session tracking

FieldTypeDescription
browserString
deviceString
ipAddressString
osString
userAgentString

EnrollMemberInput

Input

Server-to-server member enrollment by a partner

FieldTypeDescription
emailString!Member email (matched case-insensitively for idempotency)
externalIdStringPartner’s own loyalty key for this member on their side. Unique per partner.
firstNameString!
lastNameString!

EnrollMemberResult

Object

Result of a partner server-to-server member enrollment

FieldTypeDescription
createdBoolean!True if a new member account was created (vs an existing one reused)
enrollmentChangedBoolean!True if the partner enrollment was newly created or reactivated
memberIdID!AKIN member id for the partner to persist

EnrollmentSource

Enum

ValueDescription
DASHBOARD
MANUAL
MIGRATION
SDK
SIGNUP
URL_PARAM
WHITE_LABEL

GIPMemberAuthPayload

Object

GIP member authentication payload

FieldTypeDescription
memberDataMember!Loyalty member data
userMemberUser!GIP user information

InitialSyncSummary

Object

Summary of initial signup sync (past + future stays)

FieldTypeDescription
failedStaysCountInt!Stays that failed to import and were skipped. Non-zero means the sync is incomplete and was left re-runnable
futureStays[SyncedStay!]!Future stays (no points yet)
futureStaysCountInt!Number of future stays synced
messageStringSummary message
pastStays[SyncedStay!]!Past stays with points awarded
pastStaysCountInt!Number of past stays synced
pointsAwardedInt!Total points awarded from past stays
successBoolean!Whether sync was successful

JSONObject

Scalar

The JSONObject scalar type represents JSON objects as specified by ECMA-404 .

LoginMemberGIPInput

Input

GIP (Google Identity Platform) authentication input for website members

FieldTypeDescription
countryCodeStringCountry code (e.g., AU, US, GB)
deviceInfoDeviceInfoInput
enrollmentSourceEnrollmentSourceWhere the sign-in originated from (white-label site, URL param, SDK, etc.). Used to tag partner enrollments for existing members signing in with a new partner context. Defaults to WHITE_LABEL when partnerId is set and this is omitted, or SDK when the request is partner-SDK-authenticated. Issue #1160.
firstNameStringFirst name for new member registration
idTokenString!GIP ID token from client authentication
lastNameStringLast name for new member registration
marketingOptInBooleanMarketing email opt-in preference
partnerIdStringPartner ID for attribution tracking
phoneStringPhone number for SMS/MFA
termsAcceptedBooleanTerms and conditions acceptance

LoyaltyTierConfig

Object

Loyalty tier configuration

FieldTypeDescription
activeBoolean!
cardBodyDataString
cardFooterDataString
createdAtDateTimeISO!
displayNameString!
displayOrderInt!
eligibilityString
idID!
maxPerksAllowedInt!
partnerIdString
secretBenefitsBoolean!Secret benefits — hide benefit details unless member has reached this tier
sourceLocaleString!BCP-47 locale this tier config was authored in. Drives the source language used by translation.service.
tierBylineString
tierColorString
tierIconString
tierNameTierName!
tierTextColorString
tierTypeTierType!
translationsJSONObjectAuto-translated content per locale
updatedAtDateTimeISO!

LoyaltyTransaction

Object

Loyalty points transaction record

FieldTypeDescription
balanceAfterInt⚠️ Deprecated. Sunset 2026-09-08: No longer computed. Use getMemberBalance query instead.
bookingChannelNameStringBooking channel from PMS (e.g., Direct, Booking.com)
bookingCheckInStringBooking check-in date YYYY-MM-DD (for booking transactions)
bookingIdString
bookingSourceTypeStringBooking source type (web_direct, admin_direct, direct, pms, consolidated)
createdAtDateTimeISO!
currencyStringOriginal booking currency code
descriptionString
eligibilityReasonCodeStringEligibility reason code for BOOKING transactions (null = eligible). Codes: STATUS_NOT_COMPLETED, PRE_MEMBERSHIP_OUTSIDE_WINDOW, OTA_NOT_ELIGIBLE, NON_REVENUE_CHANNEL.
exchangeRateFloatExchange rate to USD at time of booking
expiresAtDateTimeISOWhen these points expire (null = never)
idID!
isDuplicateBooleanTrue when this transaction is a same-day same-property duplicate of another transaction for this member — computed server-side via ROW_NUMBER so pagination cannot split a duplicate group across pages (akin-travel/issues#1231).
isPermanentBooleanTrue if points never expire (tattoo, etc.)
memberIdString!
membershipYearIntMembership year (-1 = pre-membership, 1+ = membership years, null = unknown)
nightsMemberOriginIntNights (member origin scope)
nightsNetworkIntNights (network scope)
nightsPartnerIntNights (partner scope - requires context)
pointsChangeInt!
propertiesMemberOriginIntDistinct properties (member origin scope)
propertiesNetworkIntDistinct properties (network scope)
propertiesPartnerIntDistinct properties (partner scope - requires context)
propertyIdStringProperty ID of the booking that produced this transaction (null for non-booking entries)
reasonString
relatedMemberEmailStringObfuscated email of the related member (for referral transactions)
sourceStringSource of this transaction (booking, referral, preference, adjustment)
spendMemberOriginFloatSpend in USD (member origin scope)
spendNetworkFloatSpend in USD (network scope)
spendOriginalFloatSpend in original booking currency
spendPartnerFloatSpend in USD (partner scope - requires context)
staysMemberOriginIntStays (member origin scope)
staysNetworkIntStays (network scope)
staysPartnerIntStays (partner scope - requires context)
transactionTypeLoyaltyTransactionType!

LoyaltyTransactionDirection

Enum

Direction of a server-to-server partner points write

ValueDescription
CREDIT
DEBIT

LoyaltyTransactionType

Enum

Type of loyalty transaction

ValueDescription
ADJUSTED
ADJUSTMENT
BONUS
BOOKING
EARN
EARNED
EXPIRATION
EXPIRED
REDEMPTION
REFERRAL
REFERRAL_REFERRED
REFERRAL_REFERRER
SPENT

LoyaltyTransactionsWithMetricsResult

Object

Paginated loyalty transactions with tier metrics

FieldTypeDescription
items[LoyaltyTransaction!]!
totalCountInt!

Member

Object

Member of the loyalty program

FieldTypeDescription
attributionMemberAttributionWhy this member is in the viewing partner’s cohort, and until when. NULL means not resolved for this viewer (GLOBAL scope / policy dark) — it is NOT a tie and must never render as a default one
avatarModerationStringAvatar moderation status: null (pending), approved, rejected
avatarUrlStringURL of member profile avatar image
closedAtDateTimeISOWhen the member closed their account (soft-delete); row is hard-purged 3 years after this
countryCodeString
createdAtDateTimeISO!
emailString!
emailPreferencesJSONObjectPer-template-code email opt-in/out map. Shape: { “<templateCode>”: boolean }. Absent entry = use default (transactional always on; marketing falls back to marketing_opt_in). See akin-travel/issues#1563
firstNameString
idID!
initialBonusAwardedAtDateTimeISOWhen initial signup sync was performed (one-time bonus)
lastNameString
loyaltyNumberString
marketingOptInBoolean
networkYearStartDateTimeISOWhen member network year began (for annual reset)
originPartnerIdStringPartner where member originally signed up
originPropertyIdStringProperty where member originally signed up (for QR code tracking)
partnerIdString
perkPreferences[String!]
phoneString
placeTypePreferences[String!]
preferredLanguageString
privacyAcceptedAtDateTimeISOServer-stamped time the member accepted the Privacy Policy
privacyAcceptedVersionStringPublished Privacy Policy version the member accepted (e.g. v24.05.2026). See akin-travel/issues#1820
signedUpByUserIdStringDashboard/staff user who enrolled this member (for staff competition leaderboard)
signupLocationSignupLocationWhere the member originally signed up
statusMemberStatus
termsAcceptedBoolean
termsAcceptedAtDateTimeISOServer-stamped time the member accepted the Customer T&C
termsAcceptedVersionStringPublished Customer T&C version the member accepted (e.g. v24.05.2026); pre-v24.05.2026 for legacy rows. See akin-travel/issues#1820
updatedAtDateTimeISO!
utmCampaignStringUTM campaign parameter captured at signup (e.g., spring2026)
utmMediumStringUTM medium parameter captured at signup (e.g., newsletter, cpc)
utmSourceStringUTM source parameter captured at signup (e.g., email, google)
vibePreferenceString

MemberAttribution

Object

Why a member is in the viewing partner’s cohort, and when that ceases

FieldTypeDescription
checkInStringCheck-in of the booking behind the tie (YYYY-MM-DD). Null for WHITE_LABEL — a standing enrolment owns no booking
checkOutStringCheck-out of the booking behind the tie (YYYY-MM-DD). Null for WHITE_LABEL
tieMemberQualifyingTie!The member’s strongest qualifying tie to the viewing partner
visibleUntilStringLast day this tie keeps the member in the cohort (YYYY-MM-DD): check-in for CANCELLED_UPCOMING, check-out + 60 days for POST_STAY_WINDOW. Null when the tie has no date-bounded expiry (BOOKING_WINDOW rolls into the post-stay window; WHITE_LABEL is standing) — never a guess

MemberProfile

Object

Comprehensive member profile with statistics

FieldTypeDescription
bookingHistory[Booking!]!Booking history for this member
favoriteRewardStringMost frequently selected reward/perk
lifetimeStatsMemberStats!Lifetime statistics
memberMember!Core member data
membershipYearStatsMemberStats!Statistics for current membership year (from join date anniversary)
originPartnerNameStringName of origin partner
originPropertyNameStringName of origin property (for QR code tracking)

MemberQualifyingTie

Enum

ValueDescription
BOOKING_WINDOW
CANCELLED_UPCOMING
POST_STAY_WINDOW
WHITE_LABEL

MemberStats

Object

Member statistics for a time period

FieldTypeDescription
akinPointsFloat!AKIN points in this period (derived from bookings; masked to 0 for partner staff when the Data Availability Policy withholds it)
originStaysInt!Number of stays at origin partner
totalNightsInt!Total number of nights across all properties
totalStaysInt!Total number of stays

MemberStatus

Enum

ValueDescription
ACTIVE
BLOCKED
CLOSED
INACTIVE
VIP

MemberTierHistory

Object

Member tier change audit record

FieldTypeDescription
changeReasonTierChangeReason!
createdAtDateTimeISO!
idID!
memberIdString!
metadataString
newTierString!
oldTierString!
pointsAtChangeInt!
staysAtChangeInt!

MemberTierHistoryConnection

Object

FieldTypeDescription
edges[MemberTierHistoryEdge!]!
pageInfoPageInfo!
totalCountInt!

MemberTierHistoryEdge

Object

FieldTypeDescription
cursorString!
nodeMemberTierHistory!

MemberUser

Object

Member user info from GIP

FieldTypeDescription
countryCodeString
emailString!
emailVerifiedString!
firstNameString
idID!
lastNameString
marketingOptInString
nameString!
phoneString
phoneVerifiedBoolean!
termsAcceptedString
termsAcceptedAtString

PageInfo

Object

FieldTypeDescription
endCursorString
hasNextPageBoolean!
hasPreviousPageBoolean!
startCursorString

PaginationInput

Input

FieldTypeDescription
afterString
beforeString
firstInt
offsetInt

PartnerMemberRead

Object

Partner-scoped member identity + current loyalty standing (tier + points).

FieldTypeDescription
emailString!
firstNameString
lastNameString
memberIdID!AKIN member ID
pointsFloat!Member’s current AKIN points balance with this partner (masked to 0 when the Data Availability Policy withholds it)
tierTierNameMember’s current calculated tier with this partner (current membership year)

PasskeyAuthResponse

Object

Passkey authentication response

FieldTypeDescription
customTokenString!Firebase custom token for authentication
tenantIdString!GIP tenant ID the token was created for

PaymentStatus

Enum

ValueDescription
FAILED
PAID
PENDING
REFUNDED

RecordLoyaltyTransactionInput

Input

Server-to-server partner points credit/debit

FieldTypeDescription
descriptionStringOptional longer description
emailStringMember email (matched case-insensitively)
externalIdStringPartner’s own external id for the member (as set on enrollment)
idempotencyKeyString!Idempotency token. A retry with the same token returns the original transaction and writes nothing.
memberIdIDAKIN member id
pointsInt!Positive points magnitude to credit or debit
reasonString!Short reason, surfaced in the member activity statement
typeLoyaltyTransactionDirection!

RecordLoyaltyTransactionResult

Object

Result of a server-to-server partner points write

FieldTypeDescription
balanceFloat!Member’s network-wide points balance after the write
idempotentReplayBoolean!True when this matched a prior idempotency key — no new write happened
memberIdID!AKIN member id the points were applied to
pointsChangeInt!Signed delta applied (+credit / -debit)
transactionIdID!The loyalty transaction (adjustment) id
typeLoyaltyTransactionDirection!

RedeemRewardInput

Input

Server-to-server partner reward redemption

FieldTypeDescription
emailStringMember email (matched case-insensitively)
externalIdStringPartner’s own external id for the member (as set on enrollment)
idempotencyKeyString!Idempotency token. A retry with the same token returns the original redemption and writes nothing.
memberIdIDAKIN member id
noteStringOptional note stored with the claim
propertyIdID!Property where the reward was redeemed. Must belong to the key’s partner.
rewardInstanceIdID!Reward instance id — the id returned by rewardInstancesForTier

RedeemRewardResult

Object

Result of a server-to-server partner reward redemption

FieldTypeDescription
idempotentReplayBoolean!True when this matched a prior idempotency key — no new write happened
memberIdID!AKIN member id the reward was recorded against
propertyIdID!Property the redemption was recorded against
redeemedAtDateTimeISO!When the redemption was recorded
redemptionIdID!The member activity (REWARD_CLAIM) id
remainingRedemptionsIntRedemptions of this reward still available to the member under the partner-wide limit. Null when the reward carries no such limit.
rewardIdID!The underlying reward template id — the identity network limits are counted on
rewardInstanceIdID!The reward instance that was redeemed
rewardNameStringEffective reward name at redemption time
tierStringMember’s tier at redemption time

RequestMagicLinkResult

Object

Result of magic link request

FieldTypeDescription
errorStringError message if failed
successBoolean!Whether the request was successful
verificationUrlStringVerification URL (E2E testing only - returned when E2E_AUTO_CONFIRM=true)

SignUpPasswordlessInput

Input

Passwordless signup input for website/white-label members

FieldTypeDescription
attributionTokenStringShort-lived HMAC-signed assertion, minted by the white-label server, of the partner whose HOST this sign-up came from. Every other partner signal on this input is client-chosen by design (QR / referral / cookie attribution); this is the only one the API can verify, so it is what gates the Row 1 program-terms write — a consent record must not attach to a partner the caller merely named. Omitted by the website and the SDK, neither of which writes a program-terms version. See akin-travel/issues#3944
countryCodeStringCountry code (e.g., AU, US, GB)
emailString!Email address
firstNameString!First name
lastNameString!Last name
localeStringUser locale for email links (e.g., en, de, fr)
marketingOptInBooleanRow 3 — marketing opt-in for AKIN, across the whole AKIN network (spec §2.3). On the website this is the single marketing opt-in
partnerIdIDPartner ID for attribution
partnerMarketingOptInBooleanRow 2 — marketing opt-in for the attributed white-label Partner specifically (spec §2.2). Recorded separately from marketingOptIn: §2.4 forbids collapsing rows 2 and 3 into a single marketing flag. See akin-travel/issues#3427
partnerSlugStringPartner slug for URL building (preferred over partnerId)
phoneStringPhone number
privacyAcceptedVersionStringPublished Privacy Policy version the member agreed to (must match the current LEGAL_PRIVACY_VERSION). See akin-travel/issues#1820
programTermsAcceptedBooleanRow 1 of the white-label consent screen included this program’s WL Program Terms & Conditions (Sign-Up Flow & Consent Spec 18 Jul 2026 §2.1). A boolean, NOT a version: the accepted version is resolved server-side from the attributed program, because the program documents are server-rendered and a client cannot be the authority on which one it showed. See akin-travel/issues#3427
propertyIdIDProperty ID for signup tracking (from QR code links)
redirectUrlStringCustom verification page URL for SDK integrations (e.g., https://viajero.com/auth/verify )
referralCodeStringReferral code from referrer
signedUpByUserIdIDStaff user id credited for this signup (the su param on a promotions QR link). Spoofable — server-validated against the attributed partner and dropped to NULL when it does not belong. See akin-travel/issues#3434
signupLocationSignupLocationSurface the signup originated from. WEBSITE and WHITE_LABEL both make legal-version acceptance mandatory (white-label since its own clickwrap shipped in akin-travel/issues#3427); SDK stays relaxed until it has an acceptance surface. See akin-travel/issues#1820
termsAcceptedBooleanTerms and conditions acceptance
termsAcceptedVersionStringPublished Customer T&C version the member agreed to (must match the current LEGAL_TERMS_VERSION). See akin-travel/issues#1820
utmCampaignStringUTM campaign parameter for campaign tracking
utmMediumStringUTM medium parameter for campaign tracking
utmSourceStringUTM source parameter for campaign tracking
viaHandleStringReadable QR handle credited for this signup (the via param on a cascading-QR link, e.g. paula-diaz). Resolved to a dashboard user and validated against the attributed partner exactly like su; wins over su when both are present. See akin-travel/issues#3507

SignUpResult

Object

Result of passwordless signup

FieldTypeDescription
emailStringEmail address
errorStringError message if failed
successBoolean!Whether signup was successful
userIdStringUser ID if successful
verificationUrlStringVerification URL (E2E testing only - returned when E2E_AUTO_CONFIRM=true)

SignupLocation

Enum

ValueDescription
ANDROID
DASHBOARD
SDK
WEBSITE
WHITE_LABEL

SyncedStay

Object

A synced stay from initial signup sync

FieldTypeDescription
checkInString!Check-in date (YYYY-MM-DD)
checkOutString!Check-out date (YYYY-MM-DD)
confirmationNumberStringConfirmation number
pointsInt!Points awarded (0 for future stays)
propertyNameString!Property name
sourceStringBooking source

TierBenefitGroup

Object

A group of rewards scoped to all properties or a specific property

FieldTypeDescription
propertyIdStringProperty ID (only when scope=PROPERTY)
propertyNameStringProperty name (only when scope=PROPERTY)
rewardNames[String!]!Reward names in this group
scopeString!ALL_PROPERTIES or PROPERTY

TierBenefits

Object

Tier benefits - rewards available at a specific tier

FieldTypeDescription
groups[TierBenefitGroup!]Rewards grouped by scope (all properties vs per-property)
rewardNames[String!]!Flat list of all reward names at this tier (backward compat)
tierNameString!

TierChangeReason

Enum

Reason for tier change

ValueDescription
MANUAL
POINTS
PROMOTION
STAYS

TierName

Enum

Loyalty tier levels

ValueDescription
TIER1
TIER2
TIER3
TIER4
TIER5

TierType

Enum

How a tier can be achieved - POINTS for activity-based progression, INVITATION for manual assignment only

ValueDescription
INVITATION
POINTS

UpdateMemberInput

Input

FieldTypeDescription
avatarUrlStringURL of member profile avatar image
countryCodeString
firstNameString
lastNameString
loyaltyNumberString
marketingOptInBoolean
perkPreferences[String!]
phoneString
placeTypePreferences[String!]
preferredLanguageString
termsAcceptedBoolean
vibePreferenceString
Last updated on