Upload components
Up to 200 components per call. Each is placed on a primitive and stored private, self-reported, draft.
/api/v1/workspaces/:slug/upload/componentsWrite · editor keyAuthentication
Authorization: Bearer sa_… from the workspace owner or a member. Counts against the upload rate limit.
Parameters
Path
- slugstringrequired
Workspace slug
Body
- companystringoptional
Company slug; defaults to the workspace's own company
min 1 charmax 80 chars - itemsobject[]requiredmin 1 itemmax 200 items
- items[].clientIdstringoptional
Your stable id for this thing (e.g. repo path or tool slug). Re-uploading the same clientId updates instead of duplicating.
min 1 charmax 120 charspattern ^[\w.:/@-]+$ - items[].labelstringrequired
The company's own name for it: 'Payroll (Gusto)', 'Platform team'
min 1 charmax 200 chars - items[].descriptionstringoptional
One or two plain sentences: what it is, what it does
max 2000 chars - items[].layerenumoptionalpeopleprocesssoftwaredatadecisions
- items[].primitivestringoptional
Primitive key from get_mapping_guide, if you know it
max 80 chars - items[].parentstringoptional
Parent component: its clientId, label, or component id
min 1 charmax 200 chars - items[].kindenumoptionaldefault "internal"internalexternal
- items[].externalKindenumoptionalcustomersupplierpartnerregulatoreconomic_factor
- items[].valuesobject[]optionaldefault []max 50 items
- items[].values[].parameterstringrequiredmin 1 charmax 80 chars
- items[].values[].valuestring | number | booleanrequired
- items[].sourceobjectoptional
- items[].source.kindenumoptionaldefault "client_document"client_documentinterviewmanualwebsitefilingregistry
- items[].source.urlstringoptionalmax 500 chars
- items[].source.titlestringoptionalmax 200 chars
Request
curl -X POST "https://systematlas.org/api/v1/workspaces/acme-builders/upload/components" \
-H "Authorization: Bearer sa_…" \
-H "content-type: application/json" \
-d '{"items":[{"clientId":"tool/gusto","label":"Payroll in Gusto","layer":"software"}]}'Response
200 with the result in data (abbreviated here). Errors are listed in Errors and limits.
{
"data": {
"placed": {
"matched": 1
},
"results": [
{
"clientId": "tool/gusto",
"primitive": "payroll",
"placedBy": "matched",
"created": true
}
],
"summary": {
"coverage": {
"percent": 62
}
}
}
}Over MCP
The same call as an MCP tool: upload_components.