Skip to content

Quick Reference Guide

Base URL & Authentication

Base URL: https://builtin-crm.azurewebsites.net/api/v1

Required Headers:

http
Authorization: Bearer {access_token}
tenant-code: {your_tenant_code}
Content-Type: application/json

Get Access Token:

bash
curl -X POST "https://builtin-crm.azurewebsites.net/oauth/token" \
  -H "Content-Type: application/x-www-form-urlencoded" \
  -d "grant_type=client_credentials&client_id=YOUR_CLIENT_ID&client_secret=YOUR_CLIENT_SECRET"

Essential Endpoints

People Management

bash
# List people with pagination
POST /people/PeoplePagingList
{
  "pageIndex": 0,
  "pageSize": 50,
  "filter": { "isActive": true }
}

# Get person by ID
GET /people/{id}

# Create person
POST /people/CreatePersonInline/{organizationId}
{
  "firstName": "John",
  "lastName": "Doe",
  "email": "john.doe@example.com"
}

# Update person
PUT /people/UpdatePersonHeader/{id}
{
  "firstName": "John",
  "lastName": "Doe",
  "email": "john.doe.updated@example.com"
}

# Search people
POST /people/SearchPeopleList/{searchText}

Organization Management

bash
# List organizations
POST /organization/OrganizationPagingList
{
  "pageIndex": 0,
  "pageSize": 50,
  "filter": { "isActive": true }
}

# Get organization by ID
GET /organization/{id}

# Create organization
POST /organization
{
  "name": "Acme Corp",
  "type": "Company",
  "email": "info@acme.com"
}

# Get organization members
POST /organization/{id}/GetAllPeople

Committee Management

bash
# List committees
POST /committee/CommiteePagingList

# Get committee details
GET /committee/get/{committeeId}

# Create committee
POST /committee/createcommittee
{
  "name": "Board of Directors",
  "description": "Executive committee",
  "organizationId": "org-123"
}

# Add committee member
POST /committee/savecommitteemember
{
  "committeeId": "committee-123",
  "personId": "person-456",
  "positionId": "pos-1"
}

Advocacy & Relationships

bash
# Get relationship types
GET /advocacy/GetRelationshipTypes

# Get people relationships
GET /advocacy/list/people-relationships/{peopleId}

# Save people relationship
POST /advocacy/save/people-relationship
{
  "personId": "person-456",
  "relatedOfficialId": "official-789",
  "relationshipTypeId": "rel-1"
}

# Get officials list
GET /advocacy/officials-list-lite/{id}

Audience & Communication

bash
# Search across modules
POST /audience/ModuleSearchList
{
  "searchText": "john",
  "modules": ["people", "organization"]
}

# Broadcast email
POST /audience/BroacastViaEmail
{
  "subject": "Important Update",
  "body": "Message content",
  "audienceSelection": {
    "selectedPeople": ["person-123"]
  }
}

Common Request Patterns

Pagination Request

json
{
  "pageIndex": 0,
  "pageSize": 50,
  "sortField": "lastName",
  "sortDirection": "asc",
  "searchText": "search term",
  "filter": {
    "isActive": true,
    "dateRange": {
      "startDate": "2023-01-01T00:00:00Z",
      "endDate": "2024-01-01T00:00:00Z"
    }
  }
}

Filter Examples

json
{
  "filter": {
    "organizationId": "org-123",
    "tags": ["vip", "board-member"],
    "customFields": {
      "field123": "value"
    },
    "locationFilter": {
      "state": "CA",
      "city": "San Francisco"
    }
  }
}

Response Formats

Paginated List Response

json
{
  "data": [...],
  "totalCount": 150,
  "pageIndex": 0,
  "pageSize": 50,
  "hasNextPage": true,
  "hasPreviousPage": false
}

Error Response

json
{
  "error": {
    "code": "VALIDATION_ERROR",
    "message": "Request contains validation errors",
    "details": [
      {
        "field": "email",
        "message": "Email is required",
        "code": "REQUIRED_FIELD"
      }
    ],
    "requestId": "req-123"
  }
}

Common Data Formats

Person Object

json
{
  "id": "123e4567-e89b-12d3-a456-426614174000",
  "firstName": "John",
  "lastName": "Doe",
  "email": "john.doe@example.com",
  "phone": "+1-555-123-4567",
  "organizationId": "org-123",
  "organizationName": "Acme Corp",
  "isActive": true,
  "createdDate": "2023-01-15T10:30:00Z"
}

Organization Object

json
{
  "id": "org-123",
  "name": "Acme Corporation",
  "type": "Company",
  "email": "info@acme.com",
  "phone": "+1-555-000-1234",
  "website": "https://acme.com",
  "memberCount": 150,
  "isActive": true
}

Address Object

json
{
  "type": "Primary",
  "street": "123 Main St",
  "city": "New York",
  "state": "NY",
  "zipCode": "10001",
  "country": "USA"
}

HTTP Status Codes

CodeMeaningAction
200SuccessRequest completed
201CreatedResource created successfully
400Bad RequestCheck request format and validation
401UnauthorizedCheck access token
403ForbiddenCheck tenant code and permissions
404Not FoundCheck resource ID
429Rate LimitedWait and retry
500Server ErrorContact support with request ID

Rate Limits

  • Limit: 1,000 requests per minute per client
  • Headers: Check X-RateLimit-* headers in responses
  • Retry: Implement exponential backoff for 429 responses

JavaScript Quick Start

javascript
// Authentication
const getAccessToken = async () => {
  const response = await fetch('https://builtin-crm.azurewebsites.net/oauth/token', {
    method: 'POST',
    headers: { 'Content-Type': 'application/x-www-form-urlencoded' },
    body: new URLSearchParams({
      'grant_type': 'client_credentials',
      'client_id': 'your-client-id',
      'client_secret': 'your-client-secret'
    })
  });
  const data = await response.json();
  return data.access_token;
};

// API Request Helper
const apiRequest = async (endpoint, options = {}) => {
  const token = await getAccessToken();
  const response = await fetch(`https://builtin-crm.azurewebsites.net/api/v1${endpoint}`, {
    ...options,
    headers: {
      'Authorization': `Bearer ${token}`,
      'tenant-code': 'your-tenant-code',
      'Content-Type': 'application/json',
      ...options.headers
    }
  });
  
  if (!response.ok) {
    const error = await response.json();
    throw new Error(`API Error: ${error.error.message}`);
  }
  
  return response.json();
};

// Get people
const people = await apiRequest('/people/PeoplePagingList', {
  method: 'POST',
  body: JSON.stringify({
    pageIndex: 0,
    pageSize: 50,
    filter: { isActive: true }
  })
});

// Create person
const newPerson = await apiRequest('/people/CreatePersonInline/org-123', {
  method: 'POST',
  body: JSON.stringify({
    firstName: 'John',
    lastName: 'Doe',
    email: 'john.doe@example.com'
  })
});

cURL Examples

bash
# Get access token
curl -X POST "https://builtin-crm.azurewebsites.net/oauth/token" \
  -H "Content-Type: application/x-www-form-urlencoded" \
  -d "grant_type=client_credentials&client_id=YOUR_CLIENT_ID&client_secret=YOUR_CLIENT_SECRET"

# List people
curl -X POST "https://builtin-crm.azurewebsites.net/api/v1/people/PeoplePagingList" \
  -H "Authorization: Bearer YOUR_TOKEN" \
  -H "tenant-code: YOUR_TENANT" \
  -H "Content-Type: application/json" \
  -d '{"pageIndex":0,"pageSize":50,"filter":{"isActive":true}}'

# Get person by ID
curl -X GET "https://builtin-crm.azurewebsites.net/api/v1/people/PERSON_ID" \
  -H "Authorization: Bearer YOUR_TOKEN" \
  -H "tenant-code: YOUR_TENANT"

# Create organization
curl -X POST "https://builtin-crm.azurewebsites.net/api/v1/organization" \
  -H "Authorization: Bearer YOUR_TOKEN" \
  -H "tenant-code: YOUR_TENANT" \
  -H "Content-Type: application/json" \
  -d '{"name":"New Company","type":"Company","email":"info@newco.com"}'

Validation Rules

Required Fields

  • Person: firstName, lastName, email
  • Organization: name, organizationType
  • Committee: name, organizationId

Format Requirements

  • Email: Valid RFC 5322 format
  • Phone: International format with country code
  • Dates: ISO 8601 format (YYYY-MM-DDTHH:mm:ssZ)
  • GUIDs: Standard format with hyphens

Length Limits

  • Name fields: 200 characters max
  • Email: 254 characters max
  • Phone: 20 characters max
  • Search text: 200 characters max

Troubleshooting

Common Issues

401 Unauthorized

  • Missing Authorization header
  • Expired access token
  • Invalid token format

403 Forbidden

  • Missing tenant-code header
  • Invalid tenant code
  • Insufficient permissions

400 Bad Request

  • Invalid JSON format
  • Missing required fields
  • Validation errors

404 Not Found

  • Invalid resource ID
  • Resource deleted or inactive

429 Rate Limited

  • Too many requests
  • Implement retry with backoff

Debug Tips

  1. Check request headers include Authorization and tenant-code
  2. Verify JSON format and required fields
  3. Use request ID from error responses for support
  4. Monitor rate limit headers
  5. Test with Swagger UI for validation