Lasso CRM API

The public API for Lasso CRM, ECI's new-home-sales CRM (acquired with Lasso Data Systems and sold under ecisolutions.com/products/lasso-crm). Manages registrants, their contact information, notes, questions, appointments, relationships, assigned sales reps and history, plus projects and inventory with plan types and pricing revisions. Bearer JWT API keys are issued per project or location; a 1,000 request-per-minute limit applies per key, and a registrant webhook event system pushes inserted/updated/deleted events to registered integrations.

Operations 68

GET /registrants List of registrants for a project. #
POST /registrants Create a registrant #
PUT /registrants/{registrantId} #
GET /registrants/{registrantId} Extended data for a registrant #
PUT /registrants/{registrantId}/person/contact-information Convenience method to update all of a registrant's contact information in a single call #
GET /registrants/{registrantId}/person/contact-information Retrieve all of a registrant's contact information #
POST /registrants/{registrantId}/integrations #
DELETE /registrants/{registrantId}/integrations #
DELETE /registrants/{registrantId}/external/{externalId} #
PUT /registrants/{registrantId}/rating #
PUT /registrants/{registrantId}/follow-up-process #
PUT /registrants/{registrantId}/source-type #
PUT /registrants/{registrantId}/secondary-source-type #
GET /registrants/{registrantId}/assigned-sales-reps #
PUT /registrants/{registrantId}/assigned-sales-reps #
POST /registrants/{registrantId}/emails #
PUT /registrants/{registrantId}/emails/{emailId} #
DELETE /registrants/{registrantId}/emails/{emailId} #
POST /registrants/{registrantId}/phones #
PUT /registrants/{registrantId}/phones/{phoneId} #
DELETE /registrants/{registrantId}/phones/{phoneId} #
POST /registrants/{registrantId}/addresses #
PUT /registrants/{registrantId}/addresses/{addressId} #
DELETE /registrants/{registrantId}/addresses/{addressId} #
POST /registrants/{registrantId}/questions #
PUT /registrants/{registrantId}/questions/{questionId} #
POST /registrants/{registrantId}/notes #
POST /registrants/{registrantId}/histories #
GET /registrants/{registrantId}/histories/{historyId} #
PUT /registrants/{registrantId}/histories/{historyId} #
DELETE /registrants/{registrantId}/notes/{noteId} #
POST /registrants/{registrantId}/relationships #
PUT /registrants/{registrantId}/relationships/{relationshipId} #
DELETE /registrants/{registrantId}/relationships/{relationshipId} #
POST /registrants/{registrantId}/website-tracking/ #
GET /registrants/{registrantId}/appointments Retrieve a registrant's appointments #
POST /registrants/{registrantId}/appointments Create an appointment #
GET /registrants/{registrantId}/appointments/{appointmentId} Retrieve a single appointment #
PUT /registrants/{registrantId}/appointments/{appointmentId} Update an appointment #
DELETE /registrants/{registrantId}/appointments/{appointmentId} Delete an appointment #
POST /registrants/{registrantId}/appointments/{appointmentId}/email-confirmations Send email confirmations for an already existing appointment #
GET /emails/{email}/opted-status/ Retrieve an opted status #
PUT /emails/{email}/opted-status/ Update an opted-status #
GET /projects/settings Retrieve a project's settings #
GET /projects/appointments Retrieves a project's appointments #
GET /inventory Returns a list of all inventories #
POST /inventory Create an inventory #
GET /inventory/{inventoryId} Get a single inventory #
PUT /inventory/{inventoryId} Update an inventory #
DELETE /inventory/{inventoryId} Delete an inventory #
PUT /inventory/{inventoryId}/sync Sync an inventory #
POST /inventory/{inventoryId}/reset Reset an inventory items. Deletes all associated data with the inventory item, e.g. pricing information, options and upgrades, deposits, etc. #
GET /inventory/{inventoryId}/dates #
PUT /inventory/{inventoryId}/dates #
GET /inventory/{inventoryId}/pricing #
PUT /inventory/{inventoryId}/pricing #
PUT /inventory/{inventoryId}/purchasers #
GET /inventory/{inventoryId}/purchasers #
GET /inventory/{inventoryId}/pricing-revisions #
POST /inventory/{inventoryId}/pricing-revisions #
GET /inventory/plans #
POST /inventory/plans #
GET /inventory/plans/{planTypeId} #
PUT /inventory/plans/{planTypeId} #
GET /inventory/{inventoryId}/plans #
PUT /inventory/{inventoryId}/plans #

Work with this as data

Every API here is available over the APIs.io API and to AI agents over MCP.

MCP server

One button, every client — Claude, Cursor, VS Code and the rest.

https://apis.io/mcp

Tools for apis

7 MCP tools reach this
  • find_apisBrowse and filter every API in the catalog.
  • get_api_artifactsOne API's artifacts, grouped by type.
  • get_openapiThe primary OpenAPI for this API.
  • find_similar_apisAPIs that look like this one.
  • apis_io_searchSTART HERE — APIs, providers and tags for one query, each with its total.
  • resolveTurn a domain, URL or GitHub org into the provider it belongs to.
  • find_cohortsEvery scored population of providers in the catalog.
All 92 tools →

Call it yourself

curl for this page
This API
curl "https://apis.io/api/v1/apis/eci-solutions-lasso-crm"
All apis
curl "https://apis.io/api/v1/apis?limit=25"

Discovery needs no key. Ratings and market analysis are Pro.

Get an API key

Free tier, no form to fill in. Signing in shares your email address with us — we store it to create your key and to recognise you if you sign in with another provider. See our Privacy Policy and Terms.

A second provider on the same verified email joins the account you already have.

OpenAPI Specification

eci-solutions-lasso-crm-openapi.yml Raw ↑
openapi: 3.0.2
info:
  title: Lasso API
  description: |
    <h3 id="overview">Overview</h3>
    Use this API to manage Registrant, Project, and Inventory data within Lasso CRM.

    <h4 id="auth">Authorization</h4>
    An authorization header with a Bearer JWT API key token is required for all requests.
    API keys are project/location based, and can be obtained from your business contact with Lasso Data Systems.

    <h4 id="trycurl">Try it out with CURL</h4>
    Here's an example of how to try it on the command line with curl:
    <pre>
      curl -X GET "https://api.lassocrm.com/v1/registrants/123456" \
           -H "accept: application/json" \
           -H "Authorization: Bearer ***apikey***"
    </pre>
    To find the curl command for a specific endpoint:
    <ul>
      <li>Select the `Authorize` button and place your api key in the textbox</li>
      <li>Go to the route you want to try out in the swagger definition</li>
      <li>Select `Try it out`</li>
      <li>Input any required fields, query params, and request payload</li>
      <li>Copy the curl command using the copy button</li>
    </ul>

    <h4 id="trydoc">Try it out in documentation</h4>
    To try it out directly in the documentation:
    <ul>
      <li>Select the `Authorize` button and place your api key in the textbox</li>
      <li>Ensure that the api key is prefixed with `Bearer` including a space separating `Bearer` from the api key</li>
      <li>Go to the route you want to try out in the swagger definition</li>
      <li>Select `Try it out`</li>
      <li>Input any required fields, query params, and request payload</li>
      <li>Select `Execute`</li>
    </ul>

    <h4 id="ratelimit">Rate Limiting</h4>
    A Rate limit of 1,000 requests per minute applies to each API key

    <h3 id="events">Lasso Event System</h3>
    The event system listens for actions on a registrant in Lasso. An action can be any of; Create, Update, Delete.
    When an action is performed on a registrant, the event system will fire off a webhook event to registered integrations.

    However, not all actions on a registrant will fire off a webhook event. Only actions on certain registrant attributes
    will trigger a webhook event.

    The following actions will trigger a webhook event:
    <ul>
      <li>Create: Registrant</li>
      <li>Delete: Registrant</li>
      <li>Update: Registrant.person.firstName</li>
      <li>Update: Registrant.person.lastName</li>
      <li>Update: Registrant.person.nameTitle</li>
      <li>Update: Registrant.person.contactPreference</li>
      <li>Update: Registrant.person.company</li>
      <li>Update: Registrant.person.birthday</li>
      <li>Update: Registrant.person.gender</li>
      <li>Update: Registrant.person.jobTitle</li>
      <li>Update: Registrant.person.nickname</li>
      <li>Update: Registrant.person.ssnSin</li>
      <li>Update: Registrant.Rating</li>
      <li>Update: Registrant.SourceType</li>
      <li>Update: Registrant.SecondarySourceType</li>
      <li>Update: Registrant.FollowUpProcess</li>
      <li>Update: Registrant.registrationDate</li>
      <li>Update: Registrant.emails</li>
      <li>Update: Registrant.phones</li>
      <li>Update: Registrant.addresses</li>
      <li>Update: Registrant.notes</li>
      <li>Update: Registrant.questions</li>
      <li>Update: Registrant.excludeFromTraffic</li>
      <li>Update: Registrant.status</li>
      <li>Update: Registrant.relationships</li>
      <li>Update: Registrant.assignedSalesReps</li>
    </ul>

    On update events, the webhook payload includes a <code>changed</code> array listing which
    RegistrantRead fields triggered the event. Only a defined set of field names appear;
    internal metadata (e.g. status, LastModified) is omitted even when it triggers the webhook.
    This allows stateless consumers to skip irrelevant updates (e.g. when <code>changed</code>
    is only <code>["history"]</code>) without diffing the full entity. The <code>changed</code>
    array is empty on inserted and deleted events.

    Possible values: person, rating, excludeFromTraffic, registrationDate, followUpProcess,
    sourceType, secondarySourceType, questions, notes, assignedSalesReps, history.

    <h3 id="routes">Routes</h3>
  version: 1.0.39
servers:
- url: https://api.lassocrm.com/v1
  description: 'Production endpoint'
paths:
  /registrants:
    get:
      summary: >-
        List of registrants for a project.
      operationId: 'get_registrants'
      description: >-
        Returns a full representation of a registrant, including notes and history
        items excluding the history body. This may produce a lot of data, so the endpoint
        is limited to 20 results at a time.

        Because a history body can be quite large, a separate request must be made
        to `/registrants/{registrantId}/histories/{historyId}` in order to retrieve
        it.

        Use the `next` link to page through the available registrants. Registrant
        are sorted by creation date, with newest on top.
      tags:
      - Registrant
      parameters:
      - in: query
        name: rating
        schema:
          type: string
      - in: query
        name: lastModifiedAfter
        schema:
          type: string
          format: date
        description: >-
          Returns only registrants that were modified at least once since the given
          date, in ISO 8601 UTC format
      - in: query
        name: lastModifiedBefore
        schema:
          type: string
          format: date
        description: >-
          Returns only registrants that were last modified before this date. Combined
          with lastModifiedAfter this allows to select registrants that were last
          modified between two dates. Dates are in ISO 8601 UTC format.
      - in: query
        name: registeredAfter
        schema:
          type: string
          format: date
        description: >-
          Returns only registrants that were registered since the given date, in ISO
          8601 UTC format.
      - in: query
        name: registeredBefore
        schema:
          type: string
          format: date
        description: >-
          Returns only registrants that were registered before this date. Combined
          with registeredAfter this allows to select registrants that were registered
          between two dates. Dates are in ISO 8601 UTC format.
      - $ref: '#/components/parameters/Cursor'
      security:
      - JwtAuthorizer: []
      responses:
        200:
          description: >-
            Get a list of registrants, sorted newest-first. You can also limit the
            selection of registrants by rating and creation date.
          content:
            application/json:
              schema:
                type: object
                properties:
                  items:
                    type: array
                    items:
                      $ref: '#/components/schemas/RegistrantRead'
                  links:
                    type: object
                    properties:
                      next:
                        type: string
                        description: Link to the next batch of registrants
                        example: '/registrants?cursor=fdslkb32b3o2o'
        400:
          $ref: '#/components/responses/BadRequest'
        401:
          $ref: '#/components/responses/Unauthorized'
        403:
          $ref: '#/components/responses/Forbidden'
        500:
          $ref: '#/components/responses/InternalServerError'
    post:
      summary: Create a registrant
      operationId: 'post_registrants'
      description: |
        Notes:
        - History body is not returned in the response payload. Because a history body can be quite large,
          a separate request must be made to `/registrants/{registrantId}/histories/{historyId}`
          in order to retrieve it.
        - Automatic handling of duplicates (upsert) is available if `RegistrantWrite.automaticallyMerge` is set to true.
          (See notes in schema for matching rules and precedence)
      tags:
      - Registrant
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/RegistrantWrite'
      security:
      - JwtAuthorizer: []
      responses:
        202:
          description: Registrant has been created
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/RegistrantAccepted'
        400:
          $ref: '#/components/responses/BadRequest'
        401:
          $ref: '#/components/responses/Unauthorized'
        403:
          $ref: '#/components/responses/Forbidden'
        500:
          $ref: '#/components/responses/InternalServerError'
  '/registrants/search':
    get:
      summary: >-
        Search registrants by name, email, phone, nickname, externalId, rating or
        creation date.
      operationId: 'get_registrants_search'
      description: >-
        This endpoint is optimized for speed with a smaller payload than `/registrants`.
        This is handy for live search features, e.g. a drop-down with suggested results
        for a search bar.

        Note: History body is not returned in the response payload. Because a history
        body can be quite large, a separate request must be made to `/registrants/{registrantId}/histories/{historyId}`
        in order to retrieve it.
      tags:
      - Registrant
      parameters:
      - name: lastModified
        in: query
        schema:
          type: string
        description: Return only registrant modified after the specified date time,
          in ISO 8601 UTC format.
      - in: query
        name: registeredAfter
        schema:
          type: string
          format: date
        description: >-
          Returns only registrants that were registered since the given date, in ISO
          8601 UTC format.
      - in: query
        name: registeredBefore
        schema:
          type: string
          format: date
        description: >-
          Returns only registrants that were registered before this date. Combined
          with registeredAfter this allows to select registrants that were registered
          between two dates. Dates are in ISO 8601 UTC format.
      - name: rating
        in: query
        schema:
          type: string
        description: Return only registrants who currently have the specified rating
      - name: email
        in: query
        schema:
          type: string
        description: Search registrants by email address
      - name: phone
        in: query
        schema:
          type: string
        description: Search registrants by phone number
      - name: nickName
        in: query
        schema:
          type: string
        description: Search registrants by nickname
      - name: name
        in: query
        schema:
          type: string
        description: >-
          Search registrants by name. This is a loose search, the name will be parsed
          into first and last name, and then partially matched. E.g. `Jim and Susan
          Smith` will match `Jim Smith` and `Susan Smith`.
      - name: fuzzy
        in: query
        schema:
          type: boolean
        description: >-
          Default is `false`, turns on partial matching for specific field searches
          where the provided value is a prefix or an exact match. E.g. `name=rob&fuzzy=true`
          will match the name `Robert`. Affected fields are: name, nickName, phone,
          email, externalId, and rating.
      - name: externalId
        in: query
        schema:
          type: string
        description: >-
          Search registrants by an integration externalId. The integration type will
          be determined by the API key.
      - name: smartSearch
        in: query
        schema:
          type: string
        description: >-
          Searches for registrants where the given value is a prefix or exactly matches
          at least one of first name, last name, full name, phone, email, nickName,
          or company. E.g. `Jon`, `Jon Sno`, `Sno`, `Jo`  will all return `Jon Snow`.
          `jonsnow@` and `jonsno` will return a registrant with the email `jonsnow@westeros.com`.
      - $ref: '#/components/parameters/Cursor'
      security:
      - JwtAuthorizer: []
      responses:
        200:
          description: Registrants found
          content:
            application/json:
              schema:
                type: object
                properties:
                  links:
                    type: object
                    properties:
                      next:
                        type: string
                        description: Next batch of search results
                        example: /registrants/search?name=Smith&cursor=32bj3k2b
                  items:
                    type: array
                    items:
                      type: object
                      properties:
                        registrantId:
                          type: string
                          example: 123
                        personalId:
                          type: string
                          example: 1234
                        firstName:
                          type: string
                          example: John
                        lastName:
                          type: string
                          example: Smith
                        email:
                          type: string
                          description: Registrants primary email
                          example: john.smith@example.com
                        address:
                          type: string
                          description: Registrants primary address
                          example: 335 Example St, ES, 38832, USA
                        phone:
                          type: string
                          description: Registrants primary phone number
                          example: 512-555-8787
                        _links:
                          type: object
                          properties:
                            self:
                              type: string
                              description: Link to the full representation of the
                                registrant
                              example: /registrants/123
        400:
          $ref: '#/components/responses/BadRequest'
        401:
          $ref: '#/components/responses/Unauthorized'
        403:
          $ref: '#/components/responses/Forbidden'
        500:
          $ref: '#/components/responses/InternalServerError'
  '/registrants/{registrantId}':
    parameters:
    - in: path
      name: registrantId
      schema:
        type: string
      required: true
    put:
      description: Update a registrants personal data
      operationId: 'put_registrants_by_id'
      tags:
      - Registrant
      security:
      - JwtAuthorizer: []
      responses:
        200:
          description: Registrants personal data successfully saved
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/RegistrantRead'
        400:
          $ref: '#/components/responses/BadRequest'
        401:
          $ref: '#/components/responses/Unauthorized'
        403:
          $ref: '#/components/responses/Forbidden'
        404:
          $ref: '#/components/responses/NotFound'
        500:
          $ref: '#/components/responses/InternalServerError'
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/RegistrantPersonalInfo'
    get:
      summary: Extended data for a registrant
      operationId: 'get_registrants_by_id'
      description: >-
        Note: History body is not returned in the response payload. Because a history
        body can be quite large, a separate request must be made to `/registrants/{registrantId}/histories/{historyId}`
        in order to retrieve it.
      tags:
      - Registrant
      security:
      - JwtAuthorizer: []
      responses:
        200:
          description: Registrant exists
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/RegistrantRead'
        401:
          $ref: '#/components/responses/Unauthorized'
        403:
          $ref: '#/components/responses/Forbidden'
        404:
          $ref: '#/components/responses/NotFound'
        500:
          $ref: '#/components/responses/InternalServerError'
  '/registrants/{registrantId}/person/contact-information':
    parameters:
    - in: path
      name: registrantId
      schema:
        type: string
      required: true
    put:
      summary: Convenience method to update all of a registrant's contact information
        in a single call
      operationId: 'get_registrants_contact_information'
      description: >-
        Update a registrant's contact information. This will overwrite all of the
        registrant's contact information with the entity provided in the request payload.
        To avoid accidentally deleting contact information, first perform a GET on
        the same resource, then modify the returned entity, and finally apply the
        entity through this PUT method.
      tags:
      - Registrant Contact Information
      security:
      - JwtAuthorizer: []
      responses:
        200:
          description: Registrant's contact information successfully saved
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ContactInformation'
        400:
          $ref: '#/components/responses/BadRequest'
        401:
          $ref: '#/components/responses/Unauthorized'
        403:
          $ref: '#/components/responses/Forbidden'
        404:
          $ref: '#/components/responses/NotFound'
        500:
          $ref: '#/components/responses/InternalServerError'
      requestBody:
        description: >
          Registrant's contact information for update.

          Notes:

          - emails, phones, addresses: for the collections that are non-empty, there
          must be exactly
            one entity within the collection that is a designated primary, otherwise
          a 400 error will be returned
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/ContactInformation'
    get:
      summary: Retrieve all of a registrant's contact information
      operationId: 'put_registrants_contact_information'
      description: >-
        Retrieves all of a registrant's contact information. Use this method in conjunction
        with the PUT method of the same resource to perform a safe update.
      tags:
      - Registrant Contact Information
      security:
      - JwtAuthorizer: []
      responses:
        200:
          description: Registrant exists
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ContactInformation'
        401:
          $ref: '#/components/responses/Unauthorized'
        403:
          $ref: '#/components/responses/Forbidden'
        404:
          $ref: '#/components/responses/NotFound'
        500:
          $ref: '#/components/responses/InternalServerError'
  '/registrants/{registrantId}/integrations':
    parameters:
    - in: path
      name: registrantId
      required: true
      schema:
        type: string
    post:
      tags:
      - Registrant Integrations
      operationId: 'post_registrants_integrations'
      description: >-
        Associate an external customer with a Lasso registrant. What this allows,
        is for integration-specific triggers to automatically fire when an event is
        registered for a registrant - for example, when a registrant is updated, Lasso
        could fire off an event to an external integration. The integration type will
        be determined from the API Key used to access this route.
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/ExternalId'
      security:
      - JwtAuthorizer: []
      responses:
        200:
          description: Integrations successfully updated.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ExternalId'
        400:
          $ref: '#/components/responses/BadRequest'
        401:
          $ref: '#/components/responses/Unauthorized'
        403:
          $ref: '#/components/responses/Forbidden'
        404:
          $ref: '#/components/responses/NotFound'
        500:
          $ref: '#/components/responses/InternalServerError'
    delete:
      tags:
      - Registrant Integrations
      operationId: 'delete_registrants_integrations'
      description: >-
        Disassociates a registrant from all externalId's of an integration. This means
        that webhooks that trigger on externalId will no longer send events for this
        registrant. The integration associated with the registrant will be determined
        from the API Key used to access this route.
      security:
      - JwtAuthorizer: []
      responses:
        204:
          description: registrant successfully disassociated from external registrant.
        401:
          $ref: '#/components/responses/Unauthorized'
        403:
          $ref: '#/components/responses/Forbidden'
        404:
          $ref: '#/components/responses/NotFound'
        500:
          $ref: '#/components/responses/InternalServerError'
  '/registrants/{registrantId}/external/{externalId}':
    parameters:
    - in: path
      name: registrantId
      required: true
      schema:
        type: string
    - in: path
      name: externalId
      required: true
      schema:
        type: string
    delete:
      tags:
      - Registrant Integrations
      operationId: 'delete_registrants_external'
      description: >-
        Disassociates a registrant from a specific externalId. This means that webhooks
        that trigger on the specified externalId will no longer send events for this
        registrant. The integration associated with the registrant will be determined
        from the API Key used to access this route.
      security:
      - JwtAuthorizer: []
      responses:
        204:
          description: registrant successfully disassociated from external registrant.
        401:
          $ref: '#/components/responses/Unauthorized'
        403:
          $ref: '#/components/responses/Forbidden'
        500:
          $ref: '#/components/responses/InternalServerError'
  '/registrants/{registrantId}/rating':
    parameters:
    - in: path
      name: registrantId
      required: true
      schema:
        type: string
    put:
      tags:
      - Registrant Sales Details
      operationId: 'put_registrants_rating'
      description: >-
        Set the rating for the registrant. If the rating does not exist, it will be
        created.
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/Rating'
      security:
      - JwtAuthorizer: []
      responses:
        200:
          description: Rating successfully updated.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Rating'
        400:
          $ref: '#/components/responses/BadRequest'
        401:
          $ref: '#/components/responses/Unauthorized'
        403:
          $ref: '#/components/responses/Forbidden'
        404:
          $ref: '#/components/responses/NotFound'
        500:
          $ref: '#/components/responses/InternalServerError'
  '/registrants/{registrantId}/follow-up-process':
    parameters:
    - in: path
      name: registrantId
      required: true
      schema:
        type: string
    put:
      tags:
      - Registrant Sales Details
      operationId: 'put_registrants_follow_up_process'
      description: Set the follow-up process. If the follow-up process does not exist,
        it will be created.
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/FollowUpProcess'
      security:
      - JwtAuthorizer: []
      responses:
        200:
          description: Follow-up process successfully set.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/FollowUpProcess'
        400:
          $ref: '#/components/responses/BadRequest'
        401:
          $ref: '#/components/responses/Unauthorized'
        403:
          $ref: '#/components/responses/Forbidden'
        404:
          $ref: '#/components/responses/NotFound'
        500:
          $ref: '#/components/responses/InternalServerError'
  '/registrants/{registrantId}/source-type':
    parameters:
    - in: path
      name: registrantId
      required: true
      schema:
        type: string
    put:
      tags:
      - Registrant Sales Details
      operationId: 'put_registrants_source_type'
      description: Set the source type. If the source type does not exist, it will
        be created.
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/SourceType'
      security:
      - JwtAuthorizer: []
      responses:
        200:
          description: Source type successfully set.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/SourceType'
        400:
          $ref: '#/components/responses/BadRequest'
        401:
          $ref: '#/components/responses/Unauthorized'
        403:
          $ref: '#/components/responses/Forbidden'
        404:
          $ref: '#/components/responses/NotFound'
        500:
          $ref: '#/components/responses/InternalServerError'
  '/registrants/{registrantId}/secondary-source-type':
    parameters:
    - in: path
      name: registrantId
      required: true
      schema:
        type: string
    put:
      tags:
      - Registrant Sales Details
      operationId: 'put_registrants_secondarysource_type'
      description: Set the secondary source type. If the secondary source type does
        not exist, it will be created.
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/SecondarySourceType'
      security:
      - JwtAuthorizer: []
      responses:
        200:
          description: Secondary source type successfully set.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/SecondarySourceType'
        400:
          $ref: '#/components/responses/BadRequest'
        401:
          $ref: '#/components/responses/Unauthorized'
        403:
          $ref: '#/components/responses/Forbidden'
        404:
          $ref: '#/components/responses/NotFound'
        500:
          $ref: '#/components/responses/InternalServerError'
  '/registrants/{registrantId}/assigned-sales-reps':
    parameters:
    - in: path
      name: registrantId
      required: true
      schema:
        type: string
    get:
      tags:
      - Registrant Assigned Sales Reps
      operationId: 'get_registrants_assigned_sales_reps'
      description: >-
        Gets a list of sales reps that this registrant is assigned to.
      responses:
        200:
          description: >-
            A list of sales reps that this registrant is assigned to.
          content:
            application/json:
              schema:
                type: array
                items:
                  $ref: '#/components/schemas/SalesRepRead'
        401:
          $ref: '#/components/responses/Unauthorized'
        403:
          $ref: '#/components/responses/Forbidden'
        404:
          $ref: '#/components/responses/NotFound'
        500:
          $ref: '#/components/responses/InternalServerError'
    put:
      tags:
      - Registrant Assigned Sales Reps
      operationId: 'put_registrants_assigned_sales_reps'
      description: >-
        Update a registrant's assigned sales reps. This list will overwrite the assigned
        sales reps for the registrant.

        Only one sales rep can be set to primary. If more than one has isPrimary set
        to true, an error will be thrown.
      requestBody:
        required: false
        content:
          application/json:
            schema:
              type: array
              items:
                $ref: '#/components/schemas/SalesRepWrite'
      security:
      - JwtAuthorizer: []
      responses:
        200:
          description: Sales reps successfully assigned.
          content:
            application/json:
              schema:
                type: array
                items:
                  $ref: '#/components/schemas/SalesRepRead'
        400:
          $ref: '#/components/responses/BadRequest'
        401:
          $ref: '#/components/responses/Unauthorized'
        403:
          $ref: '#/components/responses/Forbidden'
        404:
          $ref: '#/components/responses/NotFound'
        500:
          $ref: '#/components/responses/InternalServerError'
  '/registrants/{registrantId}/emails':
    parameters:
    - in: path
      name: registrantId
      required: true
      schema:
        type: string
    post:
      tags:
      - Registrant Contact Information
      operationId: 'post_registrants_emails'
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/EmailWrite'
      security:
      - JwtAuthorizer: []
      responses:
        201:
          description: Email successfully created.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/EmailRead'
        400:
          $ref: '#/components/responses/BadRequest'
        401:
          $ref: '#/components/responses/Unauthorized'
        403:
          $ref: '#/components/responses/Forbidden'
        404:
          $ref: '#/components/responses/NotFound'
        500:
          $ref: '#/components/responses/InternalServerError'
  '/registrants/{registrantId}/emails/{emailId}':
    parameters:
    - in: path
      name: registrantId
      required: true
      schema:
        type: string
    - in: path
      name: emailId
      required: true
      schema:
        type: string
    put:
      tags:
      - Registrant Contact Information
      operationId: 'put_registrants_emails_by_id'
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/EmailWrite'
      security:
      - JwtAuthorizer: []
      responses:
        200:
          description: Email updated.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/EmailRead'
        400:
          $ref: '#/components/responses/BadRequest'
        401:
          $ref: '#/components/responses/Unauthorized'
        403:
          $ref: '#/components/responses/Forbidden'
        404:
          $ref: '#/components/responses/NotFound'
        500:
          $ref: '#/components/responses/InternalServerError'
    delete:
      tags:
      - Registrant Contact Information
      operationId: 'delete_registrants_emails_by_id'
      security:
      - JwtAuthorizer: []
      responses:
        204:
          description: Item deleted
        401:
          $ref: '#/components/responses/Unauthorized'
        403:
          $ref: '#/components/responses/Forbidden'
        500:
          $ref: '#/components/responses/InternalServerError'
  '/registrants/{registrantId}/phones':
    parameters:
    - in: path
      name: registrantId
      required: true
      schema:
        type: string
    post:
      tags:
      - Registrant Contact Information
      operationId: 'post_registrants_phones'
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/PhoneWrite'
      security:
      - JwtAuthorizer: []
      responses:
        201:
          description: Phone number successfully created.
          content:
            application/json:
              schema:
                $

# --- truncated at 32 KB (165 KB total) ---
# Full source: https://raw.githubusercontent.com/api-evangelist/eci-solutions/refs/heads/main/openapi/eci-solutions-lasso-crm-openapi.yml