Skip to main content

TwentyCRM

Purpose: Open source CRM platform for internal agency use and client workspaces. Fully customisable to match customer requirements with unlimited team members, full Gmail/Calendar sync, secure Google OAuth, automation workflows, and comprehensive REST/GraphQL APIs.

Where it runs: Production instance at https://pacingagency.com with multi-workspace support on Hetzner Cloud with redundancy and high availability.

Last verified: December 2025


Quick Reference

FeatureCapability
CustomisationUnlimited custom objects and fields, adaptable data model
Team SizeUnlimited team members (no per-user licensing)
Gmail SyncFull email sync with automatic contact creation
Calendar SyncGoogle Calendar integration with two-way sync
AuthenticationGoogle OAuth only (very secure, passwordless)
AutomationVisual workflow builder with HTTP, Code, and Webhook nodes
APIsREST and GraphQL APIs with OpenAPI schema
WebhooksReal-time updates for external integrations
PipelineCustomisable sales pipeline with Kanban and Table views
ViewsCustom views with filters, sorting, and grouping
TimelineChronological activity tracking across all records
SearchFull-text search across all records and activities
AttachmentsFile attachments to any record
Import/ExportCSV import/export for bulk data operations
MobileResponsive web interface for mobile access
HostingHetzner Cloud (EU) with hourly backups and redundancy
Cost€12.49/month (80-95% savings vs alternatives)
Open SourceGPL-licensed (you own, not rent, the software)

Overview

TwentyCRM is an open source CRM platform deployed as a multi-workspace agency instance. Fully customisable to match client requirements with unlimited team members, full Gmail and Google Calendar sync, secure Google OAuth authentication, and powerful automation workflows.

Current deployment:

  • Server: Hetzner Cloud (49.13.82.194) with redundancy and high availability
  • Domain: pacingagency.com with subdomain routing
  • Workspaces: pacing (agency), ttl, hml, automates
  • Authentication: Google OAuth only (no password auth)
  • API base: https://pacingagency.com/rest/
  • Open source: GPL-licensed (you own, not rent, the software)

Key Features & Capabilities

Customisation & Flexibility

Custom Objects & Fields:

  • Create unlimited custom objects tailored to client needs
  • Define custom fields with various types (text, number, date, select, relation, etc.)
  • Model data structures that match unique business workflows
  • Current workspace includes 6 custom objects: client, project, talent, jobPosting, account, category

Adaptable Data Model:

  • Full control over data structure and relationships
  • No vendor lock-in (open source, self-hosted)
  • Adapt to evolving business requirements
  • Workspace-specific customisations per client

Gmail & Calendar Integration

Full Gmail Sync:

  • Connect Gmail accounts to automatically sync emails
  • Messages appear in CRM with full threading
  • Automatic contact creation from email participants
  • Email folders and labels synchronised
  • Search across all synced emails
  • Real-time message import and updates

Google Calendar Sync:

  • Automatic calendar event synchronisation
  • Meeting participants automatically linked to contacts
  • Calendar events appear in timeline
  • Two-way sync (CRM ↔ Google Calendar)
  • Multiple calendar support
  • Recurring event handling

Integration Benefits:

  • All communication in one place
  • Automatic contact enrichment from email/calendar
  • Timeline view of all interactions
  • No manual data entry for emails and meetings

Team Collaboration

Unlimited Team Members:

  • Add as many team members as needed (no per-user licensing)
  • Role-based access control (Admin, Member)
  • Per-workspace permissions
  • Team activity visible in timeline

Multi-Workspace Support:

  • Separate isolated workspaces per client
  • Each workspace has its own data, users, and settings
  • Subdomain routing (e.g., clientname.pacingagency.com)
  • Admin-controlled workspace creation

Collaboration Features:

  • Shared notes and tasks
  • Activity timeline across team
  • Favourites and folders for organisation
  • Real-time updates across team members
  • @mentions in notes and comments
  • Activity notifications

Security & Authentication

Google OAuth Authentication:

  • Secure Google OAuth-only authentication (password auth disabled)
  • No password management overhead
  • Single sign-on with Google accounts
  • Enterprise-grade security
  • Per-workspace authentication settings

Security Features:

  • HTTPS enforced with auto-renewal certificates
  • Security headers (X-Frame-Options, HSTS, XSS protection)
  • Rate limiting via fail2ban (100 requests/minute)
  • SSH brute-force protection
  • Invite-only access (no public signup)
  • Workspace data isolation

Automation & Workflows

Workflow Automation:

  • Visual workflow builder for business logic (no coding required)
  • Trigger workflows on record creation, updates, or field changes
  • HTTP nodes for API calls to external services
  • Code nodes for custom logic and calculations (JavaScript/Python)
  • Webhook triggers for receiving external data
  • Field update triggers for actions based on CRM changes
  • Conditional logic and branching
  • Multi-step workflows with error handling

Automation Capabilities:

  • Automate repetitive tasks (e.g., auto-assign leads, send notifications)
  • Integrate with external systems via webhooks and HTTP calls
  • Custom business logic implementation
  • Scheduled workflow execution (cron-based)
  • Event-driven automations (real-time triggers)
  • Data transformation and enrichment
  • Multi-object workflows (e.g., create related records)

Workflow Examples:

  • Auto-create person records from email participants
  • Send notifications when opportunities reach certain stages
  • Sync data to external systems via webhooks
  • Calculate custom fields based on related records
  • Trigger actions in external tools (Slack, email, etc.)

Background Jobs:

  • Automated Gmail message sync (continuous)
  • Calendar event synchronisation (real-time)
  • Workflow execution (scheduled and event-driven)
  • System maintenance tasks (weekly database optimisation)
  • All registered and monitored via Sentry with alerting

Open APIs

REST API:

  • Full REST API for all objects (standard + custom)
  • OpenAPI 3.1.1 schema for code generation and LLM integration
  • Workspace-scoped API keys (secure, per-workspace isolation)
  • Cursor-based pagination (efficient for large datasets)
  • Advanced filtering and sorting (complex queries supported)
  • CRUD operations for all objects
  • See detailed API documentation below

GraphQL API:

  • Powerful GraphQL API for complex queries
  • Single request for related data (reduce round trips)
  • Type-safe queries with schema introspection
  • Real-time subscriptions support
  • Batch operations
  • Optimised for frontend applications

Webhooks:

  • Configure webhooks for real-time updates
  • Receive notifications on record changes (create, update, delete)
  • Integrate with external systems (Zapier, Make, custom apps)
  • Custom webhook secrets for security verification
  • Filter by object type and operation
  • Retry logic for failed deliveries

API Benefits:

  • No vendor lock-in (open source, standard APIs)
  • Easy integration with existing tools
  • LLM-friendly (OpenAPI schema for AI code generation)
  • Workspace isolation (secure multi-tenancy)

Sales Pipeline & Opportunities Management

Pipeline Management:

  • Customisable sales pipeline stages
  • Track opportunities from initial contact to closure
  • Drag-and-drop opportunity movement between stages
  • Pipeline visualisation (Kanban and Table views)
  • Stage-based filtering and reporting
  • Probability and amount tracking
  • Expected close date management

Opportunity Tracking:

  • Link opportunities to companies and people
  • Assign opportunities to team members
  • Track opportunity value and probability
  • Monitor pipeline health and conversion rates
  • Custom fields for opportunity-specific data
  • Activity history per opportunity

Sales Forecasting:

  • Pipeline value calculations
  • Stage-based probability weighting
  • Expected revenue tracking
  • Time-based forecasting
  • Custom reporting on pipeline metrics

Views & Visualisation

View Types:

  • Table Views: Spreadsheet-like data views with sortable columns
  • Kanban Views: Visual board representation of pipeline stages
  • Custom views per object type
  • Saved views for quick access
  • Personal and shared views

View Customisation:

  • Customisable columns/fields
  • Advanced filtering (multiple conditions, AND/OR logic)
  • Sorting by multiple fields
  • Grouping by field values
  • Field visibility controls
  • Compact vs detailed view modes

View Features:

  • Save frequently used views
  • Share views with team
  • Set default views per object
  • Quick filters and saved filters
  • Export view data
  • Real-time view updates

Timeline & Activity Tracking

Timeline Activities:

  • Chronological view of all interactions
  • Automatic activity creation from emails and calendar
  • Manual activity logging (calls, meetings, notes)
  • Activity types: email, calendar event, note, task, call, meeting
  • Activity filtering and search
  • Activity attachments

Activity Features:

  • See all activities for a record in one timeline
  • Filter activities by type, date, or participant
  • Search across all activities
  • Activity threading (related activities grouped)
  • Activity participants tracking
  • Export activity history

Activity Integration:

  • Gmail messages appear automatically
  • Calendar events synced to timeline
  • Tasks and notes linked to timeline
  • Workflow-triggered activities
  • API-created activities

Notes & Tasks Management

Notes:

  • Rich text notes with formatting
  • Attach notes to any record (person, company, opportunity, etc.)
  • Note threading and replies
  • @mentions for team collaboration
  • Note search and filtering
  • Note attachments (files, images)
  • Note versioning

Tasks:

  • Create tasks linked to records
  • Assign tasks to team members
  • Set due dates and reminders
  • Task status tracking (todo, in progress, done)
  • Task priority levels
  • Task dependencies
  • Recurring tasks support
  • Task notifications

Task Management:

  • Personal task list view
  • Team task overview
  • Task filtering by assignee, status, due date
  • Task search
  • Task completion tracking
  • Task activity in timeline

Attachments & File Management

File Attachments:

  • Attach files to any record
  • Support for multiple file types
  • Image previews
  • Document storage
  • File versioning
  • Attachment search

Attachment Features:

  • Drag-and-drop file uploads
  • File size limits and management
  • Attachment organisation
  • Link attachments to notes and tasks
  • Download and share attachments
  • Attachment metadata tracking

Search & Filtering

Full-Text Search:

  • Search across all records and fields
  • Search within notes and messages
  • Search by contact name, email, company
  • Search across custom objects
  • Search result highlighting
  • Advanced search operators

Advanced Filtering:

  • Filter by any field value
  • Multiple filter conditions (AND/OR)
  • Date range filtering
  • Numeric range filtering
  • Text pattern matching
  • Null/not null checks
  • Saved filters for reuse

Filter Features:

  • Quick filters for common searches
  • Saved filter sets
  • Share filters with team
  • Filter combinations
  • Export filtered results
  • Filter-based views

Record Relationships & Linking

Relationship Management:

  • Link people to companies
  • Link opportunities to people and companies
  • Link tasks and notes to records
  • Link calendar events to contacts
  • Custom relationship fields
  • Many-to-many relationships

Relationship Features:

  • Related records sidebar
  • Relationship navigation
  • Relationship types (primary, secondary, etc.)
  • Relationship history
  • Automatic relationship creation from activities
  • Relationship-based filtering

Data Model Relationships:

  • Person ↔ Company (many-to-one)
  • Opportunity ↔ Person/Company (many-to-one)
  • Task ↔ Record (many-to-many)
  • Note ↔ Record (many-to-many)
  • Calendar Event ↔ Person (many-to-many)
  • Custom object relationships

Data Import & Export

Data Import:

  • CSV import for bulk data
  • Import people, companies, opportunities
  • Field mapping during import
  • Duplicate detection
  • Import validation and error handling
  • Import history and logs

Data Export:

  • Export records to CSV
  • Export filtered views
  • Export with relationships
  • Scheduled exports
  • API-based exports
  • BigQuery sync for analytics

Import/Export Features:

  • Template-based imports
  • Field validation
  • Error reporting
  • Import preview
  • Export customisation
  • Data transformation during import

Mobile & Responsive Design

Mobile Support:

  • Responsive web interface
  • Mobile-optimised views
  • Touch-friendly interactions
  • Mobile search and filtering
  • Quick actions on mobile
  • Offline capability (planned)

Accessibility:

  • Keyboard navigation
  • Screen reader support
  • High contrast mode
  • Responsive layouts
  • Mobile-first design principles

Favourites & Organisation

Favourites:

  • Star records for quick access
  • Favourite folders for organisation
  • Personal favourites list
  • Quick access to starred items
  • Favourite sharing (planned)

Organisation Features:

  • Personal record organisation
  • Custom folders and tags
  • Record grouping
  • Personal views and filters
  • Quick access shortcuts

Infrastructure & Reliability

Hetzner Cloud Hosting:

  • Location: Falkenstein, Germany (EU data residency)
  • Server: CPX31 (4 vCPU, 8GB RAM) - €12.49/month (~$13.50/month)
  • Redundancy: Automated backups every hour with 7-day retention
  • High Availability: Health checks every 5 minutes
  • Database: PostgreSQL 16 with automated maintenance
  • Cache: Redis 7 for performance
  • CDN: Caddy reverse proxy with auto-renewal TLS
  • Cost: 80-95% savings vs alternatives (Railway: $40-80/month, Render: $35-100/month, GCP: $200-400/month)

Backup & Recovery:

  • Complete system backups (database + volumes + configs) every hour
  • 7-day retention on server, 10 backups mirrored locally
  • Local backup mirroring available
  • One-click restore capability
  • Backup integrity validation with Sentry alerts
  • Live backups without service disruption

Monitoring & Observability:

  • Sentry error tracking (frontend + backend + cron jobs)
  • Automated health checks every 5 minutes
  • Database maintenance (weekly VACUUM ANALYZE on Sunday 3 AM)
  • fail2ban security monitoring (100 requests/minute rate limit)
  • Performance metrics and logging
  • Cron job monitoring via Sentry

Scalability:

  • Current server handles 50+ clients comfortably
  • Easy upgrade path (CPX41: 8 vCPU, 16GB RAM - €22.49/month)
  • Horizontal scaling options available
  • Database read replicas supported
  • No per-user licensing costs (unlimited team members)

Hetzner Redundancy Features:

  • Automated hourly backups with validation
  • Health monitoring with automatic alerts
  • Database replication support
  • Volume snapshots available
  • Multi-region deployment options
  • 99.9% uptime SLA on Hetzner infrastructure
  • Failover capabilities
  • Data redundancy across storage volumes

Open Source Benefits

Ownership & Freedom:

  • GPL-licensed (you own, not rent, the software)
  • No vendor lock-in
  • Full access to source code
  • Customise and extend as needed
  • Deploy anywhere (self-hosted or cloud)

Cost Savings:

  • €12.49/month vs $40-400/month for alternatives
  • No per-user licensing fees
  • 80-95% cost reduction vs SaaS CRMs
  • Predictable costs (no surprise charges)
  • Scale without per-user penalties

Community & Support:

  • Thriving open source community
  • Active development and updates
  • Open roadmap (contribute features)
  • Security through transparency
  • Community support and documentation

Customer Customisation

The CRM setup can be fully adapted to match customer requirements:

Flexible Configuration:

  • Custom objects and fields tailored to business needs
  • Workspace-specific branding and settings
  • Custom workflows and automation rules
  • Integration with customer's existing tools via APIs/webhooks
  • Data model adapts to unique business processes

Team Setup:

  • Unlimited team members (no per-user licensing)
  • Role-based permissions per workspace
  • Google OAuth for secure, passwordless authentication
  • Invite-only access with admin controls

Integration Options:

  • Gmail and Google Calendar sync (automatic contact creation)
  • REST and GraphQL APIs for custom integrations
  • Webhook support for real-time updates
  • BigQuery sync for analytics and reporting

Deployment Flexibility:

  • Self-hosted on Hetzner Cloud (EU data residency)
  • Multi-workspace isolation per client
  • Subdomain routing (e.g., clientname.pacingagency.com)
  • Full control over data and infrastructure

API Authentication

API Keys

API keys are workspace-scoped and generated in Settings → Playground.

Current API key (example token, expires 2026-01-09):

eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiJjMTZlNGVlNi0wZGViLTQ5MDQtYjdjYS1hYTA4MmM2ODk5OTkiLCJ0eXBlIjoiQVBJX0tFWSIsIndvcmtzcGFjZUlkIjoiYzE2ZTRlZTYtMGRlYi00OTA0LWI3Y2EtYWEwODJjNjg5OTk5IiwiaWF0IjoxNzYwMDkzNjA5LCJleHAiOjE3Njc4NzMyMDgsImp0aSI6IjQ3OGMzOGY1LWE3MTYtNDk0YS04MjczLTYzNmZmNmVlNzQ3YSJ9.A_5D6fMQGLnSp7DpkypQ6_5cBL79Nl2xSPfCVcRKC-c

Security notes:

  • Treat tokens as secrets; prefer short-lived Playground tokens
  • Tokens are workspace-scoped (cannot access other workspaces)
  • Generate new tokens in Settings → Playground when needed

Usage

Send Bearer token with each request:

curl -H 'Authorization: Bearer <token>' \
'https://pacingagency.com/rest/core/<object-id>'

API Endpoints

Core API

Base URL: https://pacingagency.com/rest/core/

Endpoint format: Use object plural names (e.g., companies, people) or object UUIDs from metadata API.

Standard objects (use plural names):

  • /rest/core/companies - Company records
  • /rest/core/people - Person/contact records
  • /rest/core/opportunities - Sales opportunities
  • /rest/core/calendarEvents - Calendar events
  • /rest/core/messages - Email messages
  • /rest/core/tasks - Task records
  • /rest/core/notes - Notes
  • /rest/core/workflows - Workflow automations
  • /rest/core/timelineActivities - Timeline activities

Custom objects (agency-specific, use plural names):

  • /rest/core/clients - Client records
  • /rest/core/projects - Project records
  • /rest/core/talents - Talent profiles
  • /rest/core/jobPostings - Job postings
  • /rest/core/accounts - Account records
  • /rest/core/categories - Categories

Object IDs (for metadata API):

  • f53522fc-456e-4966-91ee-b28247448b86 - person
  • 373d47f7-874c-40ff-a901-4a6715b4eb8d - company
  • 3b5730ed-e521-482b-a636-2f9294b9b683 - calendarEvent
  • bd48beda-9b90-4126-bb1d-688687b7b0f9 - message
  • 5b4546d5-ebfd-42bd-92d1-b6b7d0776f4f - opportunity
  • 83b7d07b-7e2a-4de3-8008-9447db340784 - client (custom)
  • 06437838-aae5-446c-af85-37d9bf495c47 - project (custom)
  • 6cdeb29d-c6f4-4858-ac0f-1ae7254b12be - talent (custom)

Metadata API

Base URL: https://pacingagency.com/rest/metadata/

Endpoints:

  • GET /objects - List all objects (system + custom) with schemas
  • GET /objects/{id} - Get object schema
  • GET /fields - List all fields
  • GET /fields/{id} - Get field schema
  • GET /views - List views
  • GET /webhooks - List webhooks
  • GET /apiKeys - List API keys

Query Parameters

Filters

Use filter query parameter to narrow results.

Format: field[COMPARATOR]:value

Comparators:

  • eq - equals
  • neq - not equals
  • in - in array
  • containsAny - contains any value
  • is - is (for NULL checks)
  • gt, gte, lt, lte - numeric comparisons
  • startsWith, like, ilike - string matching

Examples:

# Filter by status
filter=status[eq]:"open"

# Filter by date
filter=createdAt[gte]:"2024-01-01"

# Filter by nested field
filter=owner.name[ilike]:"%smith%"

# Multiple conditions (AND)
filter=status[eq]:"open",createdAt[gte]:"2024-01-01"

# Array filter
filter=id[in]:["id-1","id-2"]

# NULL check
filter=deletedAt[is]:NULL

# Boolean
filter=isActive[eq]:true

# Advanced: OR conditions
filter=or(status[eq]:"open",assigneeId[is]:NULL)

Notes:

  • Strings and dates must be quoted
  • Numbers are not quoted
  • Root conjunction is AND (use or() for OR)

Pagination

All list endpoints use cursor-based pagination.

Parameters:

  • limit - Page size (default: 60, max: 60)
  • starting_after - Fetch next page (forward)
  • ending_before - Fetch previous page (backward)

Response includes:

{
"pageInfo": {
"hasNextPage": true,
"hasPreviousPage": false,
"startCursor": "...",
"endCursor": "..."
}
}

Examples:

# First page
curl -H 'Authorization: Bearer <token>' \
'https://pacingagency.com/rest/core/<object-id>?limit=60'

# Next page
curl -H 'Authorization: Bearer <token>' \
'https://pacingagency.com/rest/core/<object-id>?limit=60&starting_after=<endCursor>'

# Previous page
curl -H 'Authorization: Bearer <token>' \
'https://pacingagency.com/rest/core/<object-id>?limit=60&ending_before=<startCursor>'

Ordering

Use order_by parameter.

Format: field1,field2[DIRECTION2]

Directions:

  • AscNullsFirst (default)
  • AscNullsLast
  • DescNullsFirst
  • DescNullsLast

Examples:

# Single field
order_by=createdAt

# Multiple fields
order_by=id[AscNullsFirst],createdAt[DescNullsLast]

OpenAPI Schema

The API provides OpenAPI 3.1.1 schemas for LLM and code generation.

Core API schema:

https://pacingagency.com/rest/open-api/core?token=<token>

Metadata API schema:

https://pacingagency.com/rest/open-api/metadata?token=<token>

Usage with LLMs:

Here is an OpenAPI schema for the Twenty REST API:
https://pacingagency.com/rest/open-api/core?token=<token>

Use it to list companies created after 2024-01-01, ordered by createdAt desc, and include only 20 results.

Example Queries

List Companies

curl -H 'Authorization: Bearer <token>' \
'https://pacingagency.com/rest/core/companies?limit=20'

List People with Filter

curl -H 'Authorization: Bearer <token>' \
'https://pacingagency.com/rest/core/people?filter=createdAt[gte]:"2024-01-01"&order_by=createdAt[DescNullsLast]&limit=20'

List Custom Clients

curl -H 'Authorization: Bearer <token>' \
'https://pacingagency.com/rest/core/clients?limit=20'

Get Single Record

curl -H 'Authorization: Bearer <token>' \
'https://pacingagency.com/rest/core/companies/{record-id}'

Get Object Schema

curl -H 'Authorization: Bearer <token>' \
'https://pacingagency.com/rest/metadata/objects/f53522fc-456e-4966-91ee-b28247448b86'

List All Objects (Metadata)

curl -H 'Authorization: Bearer <token>' \
'https://pacingagency.com/rest/metadata/objects'

Custom Objects

The agency workspace includes 6 custom objects:

ObjectIDPurpose
client83b7d07b-7e2a-4de3-8008-9447db340784Client records
project06437838-aae5-446c-af85-37d9bf495c47Project records
talent6cdeb29d-c6f4-4858-ac0f-1ae7254b12beTalent profiles
jobPosting78aea2cf-7ea5-4fd6-b3e8-51fd5c64d2afJob postings
account4721e956-2cd2-4fca-956f-de1766e08457Account records
category8e7dfd3a-36aa-45a6-8932-a2a6edd792e8Categories

These objects are accessible via the same REST API endpoints using their object IDs.


Webhooks

Webhooks can be configured to receive real-time updates when records change.

Endpoints:

  • GET /rest/metadata/webhooks - List webhooks
  • POST /rest/metadata/webhooks - Create webhook
  • PATCH /rest/metadata/webhooks/{id} - Update webhook
  • DELETE /rest/metadata/webhooks/{id} - Delete webhook

Webhook configuration:

{
"targetUrl": "https://your-endpoint.com/webhook",
"operations": ["create", "update", "delete"],
"description": "Sync to external system",
"secret": "optional-secret-for-verification"
}

Data Model

Core Objects

Person (f53522fc-456e-4966-91ee-b28247448b86):

  • Standard CRM contact fields
  • Email, phone, address
  • Job title, company relationship
  • Timeline activities, notes, tasks

Company (373d47f7-874c-40ff-a901-4a6715b4eb8d):

  • Company name, domain
  • Address, employees
  • Related people, opportunities

Opportunity (5b4546d5-ebfd-42bd-92d1-b6b7d0776f4f):

  • Sales pipeline management
  • Stage, amount, probability
  • Related company and person

Calendar Event (3b5730ed-e521-482b-a636-2f9294b9b683):

  • Meetings and appointments
  • Participants, location, time
  • Linked to people/companies

Message (bd48beda-9b90-4126-bb1d-688687b7b0f9):

  • Email messages
  • Threads, participants, folders
  • Gmail integration

Task (472ab926-a2cc-4ff4-8f9c-dd3582851981):

  • Task management
  • Assignees, due dates, status
  • Linked to records

Note (9e7b9423-6f02-4c36-816c-4d77ad4b8461):

  • Notes on records
  • Rich text support
  • Timeline integration

Custom Objects Schema

Use the metadata API to discover custom object schemas:

curl -H 'Authorization: Bearer <token>' \
'https://pacingagency.com/rest/metadata/objects/83b7d07b-7e2a-4de3-8008-9447db340784'

This returns the full schema including all fields, types, and relationships.


Integration Examples

Python Example

import requests

API_BASE = "https://pacingagency.com/rest"
TOKEN = "your-api-token"

headers = {
"Authorization": f"Bearer {TOKEN}"
}

# List companies
response = requests.get(
f"{API_BASE}/core/companies",
headers=headers,
params={"limit": 20}
)

companies = response.json()["data"]["edges"]

# List custom clients
response = requests.get(
f"{API_BASE}/core/clients",
headers=headers,
params={"limit": 20}
)

clients = response.json()["data"]["edges"]

JavaScript Example

const API_BASE = "https://pacingagency.com/rest";
const TOKEN = "your-api-token";

// List companies
const response = await fetch(
`${API_BASE}/core/companies?limit=20`,
{
headers: {
"Authorization": `Bearer ${TOKEN}`
}
}
);

const data = await response.json();
const companies = data.data.edges;

// List custom clients
const clientsResponse = await fetch(
`${API_BASE}/core/clients?limit=20`,
{
headers: {
"Authorization": `Bearer ${TOKEN}`
}
}
);

const clientsData = await clientsResponse.json();
const clients = clientsData.data.edges;

Testing

Test API Access

# Test authentication
curl -H 'Authorization: Bearer <token>' \
'https://pacingagency.com/rest/metadata/objects' | jq '.data.objects | length'

# Should return number of objects (e.g., 38)

Test Custom Objects

# List custom objects
curl -H 'Authorization: Bearer <token>' \
'https://pacingagency.com/rest/metadata/objects' | \
jq '.data.objects[] | select(.isCustom == true) | {name: .nameSingular, id: .id}'

Rate Limits

Current deployment has no explicit rate limits documented. Best practices:

  • Batch requests where possible
  • Use pagination for large datasets
  • Cache object IDs and schemas
  • Respect server resources (Hetzner CPX31: 4 vCPU, 8GB RAM)

Troubleshooting

Invalid Endpoint Error

Error: 'companies' is not a valid UUID or object 'core' not found

Cause: Incorrect endpoint format or object name.

Fix: Use plural object names in the endpoint:

# Correct format
curl -H 'Authorization: Bearer <token>' \
'https://pacingagency.com/rest/core/companies?limit=20'

# For custom objects, use plural name
curl -H 'Authorization: Bearer <token>' \
'https://pacingagency.com/rest/core/clients?limit=20'

Note: Object IDs are only used with the metadata API, not the core API endpoints.

Authentication Errors

Error: 401 Unauthorized

Causes:

  • Token expired
  • Invalid token
  • Token for wrong workspace

Fix:

  1. Generate new token in Settings → Playground
  2. Verify token is for correct workspace
  3. Check token expiration date

Pagination Issues

Problem: Not getting all records

Solution: Use cursor-based pagination:

# First page
response1 = GET /rest/core/companies?limit=60

# Next page
response2 = GET /rest/core/companies?limit=60&starting_after=<endCursor>

# Continue until hasNextPage is false

Owner & Contact


References

  • Deployment Guide: /Users/benpower/VSC/twentyCRM/README.md
  • Admin Guide: /Users/benpower/VSC/twentyCRM/ADMIN_GUIDE.md
  • Database Queries: /Users/benpower/VSC/twentyCRM/DATABASE_QUERIES.md
  • BigQuery Sync: /Users/benpower/VSC/twentyCRM/BIGQUERY_SYNC_SETUP.md

Note: This API is workspace-scoped. Each workspace has its own API keys and isolated data. Generate tokens per workspace as needed.


Account Details

  • Notes: open source CRM for internal and client management
  • Category: SELF_HOSTING
  • Account type: CLIENT_ACCESS, INTERNAL
  • Created: December 2025
  • Access URL: https://crm.pacingagency.com
  • Account owner: Ben Power