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.

MethodEndpointDescription
GET/modulesList all modules
GET/modules/{moduleSlug}Get a module's full schema (fields, views, references)
GET/modules/{moduleSlug}/fieldsList a module's fields
GET/modules/{moduleSlug}/viewsList a module's views
GET/modules/{moduleSlug}/referencesList 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:

KeyDescription
moduleThe module row
fieldsArray of field definitions (same shape as GET /modules/{moduleSlug}/fields)
viewsArray of detailed view objects (same shape as GET /modules/{moduleSlug}/views)
referencesArray 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
  }
}
StatusDescription
400Validation failed (the error.issues array lists each problem)
401Missing or invalid authentication
403API key lacks the required scope
404Module not found
429Rate limited

Related: API Overview | Authentication | Records API