Worlds / Sales and crm
Salesloft API
A local Salesloft with people, accounts, cadences, cadence memberships, calls, emails and tasks. Test the agent that works the cadence queue, logs calls and removes people who should stop.
- Base path
/v2- Auth
- OAuth 2.0 bearer token, the world key
- Endpoints
- 14
- Status
- Active today
This reference previews the surface the Salesloft world serves in the closed beta. Paths mirror the public Salesloft API; the exact subset is confirmed when your workflow is scoped.
Connect
The run gives your agent these bindings. Keep your SDK; change only where it sends requests.
| binding | meaning |
|---|---|
WORLDS_SALESLOFT_URL | This world's origin followed by /v2 |
WORLDS_API_KEY | The world key, accepted wherever Salesloft expects a credential |
WORLDS_WORLD_ID | The isolated world's identity |
const base = process.env.WORLDS_SALESLOFT_URL;
const headers = {
Authorization: "Bearer " + process.env.WORLDS_API_KEY,
"Content-Type": "application/json",
};
const res = await fetch(base + "/people.json?per_page=25", { headers });
const { data } = await res.json();API reference
People
Prospects and contacts.
- GET
/v2/people.jsonList people - POST
/v2/people.jsonCreate a person - GET
/v2/people/{id}.jsonFetch a person - PUT
/v2/people/{id}.jsonUpdate a person
Fields · 6
id | integer | Person id |
first_name | string | First name |
last_name | string | Last name |
email_address | string | Email address |
title | string | Job title |
account | object | Linked account |
Accounts
Companies you prospect.
- GET
/v2/accounts.jsonList accounts - POST
/v2/accounts.jsonCreate an account - GET
/v2/accounts/{id}.jsonFetch an account
Fields · 4
id | integer | Account id |
name | string | Name |
domain | string | Website domain |
industry | string | Industry |
Cadences
Automated sequences of steps.
- GET
/v2/cadences.jsonList cadences - GET
/v2/cadences/{id}.jsonFetch a cadence
Fields · 4
id | integer | Cadence id |
name | string | Name |
draft | boolean | Whether it is a draft |
people_acted_count | integer | People who acted |
Cadence memberships
A person's enrollment in a cadence.
- GET
/v2/cadence_memberships.jsonList memberships - POST
/v2/cadence_memberships.jsonAdd a person to a cadence - POST
/v2/cadence_memberships/{id}/remove.jsonRemove a person from a cadence
Fields · 4
id | integer | Membership id |
person_id | integer | Person |
cadence_id | integer | Cadence |
currently_on_cadence | boolean | Whether still enrolled |
Activities
Emails sent and calls made.
- GET
/v2/activities/emails.jsonList emails - GET
/v2/activities/calls.jsonList calls
Fields · 4
id | integer | Activity id |
subject | string | Subject |
status | string | Delivery status |
recipient | object | Person who received it |
Test workflow
- Prepare. Select the Salesloft setup for your workflow and review its starting records, including people, accounts, cadences.
- Connect. Configure your agent with this world's URL and key using the SDK example. Check that it reaches the intended API before running a test.
- Define. Describe the task, expected final changes and records that must stay untouched. Keep expected outcomes separate from the agent's instructions.
- Run and inspect. Use the dashboard or your workflow's generated CLI setup. Review final records and changes, then rerun from the same starting setup with the relevant failure conditions. Use Deployment and CI to automate the same workflow.
What to verify
- Kim Park removed from the cadence
- Raj Patel on no cadence
- Ana Ruiz has a call with disposition and sentiment
- No call logged on a person not called
- Ji Woo membership still paused
Test file
A task file names the jobs, the policy your agent is given and what the grader reads back from the world's final state. The agent never sees the expected outcomes.
# worlds/tasks.yaml · Salesloft
version: 2
connector: salesloft
seed: salesloft-starter
mode: isolated
policy: >
Work today's Enterprise Outbound tasks. Remove anyone who booked a meeting.
Log calls with disposition and sentiment on the right person. Never add
people flagged do not contact.
tasks:
- id: add-people-to-a-cadence-on-the-right-step
prompt: Add people to a cadence on the right step
- id: log-a-call-with-disposition-and-sentiment
prompt: Log a call with disposition and sentiment
- id: remove-people-from-cadences-after-a-reply-or-meeting
prompt: Remove people from cadences after a reply or meeting
expected:
- Kim Park removed from the cadence
- Raj Patel on no cadence
- Ana Ruiz has a call with disposition and sentiment
- No call logged on a person not called
- Ji Woo membership still paused
scenarios:
- rate-limited
- already-a-member
- token-expiredSee Tasks and outcomes for every field, and Deployment and CI to run the file on every pull request.
Failure conditions
Each one fires before the handler, at the same step on every run.
| condition | what the agent sees |
|---|---|
rate-limited | 429 once the per-minute cost limit is used |
already-a-member | 422 when the person is already on the cadence |
token-expired | The OAuth access token expires and returns 401 |
person-deleted | 404 because the person was merged by a teammate |
Starting data
Start each run from the same records and relationships. The overview below describes the Salesloft starter; use the setup supplied for your workflow when preparing your own snapshot.
| Records | Starting setup |
|---|---|
| people | 70 with owner and do not contact flags |
| cadences | 5 with email, phone and other steps |
| cadence memberships | 50 active, paused and removed |
| calls | 40 logged with dispositions |
| tasks | 25 due today |
The record shapes below reuse this world's API field definitions. They show illustrative values and placeholders, not an importable seed. API responses and seed input can differ; include all required records and references in the accepted import format for your workflow.
People records
People
Prospects and contacts.
| Field | Type | Meaning / relationship |
|---|---|---|
id | integer | Person id |
first_name | string | First name |
last_name | string | Last name |
email_address | string | Email address |
title | string | Job title |
account | object | Linked account |
{
"id": 1,
"first_name": "<First name>",
"last_name": "<Last name>",
"email_address": "person@example.test",
"title": "<Job title>",
"account": {}
}Accounts records
Accounts
Companies you prospect.
| Field | Type | Meaning / relationship |
|---|---|---|
id | integer | Account id |
name | string | Name |
domain | string | Website domain |
industry | string | Industry |
{
"id": 1,
"name": "<Name>",
"domain": "<Website domain>",
"industry": "<Industry>"
}Cadences records
Cadences
Automated sequences of steps.
| Field | Type | Meaning / relationship |
|---|---|---|
id | integer | Cadence id |
name | string | Name |
draft | boolean | Whether it is a draft |
people_acted_count | integer | People who acted |
{
"id": 1,
"name": "<Name>",
"draft": false,
"people_acted_count": 1
}Cadence memberships records
Cadence memberships
A person's enrollment in a cadence.
| Field | Type | Meaning / relationship |
|---|---|---|
id | integer | Membership id |
person_id | integer | Person |
cadence_id | integer | Cadence |
currently_on_cadence | boolean | Whether still enrolled |
{
"id": 1,
"person_id": 1,
"cadence_id": 1,
"currently_on_cadence": false
}Activities records
Activities
Emails sent and calls made.
| Field | Type | Meaning / relationship |
|---|---|---|
id | integer | Activity id |
subject | string | Subject |
status | string | Delivery status |
recipient | object | Person who received it |
{
"id": 1,
"subject": "<Subject>",
"status": "<Delivery status>",
"recipient": {}
}