Skip to main content

Glossary API

The Business Glossary API provides CRUD operations for business terms, product/field linking, and CSV import/export.

Base path: /spaces/{slug}/glossary

All endpoints require authentication and space membership.


Term CRUD

Create Term

POST /spaces/{slug}/glossary

Request Body:

FieldTypeRequiredDescription
namestringTerm name (1–200 chars)
slugstringURL-safe identifier (pattern: ^[a-z0-9]+(?:-[a-z0-9]+)*$)
definitionstringRich-text definition
categorystringCategory grouping
statusstringdraft (default), approved, deprecated
synonymsstring[]Alternative names

Response: 201 CreatedGlossaryTermResponse

{
"id": "uuid",
"name": "Annual Recurring Revenue",
"slug": "annual-recurring-revenue",
"definition": "Total annualized subscription revenue.",
"category": "Finance",
"status": "approved",
"synonyms": ["ARR"],
"created_by_id": "uuid",
"created_at": "2025-01-15T10:30:00Z",
"updated_at": "2025-01-15T10:30:00Z",
"products": [],
"fields": []
}

Errors: 409 Conflict — Slug already exists in this space.


List Terms

GET /spaces/{slug}/glossary

Query Parameters:

ParameterTypeDefaultDescription
categorystringFilter by category
statusstringFilter by status
letterstringFilter by first letter (single char)
limitint100Max items (1–500)
offsetint0Pagination offset

Response: 200 OK

{
"items": [
{
"id": "uuid",
"name": "Annual Recurring Revenue",
"slug": "annual-recurring-revenue",
"category": "Finance",
"status": "approved",
"synonyms": ["ARR"],
"product_count": 3,
"field_count": 5
}
],
"total": 42
}

Get Term

GET /spaces/{slug}/glossary/{term_slug}

Response: 200 OKGlossaryTermResponse (includes linked products and fields).

Errors: 404 Not Found — Term not found.


Update Term

PATCH /spaces/{slug}/glossary/{term_slug}

Request Body (all fields optional):

FieldTypeDescription
namestringUpdated name
definitionstringUpdated definition
categorystringUpdated category
statusstringUpdated status
synonymsstring[]Updated synonyms

Response: 200 OKGlossaryTermResponse

Errors: 404 Not Found — Term not found.


Delete Term

DELETE /spaces/{slug}/glossary/{term_slug}

Response: 204 No Content

Errors: 404 Not Found — Term not found.


Categories

List Categories

GET /spaces/{slug}/glossary/categories

Returns distinct category names used in the space.

Response: 200 OK

["Finance", "Marketing", "Operations"]

Linking

POST /spaces/{slug}/glossary/{term_slug}/products

Request Body:

FieldTypeRequiredDescription
product_idUUIDProduct to link

Response: 201 Created

{
"id": "uuid",
"term_id": "uuid",
"linked_at": "2025-01-15T10:30:00Z"
}

Errors: 409 Conflict — Link already exists.


DELETE /spaces/{slug}/glossary/{term_slug}/products/{product_id}

Response: 204 No Content


POST /spaces/{slug}/glossary/{term_slug}/fields

Request Body:

FieldTypeRequiredDescription
field_idUUIDField to link

Response: 201 CreatedLinkResponse

Errors: 409 Conflict — Link already exists.


DELETE /spaces/{slug}/glossary/{term_slug}/fields/{field_id}

Response: 204 No Content


Get Terms for Product

GET /spaces/{slug}/glossary/products/{product_id}/terms

Returns all glossary terms linked to a specific product.

Response: 200 OKGlossaryTermListResponse[]


CSV Import/Export

Export Terms

GET /spaces/{slug}/glossary/export

Downloads all terms as a CSV file.

Response: 200 OK — CSV file (text/csv)

Columns: name, slug, definition, category, status, synonyms


Import Terms

POST /spaces/{slug}/glossary/import

Upserts terms from a CSV file. Matching is done by slug — existing terms are updated, new slugs create new terms.

Request: Multipart form upload (field: file) or raw CSV body with Content-Type: text/csv.

Response: 200 OK

{
"created": 12,
"updated": 3,
"errors": 0
}

Response Models

GlossaryTermResponse

FieldTypeDescription
idUUIDTerm identifier
namestringTerm name
slugstringURL-safe identifier
definitionstring | nullRich-text definition
categorystring | nullCategory grouping
statusstringdraft, approved, deprecated
synonymsstring[] | nullAlternative names
created_by_idUUID | nullCreator's user ID
created_atdatetime | nullCreation timestamp
updated_atdatetime | nullLast update timestamp
productsLinkedProductBrief[]Linked products
fieldsLinkedFieldBrief[]Linked fields

LinkedProductBrief

FieldTypeDescription
idUUIDProduct ID
namestringProduct name
slugstringProduct slug

LinkedFieldBrief

FieldTypeDescription
idUUIDField ID
namestringField name
data_typestring | nullColumn data type
product_idUUID | nullParent product ID