openapi: 3.2.0 info: title: Photon website Onboarding API summary: Public website API used by the Photon onboarding funnel and newsletter signup. description: Create or resume an onboarding session, save path-specific onboarding answers, submit a completed onboarding flow, and create Ghost newsletter signups. The companion onboarding schema endpoint returns the current path definitions, steps, and fields. version: '2026-05-13' contact: name: Photon Health url: https://photonhealth.com servers: - url: https://photonhealth.com tags: - name: Onboarding description: First-party onboarding endpoints for prescriber, developer, clinic, enterprise, platform, and other paths. paths: /api/onboarding/schema: get: tags: - Onboarding operationId: getOnboardingSchema summary: Get onboarding paths, steps, and fields description: Returns every onboarding path in `allPaths`, plus the active path-specific step list when the optional `path` query parameter is supplied. parameters: - name: path in: query required: false description: Optional onboarding path id used to return the currently active step list. schema: $ref: '#/components/schemas/OnboardingPathId' responses: '200': description: Onboarding schema payload. content: application/json: schema: type: object required: - data properties: data: $ref: '#/components/schemas/OnboardingSchema' example: data: paths: - id: prescriber label: Prescriber description: Start prescribing in the app cta: Start Prescribing mode: verification_required - id: developer label: Developer description: Build and test in a sandbox cta: Start Building mode: self_serve - id: clinic label: Clinic description: Launch prescribing in production cta: Create Account mode: sales_led - id: enterprise label: Enterprise description: Large medical group or health system cta: Talk to Sales mode: sales_led - id: platform label: Platform description: EHR or clinical platform cta: Let's Partner mode: sales_led - id: other label: Other description: Tell us what you are looking for cta: Get in Touch mode: sales_led allPaths: - id: prescriber label: Prescriber description: Start prescribing in the app cta: Start Prescribing mode: verification_required provisioningMode: prescriber entryPath: /onboard?type=prescriber steps: - id: contact title: Prescriber account details fields: - name: email label: Email type: email required: true autoComplete: email placeholder: name@company.com - name: npi label: Individual NPI type: text required: true placeholder: 10-digit NPI inputMode: numeric autoComplete: 'off' - name: first_name label: First name type: text required: true autoComplete: given-name - name: last_name label: Last name type: text required: true autoComplete: family-name - name: company label: Practice name type: text required: false autoComplete: organization - name: phone_number label: Phone type: tel required: true autoComplete: tel inputMode: tel placeholder: (555) 555-1234 - name: fax_number label: Fax type: tel required: false inputMode: tel autoComplete: 'off' placeholder: (555) 555-1234 - id: prescriber-details title: Verify your details fields: - name: specialty label: Specialty type: text required: true placeholder: Psychiatry, Primary Care, Dermatology - name: prescription_volume label: Typical prescription volume type: select required: true options: - 1-5 / month - 6-25 / month - 26-100 / month - 101-500 / month - 500+ / month - Not sure - name: practice_type label: Practice type type: select required: true options: - Solo practice - Small clinic - Group practice - Urgent care - Other - name: use_case label: What is your desired prescribing workflow? type: textarea required: true placeholder: How do you expect to use Photon? - name: prescribing_interface label: How do you send prescriptions now? type: select required: false options: - DoseSpot - MD Toolbox - Dr. First - RXNT - athena - Epic - Cerner - Surescripts - Phone - Fax - Paper - No Existing Solution - Other - name: prescribing_interface_other label: Which prescribing interface? type: text required: true placeholder: Tell us what you use today showWhen: field: prescribing_interface value: Other - id: prescriber-address title: Practice address fields: - name: address_street1 label: Practice street address type: text required: true autoComplete: address-line1 fullWidth: true - name: address_street2 label: Suite or unit type: text required: false autoComplete: address-line2 - name: address_city label: City type: text required: true autoComplete: address-level2 - name: address_state label: State type: select required: true autoComplete: address-level1 options: - id: AL label: Alabama - id: AK label: Alaska - id: AZ label: Arizona - id: AR label: Arkansas - id: CA label: California - id: CO label: Colorado - id: CT label: Connecticut - id: DE label: Delaware - id: DC label: District of Columbia - id: FL label: Florida - id: GA label: Georgia - id: HI label: Hawaii - id: ID label: Idaho - id: IL label: Illinois - id: IN label: Indiana - id: IA label: Iowa - id: KS label: Kansas - id: KY label: Kentucky - id: LA label: Louisiana - id: ME label: Maine - id: MD label: Maryland - id: MA label: Massachusetts - id: MI label: Michigan - id: MN label: Minnesota - id: MS label: Mississippi - id: MO label: Missouri - id: MT label: Montana - id: NE label: Nebraska - id: NV label: Nevada - id: NH label: New Hampshire - id: NJ label: New Jersey - id: NM label: New Mexico - id: NY label: New York - id: NC label: North Carolina - id: ND label: North Dakota - id: OH label: Ohio - id: OK label: Oklahoma - id: OR label: Oregon - id: PA label: Pennsylvania - id: RI label: Rhode Island - id: SC label: South Carolina - id: SD label: South Dakota - id: TN label: Tennessee - id: TX label: Texas - id: UT label: Utah - id: VT label: Vermont - id: VA label: Virginia - id: WA label: Washington - id: WV label: West Virginia - id: WI label: Wisconsin - id: WY label: Wyoming - id: AS label: American Samoa - id: GU label: Guam - id: MP label: Northern Mariana Islands - id: PR label: Puerto Rico - id: VI label: U.S. Virgin Islands - name: address_postal_code label: ZIP code type: text required: true autoComplete: postal-code inputMode: numeric - id: developer label: Developer description: Build and test in a sandbox cta: Start Building mode: self_serve provisioningMode: developer entryPath: /onboard?type=developer steps: - id: contact title: Sandbox admin details fields: - name: email label: Email type: email required: true autoComplete: email placeholder: name@company.com - name: company label: Company type: text required: false autoComplete: organization - name: first_name label: First name type: text required: true autoComplete: given-name - name: last_name label: Last name type: text required: true autoComplete: family-name - name: job_title label: Role or title type: text required: false autoComplete: organization-title - name: phone_number label: Phone type: tel required: false autoComplete: tel inputMode: tel placeholder: (555) 555-1234 - id: developer-details title: Tell us about your integration fields: - name: app_domain label: Clinical web app URL (auth whitelist) type: url required: false placeholder: app.example.com autoComplete: url inputMode: url - name: integration_type label: Integration type type: multi-select required: false options: - app - embed - api - mcp - name: tech_stack label: Tech stack type: text required: false placeholder: e.g. React, Node, Postgres - name: implementation_timeline label: When do you plan to begin development? type: select required: true options: - Today - This week - This month - This quarter - Exploring - name: use_case label: What are you building? type: textarea required: true placeholder: Describe your workflow, users, and how Photon will fit into the product - name: prescribing_interface label: Existing prescription interface? type: select required: false options: - DoseSpot - MD Toolbox - Dr. First - RXNT - athena - Epic - Cerner - Surescripts - Phone - Fax - Paper - No Existing Solution - Other - name: prescribing_interface_other label: Which prescribing interface? type: text required: true placeholder: Tell us what you use today showWhen: field: prescribing_interface value: Other - id: clinic label: Clinic description: Launch prescribing in production cta: Create Account mode: sales_led provisioningMode: handoff entryPath: /onboard?type=clinic steps: - id: contact title: Clinic admin details fields: - name: email label: Email type: email required: true autoComplete: email placeholder: name@company.com - name: npi label: Organization NPI type: text required: false placeholder: 10-digit NPI inputMode: numeric autoComplete: 'off' - name: first_name label: First name type: text required: true autoComplete: given-name - name: last_name label: Last name type: text required: true autoComplete: family-name - name: company label: Clinic or medical group type: text required: true autoComplete: organization - name: job_title label: Role or title type: text required: false autoComplete: organization-title - name: phone_number label: Phone type: tel required: true autoComplete: tel inputMode: tel placeholder: (555) 555-1234 - name: fax_number label: Fax type: tel required: false inputMode: tel autoComplete: 'off' placeholder: (555) 555-1234 - id: clinic-details title: Tell us about your clinic fields: - name: care_model label: Primary specialty type: text required: true placeholder: Urgent care, pediatrics, weight loss, etc. - name: provider_count label: Provider count type: select required: true options: - 1-5 - 6-20 - 21-100 - 100+ - name: prescription_volume label: Clinic prescription volume type: select required: true options: - <100 / month - 100-1k / month - 1k-10k / month - 10k+ / month - name: implementation_timeline label: When do you want to go live? type: select required: true options: - This month - This quarter - Next quarter - Planning - name: use_case label: What is your desired prescribing workflow? type: textarea required: true placeholder: Describe your care model, who will prescribe, and where Photon will fit in your workflow. - name: prescribing_interface label: How do you prescribe today? type: select required: false options: - DoseSpot - MD Toolbox - Dr. First - RXNT - athena - Epic - Cerner - Surescripts - Phone - Fax - Paper - No Existing Solution - Other - name: prescribing_interface_other label: Which prescribing interface? type: text required: true placeholder: Tell us what you use today showWhen: field: prescribing_interface value: Other - id: clinic-address title: Clinic address fields: - name: address_street1 label: Clinic street address type: text required: true autoComplete: address-line1 fullWidth: true - name: address_street2 label: Suite or unit type: text required: false autoComplete: address-line2 - name: address_city label: City type: text required: true autoComplete: address-level2 - name: address_state label: State type: select required: true autoComplete: address-level1 options: - id: AL label: Alabama - id: AK label: Alaska - id: AZ label: Arizona - id: AR label: Arkansas - id: CA label: California - id: CO label: Colorado - id: CT label: Connecticut - id: DE label: Delaware - id: DC label: District of Columbia - id: FL label: Florida - id: GA label: Georgia - id: HI label: Hawaii - id: ID label: Idaho - id: IL label: Illinois - id: IN label: Indiana - id: IA label: Iowa - id: KS label: Kansas - id: KY label: Kentucky - id: LA label: Louisiana - id: ME label: Maine - id: MD label: Maryland - id: MA label: Massachusetts - id: MI label: Michigan - id: MN label: Minnesota - id: MS label: Mississippi - id: MO label: Missouri - id: MT label: Montana - id: NE label: Nebraska - id: NV label: Nevada - id: NH label: New Hampshire - id: NJ label: New Jersey - id: NM label: New Mexico - id: NY label: New York - id: NC label: North Carolina - id: ND label: North Dakota - id: OH label: Ohio - id: OK label: Oklahoma - id: OR label: Oregon - id: PA label: Pennsylvania - id: RI label: Rhode Island - id: SC label: South Carolina - id: SD label: South Dakota - id: TN label: Tennessee - id: TX label: Texas - id: UT label: Utah - id: VT label: Vermont - id: VA label: Virginia - id: WA label: Washington - id: WV label: West Virginia - id: WI label: Wisconsin - id: WY label: Wyoming - id: AS label: American Samoa - id: GU label: Guam - id: MP label: Northern Mariana Islands - id: PR label: Puerto Rico - id: VI label: U.S. Virgin Islands - name: address_postal_code label: ZIP code type: text required: true autoComplete: postal-code inputMode: numeric - id: enterprise label: Enterprise description: Large medical group or health system cta: Talk to Sales mode: sales_led provisioningMode: handoff entryPath: /onboard?type=enterprise steps: - id: contact title: Enterprise account contact fields: - name: email label: Email type: email required: true autoComplete: email placeholder: name@company.com - name: company label: Health system or organization type: text required: false autoComplete: organization - name: first_name label: First name type: text required: true autoComplete: given-name - name: last_name label: Last name type: text required: true autoComplete: family-name - name: job_title label: Role or title type: text required: false autoComplete: organization-title - name: phone_number label: Phone type: tel required: true autoComplete: tel inputMode: tel placeholder: (555) 555-1234 - id: enterprise-details title: Tell us about your organization fields: - name: prescribing_interface label: What EHR do you use today? type: select required: true options: - Epic - Cerner - athena - Other - name: prescribing_interface_other label: Which prescribing interface? type: text required: true placeholder: Tell us what you use today showWhen: field: prescribing_interface value: Other - name: site_count label: Number of sites type: select required: true options: - 1-10 - 10-50 - 51-100 - 100+ - name: prescriber_count label: Number of prescribers type: select required: true options: - 1-100 - 101-500 - 501-1k - 1k+ - name: pharmacy_services label: Pharmacy services type: multi-select required: false options: - On-Site - Retail - Delivery - Bedside - Specialty - name: use_case label: How can we help your organization? type: textarea required: true placeholder: Describe your use case and any opportunities - name: implementation_timeline label: Implementation timeline type: select required: true options: - This quarter - Next quarter - This year - Exploring - id: platform label: Platform description: EHR or clinical platform cta: Let's Partner mode: sales_led provisioningMode: handoff entryPath: /onboard?type=platform steps: - id: contact title: Platform account contact fields: - name: email label: Email type: email required: true autoComplete: email placeholder: name@company.com - name: company label: Company type: text required: false autoComplete: organization - name: first_name label: First name type: text required: true autoComplete: given-name - name: last_name label: Last name type: text required: true autoComplete: family-name - name: job_title label: Role or title type: text required: false autoComplete: organization-title - name: phone_number label: Phone type: tel required: true autoComplete: tel inputMode: tel placeholder: (555) 555-1234 - id: platform-details title: Tell us about your platform fields: - name: product_category label: Product category type: text required: true placeholder: EHR, clinical workflow tool, care delivery platform - name: customer_org_count label: Number of customers type: select required: true options: - 1-10 - 11-50 - 51-250 - 250+ - name: prescribing_interface label: Current prescription solution? type: select required: false options: - Surescripts - DoseSpot - Dr. First - Other - No Existing Solution - name: prescribing_interface_other label: Which prescribing interface? type: text required: true placeholder: Tell us what you use today showWhen: field: prescribing_interface value: Other - name: use_case label: How do you plan to integrate? type: textarea required: true placeholder: Describe the experience you want to enable - name: implementation_timeline label: Implementation timeline type: select required: true options: - This quarter - Next quarter - This year - Exploring - id: other label: Other description: Tell us what you are looking for cta: Get in Touch mode: sales_led provisioningMode: handoff entryPath: /onboard?type=other steps: - id: contact title: Tell us about yourself fields: - name: email label: Email type: email required: true autoComplete: email placeholder: name@company.com - name: company label: Company type: text required: false autoComplete: organization - name: first_name label: First name type: text required: true autoComplete: given-name - name: last_name label: Last name type: text required: true autoComplete: family-name - name: job_title label: Role or title type: text required: false autoComplete: organization-title - name: phone_number label: Phone type: tel required: true autoComplete: tel inputMode: tel placeholder: (555) 555-1234 - id: other-details title: How can we work together? fields: - name: use_case label: What use case do you have in mind? type: textarea required: true placeholder: Tell us what you are looking for path: null steps: - id: path title: Choose the best path fields: - name: path label: Path type: radio-cards required: true /api/onboarding/sessions: post: tags: - Onboarding operationId: createOrResumeOnboardingSession summary: Create or resume an onboarding session description: Creates a local-only session until valid contact details identify the lead. A prior lead token may be supplied in the `x-onboarding-lead-token` header, cookie, or request body. A submitted session can also be resumed from Attio with `resumeSessionId`. security: - {} - leadTokenHeader: [] - leadTokenCookie: [] requestBody: required: false content: application/json: schema: type: object additionalProperties: true properties: path: anyOf: - $ref: '#/components/schemas/OnboardingPathId' - type: 'null' trackingSummary: anyOf: - $ref: '#/components/schemas/TrackingSummary' - type: 'null' flowId: anyOf: - type: string - type: 'null' description: Browser-local flow id used before the server issues a session id. draftState: anyOf: - $ref: '#/components/schemas/OnboardingSession' - type: 'null' resumeSessionId: anyOf: - type: string - type: 'null' description: Submitted onboarding session id to resume from Attio when no lead token is present. paymentPlanTier: anyOf: - type: string - type: 'null' description: Optional Stripe pricing-plan lookup key to assign to the onboarding session. email: anyOf: - type: string format: email - type: 'null' description: Optional email seed for URL-driven onboarding links. Browser `/onboard?email=` links start a fresh local session unless `session` is also present. orgId: anyOf: - type: string - type: 'null' description: Optional prefixed provisioning org id, such as `photon:org_...`, used to link checkout/provisioning to an existing account. stripeCustomerId: anyOf: - type: string - type: 'null' description: Optional Stripe customer id seed, such as `cus_...`, stored as `stripe_customer_id` when the session is identified. leadToken: type: string description: Optional serialized lead token. Prefer the `x-onboarding-lead-token` header when available. example: path: clinic paymentPlanTier: launch email: lead@example.com orgId: photon:org_abc123 stripeCustomerId: cus_abc123 flowId: local-flow-id trackingSummary: source: agent responses: '200': $ref: '#/components/responses/OnboardingStateResponse' /api/onboarding/sessions/{sessionId}: patch: tags: - Onboarding operationId: saveOnboardingStep summary: Save or advance an onboarding step description: Persists step answers and, when advancing from contact details with a valid email, identifies the lead and syncs the Attio list item. security: - {} - leadTokenHeader: [] - leadTokenCookie: [] parameters: - name: sessionId in: path required: true schema: type: string requestBody: required: true content: application/json: schema: $ref: '#/components/schemas/SaveStepRequest' example: stepId: contact action: advance values: email: admin@example.com first_name: Ada last_name: Lovelace company: Example Health job_title: CTO existingAnswers: {} responses: '200': $ref: '#/components/responses/OnboardingStateResponse' '400': $ref: '#/components/responses/ErrorResponse' '401': $ref: '#/components/responses/ErrorResponse' /api/onboarding/sessions/{sessionId}/submit: post: tags: - Onboarding operationId: submitOnboardingSession summary: Submit a completed onboarding session description: Validates all required path fields, marks the onboarding session submitted, syncs Attio, and returns a hosted Stripe Checkout URL for paid self-serve offers. Account provisioning happens from the Stripe webhook after payment. security: - {} - leadTokenHeader: [] - leadTokenCookie: [] parameters: - name: sessionId in: path required: true schema: type: string requestBody: required: true content: application/json: schema: $ref: '#/components/schemas/SubmitRequest' example: answers: email: admin@example.com first_name: Ada last_name: Lovelace company: Example Health app_domain: https://app.example.com integration_type: - api - embed tech_stack: React, Node, Postgres implementation_timeline: This quarter use_case: Embedded prescribing for a care team workflow. responses: '200': description: Submitted onboarding session. content: application/json: schema: type: object required: - data properties: data: type: object required: - flow - session - leadToken - answers properties: flow: $ref: '#/components/schemas/OnboardingSession' session: $ref: '#/components/schemas/OnboardingSession' leadToken: type: string answers: $ref: '#/components/schemas/Answers' checkoutUrl: anyOf: - type: string format: uri - type: 'null' result: anyOf: - $ref: '#/components/schemas/ProvisioningResult' - type: 'null' '401': $ref: '#/components/responses/ErrorResponse' '422': description: Validation failed. The response includes inline field errors and the step that needs attention. content: application/json: schema: $ref: '#/components/schemas/ValidationErrorEnvelope' components: responses: ErrorResponse: description: Request failed. content: application/json: schema: $ref: '#/components/schemas/ErrorEnvelope' OnboardingStateResponse: description: Current onboarding session state. content: application/json: schema: $ref: '#/components/schemas/OnboardingStateEnvelope' schemas: OnboardingSchema: type: object required: - paths - allPaths - path - steps properties: paths: type: array items: $ref: '#/components/schemas/OnboardingPathChoice' allPaths: type: array items: $ref: '#/components/schemas/OnboardingFullPath' path: anyOf: - $ref: '#/components/schemas/OnboardingPathId' - type: 'null' steps: type: array items: $ref: '#/components/schemas/OnboardingStep' OnboardingMode: type: string enum: - self_serve - verification_required - sales_led OnboardingStateEnvelope: type: object required: - data properties: data: type: object required: - flow - session - leadToken - schema - answers properties: flow: $ref: '#/components/schemas/OnboardingSession' session: $ref: '#/components/schemas/OnboardingSession' leadToken: type: string schema: $ref: '#/components/schemas/OnboardingSchema' answers: $ref: '#/components/schemas/Answers' errors: type: object additionalProperties: type: string checkoutUrl: anyOf: - type: string format: uri - type: 'null' identityRestartRequired: type: boolean nextStep: type: string Answers: type: object additionalProperties: anyOf: - type: string - type: number - type: boolean - type: array items: type: string - type: 'null' example: email: name@example.com npi: 10-digit NPI first_name: First name last_name: Last name company: Practice name phone_number: (555) 555-1234 fax_number: (555) 555-1234 specialty: Psychiatry, Primary Care, Dermatology prescription_volume: 1-5 / month practice_type: Solo practice use_case: How do you expect to use Photon? prescribing_interface: DoseSpot prescribing_interface_other: Tell us what you use today address_street1: Practice street address address_street2: Suite or unit address_city: City address_state: AL address_postal_code: ZIP code job_title: Role or title app_domain: https://example.com integration_type: - app tech_stack: e.g. React, Node, Postgres implementation_timeline: Today care_model: Urgent care, pediatrics, weight loss, etc. provider_count: 1-5 site_count: 1-10 prescriber_count: 1-100 pharmacy_services: - On-Site product_category: EHR, clinical workflow tool, care delivery platform customer_org_count: 1-10 terms_of_service_accepted_at: '2026-05-25T12:00:00.000Z' business_associate_agreement_accepted_at: '2026-05-25T12:00:00.000Z' OnboardingPathId: type: string enum: - prescriber - developer - clinic - enterprise - platform - other description: Public onboarding path id. Prefer `/onboard?type={id}` for new human links. Legacy `/onboard#{id}` and `/onboard#{id}-{payment_plan_tier}` links remain supported. ErrorEnvelope: type: object required: - error properties: error: type: string TrackingSummary: type: object additionalProperties: true properties: source: type: string medium: type: string campaign: type: string referrer: type: string landingPath: type: string OnboardingFullPath: type: object required: - id - label - description - cta - mode - provisioningMode - entryPath - steps properties: id: $ref: '#/components/schemas/OnboardingPathId' label: type: string description: type: string cta: type: string mode: $ref: '#/components/schemas/OnboardingMode' provisioningMode: type: string enum: - developer - prescriber - handoff entryPath: type: string steps: type: array items: $ref: '#/components/schemas/OnboardingStep' OnboardingSession: type: object additionalProperties: true required: - sessionId - path - status - lastStep properties: sessionId: type: string path: anyOf: - $ref: '#/components/schemas/OnboardingPathId' - type: 'null' status: type: string enum: - draft - identified - submitted lastStep: type: string identifiedEmail: type: string format: email submittedAt: type: string format: date-time provisioningStatus: type: string enum: - pending - completed - failed - not_applicable paymentStatus: type: string enum: - not_required - payment_required - checkout_open - paid - failed - expired provisioningInviteUrl: type: string format: uri provisioningFailureReason: oneOf: - type: string - type: object properties: message: type: string debugMessage: type: string paymentPlanTier: type: string description: Business tier / Stripe pricing plan lookup key. paymentPlanName: type: string description: Display name returned by the billing catalog. paymentPlanDescription: type: string description: Short display description returned by the billing catalog. paymentPrice: type: number description: Monthly Checkout price in USD dollars. paymentIncludedMonthlyOrders: type: number description: Included monthly order volume for the plan. paymentOveragePrice: type: number description: Per-order overage price in USD dollars. stripeCustomerId: type: string stripeSubscriptionId: type: string attioEntryId: type: string attioPersonRecordId: type: string SaveStepRequest: type: object required: - stepId additionalProperties: false properties: stepId: type: string action: type: string enum: - save - advance default: save values: $ref: '#/components/schemas/Answers' existingAnswers: $ref: '#/components/schemas/Answers' draftState: anyOf: - $ref: '#/components/schemas/OnboardingSession' - type: 'null' leadToken: type: string OnboardingField: type: object required: - name - label - type properties: name: type: string label: type: string type: type: string enum: - email - multi-select - radio-cards - select - tel - text - textarea - url required: type: boolean options: type: array items: anyOf: - type: string - $ref: '#/components/schemas/OnboardingPathChoice' placeholder: type: string autoComplete: type: string inputMode: type: string showWhen: type: object additionalProperties: true properties: field: type: string value: type: string SubmitRequest: type: object additionalProperties: false properties: answers: $ref: '#/components/schemas/Answers' draftState: anyOf: - $ref: '#/components/schemas/OnboardingSession' - type: 'null' leadToken: type: string turnstileToken: type: string description: Cloudflare Turnstile token. Required when both Turnstile keys are configured. OnboardingPathChoice: type: object required: - id - label - description - cta - mode properties: id: $ref: '#/components/schemas/OnboardingPathId' label: type: string description: type: string cta: type: string mode: $ref: '#/components/schemas/OnboardingMode' OnboardingStep: type: object required: - id - title - fields properties: id: type: string title: type: string fields: type: array items: $ref: '#/components/schemas/OnboardingField' ValidationErrorEnvelope: type: object required: - data properties: data: type: object required: - flow - session - errors properties: flow: $ref: '#/components/schemas/OnboardingSession' session: $ref: '#/components/schemas/OnboardingSession' errors: type: object additionalProperties: type: string identityRestartRequired: type: boolean stepId: type: string ProvisioningResult: type: object additionalProperties: true properties: status: type: string enum: - completed - failed - handoff_required - pending message: type: string data: type: object additionalProperties: true properties: invite: type: object additionalProperties: true properties: id: type: string email: type: string format: email url: type: string format: uri securitySchemes: leadTokenHeader: type: apiKey in: header name: x-onboarding-lead-token leadTokenCookie: type: apiKey in: cookie name: photon_onboarding_lead externalDocs: description: Photon developer documentation url: https://docs.photon.health/docs