Modules
Read module schemas, fields, views, and references with the Modules API
Modules are the building blocks of your Coherence workspace. Each module represents a type of data (Contacts, Deals, Projects, etc.) with its own schema, fields, views, and relationships.
Overview
Modules act as containers for your data. Each module has:
- Fields - Define the data structure (text, numbers, dates, references, etc.)
- Views - Display and interact with records (list, detail, kanban, calendar)
- References - Relationships to other modules
- Records - Individual data entries
The public Modules API is read-only: it lets you discover a workspace's schema so you can read and write records against it. Schema changes — creating or editing modules, fields, views, and references — are done in the Coherence app, or by AI agents holding the schema:write scope through approved agent tools. There are no public REST endpoints for schema changes today.
Endpoints
All module reads are account-scoped. Listing modules, fields, and views requires the workspace:read scope; reading references requires records:read.
| Method | Endpoint | Description |
|---|---|---|
| GET | /modules | List all modules |
| GET | /modules/{moduleSlug} | Get a module's full schema (fields, views, references) |
| GET | /modules/{moduleSlug}/fields | List a module's fields |
| GET | /modules/{moduleSlug}/views | List a module's views |
| GET | /modules/{moduleSlug}/references | List a module's references |
List Modules
Retrieve all active modules in your workspace. The listing is intentionally lightweight — name, slug, and ID only. Use GET /modules/{moduleSlug} for the full schema.
GET /modules
When both an account-scoped module and a system template share a slug, the account-scoped module is returned.
Request
curl -X GET "https://api.getcoherence.io/v1/modules" \
-H "Authorization: Bearer YOUR_API_KEY"Response
{
"modules": [
{
"id": "0b6f2f4e-8a34-4b1a-9d2e-6f1c3a7e9b21",
"name": "Contacts",
"slug": "contacts"
},
{
"id": "3d92c1a7-45b8-4f0e-b6d1-92e4a8c05f7d",
"name": "Projects",
"slug": "projects"
}
]
}Get Module Schema
Retrieve the full schema for a single module: the module itself plus its fields, views, and references in one call.
GET /modules/{moduleSlug}
This endpoint resolves your account's own module. If the slug does not exist in your workspace, it returns 404.
Request
curl -X GET "https://api.getcoherence.io/v1/modules/contacts" \
-H "Authorization: Bearer YOUR_API_KEY"Response
The response contains four top-level keys:
| Key | Description |
|---|---|
module | The module row |
fields | Array of field definitions (same shape as GET /modules/{moduleSlug}/fields) |
views | Array of detailed view objects (same shape as GET /modules/{moduleSlug}/views) |
references | Array of reference summaries (same shape as GET /modules/{moduleSlug}/references) |
{
"module": {
"ModuleId": "0b6f2f4e-8a34-4b1a-9d2e-6f1c3a7e9b21",
"AccountId": "7f8e9d0c-1b2a-4c3d-8e5f-a6b7c8d9e0f1",
"Name": "Contacts",
"SingularName": "Contact",
"PluralName": "Contacts",
"Slug": "contacts",
"IsCustom": false,
"Visibility": "active",
"Config": {},
"CreatedDateTime": "2024-01-15T10:30:00.000Z",
"UpdatedDateTime": "2024-01-20T14:45:00.000Z"
},
"fields": [
{
"ModuleFieldId": "b4a1c2d3-e5f6-4789-a0b1-c2d3e4f5a6b7",
"ModuleId": "0b6f2f4e-8a34-4b1a-9d2e-6f1c3a7e9b21",
"Name": "first_name",
"Slug": "first_name",
"Label": "First Name",
"DataType": "text",
"Config": {},
"IsRequired": true,
"IsSystem": false,
"PrivacyLevel": "account",
"SortOrder": 1,
"CreatedDateTime": "2024-01-15T10:30:00.000Z",
"UpdatedDateTime": "2024-01-15T10:30:00.000Z"
}
],
"views": [
{
"view": {
"ModuleViewId": "9c8b7a6d-5e4f-4321-b0a9-8d7c6b5a4e3f",
"ModuleId": "0b6f2f4e-8a34-4b1a-9d2e-6f1c3a7e9b21",
"Name": "All Contacts",
"ViewType": "list",
"Status": "published",
"Visibility": "account",
"Slug": "all-contacts",
"Config": {},
"CreatedDateTime": "2024-01-15T10:30:00.000Z",
"UpdatedDateTime": "2024-01-15T10:30:00.000Z"
},
"filters": [],
"layouts": [],
"actions": []
}
],
"references": [
{
"moduleReferenceId": "5e4d3c2b-1a09-4876-b5c4-d3e2f1a0b9c8",
"sourceModuleId": "0b6f2f4e-8a34-4b1a-9d2e-6f1c3a7e9b21",
"sourceFieldId": null,
"sourceFieldSlug": null,
"slug": "account",
"relationshipType": "many_to_one",
"targetType": "module",
"targetFilters": null,
"isRequired": false,
"cascadeDelete": false,
"cascadeUpdate": false,
"target": {
"moduleId": "3d92c1a7-45b8-4f0e-b6d1-92e4a8c05f7d",
"moduleSlug": "accounts",
"moduleName": "Accounts"
}
}
]
}The module, fields, and views objects use PascalCase property names (they mirror the underlying schema tables), while references use camelCase summaries. Additional properties may appear on these objects over time — treat unknown keys as informational.
List Fields
Retrieve the field definitions for a module, ordered by SortOrder then Label.
GET /modules/{moduleSlug}/fields
Request
curl -X GET "https://api.getcoherence.io/v1/modules/contacts/fields" \
-H "Authorization: Bearer YOUR_API_KEY"Response
{
"fields": [
{
"ModuleFieldId": "b4a1c2d3-e5f6-4789-a0b1-c2d3e4f5a6b7",
"ModuleId": "0b6f2f4e-8a34-4b1a-9d2e-6f1c3a7e9b21",
"Name": "first_name",
"Slug": "first_name",
"Label": "First Name",
"DataType": "text",
"Config": {},
"IsRequired": true,
"IsSystem": false,
"PrivacyLevel": "account",
"SortOrder": 1,
"CreatedDateTime": "2024-01-15T10:30:00.000Z",
"UpdatedDateTime": "2024-01-15T10:30:00.000Z"
},
{
"ModuleFieldId": "c5b2d3e4-f6a7-4890-b1c2-d3e4f5a6b7c8",
"ModuleId": "0b6f2f4e-8a34-4b1a-9d2e-6f1c3a7e9b21",
"Name": "email",
"Slug": "email",
"Label": "Email",
"DataType": "email",
"Config": {},
"IsRequired": false,
"IsSystem": false,
"PrivacyLevel": "account",
"SortOrder": 2,
"CreatedDateTime": "2024-01-15T10:30:00.000Z",
"UpdatedDateTime": "2024-01-15T10:30:00.000Z"
}
]
}Use each field's Slug as the key when reading or writing record fields values with the Records API, and check DataType and Config to format values correctly.
List Views
Retrieve a module's views. Each entry bundles the view row with its saved filters, layouts, and actions.
GET /modules/{moduleSlug}/views
Request
curl -X GET "https://api.getcoherence.io/v1/modules/contacts/views" \
-H "Authorization: Bearer YOUR_API_KEY"Response
{
"views": [
{
"view": {
"ModuleViewId": "9c8b7a6d-5e4f-4321-b0a9-8d7c6b5a4e3f",
"ModuleId": "0b6f2f4e-8a34-4b1a-9d2e-6f1c3a7e9b21",
"Name": "All Contacts",
"ViewType": "list",
"Status": "published",
"Visibility": "account",
"Slug": "all-contacts",
"Config": {},
"CreatedDateTime": "2024-01-15T10:30:00.000Z",
"UpdatedDateTime": "2024-01-15T10:30:00.000Z"
},
"filters": [],
"layouts": [],
"actions": []
}
]
}List References
Retrieve the reference (relationship) definitions on a module. Requires the records:read scope.
GET /modules/{moduleSlug}/references
Request
curl -X GET "https://api.getcoherence.io/v1/modules/contacts/references" \
-H "Authorization: Bearer YOUR_API_KEY"Response
{
"references": [
{
"moduleReferenceId": "5e4d3c2b-1a09-4876-b5c4-d3e2f1a0b9c8",
"sourceModuleId": "0b6f2f4e-8a34-4b1a-9d2e-6f1c3a7e9b21",
"sourceFieldId": null,
"sourceFieldSlug": null,
"slug": "account",
"relationshipType": "many_to_one",
"targetType": "module",
"targetFilters": null,
"isRequired": false,
"cascadeDelete": false,
"cascadeUpdate": false,
"target": {
"moduleId": "3d92c1a7-45b8-4f0e-b6d1-92e4a8c05f7d",
"moduleSlug": "accounts",
"moduleName": "Accounts"
}
},
{
"moduleReferenceId": "6f5e4d3c-2b1a-4987-c6d5-e4f3a2b1c0d9",
"sourceModuleId": "0b6f2f4e-8a34-4b1a-9d2e-6f1c3a7e9b21",
"sourceFieldId": null,
"sourceFieldSlug": null,
"slug": "owner",
"relationshipType": "many_to_one",
"targetType": "user",
"targetFilters": null,
"isRequired": false,
"cascadeDelete": false,
"cascadeUpdate": false,
"target": {
"moduleId": null,
"moduleSlug": null,
"moduleName": null
}
}
]
}To read which records are linked through a reference, or to search for linkable records, see the reference endpoints in the Records API.
Error Responses
Errors use the standard envelope:
{
"error": {
"code": "not_found",
"message": "Module not found",
"statusCode": 404
}
}| Status | Description |
|---|---|
| 400 | Validation failed (the error.issues array lists each problem) |
| 401 | Missing or invalid authentication |
| 403 | API key lacks the required scope |
| 404 | Module not found |
| 429 | Rate limited |
Related: API Overview | Authentication | Records API