Partner API Documentation
A REST API for partners to manage contacts and campaigns inside PITCHcrm. All requests are authenticated via headers and served over HTTPS.
Overview
Three things to know before your first request:
Get your credentials
Register your application to receive an x-api-key, x-api-secret, and x-account-id.
Choose an environment
Use the DEV base URL for testing and the LIVE URL for production.
Send JSON
All request bodies must be Content-Type: application/json. All responses are JSON.
🌐 Base URLs
Authentication
All API requests must include the following three headers. Credentials are issued when you register your application with PITCHcrm.
| Header | Type | Required | Description |
|---|---|---|---|
x-api-key |
String | Yes | API key provided by PITCHcrm |
x-api-secret |
String | Yes | API secret provided by PITCHcrm |
x-account-id |
String | Yes | Partner's encrypted account ID |
📋 Example Request Headers
POST /v3/partner/webhook/contact/add HTTP/1.1
Host: partner.api.v3.pitchcrm.com
Content-Type: application/json
x-api-key: YOUR_API_KEY
x-api-secret: YOUR_API_SECRET
x-account-id: YOUR_ACCOUNT_ID
Rate Limiting
All endpoints share the same rate limit. When exceeded, the API returns HTTP 429.
{
"error": "Rate limit exceeded. Try again later."
}
Error Codes
These error codes are returned across all endpoints.
| HTTP Code | Error Message | Description |
|---|---|---|
| 401 | Invalid API credentials | API key or secret is incorrect |
| 403 | Unauthorized account access | Account ID mismatch |
| 429 | Rate limit exceeded. Try again later. | More than 100 requests per minute |
| 500 | Internal server error | Unexpected server issue |
Add Contact
POSTAdds a new contact to PITCHcrm. Either email or phoneNo must be provided — an error is returned if both are missing.
🔗 Endpoint
📥 Request Body
Send as application/json. At least one of email or phoneNo is required.
{
"email": "testuser@example.com",
"firstName": "Test",
"lastName": "User",
"phoneNo": "+1234567890",
"addrOne": "2nd Floor",
"addrTwo": "123 Main St",
"city": "Test City",
"country": "US",
"state": "CA",
"zipCode": "12345",
"gender": "male",
"dateOfBirth": "1990-01-01",
"emailOptStatus": 0,
"smsOptStatus": 0,
"tag": ["test_tag_123", "test_tag_456"]
}
📌 Field Reference
| Field | Type | Required | Description |
|---|---|---|---|
email | String | Optional* | Contact email. Required if phoneNo not provided. |
firstName | String | Optional | Contact first name |
lastName | String | Optional | Contact last name |
phoneNo | String | Optional* | Contact phone number. Required if email not provided. |
addrOne | String | Optional | Address line 1 |
addrTwo | String | Optional | Address line 2 |
city | String | Optional | City |
country | String | Optional | Country code — e.g. US, UK, CA, AU |
state | String | Optional | State or province code |
zipCode | String | Optional | ZIP or postal code |
gender | String | Optional | male, female, or other |
dateOfBirth | Date | Optional | Format: YYYY-MM-DD |
emailOptStatus | Integer | Optional | 0 = Opt-out · 1 = Opt-in |
smsOptStatus | Integer | Optional | 0 = Opt-out · 1 = Opt-in |
tag | Array | Optional | List of tag name strings |
playerType | Array | Optional | List of player type name strings |
✅ Success Response
{
"status": "success",
"contactId": "1234567890"
}
❌ Error Responses
| HTTP Code | Error Message | Description |
|---|---|---|
| 400 | Either email or phoneNo is required | Both email and phone number are missing |
| 401 | Invalid API credentials | API key or secret is incorrect |
| 403 | Unauthorized account access | Account ID mismatch |
| 429 | Rate limit exceeded. Try again later. | More than 100 requests per minute |
| 500 | Internal server error | Unexpected server issue |
Campaign List
POSTRetrieves a paginated list of campaigns from PITCHcrm.
🔗 Endpoint
📥 Request Body
{
"limit": 10,
"page": 1
}
📌 Field Reference
| Field | Type | Required | Description |
|---|---|---|---|
limit | Integer | Yes | Records per page. Maximum: 50 |
page | Integer | Yes | Page number. Must be ≥ 1 |
✅ Success Response
{
"pageNo": 1,
"pageSize": 10,
"totalPages": 25,
"totalRecords": 241,
"filteredRecords": 1,
"campaigns": [
{
"Id": 12345,
"campaignName": "Summer Sale",
"campaignType": 0, // 0 = static, 1 = dynamic
"campaignChannel": "email", // "email" or "sms"
"status": "scheduled",
"statusColor": "#009202",
"active": 1, // 0 = deleted, 1 = active
"scheduledOn": "2026-02-19T17:12:43.000Z",
"scheduledTimeZone":"EST",
"offset": "-05:00",
"autoResend": 0,
"broadcastOn": "2026-02-19T17:12:43.000Z",
"broadcast": 1, // 1 = ready to send
"createdAt": "2026-02-10T15:43:45.000Z",
"updatedAt": "2026-02-10T22:06:56.000Z",
"reason": null
}
]
}
❌ Error Responses
| HTTP Code | Error Message | Description |
|---|---|---|
| 401 | Invalid API credentials | API key or secret is incorrect |
| 403 | Unauthorized account access | Account ID mismatch |
| 429 | Rate limit exceeded. Try again later. | More than 100 requests per minute |
| 500 | Internal server error | Unexpected server issue |
Campaign Stats
POSTFetches email and SMS delivery statistics for a specific campaign.
🔗 Endpoint
📥 Request Body
{
"campaignId": 12345
}
📌 Field Reference
| Field | Type | Required | Description |
|---|---|---|---|
campaignId | Integer | Yes | The ID of the campaign to retrieve stats for |
✅ Success Response
{
"emailStat": {
"Sent": 14658,
"Opened": 2268,
"Delivered": 14537,
"Hardbounce": 3,
"Softbounce": 116,
"Failed": 1,
"Clicked": 53,
"Unsubscribe": 6,
"Complained": 1
},
"smsStat": {
"Sent": 123,
"Delivered": 122,
"Failed": 0
}
}
❌ Error Responses
| HTTP Code | Error Message | Description |
|---|---|---|
| 400 | CampaignId is required | Missing campaign ID in request body |
| 401 | Invalid API credentials | API key or secret is incorrect |
| 403 | Unauthorized account access | Account ID mismatch |
| 429 | Rate limit exceeded. Try again later. | More than 100 requests per minute |
| 500 | Internal server error | Unexpected server issue |