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
| Feature | Capability |
|---|---|
| Customisation | Unlimited custom objects and fields, adaptable data model |
| Team Size | Unlimited team members (no per-user licensing) |
| Gmail Sync | Full email sync with automatic contact creation |
| Calendar Sync | Google Calendar integration with two-way sync |
| Authentication | Google OAuth only (very secure, passwordless) |
| Automation | Visual workflow builder with HTTP, Code, and Webhook nodes |
| APIs | REST and GraphQL APIs with OpenAPI schema |
| Webhooks | Real-time updates for external integrations |
| Pipeline | Customisable sales pipeline with Kanban and Table views |
| Views | Custom views with filters, sorting, and grouping |
| Timeline | Chronological activity tracking across all records |
| Search | Full-text search across all records and activities |
| Attachments | File attachments to any record |
| Import/Export | CSV import/export for bulk data operations |
| Mobile | Responsive web interface for mobile access |
| Hosting | Hetzner Cloud (EU) with hourly backups and redundancy |
| Cost | €12.49/month (80-95% savings vs alternatives) |
| Open Source | GPL-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.comwith 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- person373d47f7-874c-40ff-a901-4a6715b4eb8d- company3b5730ed-e521-482b-a636-2f9294b9b683- calendarEventbd48beda-9b90-4126-bb1d-688687b7b0f9- message5b4546d5-ebfd-42bd-92d1-b6b7d0776f4f- opportunity83b7d07b-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 schemasGET /objects/{id}- Get object schemaGET /fields- List all fieldsGET /fields/{id}- Get field schemaGET /views- List viewsGET /webhooks- List webhooksGET /apiKeys- List API keys
Query Parameters
Filters
Use filter query parameter to narrow results.
Format: field[COMPARATOR]:value
Comparators:
eq- equalsneq- not equalsin- in arraycontainsAny- contains any valueis- is (for NULL checks)gt,gte,lt,lte- numeric comparisonsstartsWith,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)AscNullsLastDescNullsFirstDescNullsLast
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:
| Object | ID | Purpose |
|---|---|---|
| client | 83b7d07b-7e2a-4de3-8008-9447db340784 | Client records |
| project | 06437838-aae5-446c-af85-37d9bf495c47 | Project records |
| talent | 6cdeb29d-c6f4-4858-ac0f-1ae7254b12be | Talent profiles |
| jobPosting | 78aea2cf-7ea5-4fd6-b3e8-51fd5c64d2af | Job postings |
| account | 4721e956-2cd2-4fca-956f-de1766e08457 | Account records |
| category | 8e7dfd3a-36aa-45a6-8932-a2a6edd792e8 | Categories |
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 webhooksPOST /rest/metadata/webhooks- Create webhookPATCH /rest/metadata/webhooks/{id}- Update webhookDELETE /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:
- Generate new token in Settings → Playground
- Verify token is for correct workspace
- 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
- Owner: Pacing Agency
- Deployment: See
/Users/benpower/VSC/twentyCRM/for deployment docs - API Documentation: https://docs.twenty.com/
- GitHub: https://github.com/twentyhq/twenty
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