Skip to main content

Metadata

This page documents the metadata management endpoints in the VAMS API. VAMS provides a centralized metadata service that handles metadata across four entity types: assets, files, databases, and asset links.

For asset management, see Assets. For file operations, see Files.


Concepts

  • Metadata Item: A key-value pair with an associated value type. Each item consists of a metadataKey, metadataValue, and metadataValueType.
  • Metadata Value Type: The data type of the metadata value. Determines validation rules and how the value is displayed in the UI.
  • File Metadata vs. File Attributes: Both use the same API path with a type query parameter. File metadata stores descriptive information, while file attributes store operational data (e.g., primaryType).
  • Bulk Operations: All create, update, and delete operations support bulk processing of multiple metadata items in a single request. Responses include partial success information.
  • Schema Validation: When metadata schemas are configured, metadata values are validated against the schema on create and update operations.

Supported Value Types

TypeDescriptionExample Value
stringPlain text string"Building A"
multiline_stringMulti-line text"Line 1\nLine 2"
inline_controlled_listString from a controlled vocabulary"approved"
numberNumeric value"42.5"
booleanBoolean value"true" or "false"
dateISO 8601 date string"2024-06-15T10:30:00Z"
xyz3D coordinate"{\"x\": 1.0, \"y\": 2.0, \"z\": 3.0}"
wxyzQuaternion rotation"{\"w\": 1.0, \"x\": 0.0, \"y\": 0.0, \"z\": 0.0}"
matrix4x44x4 transformation matrix"[[1,0,0,0],[0,1,0,0],[0,0,1,0],[0,0,0,1]]"
geopointGeoJSON Point"{\"type\": \"Point\", \"coordinates\": [-73.9, 40.7]}"
geojsonGeoJSON, nested at most 32 levels"{\"type\": \"Polygon\", \"coordinates\": [...]}"
llaLatitude/Longitude/Altitude"{\"lat\": 40.7, \"long\": -73.9, \"alt\": 100.0}"
jsonArbitrary JSON"{\"custom\": \"data\"}"
Values Are Always Strings

All metadata values are stored and transmitted as strings, regardless of type. The metadataValueType field indicates how the string should be interpreted and validated.

GeoJSON Nesting Limit

A geojson or geopoint value may nest GeometryCollection members at most 32 levels deep. A deeper value is rejected with a 400 naming the limit, as is a value too deeply nested for the JSON parser to read. The same limit applies to the geoJson filter on Search and to the shapes indexed for geospatial search, so a value the metadata API accepts is a value search can match.

Incomplete Records

A metadata record that carries no stored value, or no stored value type, is returned with that field as null. The record stays visible in the response along with its key. On a create or update, null in either field is read as the field not being supplied: metadataValue stores an empty value, and metadataValueType takes the default "string". An item taken from a GET response can therefore be submitted back unchanged to complete the record.

Completing a record does not bypass schema validation. Where a schema marks the field as required, a write that leaves its value empty is rejected — supply a value for that field in the same request.


Asset Metadata

Asset-level metadata is attached to an asset within a database.

Get Asset Metadata

GET /database/{databaseId}/assets/{assetId}/metadata

Retrieves metadata items for the specified asset, one page at a time. When more records exist than pageSize, the response includes a NextToken; pass it as startingToken to retrieve the next page. Records are ordered consistently across pages.

Request Parameters:

ParameterLocationTypeRequiredDescription
databaseIdpathstringYesDatabase identifier.
assetIdpathstringYesAsset identifier.
maxItemsqueryintegerNoMaximum items to return. Default: 1000. Maximum: 1000; a larger value is rejected with 400.
pageSizequeryintegerNoPage size for pagination. Default: 100. Maximum: 1000; a larger value is rejected with 400.
startingTokenquerystringNoContinuation token from a previous response.
assetVersionIdquerystringNoRetrieve metadata from a specific asset version snapshot.

Response:

{
"metadata": [
{
"metadataKey": "material",
"metadataValue": "concrete",
"metadataValueType": "string"
},
{
"metadataKey": "height_meters",
"metadataValue": "45.5",
"metadataValueType": "number"
},
{
"metadataKey": "position",
"metadataValue": "{\"x\": 100.0, \"y\": 50.0, \"z\": 0.0}",
"metadataValueType": "xyz"
}
],
"restrictMetadataOutsideSchemas": false,
"NextToken": "eyJ...",
"message": "Success"
}

The response always includes restrictMetadataOutsideSchemas (a boolean that is true when the database restricts metadata to schema-defined fields and at least one schema exists) and a message field.

Schema Enrichment Fields

When a metadata schema applies to the entity, each metadata item is enriched with additional schema fields: metadataSchemaName, metadataSchemaField, metadataSchemaRequired, metadataSchemaSequence, metadataSchemaDefaultValue, metadataSchemaDependsOn, metadataSchemaMultiFieldConflict, and metadataSchemaControlledListKeys. These fields are omitted (or null) when no schema defines the item. This enrichment applies to the asset, file, database, and asset link metadata GET responses.

Error Responses:

StatusDescription
400Invalid parameters or pagination token.
403Not authorized to view metadata for this asset.
404Asset not found.
500Internal server error.

Create Asset Metadata

POST /database/{databaseId}/assets/{assetId}/metadata

Adds new metadata items to an asset. Supports bulk creation of multiple items in a single request.

Request Parameters:

ParameterLocationTypeRequiredDescription
databaseIdpathstringYesDatabase identifier.
assetIdpathstringYesAsset identifier.

Request Body:

{
"metadata": [
{
"metadataKey": "material",
"metadataValue": "concrete",
"metadataValueType": "string"
},
{
"metadataKey": "height_meters",
"metadataValue": "45.5",
"metadataValueType": "number"
}
]
}
FieldTypeRequiredDescription
metadataarrayYesList of metadata items. Must contain at least one item.
metadata[].metadataKeystringYesMetadata key (1-256 characters).
metadata[].metadataValuestringYesMetadata value as string. null stores an empty value.
metadata[].metadataValueTypestringNoValue type. null or omitted: "string".

Response:

{
"success": true,
"totalItems": 2,
"successCount": 2,
"failureCount": 0,
"successfulItems": ["material", "height_meters"],
"failedItems": [],
"message": "All 2 metadata items created successfully",
"timestamp": "2024-06-15T10:30:00Z"
}

Error Responses:

StatusDescription
400Invalid parameters, validation error, or schema validation failure.
403Not authorized to create metadata for this asset.
404Asset not found.
500Internal server error.

Update Asset Metadata

PUT /database/{databaseId}/assets/{assetId}/metadata

Updates existing metadata items for an asset. Supports two update modes.

Request Parameters:

ParameterLocationTypeRequiredDescription
databaseIdpathstringYesDatabase identifier.
assetIdpathstringYesAsset identifier.

Request Body:

{
"metadata": [
{
"metadataKey": "material",
"metadataValue": "steel",
"metadataValueType": "string"
}
],
"updateType": "update"
}
FieldTypeRequiredDescription
metadataarrayYesList of metadata items to update.
updateTypestringNo"update" (default, upserts provided items) or "replace_all" (replaces all metadata).
REPLACE_ALL Mode

The replace_all update type deletes all existing metadata and replaces it with the provided items. This mode requires the user to have PUT, POST, and DELETE permissions on the entity. It is limited to 500 items per operation and includes automatic rollback on failure.

Response:

{
"success": true,
"totalItems": 1,
"successCount": 1,
"failureCount": 0,
"successfulItems": ["material"],
"failedItems": [],
"message": "All 1 metadata items updated successfully",
"timestamp": "2024-06-15T10:30:00Z"
}

Error Responses:

StatusDescription
400Invalid parameters or validation error.
403Not authorized to update metadata for this asset.
404Asset not found.
500Internal server error.

Delete Asset Metadata

DELETE /database/{databaseId}/assets/{assetId}/metadata

Removes metadata items from an asset by key.

Request Parameters:

ParameterLocationTypeRequiredDescription
databaseIdpathstringYesDatabase identifier.
assetIdpathstringYesAsset identifier.

Request Body:

{
"metadataKeys": ["material", "height_meters"]
}
FieldTypeRequiredDescription
metadataKeysarray[string]YesList of metadata keys to delete. Must contain at least one key.

Response:

{
"success": true,
"totalItems": 2,
"successCount": 2,
"failureCount": 0,
"successfulItems": ["material", "height_meters"],
"failedItems": [],
"message": "All 2 metadata items deleted successfully",
"timestamp": "2024-06-15T10:30:00Z"
}

Error Responses:

StatusDescription
400Invalid parameters.
403Not authorized to delete metadata for this asset.
404Asset not found.
500Internal server error.

File Metadata

File-level metadata is attached to individual files within an asset. The same endpoint path handles both file metadata and file attributes, distinguished by a type query parameter.

Get File Metadata

GET /database/{databaseId}/assets/{assetId}/metadata/file

Retrieves metadata for a specific file within an asset.

Request Parameters:

ParameterLocationTypeRequiredDescription
databaseIdpathstringYesDatabase identifier.
assetIdpathstringYesAsset identifier.
filePathquerystringYesRelative file path.
typequerystringYes"metadata" to retrieve file metadata, or "attribute" to retrieve file attributes.
maxItemsqueryintegerNoMaximum items to return. Default: 1000. Maximum: 1000; a larger value is rejected with 400.
pageSizequeryintegerNoPage size for pagination. Default: 100. Maximum: 1000; a larger value is rejected with 400.
startingTokenquerystringNoContinuation token.
assetVersionIdquerystringNoRetrieve metadata from a specific asset version snapshot.

Response:

{
"metadata": [
{
"metadataKey": "author",
"metadataValue": "John Smith",
"metadataValueType": "string"
}
],
"restrictMetadataOutsideSchemas": false,
"NextToken": null,
"message": "Success"
}

Error Responses:

StatusDescription
400Invalid parameters or missing filePath.
403Not authorized.
404Asset or file not found.
500Internal server error.

Create File Metadata

POST /database/{databaseId}/assets/{assetId}/metadata/file

Adds metadata items to a specific file.

Request Parameters:

ParameterLocationTypeRequiredDescription
databaseIdpathstringYesDatabase identifier.
assetIdpathstringYesAsset identifier.

Request Body:

{
"filePath": "/models/building.ifc",
"type": "metadata",
"metadata": [
{
"metadataKey": "author",
"metadataValue": "John Smith",
"metadataValueType": "string"
}
]
}
FieldTypeRequiredDescription
filePathstringYesRelative file path.
typestringYes"metadata" or "attribute".
metadataarrayYesList of metadata items.

Response:

Returns a bulk operation response (same format as asset metadata).

Error Responses:

StatusDescription
400Invalid parameters.
403Not authorized.
404Asset or file not found.
500Internal server error.

Update File Metadata

PUT /database/{databaseId}/assets/{assetId}/metadata/file

Updates metadata items for a specific file.

Request Body:

{
"filePath": "/models/building.ifc",
"type": "metadata",
"metadata": [
{
"metadataKey": "author",
"metadataValue": "Jane Doe",
"metadataValueType": "string"
}
],
"updateType": "update"
}

filePath and type are required. type is "metadata" or "attribute"; updateType is "update" (default) or "replace_all".

Response:

Returns a bulk operation response.

Error Responses:

StatusDescription
400Invalid parameters.
403Not authorized.
404Asset or file not found.
500Internal server error.

Delete File Metadata

DELETE /database/{databaseId}/assets/{assetId}/metadata/file

Removes metadata items from a specific file.

Request Body:

{
"filePath": "/models/building.ifc",
"type": "metadata",
"metadataKeys": ["author"]
}

filePath and type are required. type is "metadata" or "attribute".

Response:

Returns a bulk operation response.

Error Responses:

StatusDescription
400Invalid parameters.
403Not authorized.
404Asset or file not found.
500Internal server error.

Database Metadata

Database-level metadata is attached to a database and applies to the entire collection.

Get Database Metadata

GET /database/{databaseId}/metadata

Retrieves metadata items for the specified database, one page at a time.

Request Parameters:

ParameterLocationTypeRequiredDescription
databaseIdpathstringYesDatabase identifier.
maxItemsqueryintegerNoMaximum items to return. Default: 1000. Maximum: 1000; a larger value is rejected with 400.
pageSizequeryintegerNoPage size for pagination. Default: 100. Maximum: 1000; a larger value is rejected with 400.
startingTokenquerystringNoContinuation token.

Response:

{
"metadata": [
{
"metadataKey": "project_name",
"metadataValue": "Downtown Development",
"metadataValueType": "string"
},
{
"metadataKey": "project_start_date",
"metadataValue": "2024-01-15T00:00:00Z",
"metadataValueType": "date"
}
],
"restrictMetadataOutsideSchemas": false,
"NextToken": null,
"message": "Success"
}

Error Responses:

StatusDescription
400Invalid parameters.
403Not authorized to view metadata for this database.
404Database not found.
500Internal server error.

Create Database Metadata

POST /database/{databaseId}/metadata

Adds metadata items to a database.

Request Parameters:

ParameterLocationTypeRequiredDescription
databaseIdpathstringYesDatabase identifier.

Request Body:

{
"metadata": [
{
"metadataKey": "project_name",
"metadataValue": "Downtown Development",
"metadataValueType": "string"
}
]
}

Response:

Returns a bulk operation response.

Error Responses:

StatusDescription
400Invalid parameters or schema validation failure.
403Not authorized.
404Database not found.
500Internal server error.

Update Database Metadata

PUT /database/{databaseId}/metadata

Updates metadata items for a database.

Request Body:

{
"metadata": [
{
"metadataKey": "project_name",
"metadataValue": "Updated Project Name",
"metadataValueType": "string"
}
],
"updateType": "update"
}

Response:

Returns a bulk operation response.

Error Responses:

StatusDescription
400Invalid parameters.
403Not authorized.
404Database not found.
500Internal server error.

Delete Database Metadata

DELETE /database/{databaseId}/metadata

Removes metadata items from a database.

Request Body:

{
"metadataKeys": ["project_name"]
}

Response:

Returns a bulk operation response.

Error Responses:

StatusDescription
400Invalid parameters.
403Not authorized.
404Database not found.
500Internal server error.

Metadata can be attached to asset links (relationships between assets).

GET /asset-links/{assetLinkId}/metadata

Retrieves metadata items for the specified asset link, one page at a time.

Request Parameters:

ParameterLocationTypeRequiredDescription
assetLinkIdpathstringYesAsset link identifier (UUID).
maxItemsqueryintegerNoMaximum items to return. Default: 1000. Maximum: 1000; a larger value is rejected with 400.
pageSizequeryintegerNoPage size for pagination. Default: 100. Maximum: 1000; a larger value is rejected with 400.
startingTokenquerystringNoContinuation token.

Response:

{
"metadata": [
{
"metadataKey": "relationship_type",
"metadataValue": "structural_support",
"metadataValueType": "string"
}
],
"restrictMetadataOutsideSchemas": false,
"NextToken": null,
"message": "Success"
}

Error Responses:

StatusDescription
400Invalid parameters or pagination token.
403Not authorized to view metadata for this asset link.
404Asset link not found.
500Internal server error.

POST /asset-links/{assetLinkId}/metadata

Adds metadata items to an asset link. Supports bulk creation.

Request Parameters:

ParameterLocationTypeRequiredDescription
assetLinkIdpathstringYesAsset link identifier (UUID).

Request Body:

{
"metadata": [
{
"metadataKey": "relationship_type",
"metadataValue": "structural_support",
"metadataValueType": "string"
}
]
}

Response:

Returns a bulk operation response.

Error Responses:

StatusDescription
400Invalid parameters or validation error.
403Not authorized.
404Asset link not found.
500Internal server error.

PUT /asset-links/{assetLinkId}/metadata

Updates metadata items for an asset link.

Request Parameters:

ParameterLocationTypeRequiredDescription
assetLinkIdpathstringYesAsset link identifier (UUID).

Request Body:

{
"metadata": [
{
"metadataKey": "relationship_type",
"metadataValue": "updated_value",
"metadataValueType": "string"
}
],
"updateType": "update"
}
FieldTypeRequiredDescription
metadataarrayYesList of metadata items to update.
updateTypestringNo"update" (default) or "replace_all".

Response:

Returns a bulk operation response.

Error Responses:

StatusDescription
400Invalid parameters.
403Not authorized.
404Asset link not found.
500Internal server error.

DELETE /asset-links/{assetLinkId}/metadata

Removes metadata items from an asset link.

Request Parameters:

ParameterLocationTypeRequiredDescription
assetLinkIdpathstringYesAsset link identifier (UUID).

Request Body:

{
"metadataKeys": ["relationship_type"]
}

Response:

Returns a bulk operation response.

Error Responses:

StatusDescription
400Invalid parameters.
403Not authorized.
404Asset link not found.
500Internal server error.

Metadata Schemas

A metadata schema declares the fields that metadata on a given entity type should carry, along with each field's value type, display order, dependencies, and default value. Schemas drive the schema-enrichment fields on the metadata GET responses, and a database that sets restrictMetadataOutsideSchemas accepts only metadata keys an applicable schema declares.

A schema is scoped to one database and one entity type. Use GLOBAL as the databaseId for a schema that applies across every database. Schemas are authorized with the metadataSchema object type on databaseId, metadataSchemaName, and metadataSchemaEntityType.

Entity types

Entity typeApplies to
databaseMetadataDatabase-level metadata
assetMetadataAsset-level metadata
fileMetadataFile-level metadata
fileAttributeFile attributes. Only the string value type is accepted on these fields
assetLinkMetadataAsset-link metadata

Field definitions

A schema's fields object holds a fields array of 1 to 500 field definitions. Field key names must be unique within a schema.

FieldTypeRequiredDescription
metadataFieldKeyNamestringYesField key name (1-256 chars). Matches the metadataKey of the metadata record it governs.
metadataFieldValueTypestringYesOne of the supported value types. Accepted case-insensitively.
requiredbooleanNoWhether a value must be supplied for this field. Defaults to false.
sequencenumberNoDisplay order, 0-based; lower numbers appear first.
dependsOnFieldKeyNamearray[string]NoField key names this field depends on, at most 500 entries of 256 characters each.
controlledListKeysarray[string]NoAllowed values, at most 1,000 entries of 256 characters each. Required when metadataFieldValueType is inline_controlled_list, and rejected for other types.
defaultMetadataFieldValuestringNoDefault value. Validated against metadataFieldValueType, and for a controlled list must be one of controlledListKeys.

List metadata schemas

Retrieves metadata schemas, optionally filtered by database and entity type.

GET /metadataschema

Query parameters

ParameterTypeRequiredDefaultDescription
databaseIdstringNonullReturn only the schemas scoped to this database. GLOBAL is accepted.
metadataEntityTypestringNonullReturn only the schemas for this entity type. Accepted case-insensitively.
maxItemsnumberNo30000Maximum number of items to return
pageSizenumberNo3000Number of items per page
startingTokenstringNonullPagination token from a previous response's NextToken

Response

{
"Items": [
{
"metadataSchemaId": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
"databaseId": "architecture-db",
"metadataSchemaEntityType": "assetMetadata",
"schemaName": "Building record",
"fileKeyTypeRestriction": null,
"fields": {
"fields": [
{
"metadataFieldKeyName": "building_name",
"metadataFieldValueType": "string",
"required": true,
"sequence": 0
},
{
"metadataFieldKeyName": "review_status",
"metadataFieldValueType": "inline_controlled_list",
"required": false,
"sequence": 1,
"controlledListKeys": ["draft", "in_review", "approved"],
"defaultMetadataFieldValue": "draft"
}
]
},
"enabled": true,
"dateCreated": "2026-03-15T10:30:00",
"dateModified": "2026-03-15T10:30:00",
"createdBy": "user@example.com",
"modifiedBy": "user@example.com"
}
],
"NextToken": null
}

NextToken is present only when more schemas remain.

Error responses

StatusDescription
400Invalid parameters or pagination token
403Not authorized
500Internal server error

Get a metadata schema

Retrieves a single metadata schema by its identifier.

GET /database/{databaseId}/metadataSchema/{metadataSchemaId}

Path parameters

ParameterTypeRequiredDescription
databaseIdstringYesDatabase identifier. GLOBAL is accepted.
metadataSchemaIdstringYesMetadata schema identifier

Response

Returns a single schema object in the same format as the items in the list response.

Error responses

StatusDescription
400Invalid path parameters
403Not authorized
404Metadata schema not found
500Internal server error

Create a metadata schema

Creates a metadata schema for one database and entity type.

POST /metadataschema

Request body

FieldTypeRequiredDescription
databaseIdstringYesDatabase the schema applies to. Use GLOBAL for a schema that applies across every database. The database must exist.
metadataSchemaEntityTypestringYesEntity type the schema governs. See Entity types.
schemaNamestringYesSchema name (1-256 chars).
fieldsobjectYesField definitions. See Field definitions.
fileKeyTypeRestrictionstringNoComma-delimited file extensions the schema applies to, each at most 10 characters. Accepted only for fileMetadata and fileAttribute entity types.
enabledbooleanNoWhether the schema is enforced. Defaults to true.

Request body example

{
"databaseId": "architecture-db",
"metadataSchemaEntityType": "assetMetadata",
"schemaName": "Building record",
"enabled": true,
"fields": {
"fields": [
{
"metadataFieldKeyName": "building_name",
"metadataFieldValueType": "string",
"required": true,
"sequence": 0
},
{
"metadataFieldKeyName": "review_status",
"metadataFieldValueType": "inline_controlled_list",
"sequence": 1,
"controlledListKeys": ["draft", "in_review", "approved"],
"defaultMetadataFieldValue": "draft"
}
]
}
}

Response

{
"success": true,
"message": "Metadata schema 'Building record' created successfully",
"metadataSchemaId": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
"operation": "create",
"timestamp": "2026-03-15T10:30:00.000000"
}

Error responses

StatusDescription
400Validation error, a fileKeyTypeRestriction on an unsupported entity type, or a databaseId that does not exist
403Not authorized
500Internal server error

Update a metadata schema

Updates a metadata schema. The schema to update is identified by metadataSchemaId in the request body; databaseId and metadataSchemaEntityType are fixed at creation and cannot be changed.

PUT /metadataschema

Request body

At least one field other than metadataSchemaId must be provided. Supplying fields replaces the schema's entire field set.

FieldTypeRequiredDescription
metadataSchemaIdstringYesIdentifier of the schema to update
schemaNamestringNoUpdated schema name (1-256 chars)
fieldsobjectNoReplacement field definitions. See Field definitions.
fileKeyTypeRestrictionstringNoUpdated comma-delimited file extensions
enabledbooleanNoToggle schema enforcement

Response

{
"success": true,
"message": "Metadata schema updated successfully",
"metadataSchemaId": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
"operation": "update",
"timestamp": "2026-03-16T14:20:00.000000"
}

Error responses

StatusDescription
400Validation error or no updatable field supplied
403Not authorized
404Metadata schema not found
500Internal server error

Delete a metadata schema

Deletes a metadata schema.

DELETE /database/{databaseId}/metadataSchema/{metadataSchemaId}

Path parameters

ParameterTypeRequiredDescription
databaseIdstringYesDatabase identifier. GLOBAL is accepted.
metadataSchemaIdstringYesMetadata schema identifier

Request body

The request body is required and must confirm the deletion.

FieldTypeRequiredDescription
confirmDeletebooleanYesMust be true; the delete is rejected otherwise
{
"confirmDelete": true
}

Response

{
"success": true,
"message": "Metadata schema deleted successfully",
"metadataSchemaId": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
"operation": "delete",
"timestamp": "2026-03-16T14:20:00.000000"
}

Error responses

StatusDescription
400Invalid path parameters or confirmDelete not true
403Not authorized
404Metadata schema not found
500Internal server error

Bulk Operation Response Format

All metadata create, update, and delete operations return a consistent bulk operation response:

{
"success": true,
"totalItems": 3,
"successCount": 2,
"failureCount": 1,
"successfulItems": ["key1", "key2"],
"failedItems": [
{
"key": "key3",
"error": "Validation failed: value must be a valid number"
}
],
"message": "2 of 3 metadata items processed successfully",
"timestamp": "2024-06-15T10:30:00Z"
}
FieldTypeDescription
successbooleantrue if at least one item succeeded.
totalItemsintegerTotal number of items in the request.
successCountintegerNumber of items that succeeded.
failureCountintegerNumber of items that failed.
successfulItemsarray[string]List of metadata keys that succeeded.
failedItemsarray[object]List of failed items with error details.
messagestringHuman-readable summary of the operation.
timestampstringISO 8601 timestamp of the operation.
Partial Success

Bulk operations can partially succeed. Check both successCount and failureCount to determine the overall result. The failedItems array provides per-item error details for troubleshooting.


Metadata Limits

LimitValueDescription
Maximum metadata records per entity500Maximum number of metadata key-value pairs per asset, file, database, or asset link.
Maximum key length256 charactersMaximum length of a metadataKey.
Maximum items per REPLACE_ALL500Maximum metadata items in a single replace_all operation.
Maximum pageSize and maxItems1,000Largest value either metadata pagination parameter may carry on a read.
Paging a metadata read

pageSize and maxItems each size a single response, and the page served is the smaller of the two. pageSize defaults to 100 and maxItems to 1,000, so a read with no pagination parameters returns 100 records. A value above the maximum in the table above is rejected with 400 rather than reduced to it, so a caller asking for more than one response can hold learns that from the answer instead of reading a shortened page as the complete set. When records remain beyond the page, the response carries a NextToken; pass it as startingToken to read the next page, and repeat until no NextToken is returned — the whole set is reachable that way whatever the page size.

Reserved metadata keys

REINDEX_METADATA_RECORD is reserved for VAMS internal use; a create or update that supplies it is refused. A key carrying the VAMS_ prefix or a leading underscore is accepted and returned by every metadata read, and is excluded from search indexing — a key with a leading underscore is also absent from asset export output.