File metadata
This page covers:
GET /api/FileAttributesPUT /api/FileAttributesDELETE /api/FileAttributesGET /api/AttributeValuesGET /api/PMIDataPUT /api/ExtractedAttributeFeedback
GET /api/FileAttributes
Section titled “GET /api/FileAttributes”Return the attributes currently used by the authenticated user’s company.
| Item | Value |
|---|---|
| Method | GET |
| Path | /api/FileAttributes |
| Auth | User bearer token |
| Response | Array of FileAttribute objects |
Typical response shape
Section titled “Typical response shape”[ { "ID": 12, "Name": "document_type", "Unit": "", "Value": null, "IsCustom": true, "Timestamp": null }, { "ID": 13, "Name": "material", "Unit": "", "Value": null, "IsCustom": true, "Timestamp": null }]Example
Section titled “Example”curl "https://your-server.example.com/api/FileAttributes" \ -H "Authorization: Bearer USER_BEARER_TOKEN"PUT /api/FileAttributes
Section titled “PUT /api/FileAttributes”Add or replace attributes on a file.
| Item | Value |
|---|---|
| Method | PUT |
| Path | /api/FileAttributes |
| Auth | User bearer token |
| Content-Type | application/json |
| Response | Boolean |
Query parameters
Section titled “Query parameters”| Parameter | Required | Notes |
|---|---|---|
fileUID | One of fileUID or fileName | File UID to update |
fileName | One of fileUID or fileName | Full stored file path. The API resolves this to a UID first. |
deleteExisting | No | Defaults to true. When true, this acts as a full replace. |
Request body format
Section titled “Request body format”The body is a JSON string whose contents are a JSON array of name=value strings.
The wire body therefore has the following form:
"[\"document_type=Assembly\",\"region=North America|Europe\",\"weight(kg)=12.3\"]"Do not send a raw JSON array. The controller receives a string first and then deserializes that string into string[].
Attribute format
Section titled “Attribute format”- Single value:
document_number=AX-1000 - Multi-valued attribute:
region=North America|Europe— see Multi-valued attributes - Unit-bearing field:
weight(kg)=12.3
Python example
Section titled “Python example”import jsonimport requests
server = "https://your-server.example.com"token = "USER_BEARER_TOKEN"file_uid = "b5d3674c-488c-41cb-a9f7-58a42cac85dd"
attrs = [ "document_type=Assembly", "region=North America|Europe", "weight(kg)=12.3",]
body = json.dumps(json.dumps(attrs))
resp = requests.put( f"{server}/api/FileAttributes?fileUID={file_uid}", headers={ "Authorization": f"Bearer {token}", "Content-Type": "application/json", }, data=body,)resp.raise_for_status()print(resp.json())Multi-valued attributes
Section titled “Multi-valued attributes”An attribute can hold more than one value for the same file — for example, a CAD file linked to several PLM part records, or a part approved for multiple regions. VizSeek models this as a single attribute whose values are separated by a pipe (|):
part_id=REC-001|REC-002|REC-003Uploading. Send the complete value list as one name=value entry, with the values pipe-separated. The pipe is the reserved value delimiter, so an individual value must not itself contain a | character.
Indexing and search. Each value is indexed individually. A metadata or exact-match search on any single value returns the file — for the example above, FT=part_id=[REC-002] is a match. See Attribute-match conventions.
Response format. Every API surface returns a multi-valued attribute in the same pipe-separated form it was uploaded in:
| Surface | Example |
|---|---|
GET /api/File — Attributes | "PartID=REC-001|REC-002|REC-003" |
Search results — ShapeResult.Attributes | "partid=REC-001|REC-002|REC-003" |
Search results — Attributes[].Value | "REC-001|REC-002|REC-003" |
To consume the values, split the string on |. A value that contains no pipe is a single-valued attribute, so the same parsing rule covers both cases.
Updating the value set. PUT /api/FileAttributes is a full replace by default (deleteExisting=true). To add or remove a single value, re-send the attribute with the complete, updated pipe-separated list. In PLM and ERP integrations, treat the source system as the system of record: whenever its records change, push the full merged attribute set for the file rather than attempting incremental edits.
DELETE /api/FileAttributes
Section titled “DELETE /api/FileAttributes”Remove all attributes from a file.
| Item | Value |
|---|---|
| Method | DELETE |
| Path | /api/FileAttributes |
| Auth | User bearer token |
| Response | Boolean |
Query parameters
Section titled “Query parameters”| Parameter | Required | Notes |
|---|---|---|
fileUID | Yes | File UID whose attributes are removed |
Example
Section titled “Example”curl -X DELETE "https://your-server.example.com/api/FileAttributes?fileUID=b5d3674c-488c-41cb-a9f7-58a42cac85dd" \ -H "Authorization: Bearer USER_BEARER_TOKEN"GET /api/AttributeValues
Section titled “GET /api/AttributeValues”Return the unique values and counts for one attribute in the current company.
| Item | Value |
|---|---|
| Method | GET |
| Path | /api/AttributeValues |
| Auth | User bearer token |
| Response | Array of { "Name": string, "Count": int } |
Query parameters
Section titled “Query parameters”| Parameter | Required | Notes |
|---|---|---|
attribute | Yes | Attribute name to aggregate. The name is matched case-insensitively (lower-cased by the server). |
Example response
Section titled “Example response”[ { "Name": "North America", "Count": 1842 }, { "Name": "Europe", "Count": 731 }]Example
Section titled “Example”curl -G "https://your-server.example.com/api/AttributeValues" \ -H "Authorization: Bearer USER_BEARER_TOKEN" \ --data-urlencode "attribute=region"GET /api/PMIData
Section titled “GET /api/PMIData”Return the extracted PMI payload for a file.
| Item | Value |
|---|---|
| Method | GET |
| Path | /api/PMIData |
| Auth | User bearer token |
| Response | PMIData JSON |
Query parameters
Section titled “Query parameters”| Parameter | Required | Notes |
|---|---|---|
fileUID | Yes | File UID to read PMI from |
Response fields
Section titled “Response fields”| Field | Meaning |
|---|---|
PMI | JSON text string containing the PMI array |
UnstructuredText | Extracted free text |
ExtractedAttributes | Extracted attributes as name=value strings |
Example response
Section titled “Example response”{ "PMI": "[{\"page\":0,\"ImageSize\":[2550,3300],\"PMI\":[{\"box\":[1274,356,29,125],\"type_id\":0,\"text\":\"11\"}]}]", "UnstructuredText": "Example drawing title", "ExtractedAttributes": [ "document_number=AX-1000", "document_type=Drawing" ]}Example
Section titled “Example”curl -G "https://your-server.example.com/api/PMIData" \ -H "Authorization: Bearer USER_BEARER_TOKEN" \ --data-urlencode "fileUID=b5d3674c-488c-41cb-a9f7-58a42cac85dd"PUT /api/ExtractedAttributeFeedback
Section titled “PUT /api/ExtractedAttributeFeedback”Send feedback about attributes VizSeek extracted from a file.
| Item | Value |
|---|---|
| Method | PUT |
| Path | /api/ExtractedAttributeFeedback |
| Auth | User bearer token |
| Content-Type | application/json |
| Response | Plain feedback ID string |
Query parameters
Section titled “Query parameters”| Parameter | Required | Notes |
|---|---|---|
fileUID | Yes | File UID the feedback applies to |
feedback | Recommended | URL-encoded explanation of what should have been extracted differently, max 300 chars. Documented as required but not enforced by the API; omitting it stores empty feedback rather than returning an error. |
user | No | URL-encoded external user identifier, max 100 chars |
feedbackId | No | Optional caller-supplied GUID |
Request body format
Section titled “Request body format”The body is a JSON string containing a comma-separated list of extracted attributes, for example:
"Document Type=Drawing,Region=North America"Example
Section titled “Example”import jsonimport requestsimport urllib.parse
server = "https://your-server.example.com"token = "USER_BEARER_TOKEN"file_uid = "b5d3674c-488c-41cb-a9f7-58a42cac85dd"
body = json.dumps("Document Type=Drawing,Region=North America")feedback = urllib.parse.quote("Region should have been Europe", safe="")
resp = requests.put( f"{server}/api/ExtractedAttributeFeedback?fileUID={file_uid}&feedback={feedback}", headers={ "Authorization": f"Bearer {token}", "Content-Type": "application/json", }, data=body,)resp.raise_for_status()print(resp.text)