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: 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