Developer platform

Build your outbound workflows with Outstalk

Use the REST API for predictable integrations or connect an AI client through MCP. Both use the same organization-scoped API keys and permissions.

API version 1REST + MCP

Introduction

The API uses JSON requests and responses. A key uses its home organization by default. Agency and freelance users may target a client only when an active mandate or assignment grants access and the X-Organization-Id header is provided explicitly.

For security, billing and payment changes, sign-in and invitations, CRM credentials, telephony-number purchase or release, and super-admin operations remain UI-only. The API covers the account's outbound business resources and workflows documented below.

Base URL

https://www.outstalk.com/api/v1

Authentication

Create a key in Settings → API keys, select only the permissions your integration needs, then send the secret as a Bearer token. The full secret is shown once. For an authorized client context, also send X-Organization-Id with the client organization ID.

Authorization: Bearer
curl 'https://www.outstalk.com/api/v1/me' \
  --header 'Authorization: Bearer $OUTSTALK_API_KEY'

# Optional: target an accessible client context under an active mandate
curl 'https://www.outstalk.com/api/v1/campaigns' \
  --header 'Authorization: Bearer $OUTSTALK_API_KEY' \
  --header 'X-Organization-Id: org_client_123'

Never expose a key in browser code, logs or a public repository. Revoke a key immediately if it may have leaked.

Errors

Errors use a stable code, a human-readable message and an optional details object.

4xx application/json
{
  "error": {
    "code": "invalid_request",
    "message": "The request could not be processed.",
    "details": { "field": "name" }
  }
}

Pagination

Most resource lists use cursor pagination: pass limit (1–100) and the cursor returned in meta.nextCursor. Prospecting searches document their provider pagination separately.

cursor pagination
GET /api/v1/leads?limit=50&cursor=eyJpZCI6...

{
  "data": [ ... ],
  "meta": { "hasMore": true, "nextCursor": "eyJpZCI6..." }
}

Permissions

Account

profile:read

Read the authenticated user's profile.

organization:read

Read organization details and accessible client context.

members:read

List members of the native organization.

usage:read

Read plan limits, credits, and usage totals.

Prospecting

campaigns:read

List campaigns and read their configuration.

campaigns:write

Create, update, and delete campaigns.

leads:read

List leads and read their details.

leads:write

Create, update, move, and delete leads.

lead_search:execute

Run external company and people searches.

enrichment:execute

Enrich lead and contact data using organization credits.

Calling

calls:read

Read call history and call outcomes.

calls:write

Create call-session records and update their outcomes.

phone_numbers:read

List organization phone numbers and assignments.

Sales and analytics

crm:read

Read stages, deals, activities, and CRM exports.

crm:write

Create and update CRM deals and activities.

analytics:read

Read campaign, caller, and portfolio analytics.

Agency and talent network

agency:read

Read linked clients, grants, and agency portfolio data.

agency:write

Manage agency clients and access grants.

talents:read

Browse the talent marketplace and profiles.

missions:read

Read missions, requests, and applications.

missions:write

Create and manage missions and applications.

API reference

Account & organization

Inspect the API key owner and active organization.

GET/me

Get the API key owner

Returns the authenticated user and the active organization context.

Required permissionprofile:read
cURL
curl --request GET 'https://www.outstalk.com/api/v1/me' \
  --header 'Authorization: Bearer $OUTSTALK_API_KEY' \
  --header 'Content-Type: application/json'

Example response

200 application/json
{
  "data": {}
}
GET/organization

Get the active organization

Returns non-secret organization details for the current context.

Required permissionorganization:read
cURL
curl --request GET 'https://www.outstalk.com/api/v1/organization' \
  --header 'Authorization: Bearer $OUTSTALK_API_KEY' \
  --header 'Content-Type: application/json'

Example response

200 application/json
{
  "data": {}
}

Campaigns

Create and manage outbound campaigns.

GET/campaigns

List campaigns

Lists campaigns visible to the key owner. Low-level agency delegates only see assigned campaigns.

Required permissioncampaigns:read

Parameters

limitquery
Optional
integer
cursorquery
Optional
string

Opaque cursor returned by the previous page.

cURL
curl --request GET 'https://www.outstalk.com/api/v1/campaigns' \
  --header 'Authorization: Bearer $OUTSTALK_API_KEY' \
  --header 'Content-Type: application/json'

Example response

200 application/json
{
  "data": [],
  "meta": {
    "hasMore": false,
    "nextCursor": null
  }
}
POST/campaigns

Create a campaign

Creates a campaign in the active organization.

Required permissioncampaigns:write

Parameters

namebody
Required
string
descriptionbody
Optional
string | null
cURL
curl --request POST 'https://www.outstalk.com/api/v1/campaigns' \
  --header 'Authorization: Bearer $OUTSTALK_API_KEY' \
  --header 'Content-Type: application/json' \
  --data '{
  "name": "France Q3",
  "description": "Priority accounts"
}'

Request body

application/json
{
  "name": "France Q3",
  "description": "Priority accounts"
}

Example response

201 application/json
{
  "data": {}
}
GET/campaigns/{campaignId}

Get a campaign

Returns one visible campaign with assignments and counts.

Required permissioncampaigns:read

Parameters

campaignIdpath
Required
string

Campaign ID

cURL
curl --request GET 'https://www.outstalk.com/api/v1/campaigns/campaign_123' \
  --header 'Authorization: Bearer $OUTSTALK_API_KEY' \
  --header 'Content-Type: application/json'

Example response

200 application/json
{
  "data": {}
}
PATCH/campaigns/{campaignId}

Update a campaign

Updates campaign metadata.

Required permissioncampaigns:write

Parameters

campaignIdpath
Required
string

Campaign ID

namebody
Optional
string
descriptionbody
Optional
string | null
cURL
curl --request PATCH 'https://www.outstalk.com/api/v1/campaigns/campaign_123' \
  --header 'Authorization: Bearer $OUTSTALK_API_KEY' \
  --header 'Content-Type: application/json' \
  --data '{
  "name": "France Q3",
  "description": "Priority accounts"
}'

Request body

application/json
{
  "name": "France Q3",
  "description": "Priority accounts"
}

Example response

200 application/json
{
  "data": {}
}
DELETE/campaigns/{campaignId}

Delete a campaign

Deletes a campaign. Leads are retained and detached by the database relation.

Required permissioncampaigns:write

Parameters

campaignIdpath
Required
string

Campaign ID

cURL
curl --request DELETE 'https://www.outstalk.com/api/v1/campaigns/campaign_123' \
  --header 'Authorization: Bearer $OUTSTALK_API_KEY' \
  --header 'Content-Type: application/json'

Example response

204
204 No Content

Leads & activities

Manage organization leads and their follow-up activities.

GET/leads

List leads

Lists organization-scoped leads with optional campaign, status, type, and text filters.

Required permissionleads:read

Parameters

limitquery
Optional
integer
cursorquery
Optional
string

Opaque cursor returned by the previous page.

campaignIdquery
Optional
string

Campaign ID

statusquery
Optional
string · NEW | CALLED | REACHED | CALLBACK | SEND_MAIL | LEAD
leadTypequery
Optional
string · PLACE | PERSON
queryquery
Optional
string
cURL
curl --request GET 'https://www.outstalk.com/api/v1/leads' \
  --header 'Authorization: Bearer $OUTSTALK_API_KEY' \
  --header 'Content-Type: application/json'

Example response

200 application/json
{
  "data": [],
  "meta": {
    "hasMore": false,
    "nextCursor": null
  }
}
POST/leads

Create a lead

Creates a company or person lead. Referenced campaigns must belong to the active organization.

Required permissionleads:write

Parameters

companybody
Required
string
leadTypebody
Optional
string · PLACE | PERSON
campaignIdbody
Optional
string | null
statusbody
Optional
string · NEW | CALLED | REACHED | CALLBACK | SEND_MAIL | LEAD
addressbody
Optional
string | null
summarybody
Optional
string | null
phonebody
Optional
string | null
emailbody
Optional
string | null
websitebody
Optional
string | null
contactFirstNamebody
Optional
string | null
contactLastNamebody
Optional
string | null
contactRolebody
Optional
string | null
jobTitlebody
Optional
string | null
citybody
Optional
string | null
countrybody
Optional
string | null
linkedinUrlbody
Optional
string | null
cURL
curl --request POST 'https://www.outstalk.com/api/v1/leads' \
  --header 'Authorization: Bearer $OUTSTALK_API_KEY' \
  --header 'Content-Type: application/json' \
  --data '{
  "company": "Acme",
  "leadType": "PLACE",
  "campaignId": "campaign_123"
}'

Request body

application/json
{
  "company": "Acme",
  "leadType": "PLACE",
  "campaignId": "campaign_123"
}

Example response

201 application/json
{
  "data": {}
}
GET/leads/{leadId}

Get a lead

Returns one visible lead with campaign and activity counts.

Required permissionleads:read

Parameters

leadIdpath
Required
string

Lead ID

cURL
curl --request GET 'https://www.outstalk.com/api/v1/leads/lead_123' \
  --header 'Authorization: Bearer $OUTSTALK_API_KEY' \
  --header 'Content-Type: application/json'

Example response

200 application/json
{
  "data": {}
}
PATCH/leads/{leadId}

Update a lead

Partially updates an organization-scoped lead.

Required permissionleads:write

Parameters

leadIdpath
Required
string

Lead ID

companybody
Optional
string
campaignIdbody
Optional
string | null
statusbody
Optional
string · NEW | CALLED | REACHED | CALLBACK | SEND_MAIL | LEAD
addressbody
Optional
string | null
summarybody
Optional
string | null
phonebody
Optional
string | null
emailbody
Optional
string | null
websitebody
Optional
string | null
contactFirstNamebody
Optional
string | null
contactLastNamebody
Optional
string | null
contactRolebody
Optional
string | null
jobTitlebody
Optional
string | null
citybody
Optional
string | null
countrybody
Optional
string | null
linkedinUrlbody
Optional
string | null
cURL
curl --request PATCH 'https://www.outstalk.com/api/v1/leads/lead_123' \
  --header 'Authorization: Bearer $OUTSTALK_API_KEY' \
  --header 'Content-Type: application/json' \
  --data '{
  "company": "Acme",
  "campaignId": "campaign_123",
  "status": "NEW"
}'

Request body

application/json
{
  "company": "Acme",
  "campaignId": "campaign_123",
  "status": "NEW"
}

Example response

200 application/json
{
  "data": {}
}
DELETE/leads/{leadId}

Delete a lead

Permanently deletes an organization-scoped lead and its dependent activity/call data.

Required permissionleads:write

Parameters

leadIdpath
Required
string

Lead ID

cURL
curl --request DELETE 'https://www.outstalk.com/api/v1/leads/lead_123' \
  --header 'Authorization: Bearer $OUTSTALK_API_KEY' \
  --header 'Content-Type: application/json'

Example response

204
204 No Content
GET/leads/{leadId}/activities

List lead activities

Lists follow-up activities for one visible lead.

Required permissionleads:read

Parameters

leadIdpath
Required
string

Lead ID

limitquery
Optional
integer
cursorquery
Optional
string

Opaque cursor returned by the previous page.

cURL
curl --request GET 'https://www.outstalk.com/api/v1/leads/lead_123/activities' \
  --header 'Authorization: Bearer $OUTSTALK_API_KEY' \
  --header 'Content-Type: application/json'

Example response

200 application/json
{
  "data": [],
  "meta": {
    "hasMore": false,
    "nextCursor": null
  }
}
POST/leads/{leadId}/activities

Create a lead activity

Adds a follow-up activity to a lead.

Required permissionleads:write

Parameters

leadIdpath
Required
string

Lead ID

titlebody
Required
string
dueAtbody
Optional
string | null
cURL
curl --request POST 'https://www.outstalk.com/api/v1/leads/lead_123/activities' \
  --header 'Authorization: Bearer $OUTSTALK_API_KEY' \
  --header 'Content-Type: application/json' \
  --data '{
  "title": "Follow up",
  "dueAt": "2026-08-01T09:00:00.000Z"
}'

Request body

application/json
{
  "title": "Follow up",
  "dueAt": "2026-08-01T09:00:00.000Z"
}

Example response

201 application/json
{
  "data": {}
}
PATCH/leads/{leadId}/activities/{activityId}

Update a lead activity

Updates title, due date, or completion state.

Required permissionleads:write

Parameters

leadIdpath
Required
string

Lead ID

activityIdpath
Required
string

Activity ID

titlebody
Optional
string
dueAtbody
Optional
string | null
isDonebody
Optional
boolean
cURL
curl --request PATCH 'https://www.outstalk.com/api/v1/leads/lead_123/activities/activity_123' \
  --header 'Authorization: Bearer $OUTSTALK_API_KEY' \
  --header 'Content-Type: application/json' \
  --data '{
  "title": "Follow up",
  "dueAt": "2026-08-01T09:00:00.000Z",
  "isDone": true
}'

Request body

application/json
{
  "title": "Follow up",
  "dueAt": "2026-08-01T09:00:00.000Z",
  "isDone": true
}

Example response

200 application/json
{
  "data": {}
}
DELETE/leads/{leadId}/activities/{activityId}

Delete a lead activity

Deletes a follow-up activity.

Required permissionleads:write

Parameters

leadIdpath
Required
string

Lead ID

activityIdpath
Required
string

Activity ID

cURL
curl --request DELETE 'https://www.outstalk.com/api/v1/leads/lead_123/activities/activity_123' \
  --header 'Authorization: Bearer $OUTSTALK_API_KEY' \
  --header 'Content-Type: application/json'

Example response

204
204 No Content
POST/enrichment/company-leads

Enrich and save a company lead

Enriches one Google Places result, consumes organization credits after atomic limit checks, and saves it as a de-duplicated company lead.

Required permissionenrichment:execute

Parameters

placebody
Required
object
campaignIdbody
Optional
string | null
cURL
curl --request POST 'https://www.outstalk.com/api/v1/enrichment/company-leads' \
  --header 'Authorization: Bearer $OUTSTALK_API_KEY' \
  --header 'Content-Type: application/json' \
  --data '{
  "place": {
    "placeId": "place_123",
    "company": "Acme Paris",
    "address": "1 rue Exemple, Paris",
    "phone": "+33123456789",
    "email": null,
    "website": "https://acme.example",
    "summary": null
  },
  "campaignId": "campaign_123"
}'

Request body

application/json
{
  "place": {
    "placeId": "place_123",
    "company": "Acme Paris",
    "address": "1 rue Exemple, Paris",
    "phone": "+33123456789",
    "email": null,
    "website": "https://acme.example",
    "summary": null
  },
  "campaignId": "campaign_123"
}

Example response

201 application/json
{
  "data": {}
}

Prospecting & enrichment

Search for companies or people, then enrich selected records under the organization's credits and plan limits.

POST/lead-search/people

Search for people

Searches the configured people-data provider using person, role, company, location, seniority, and tenure filters. This operation calls an external provider.

Required permissionlead_search:execute

Parameters

filtersbody
Required
object
paginationbody
Optional
object
cURL
curl --request POST 'https://www.outstalk.com/api/v1/lead-search/people' \
  --header 'Authorization: Bearer $OUTSTALK_API_KEY' \
  --header 'Content-Type: application/json' \
  --data '{
  "filters": {
    "jobTitles": [
      {
        "value": "Head of Sales",
        "exclude": false
      }
    ],
    "companyCountries": [
      "France"
    ]
  },
  "pagination": {
    "limit": 25
  }
}'

Request body

application/json
{
  "filters": {
    "jobTitles": [
      {
        "value": "Head of Sales",
        "exclude": false
      }
    ],
    "companyCountries": [
      "France"
    ]
  },
  "pagination": {
    "limit": 25
  }
}

Example response

200 application/json
{
  "data": [],
  "meta": {
    "total": 0,
    "offset": 0,
    "limit": 25,
    "searchAfter": null
  }
}
POST/lead-search/companies

Search for companies

Searches Google Places by query and location with optional rating, price-level, and strict-area filters. This operation calls an external provider.

Required permissionlead_search:execute

Parameters

querybody
Required
string
locationbody
Required
string
optionsbody
Optional
object
cURL
curl --request POST 'https://www.outstalk.com/api/v1/lead-search/companies' \
  --header 'Authorization: Bearer $OUTSTALK_API_KEY' \
  --header 'Content-Type: application/json' \
  --data '{
  "query": "software companies",
  "location": "Paris, France",
  "options": {
    "minRating": 4,
    "strictArea": true
  }
}'

Request body

application/json
{
  "query": "software companies",
  "location": "Paris, France",
  "options": {
    "minRating": 4,
    "strictArea": true
  }
}

Example response

200 application/json
{
  "data": [],
  "meta": {
    "total": 0
  }
}
POST/enrichment/jobs

Start people enrichment

Starts an asynchronous people-enrichment job, reserves organization credits, enforces plan limits, de-duplicates contacts, and pre-creates the selected leads.

Required permissionenrichment:execute

Parameters

peoplebody
Required
array
enrichEmailbody
Required
boolean
enrichPhonebody
Required
boolean
campaignIdbody
Optional
string | null
cURL
curl --request POST 'https://www.outstalk.com/api/v1/enrichment/jobs' \
  --header 'Authorization: Bearer $OUTSTALK_API_KEY' \
  --header 'Content-Type: application/json' \
  --data '{
  "people": [
    {
      "fullenrichId": "person_123",
      "firstName": "Ada",
      "lastName": "Martin",
      "fullName": "Ada Martin",
      "jobTitle": "Head of Sales",
      "jobFunction": "Sales",
      "seniority": "Head",
      "country": "France",
      "city": "Paris",
      "yearsAtCompany": 2,
      "linkedinUrl": "https://www.linkedin.com/in/example",
      "companyName": "Acme",
      "companyDomain": "acme.example",
      "companyIndustry": "Software",
      "companyHeadcount": "51-200",
      "companyCountry": "France",
      "companyLinkedin": null
    }
  ],
  "enrichEmail": true,
  "enrichPhone": false,
  "campaignId": "campaign_123"
}'

Request body

application/json
{
  "people": [
    {
      "fullenrichId": "person_123",
      "firstName": "Ada",
      "lastName": "Martin",
      "fullName": "Ada Martin",
      "jobTitle": "Head of Sales",
      "jobFunction": "Sales",
      "seniority": "Head",
      "country": "France",
      "city": "Paris",
      "yearsAtCompany": 2,
      "linkedinUrl": "https://www.linkedin.com/in/example",
      "companyName": "Acme",
      "companyDomain": "acme.example",
      "companyIndustry": "Software",
      "companyHeadcount": "51-200",
      "companyCountry": "France",
      "companyLinkedin": null
    }
  ],
  "enrichEmail": true,
  "enrichPhone": false,
  "campaignId": "campaign_123"
}

Example response

202 application/json
{
  "data": {}
}
GET/enrichment/jobs/{jobId}

Get enrichment status

Returns an organization-scoped enrichment job and polls the provider when the job is still pending. Provider identifiers and raw payloads are never returned.

Required permissionenrichment:execute

Parameters

jobIdpath
Required
string

Enrichment job ID

cURL
curl --request GET 'https://www.outstalk.com/api/v1/enrichment/jobs/job_123' \
  --header 'Authorization: Bearer $OUTSTALK_API_KEY' \
  --header 'Content-Type: application/json'

Example response

200 application/json
{
  "data": {}
}

Call logs

Record call cycles and read their measured duration. These endpoints do not dial a telephony provider.

GET/call-logs

List call logs

Lists recorded call sessions. A call log is an application record and does not prove provider connection. Native organization members only see their own call logs.

Required permissioncalls:read

Parameters

limitquery
Optional
integer
cursorquery
Optional
string

Opaque cursor returned by the previous page.

leadIdquery
Optional
string

Lead ID

userIdquery
Optional
string

User ID

cURL
curl --request GET 'https://www.outstalk.com/api/v1/call-logs' \
  --header 'Authorization: Bearer $OUTSTALK_API_KEY' \
  --header 'Content-Type: application/json'

Example response

200 application/json
{
  "data": [],
  "meta": {
    "hasMore": false,
    "nextCursor": null
  }
}
POST/call-logs/start

Start a call-log cycle

Creates a call-session record and consumes one monthly call unit after quota checks. This endpoint does not dial a telephony provider. Native organization members can only create their own call logs.

Required permissioncalls:write

Parameters

leadIdbody
Required
string

Lead ID

phoneNumberIdbody
Optional
string | null
cURL
curl --request POST 'https://www.outstalk.com/api/v1/call-logs/start' \
  --header 'Authorization: Bearer $OUTSTALK_API_KEY' \
  --header 'Content-Type: application/json' \
  --data '{
  "leadId": "lead_123",
  "phoneNumberId": "phonenumber_123"
}'

Request body

application/json
{
  "leadId": "lead_123",
  "phoneNumberId": "phonenumber_123"
}

Example response

201 application/json
{
  "data": {}
}
POST/call-logs/{callLogId}/end

End a call-log cycle

Ends a call-session record owned by the API key user and stores its measured duration. A call log can only be ended by its owner.

Required permissioncalls:write

Parameters

callLogIdpath
Required
string

Call log ID

durationSecondsbody
Required
integer
cURL
curl --request POST 'https://www.outstalk.com/api/v1/call-logs/calllog_123/end' \
  --header 'Authorization: Bearer $OUTSTALK_API_KEY' \
  --header 'Content-Type: application/json' \
  --data '{
  "durationSeconds": 84
}'

Request body

application/json
{
  "durationSeconds": 84
}

Example response

200 application/json
{
  "data": {}
}

Analytics

Retrieve call and CRM-export aggregates.

GET/analytics

Get call analytics

Returns call and CRM-export aggregates for a UTC date range. Native organization members only receive their own aggregates.

Required permissionanalytics:read

Parameters

dateFromquery
Optional
string
dateToquery
Optional
string
userIdquery
Optional
string

User ID

cURL
curl --request GET 'https://www.outstalk.com/api/v1/analytics' \
  --header 'Authorization: Bearer $OUTSTALK_API_KEY' \
  --header 'Content-Type: application/json'

Example response

200 application/json
{
  "data": {}
}

CRM

Manage internal pipeline stages, deals, comments and activities.

GET/crm/stages

List CRM stages

Lists internal CRM pipeline stages.

Required permissioncrm:read
cURL
curl --request GET 'https://www.outstalk.com/api/v1/crm/stages' \
  --header 'Authorization: Bearer $OUTSTALK_API_KEY' \
  --header 'Content-Type: application/json'

Example response

200 application/json
{
  "data": [],
  "meta": {
    "hasMore": false,
    "nextCursor": null
  }
}
POST/crm/stages

Create a CRM stage

Creates a stage at the end of the pipeline.

Required permissioncrm:write

Parameters

namebody
Required
string
cURL
curl --request POST 'https://www.outstalk.com/api/v1/crm/stages' \
  --header 'Authorization: Bearer $OUTSTALK_API_KEY' \
  --header 'Content-Type: application/json' \
  --data '{
  "name": "France Q3"
}'

Request body

application/json
{
  "name": "France Q3"
}

Example response

201 application/json
{
  "data": {}
}
PATCH/crm/stages/{stageId}

Update a CRM stage

Updates a stage name or position.

Required permissioncrm:write

Parameters

stageIdpath
Required
string

Stage ID

namebody
Optional
string
positionbody
Optional
integer
cURL
curl --request PATCH 'https://www.outstalk.com/api/v1/crm/stages/stage_123' \
  --header 'Authorization: Bearer $OUTSTALK_API_KEY' \
  --header 'Content-Type: application/json' \
  --data '{
  "name": "France Q3",
  "position": 1
}'

Request body

application/json
{
  "name": "France Q3",
  "position": 1
}

Example response

200 application/json
{
  "data": {}
}
DELETE/crm/stages/{stageId}

Delete a CRM stage

Deletes an empty CRM stage. Stages containing deals cannot be deleted.

Required permissioncrm:write

Parameters

stageIdpath
Required
string

Stage ID

cURL
curl --request DELETE 'https://www.outstalk.com/api/v1/crm/stages/stage_123' \
  --header 'Authorization: Bearer $OUTSTALK_API_KEY' \
  --header 'Content-Type: application/json'

Example response

204
204 No Content
GET/crm/deals

List CRM deals

Lists internal CRM deals with stage and owner summaries.

Required permissioncrm:read

Parameters

limitquery
Optional
integer
cursorquery
Optional
string

Opaque cursor returned by the previous page.

stageIdquery
Optional
string

Stage ID

ownerIdquery
Optional
string

Owner ID

cURL
curl --request GET 'https://www.outstalk.com/api/v1/crm/deals' \
  --header 'Authorization: Bearer $OUTSTALK_API_KEY' \
  --header 'Content-Type: application/json'

Example response

200 application/json
{
  "data": [],
  "meta": {
    "hasMore": false,
    "nextCursor": null
  }
}
POST/crm/deals

Create a CRM deal

Creates a deal linked optionally to an organization lead.

Required permissioncrm:write

Parameters

titlebody
Required
string
companybody
Required
string
stageIdbody
Required
string

Stage ID

ownerIdbody
Optional
string | null
leadIdbody
Optional
string | null
valueCentsbody
Optional
integer | null
phonebody
Optional
string | null
emailbody
Optional
string | null
contactFirstNamebody
Optional
string | null
contactLastNamebody
Optional
string | null
contactRolebody
Optional
string | null
cURL
curl --request POST 'https://www.outstalk.com/api/v1/crm/deals' \
  --header 'Authorization: Bearer $OUTSTALK_API_KEY' \
  --header 'Content-Type: application/json' \
  --data '{
  "title": "Follow up",
  "company": "Acme",
  "stageId": "stage_123"
}'

Request body

application/json
{
  "title": "Follow up",
  "company": "Acme",
  "stageId": "stage_123"
}

Example response

201 application/json
{
  "data": {}
}
GET/crm/deals/{dealId}

Get a CRM deal

Returns a deal with comments and activities.

Required permissioncrm:read

Parameters

dealIdpath
Required
string

Deal ID

cURL
curl --request GET 'https://www.outstalk.com/api/v1/crm/deals/deal_123' \
  --header 'Authorization: Bearer $OUTSTALK_API_KEY' \
  --header 'Content-Type: application/json'

Example response

200 application/json
{
  "data": {}
}
PATCH/crm/deals/{dealId}

Update a CRM deal

Partially updates deal fields, stage, owner, or linked lead.

Required permissioncrm:write

Parameters

dealIdpath
Required
string

Deal ID

titlebody
Optional
string
companybody
Optional
string
stageIdbody
Optional
string

Stage ID

ownerIdbody
Optional
string | null
leadIdbody
Optional
string | null
valueCentsbody
Optional
integer | null
phonebody
Optional
string | null
emailbody
Optional
string | null
contactFirstNamebody
Optional
string | null
contactLastNamebody
Optional
string | null
contactRolebody
Optional
string | null
cURL
curl --request PATCH 'https://www.outstalk.com/api/v1/crm/deals/deal_123' \
  --header 'Authorization: Bearer $OUTSTALK_API_KEY' \
  --header 'Content-Type: application/json' \
  --data '{
  "title": "Follow up",
  "company": "Acme",
  "stageId": "stage_123"
}'

Request body

application/json
{
  "title": "Follow up",
  "company": "Acme",
  "stageId": "stage_123"
}

Example response

200 application/json
{
  "data": {}
}
DELETE/crm/deals/{dealId}

Delete a CRM deal

Permanently deletes an organization-scoped deal.

Required permissioncrm:write

Parameters

dealIdpath
Required
string

Deal ID

cURL
curl --request DELETE 'https://www.outstalk.com/api/v1/crm/deals/deal_123' \
  --header 'Authorization: Bearer $OUTSTALK_API_KEY' \
  --header 'Content-Type: application/json'

Example response

204
204 No Content
GET/crm/deals/{dealId}/comments

List deal comments

Lists comments for a deal.

Required permissioncrm:read

Parameters

dealIdpath
Required
string

Deal ID

limitquery
Optional
integer
cursorquery
Optional
string

Opaque cursor returned by the previous page.

cURL
curl --request GET 'https://www.outstalk.com/api/v1/crm/deals/deal_123/comments' \
  --header 'Authorization: Bearer $OUTSTALK_API_KEY' \
  --header 'Content-Type: application/json'

Example response

200 application/json
{
  "data": [],
  "meta": {
    "hasMore": false,
    "nextCursor": null
  }
}
POST/crm/deals/{dealId}/comments

Create a deal comment

Adds an authored comment to a deal.

Required permissioncrm:write

Parameters

dealIdpath
Required
string

Deal ID

bodybody
Required
string
cURL
curl --request POST 'https://www.outstalk.com/api/v1/crm/deals/deal_123/comments' \
  --header 'Authorization: Bearer $OUTSTALK_API_KEY' \
  --header 'Content-Type: application/json' \
  --data '{
  "body": "Customer requested a follow-up."
}'

Request body

application/json
{
  "body": "Customer requested a follow-up."
}

Example response

201 application/json
{
  "data": {}
}
DELETE/crm/deals/{dealId}/comments/{commentId}

Delete a deal comment

Deletes a comment authored by the key owner. Organization admins may delete any comment.

Required permissioncrm:write

Parameters

dealIdpath
Required
string

Deal ID

commentIdpath
Required
string

Comment ID

cURL
curl --request DELETE 'https://www.outstalk.com/api/v1/crm/deals/deal_123/comments/comment_123' \
  --header 'Authorization: Bearer $OUTSTALK_API_KEY' \
  --header 'Content-Type: application/json'

Example response

204
204 No Content
GET/crm/deals/{dealId}/activities

List deal activities

Lists follow-up activities for a deal.

Required permissioncrm:read

Parameters

dealIdpath
Required
string

Deal ID

limitquery
Optional
integer
cursorquery
Optional
string

Opaque cursor returned by the previous page.

cURL
curl --request GET 'https://www.outstalk.com/api/v1/crm/deals/deal_123/activities' \
  --header 'Authorization: Bearer $OUTSTALK_API_KEY' \
  --header 'Content-Type: application/json'

Example response

200 application/json
{
  "data": [],
  "meta": {
    "hasMore": false,
    "nextCursor": null
  }
}
POST/crm/deals/{dealId}/activities

Create a deal activity

Adds a follow-up activity to a deal.

Required permissioncrm:write

Parameters

dealIdpath
Required
string

Deal ID

titlebody
Required
string
dueAtbody
Optional
string | null
cURL
curl --request POST 'https://www.outstalk.com/api/v1/crm/deals/deal_123/activities' \
  --header 'Authorization: Bearer $OUTSTALK_API_KEY' \
  --header 'Content-Type: application/json' \
  --data '{
  "title": "Follow up",
  "dueAt": "2026-08-01T09:00:00.000Z"
}'

Request body

application/json
{
  "title": "Follow up",
  "dueAt": "2026-08-01T09:00:00.000Z"
}

Example response

201 application/json
{
  "data": {}
}
PATCH/crm/deals/{dealId}/activities/{activityId}

Update a deal activity

Updates title, due date, or completion state.

Required permissioncrm:write

Parameters

dealIdpath
Required
string

Deal ID

activityIdpath
Required
string

Activity ID

titlebody
Optional
string
dueAtbody
Optional
string | null
isDonebody
Optional
boolean
cURL
curl --request PATCH 'https://www.outstalk.com/api/v1/crm/deals/deal_123/activities/activity_123' \
  --header 'Authorization: Bearer $OUTSTALK_API_KEY' \
  --header 'Content-Type: application/json' \
  --data '{
  "title": "Follow up",
  "dueAt": "2026-08-01T09:00:00.000Z",
  "isDone": true
}'

Request body

application/json
{
  "title": "Follow up",
  "dueAt": "2026-08-01T09:00:00.000Z",
  "isDone": true
}

Example response

200 application/json
{
  "data": {}
}
DELETE/crm/deals/{dealId}/activities/{activityId}

Delete a deal activity

Deletes a deal activity.

Required permissioncrm:write

Parameters

dealIdpath
Required
string

Deal ID

activityIdpath
Required
string

Activity ID

cURL
curl --request DELETE 'https://www.outstalk.com/api/v1/crm/deals/deal_123/activities/activity_123' \
  --header 'Authorization: Bearer $OUTSTALK_API_KEY' \
  --header 'Content-Type: application/json'

Example response

204
204 No Content

Members

List native members and active agency delegates.

GET/members

List members

Lists native members and active agency delegates. Restricted to native organization admins.

Required permissionmembers:read

Parameters

limitquery
Optional
integer
cursorquery
Optional
string

Opaque cursor returned by the previous page.

cURL
curl --request GET 'https://www.outstalk.com/api/v1/members' \
  --header 'Authorization: Bearer $OUTSTALK_API_KEY' \
  --header 'Content-Type: application/json'

Example response

200 application/json
{
  "data": [],
  "meta": {
    "hasMore": false,
    "nextCursor": null
  }
}

Phone numbers

Inspect organization numbers and assignments without exposing provider secrets.

GET/phone-numbers

List phone numbers

Lists organization phone numbers and assignments for organization admins or FULL agency delegates. Provider credentials and metadata are never returned.

Required permissionphone_numbers:read

Parameters

limitquery
Optional
integer
cursorquery
Optional
string

Opaque cursor returned by the previous page.

cURL
curl --request GET 'https://www.outstalk.com/api/v1/phone-numbers' \
  --header 'Authorization: Bearer $OUTSTALK_API_KEY' \
  --header 'Content-Type: application/json'

Example response

200 application/json
{
  "data": [],
  "meta": {
    "hasMore": false,
    "nextCursor": null
  }
}

Usage

Read plan limits, seats, calls, enrichment usage and credits.

GET/usage

Get organization usage

Returns plan limits, seat count, call usage, enrichment usage, credits, and reset timestamps. Restricted to native organization admins.

Required permissionusage:read
cURL
curl --request GET 'https://www.outstalk.com/api/v1/usage' \
  --header 'Authorization: Bearer $OUTSTALK_API_KEY' \
  --header 'Content-Type: application/json'

Example response

200 application/json
{
  "data": {}
}

Talent marketplace

Browse published talent profiles and their real engagement rates.

GET/talents

List published talents

Lists published talent profiles with their real engagement rates, languages, ratings, and completed mission count.

Required permissiontalents:read

Parameters

limitquery
Optional
integer
cursorquery
Optional
string

Opaque cursor returned by the previous page.

cURL
curl --request GET 'https://www.outstalk.com/api/v1/talents' \
  --header 'Authorization: Bearer $OUTSTALK_API_KEY' \
  --header 'Content-Type: application/json'

Example response

200 application/json
{
  "data": [],
  "meta": {
    "hasMore": false,
    "nextCursor": null
  }
}
GET/talents/{talentId}

Get a published talent

Returns a published talent profile, published reviews, active mission context, and eligible hiring clients for a home agency context.

Required permissiontalents:read

Parameters

talentIdpath
Required
string

Talent ID

cURL
curl --request GET 'https://www.outstalk.com/api/v1/talents/talent_123' \
  --header 'Authorization: Bearer $OUTSTALK_API_KEY' \
  --header 'Content-Type: application/json'

Example response

200 application/json
{
  "data": {}
}

Talent missions

Request missions and transition their user-controlled lifecycle.

GET/missions

List organization missions

Lists missions accessible to the active organization. In a home agency context, this covers all actively linked client organizations.

Required permissionmissions:read

Parameters

limitquery
Optional
integer
cursorquery
Optional
string

Opaque cursor returned by the previous page.

statusquery
Optional
string · PENDING | ONGOING | FINISHED | ABORTED | REFUSED
cURL
curl --request GET 'https://www.outstalk.com/api/v1/missions' \
  --header 'Authorization: Bearer $OUTSTALK_API_KEY' \
  --header 'Content-Type: application/json'

Example response

200 application/json
{
  "data": [],
  "meta": {
    "hasMore": false,
    "nextCursor": null
  }
}
POST/missions

Request a talent mission

Creates a pending mission request at the talent's current rate. Home agencies must select an actively linked client organization.

Required permissionmissions:write

Parameters

talentIdbody
Required
string

Talent ID

engagementTypebody
Required
string · PER_HOUR | PART_TIME | FULL_TIME
durationbody
Required
string
descriptionbody
Required
string
objectivebody
Required
string
notebody
Optional
string | null
targetOrganizationIdbody
Optional
string | null
localebody
Optional
string · en | fr
cURL
curl --request POST 'https://www.outstalk.com/api/v1/missions' \
  --header 'Authorization: Bearer $OUTSTALK_API_KEY' \
  --header 'Content-Type: application/json' \
  --data '{
  "talentId": "talent_123",
  "engagementType": "PER_HOUR",
  "duration": "example",
  "description": "Priority accounts",
  "objective": "example"
}'

Request body

application/json
{
  "talentId": "talent_123",
  "engagementType": "PER_HOUR",
  "duration": "example",
  "description": "Priority accounts",
  "objective": "example"
}

Example response

201 application/json
{
  "data": {}
}
PATCH/missions/{missionId}

Transition a mission

Finishes an ongoing mission, requests an abort for an ongoing mission, or withdraws a pending request. This endpoint does not perform admin moderation.

Required permissionmissions:write

Parameters

missionIdpath
Required
string

Mission ID

actionbody
Required
string · FINISH | REQUEST_ABORT | WITHDRAW
reasonbody
Optional
string | null
cURL
curl --request PATCH 'https://www.outstalk.com/api/v1/missions/mission_123' \
  --header 'Authorization: Bearer $OUTSTALK_API_KEY' \
  --header 'Content-Type: application/json' \
  --data '{
  "action": "FINISH",
  "reason": "example"
}'

Request body

application/json
{
  "action": "FINISH",
  "reason": "example"
}

Example response

200 application/json
{
  "data": {}
}

Agency

Read agency mandates and create client organizations when authorized.

GET/agency/clients

List agency clients

Lists client mandates for an agency admin operating in the home agency context.

Required permissionagency:read

Parameters

limitquery
Optional
integer
cursorquery
Optional
string

Opaque cursor returned by the previous page.

statusquery
Optional
string · PENDING | ACTIVE | REVOKED
cURL
curl --request GET 'https://www.outstalk.com/api/v1/agency/clients' \
  --header 'Authorization: Bearer $OUTSTALK_API_KEY' \
  --header 'Content-Type: application/json'

Example response

200 application/json
{
  "data": [],
  "meta": {
    "hasMore": false,
    "nextCursor": null
  }
}
GET/agency/clients/{clientOrgId}

Get an agency client

Returns one client mandate and its access grants to an agency admin in the home context.

Required permissionagency:read

Parameters

clientOrgIdpath
Required
string

Client organization ID

cURL
curl --request GET 'https://www.outstalk.com/api/v1/agency/clients/clientorg_123' \
  --header 'Authorization: Bearer $OUTSTALK_API_KEY' \
  --header 'Content-Type: application/json'

Example response

200 application/json
{
  "data": {}
}
POST/agency/clients

Create an agency client

Creates a new client organization, active mandate, and FULL grant for the API key owner. Agency admin only.

Required permissionagency:write

Parameters

namebody
Required
string
industrybody
Optional
string | null
cURL
curl --request POST 'https://www.outstalk.com/api/v1/agency/clients' \
  --header 'Authorization: Bearer $OUTSTALK_API_KEY' \
  --header 'Content-Type: application/json' \
  --data '{
  "name": "France Q3",
  "industry": "example"
}'

Request body

application/json
{
  "name": "France Q3",
  "industry": "example"
}

Example response

201 application/json
{
  "data": {}
}

MCP server

The MCP endpoint exposes the same operations as tools for compatible AI clients. Access is restricted by the permissions selected on the API key.

MCP endpoint

https://www.outstalk.com/api/mcp

Transport

Streamable HTTP · Bearer auth

Client configuration

Codex

config.toml
[mcp_servers.outstalk]
url = "https://www.outstalk.com/api/mcp"
bearer_token_env_var = "OUTSTALK_API_KEY"

Claude Desktop

mcp.json
{
  "mcpServers": {
    "outstalk": {
      "type": "http",
      "url": "https://www.outstalk.com/api/mcp",
      "headers": { "Authorization": "Bearer ${OUTSTALK_API_KEY}" }
    }
  }
}

Cursor

mcp.json
{
  "mcpServers": {
    "outstalk": {
      "url": "https://www.outstalk.com/api/mcp",
      "headers": { "Authorization": "Bearer ${env:OUTSTALK_API_KEY}" }
    }
  }
}

Available tools

get_me

Returns the authenticated user and the active organization context.

profile:read
get_organization

Returns non-secret organization details for the current context.

organization:read
list_campaigns

Lists campaigns visible to the key owner. Low-level agency delegates only see assigned campaigns.

campaigns:read
create_campaign

Creates a campaign in the active organization.

campaigns:write
get_campaign

Returns one visible campaign with assignments and counts.

campaigns:read
update_campaign

Updates campaign metadata.

campaigns:write
delete_campaign

Deletes a campaign. Leads are retained and detached by the database relation.

campaigns:write
list_leads

Lists organization-scoped leads with optional campaign, status, type, and text filters.

leads:read
create_lead

Creates a company or person lead. Referenced campaigns must belong to the active organization.

leads:write
get_lead

Returns one visible lead with campaign and activity counts.

leads:read
update_lead

Partially updates an organization-scoped lead.

leads:write
delete_lead

Permanently deletes an organization-scoped lead and its dependent activity/call data.

leads:write
list_lead_activities

Lists follow-up activities for one visible lead.

leads:read
create_lead_activity

Adds a follow-up activity to a lead.

leads:write
update_lead_activity

Updates title, due date, or completion state.

leads:write
delete_lead_activity

Deletes a follow-up activity.

leads:write
search_people

Searches the configured people-data provider using person, role, company, location, seniority, and tenure filters. This operation calls an external provider.

lead_search:execute
search_companies

Searches Google Places by query and location with optional rating, price-level, and strict-area filters. This operation calls an external provider.

lead_search:execute
start_people_enrichment

Starts an asynchronous people-enrichment job, reserves organization credits, enforces plan limits, de-duplicates contacts, and pre-creates the selected leads.

enrichment:execute
enrich_company_lead

Enriches one Google Places result, consumes organization credits after atomic limit checks, and saves it as a de-duplicated company lead.

enrichment:execute
get_enrichment_job

Returns an organization-scoped enrichment job and polls the provider when the job is still pending. Provider identifiers and raw payloads are never returned.

enrichment:execute
list_call_logs

Lists recorded call sessions. A call log is an application record and does not prove provider connection. Native organization members only see their own call logs.

calls:read
start_call_log

Creates a call-session record and consumes one monthly call unit after quota checks. This endpoint does not dial a telephony provider. Native organization members can only create their own call logs.

calls:write
end_call_log

Ends a call-session record owned by the API key user and stores its measured duration. A call log can only be ended by its owner.

calls:write
get_analytics

Returns call and CRM-export aggregates for a UTC date range. Native organization members only receive their own aggregates.

analytics:read
list_crm_stages

Lists internal CRM pipeline stages.

crm:read
create_crm_stage

Creates a stage at the end of the pipeline.

crm:write
update_crm_stage

Updates a stage name or position.

crm:write
delete_crm_stage

Deletes an empty CRM stage. Stages containing deals cannot be deleted.

crm:write
list_crm_deals

Lists internal CRM deals with stage and owner summaries.

crm:read
create_crm_deal

Creates a deal linked optionally to an organization lead.

crm:write
get_crm_deal

Returns a deal with comments and activities.

crm:read
update_crm_deal

Partially updates deal fields, stage, owner, or linked lead.

crm:write
delete_crm_deal

Permanently deletes an organization-scoped deal.

crm:write
list_crm_comments

Lists comments for a deal.

crm:read
create_crm_comment

Adds an authored comment to a deal.

crm:write
delete_crm_comment

Deletes a comment authored by the key owner. Organization admins may delete any comment.

crm:write
list_crm_activities

Lists follow-up activities for a deal.

crm:read
create_crm_activity

Adds a follow-up activity to a deal.

crm:write
update_crm_activity

Updates title, due date, or completion state.

crm:write
delete_crm_activity

Deletes a deal activity.

crm:write
list_members

Lists native members and active agency delegates. Restricted to native organization admins.

members:read
list_phone_numbers

Lists organization phone numbers and assignments for organization admins or FULL agency delegates. Provider credentials and metadata are never returned.

phone_numbers:read
get_usage

Returns plan limits, seat count, call usage, enrichment usage, credits, and reset timestamps. Restricted to native organization admins.

usage:read
list_talents

Lists published talent profiles with their real engagement rates, languages, ratings, and completed mission count.

talents:read
get_talent

Returns a published talent profile, published reviews, active mission context, and eligible hiring clients for a home agency context.

talents:read
list_missions

Lists missions accessible to the active organization. In a home agency context, this covers all actively linked client organizations.

missions:read
create_mission

Creates a pending mission request at the talent's current rate. Home agencies must select an actively linked client organization.

missions:write
update_mission

Finishes an ongoing mission, requests an abort for an ongoing mission, or withdraws a pending request. This endpoint does not perform admin moderation.

missions:write
list_agency_clients

Lists client mandates for an agency admin operating in the home agency context.

agency:read
get_agency_client

Returns one client mandate and its access grants to an agency admin in the home context.

agency:read
create_agency_client

Creates a new client organization, active mandate, and FULL grant for the API key owner. Agency admin only.

agency:write