Documentation Index
Fetch the complete documentation index at: https://docs.recotap.com/llms.txt
Use this file to discover all available pages before exploring further.
POST /sales-activities
Pushes sales activities and their associated contacts into Recotap. Max 50 activities per request. This endpoint is create-only. A duplicate externalActivityId is returned as failed. Returns HTTP 200 regardless of per-item outcome.
Only call and email activity types are processed. Items with any other activityType value are returned as skipped in the results.
curl -X POST "http://eapi.recotap.com/api/v1/crm/sales-activities" \
-H "X-Api-Key: your-api-key-here" \
-H "Content-Type: application/json" \
-d '{
"activities": [
{
"externalActivityId": "call-001",
"activityType": "call",
"occurredAt": "2026-04-22T10:30:00Z",
"domain": "acme.com",
"accountName": "Acme Corp",
"ownerEmail": "jane@yourcompany.com",
"ownerName": "Jane Smith",
"ownerId": "rep-123",
"callTitle": "Discovery call",
"durationMinutes": 30,
"outcome": "Connected",
"direction": "outbound",
"from": {
"name": "Jane Smith",
"email": "jane@yourcompany.com"
},
"contacts": [
{
"email": "john@acme.com",
"externalContactId": "contact-456",
"name": "John Doe",
"title": "VP of Engineering",
"department": "Engineering",
"seniority": "VP",
"phone": "+1 415 555 0101",
"linkedinUrl": "https://linkedin.com/in/johndoe"
}
]
}
]
}'
Request body
| Field | Type | Required | Description |
|---|
activities | array | Yes | Min 1, max 50 activity objects |
Activity object
| Field | Type | Required | Description |
|---|
externalActivityId | string | Yes | Your CRM activity ID — used for deduplication e.g. "act-001" |
activityType | string | Yes | call or email. Any other value returns the item as skipped. |
occurredAt | string | Yes | ISO 8601 datetime e.g. "2026-04-22T10:30:00Z" |
domain | string | Yes | Account domain e.g. "acme.com" — links activity to a Recotap account |
ownerEmail | string | Yes | Email of the rep who made the call or sent the email e.g. "jane@yourcompany.com" |
contacts | array | Yes | Min 1 — people involved in this activity |
accountName | string | No | Company name e.g. "Acme Corp" |
subject | string | No | Activity title or email subject e.g. "Follow up on our call" |
ownerName | string | No | Rep’s full name e.g. "Jane Smith" |
ownerId | string | No | Rep’s owner ID in your CRM e.g. "rep-123" |
from | object | No | Sender info — { name?, email? } e.g. { "name": "Jane Smith", "email": "jane@yourcompany.com" } |
Call-specific fields (only relevant when activityType is call)
| Field | Type | Required | Description |
|---|
callTitle | string | No | Call title shown in the activity feed |
durationMinutes | number | No | Duration of the call in minutes |
outcome | string | No | e.g. Connected, Left voicemail, No answer |
direction | string | No | inbound or outbound |
Email-specific fields (only relevant when activityType is email)
| Field | Type | Required | Description |
|---|
openCount | number | No | Number of times the email was opened |
clickCount | number | No | Number of link clicks |
Contact object
| Field | Type | Required | Description |
|---|
email | string | Yes | Deduplication key for the contact e.g. "john@acme.com" |
externalContactId | string | No | Your CRM contact ID e.g. "contact-456" |
name | string | No | Contact’s full name e.g. "John Doe" |
title | string | No | Job title e.g. "VP of Engineering" |
department | string | No | e.g. "Engineering" |
seniority | string | No | e.g. "VP", "Director", "Manager", "IC" |
phone | string | No | e.g. "+1 415 555 0101" |
linkedinUrl | string | No | e.g. "https://linkedin.com/in/johndoe" |
Call example
{
"activities": [
{
"externalActivityId": "call-001",
"activityType": "call",
"occurredAt": "2026-04-22T10:30:00Z",
"domain": "acme.com",
"accountName": "Acme Corp",
"ownerEmail": "jane@yourcompany.com",
"ownerName": "Jane Smith",
"ownerId": "rep-123",
"callTitle": "Discovery call",
"durationMinutes": 30,
"outcome": "Connected",
"direction": "outbound",
"from": {
"name": "Jane Smith",
"email": "jane@yourcompany.com"
},
"contacts": [
{
"email": "john@acme.com",
"externalContactId": "contact-456",
"name": "John Doe",
"title": "VP of Engineering",
"department": "Engineering",
"seniority": "VP",
"phone": "+1 415 555 0101",
"linkedinUrl": "https://linkedin.com/in/johndoe"
}
]
}
]
}
Email example
{
"activities": [
{
"externalActivityId": "email-001",
"activityType": "email",
"occurredAt": "2026-04-23T08:15:00Z",
"domain": "acme.com",
"accountName": "Acme Corp",
"ownerEmail": "jane@yourcompany.com",
"ownerName": "Jane Smith",
"ownerId": "rep-123",
"subject": "Follow up on our call",
"openCount": 3,
"clickCount": 1,
"from": {
"name": "Jane Smith",
"email": "jane@yourcompany.com"
},
"contacts": [
{
"email": "john@acme.com",
"externalContactId": "contact-456",
"name": "John Doe",
"title": "VP of Engineering",
"department": "Engineering",
"seniority": "VP",
"phone": "+1 415 555 0101",
"linkedinUrl": "https://linkedin.com/in/johndoe"
}
]
}
]
}
Response data
{
"results": [
{ "externalActivityId": "act-001", "status": "created" },
{ "externalActivityId": "act-002", "status": "failed", "error": "Activity with externalActivityId 'act-002' already exists." },
{ "externalActivityId": "act-003", "status": "skipped", "reason": "Only call and email activity types are supported" }
],
"summary": { "total": 3, "created": 1, "failed": 1, "skipped": 1 }
}