Pre-check-in Steps
A pre-check-in step is one task a guest completes in the guest portal before arrival: confirming their details, uploading an ID, signing an agreement, paying a deposit, answering questions. Each step is a reusable template in your organization, switched on with isActive and assigned to the properties whose guests should see it. This guide covers the step operations. Every field is listed on the operation’s page in the API Reference.
| Operation | Request | Permission |
|---|---|---|
listPrecheckSteps | GET /precheck-steps | view_properties |
getPrecheckStep | GET /precheck-steps/{id} | view_properties |
createPrecheckStep | POST /precheck-steps | modify_properties |
updatePrecheckStep | PATCH /precheck-steps/{id} | modify_properties |
Paths are relative to your region’s base URL, for example https://api-us.suiteop.com/api/v1. See Authentication for permissions.
Some writes need modify_tasks as well: minting question text with POST /translations, sending questions that link new or changed translation IDs, and changing a step’s guest-facing title or linked copy on update. See Guest-facing title.
Steps can’t be deleted or duplicated through the API. Set isActive to false to take one off every portal.
Step types
Section titled “Step types”stepType decides what the step asks of the guest and which other fields apply. It is one of your_details, identity_check, background_check, other_guests, authority_reporting, additional_questions, document_upload, agreement, mandatory_fee, damage_deposit, screen_and_protect or main.
Additional questions are single_select, multi_select, free_form_input or yes_no, and a question can be shown only when an earlier question has a given answer.
On an authority_reporting step that files with GuestAdmin, set isGuestAdminPropertyInfoEmailEnabled: true to let GuestAdmin email the lead guest its Property Information email. SuiteOp passes the flag when it creates the GuestAdmin booking, on the guest’s final submission of the step. It defaults to false, is ignored for other providers, and, like other type-specific settings, is not returned when you read the step.
nickname is required on every step. It is an internal label, up to 200 characters, and is never shown to guests.
Guest-facing title
Section titled “Guest-facing title”Guests see a heading on each step. By default it is the built-in title for the step type, in the guest’s language. displayTitle replaces it with your own text, up to 200 characters.
- On create, send
displayTitleas text.displayTitleLanguagesays which language it is written in and defaults to English. - A step’s first title must be in English. Sending a non-English
displayTitleLanguagefor a step that has no title yet, on create or update, is rejected with400and the messageprecheck_step.display_title_english_required. - On update, omit
displayTitleto keep it and sendnullto clear it and go back to the built-in title. SendingdisplayTitleLanguagewith text for a step that already has a title sets that one language, for example the French version, and leaves the others alone. displayTitleLanguageneeds text. Sending it alone, withdisplayTitle: null, or withdisplayTitleMlTextIdis rejected with400.displayTitleMlTextIdlinks a translation you already created withPOST /translationsandsourceTable: "precheck_step_detail"(see Translations). Send either it ordisplayTitle, not both.- Reading it back:
getPrecheckStepreturnsdisplayTitleas text. REST and MCP callers always read the English text.nullmeans no custom title is set and guests see the built-in one.listPrecheckSteps,createPrecheckStepandupdatePrecheckStepreturn onlydisplayTitleMlTextId. - Permission: an update that sends
displayTitleat all, or changes a linked copy ID such asdisplayTitleMlTextId, needsmodify_tasksin addition tomodify_properties. Without it the update returns403.
Listing steps
Section titled “Listing steps”GET /precheck-steps returns every step in the organization, active and inactive, in one unpaginated array:
curl https://api-us.suiteop.com/api/v1/precheck-steps \ -H "Authorization: Bearer sk_live_your_key_here"Each item carries id, nickname, displayTitleMlTextId, stepType, isActive, sortOrder, the damage-waiver and security-deposit settings, and:
scope: counts of the step’s assignments, aspropertyCount,portalCount,propertyGroupCountandtagCount. For the IDs themselves, callGET /entity-scopes.configurationIssue:missing_payment_accountwhen an activedamage_depositstep has no usable payment account,missing_authenticate_accountwhen an activebackground_checkstep has no active authenticate.com account, otherwisenull. It is only computed for active steps.hasUsableDamageWaiver:truefor an activedamage_depositstep that offers a damage waiver and has an active account to charge it to, either its own or, when none is set, the organization default.
Filters (all optional):
propertyIds,propertyGroupIds,portalSettingsIds,tagIdsreturn steps assigned directly to any of the given IDs. A step that reaches a property only through its group, portal or tags isn’t matched bypropertyIds. Different filters combine with AND.assignment:assignedreturns steps with at least one assignment,unassignedsteps with none.unassignedtogether with one of the ID filters always returns an empty list.
The list is in the order guests walk the steps (see Ordering), using the setting of the portal you filter on when portalSettingsIds has exactly one ID, and otherwise the organization’s default portal.
Reading one step
Section titled “Reading one step”GET /precheck-steps/{id} returns the step with its targeting rules, deposit and agreement settings, displayTitle, updatedAt, and the full questions list with each question’s id, options and conditions.
Several settings can be written but not read back through the API: guestDescriptionMlTextId, contractTemplateText, esignPrefillValues, and every setting specific to identity_check, your_details, other_guests, document_upload, authority_reporting, screen_and_protect, background_check and mandatory_fee. A field missing from the response doesn’t mean the write failed.
Creating a step
Section titled “Creating a step”POST /precheck-steps creates a step:
curl -X POST https://api-us.suiteop.com/api/v1/precheck-steps \ -H "Authorization: Bearer sk_live_your_key_here" \ -H "Idempotency-Key: 6c1f0b9e-2d4a-4e8b-9f37-5a0c7d2e1b64" \ -H "Content-Type: application/json" \ -d '{ "stepType": "your_details", "nickname": "Booker details", "displayTitle": "Tell us about yourself", "isActive": true, "sortOrder": 0 }'The response is 201 with the new step:
{ "data": { "id": "8d2e4f60-1b3a-4c7d-9e25-0f6a8b1c3d47", "nickname": "Booker details", "displayTitleMlTextId": "a7c3e9b1-5d2f-4a60-8e14-3b9f0c6d2e85", "stepType": "your_details", "isActive": true, "isEnabled": true, "sortOrder": 0, "updatedAt": "2026-09-27T10:15:00.000Z", "inclusionType": null, "excludedSources": null, "includedSourcesReturning": null, "isAlwaysShown": false, "isReturningGuestExcluded": false, "leadTimeMinDays": null, "leadTimeMaxDays": null, "minLos": 0, "maxLos": 1000, "damageWaiverDepositAmountCents": null, "isDamageWaiverEnabled": false, "damageWaiverCapCents": null, "damageWaiverMinLos": 0, "damageWaiverPricingBasis": "per_night", "isDamageWaiverWaivable": false, "damageWaiverPaymentAccountId": null, "damageDepositSubtitleMlTextId": null, "securityDepositAmountCents": null, "isSecurityDepositEnabled": false, "securityDepositDaysBeforeCheckin": null, "securityDepositReleaseDaysAfterCheckout": 3, "securityDepositPaymentAccountId": null, "securityDepositSubtitleMlTextId": null, "agreementType": null, "contractTemplateTextMlTextId": null, "docusignTemplateId": null, "docusignTitleMlTextId": null, "docusignSubtitleMlTextId": null, "documensoTemplateId": null, "documensoHeadingMlTextId": null, "documensoSubtitleMlTextId": null, "isMandatorySigning": false, "questions": [], "damageWaivers": [] }, "meta": { "requestId": "…" }}Field notes:
- The step reaches no guest yet. A new step has no assignments. Assign it as described in Choosing which properties use it.
questionsanddamageWaiversare always[]in create and update responses. Read them withgetPrecheckStep.- Questions (
additional_questions) need translation IDs for their text and option names. Create them first withPOST /translations, which needsmodify_tasks(see Translations). - Payment accounts (
damageWaiverPaymentAccountId,securityDepositPaymentAccountIdandfeesPaymentAccountId) come fromGET /payment-accounts. An unknown, inactive or other-organization ID returns404. Sendingnulldoes not turn the charge off: the step then uses your organization’s active default payment account. background_checkandmandatory_feecan’t be completed through the API. No operation lists the authenticate.com accounts or fee products they need, so you have to get those IDs from SuiteOp.- Use an
Idempotency-Keyso a network retry doesn’t create a second step.
Review settings
Section titled “Review settings”identityFlagPolicy(identity_check) sets what each identity check does when it finds a problem:ignoreskips the check,reviewsends the guest straight to your team, andfaillets the guest retake once before it goes to your team. Omit a key to keep that check’s default;nullclears every override. Six keys accept only their default, and any other value returns400:document_not_official,selfie_spoofandverification_unavailable(fail), andname_unavailable,name_unconfirmedandretake_limit(review).guest_is_localandguest_underageacceptfailbut act asreview, because a retake can’t change them.minimumGuestAgeis the age threshold for theguest_underagerow, and must be set whenever that row isn’tignore.isPhotoIdRequiredis accepted for compatibility but enforces nothing. To reject an ID with no photo of the holder, setidentityFlagPolicy.no_face_on_document.isManualReviewEnabled(additional_questions,document_upload,damage_deposit):true, the default, holds a flagged submission for staff review.falselets it complete on its own, and no one is asked to review it.
Targeting rules
Section titled “Targeting rules”These fields decide which reservations get the step:
minLos/maxLos: stay length in nights.0means no minimum and1000means no maximum.minLosabovemaxLosis rejected.leadTimeMinDays/leadTimeMaxDays: days between booking and check-in.nullmeans no bound. An inverted window is rejected.inclusionType:all_except_selectedhides the step for the channels inexcludedSources;only_selectedshows it only for the channels inincludedSourcesReturning, which must then be non-empty.isReturningGuestExcluded: trueskips guests who have stayed before.isAlwaysShown: trueshows the step to every guest and ignores all the rules above.
Updating a step
Section titled “Updating a step”PATCH /precheck-steps/{id} takes the fields to change inside a required data object. Fields you leave out keep their value.
curl -X PATCH https://api-us.suiteop.com/api/v1/precheck-steps/8d2e4f60-1b3a-4c7d-9e25-0f6a8b1c3d47 \ -H "Authorization: Bearer sk_live_your_key_here" \ -H "Content-Type: application/json" \ -d '{ "expectedUpdatedAt": "2026-09-27T10:15:00.000Z", "data": {"minLos": 2, "isAlwaysShown": false} }'The response is the updated step, in the same shape as the create response.
- Rules are checked against the merged step. Moving one end of a stay-length or lead-time window is rejected when it inverts the stored other end, and turning a step on is rejected when the configuration it needs isn’t there (for example an
agreementstep without a template or text, oradditional_questionswithout questions). questionsandfeeProductIdsreplace the whole list. Send every question you want to keep with theidgetPrecheckStepgave you, so guest answers already collected stay attached. A question sent withoutidis created as new. The same holds for each question’soptions: send every option back with itsidto keep it — workflow answer conditions point at option IDs — because an option sent withoutidis created fresh and an option left out is deleted. Anidthat doesn’t belong to this step is rejected with400. Send[]to clear the list, or omit it to leave it alone.expectedUpdatedAtis optional. Send theupdatedAtyou last read, and the update returns409(CONFLICT) if the step changed since. Omit it to overwrite regardless.stepTypeis locked once guests have used the step. Changing it then returns409CONFLICTwith the messagePRECHECK_STEP_TYPE_LOCKED. Deactivate the step and create a new one instead.nicknamecan’t be cleared:nullor blank returns400.
Turning a step on and off
Section titled “Turning a step on and off”isActive is the switch. It defaults to false, so a step created without it is saved but never shown. Send "isActive": true on create or update to show it, and false to take it off every portal. Turning a step on is when the checks for its required configuration apply.
isEnabled is a deprecated copy of isActive. Leave it out: sending false switches the step off whatever isActive says, and true does nothing.
Choosing which properties use it
Section titled “Choosing which properties use it”A step reaches properties through four routes: individual properties, property groups, tags and guest portals. A portal assignment covers the properties whose effective portal it is: the property’s own portal, else its group’s, else its tag’s, else the organization default. createPrecheckStep and updatePrecheckStep don’t set them. Use the entity scope operations with entityType: "precheck_step" and the step’s id as entityId:
| Operation | Request | Effect |
|---|---|---|
listEntityScopes | GET /entity-scopes | Read the current propertyIds, propertyGroupIds, tagIds and portalSettingsIds |
updateEntityScopes | POST /entity-scopes | Replace every assignment with what you send |
addEntityScopes | POST /entity-scopes/add | Add to the existing assignments |
removeEntityScopes | POST /entity-scopes/remove | Remove from the existing assignments |
listEntityScopes needs view_properties; the write operations need modify_properties.
curl -X POST https://api-us.suiteop.com/api/v1/entity-scopes/add \ -H "Authorization: Bearer sk_live_your_key_here" \ -H "Content-Type: application/json" \ -d '{ "entityType": "precheck_step", "entityId": "8d2e4f60-1b3a-4c7d-9e25-0f6a8b1c3d47", "portalSettingsIds": ["c41e7d20-5b8a-4f13-9d62-7e0a3c1b9f58"] }'Ordering
Section titled “Ordering”Each guest portal has an “order steps automatically” setting, isPrecheckOrderAutomatic on updatePortal, which is on unless you turn it off (see Guest Portals).
- Automatic (the default): steps run in a fixed order by type:
your_details,identity_check,background_check,other_guestsandauthority_reporting,additional_questions,document_upload,agreement,mandatory_fee, thendamage_depositandscreen_and_protect.mainruns after all of them.sortOrderonly orders steps of the same group. - Host order: with the setting off, steps run by
sortOrderalone.
In both cases ties are broken by creation time, and a step without sortOrder comes last. sortOrder is zero-based.
Property-limited callers
Section titled “Property-limited callers”An sk_ API key acts across the whole organization. An OAuth token carries the property access of the member who authorized it (see Members):
- Reading: a limited caller sees a step that reaches at least one of their properties, and any step not yet assigned anywhere. Other steps return
404fromgetPrecheckStepandupdatePrecheckStepand are left out oflistPrecheckSteps. Thescopecounts only include what the caller can reach. - Fee products: changing
feeProductIdson a step that also serves properties outside the caller’s access returns403.