{"openapi":"3.0.0","paths":{"/api-auth/token":{"post":{"tags":["Authentication"],"servers":[{"url":"/dashboard/api"}],"operationId":"exchangeApiKeyForToken","summary":"Create an access token","description":"Exchange the client ID and client secret from Administration → Developer for a short-lived access token. The returned JWT is valid for 600 seconds; send it as `Authorization: Bearer <access_token>` to the Spaces and Forms endpoints, and request a new token after it expires.","requestBody":{"required":true,"description":"The API credentials from Administration → Developer.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ExchangeApiKeyDto"}}}},"responses":{"201":{"description":"A short-lived Bearer access token.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ExchangeApiKeyResult"}}}},"400":{"description":"Both client_id and client_secret are required, and both must be non-empty strings.","content":{"application/json":{"schema":{"type":"object","required":["statusCode","message"],"properties":{"statusCode":{"type":"number","description":"HTTP status code.","example":400},"message":{"oneOf":[{"type":"string"},{"type":"array","items":{"type":"string"}}],"description":"Human-readable explanation of the error.","example":"The request could not be processed."},"error":{"type":"string","description":"HTTP error name, when supplied by the endpoint.","example":"Bad Request"}}},"example":{"statusCode":400,"message":"Please provide both client_id and client_secret to obtain an access token"}}}},"401":{"description":"The supplied client ID or client secret is invalid.","content":{"application/json":{"schema":{"type":"object","required":["statusCode","message"],"properties":{"statusCode":{"type":"number","description":"HTTP status code.","example":400},"message":{"oneOf":[{"type":"string"},{"type":"array","items":{"type":"string"}}],"description":"Human-readable explanation of the error.","example":"The request could not be processed."},"error":{"type":"string","description":"HTTP error name, when supplied by the endpoint.","example":"Bad Request"}}},"example":{"statusCode":401,"message":"Supplied API credentials are invalid"}}}},"500":{"description":"The credentials were accepted but the access token could not be issued.","content":{"application/json":{"schema":{"type":"object","required":["statusCode","message"],"properties":{"statusCode":{"type":"number","description":"HTTP status code.","example":400},"message":{"oneOf":[{"type":"string"},{"type":"array","items":{"type":"string"}}],"description":"Human-readable explanation of the error.","example":"The request could not be processed."},"error":{"type":"string","description":"HTTP error name, when supplied by the endpoint.","example":"Bad Request"}}},"example":{"statusCode":500,"message":"Internal server error"}}}}}}},"/spaces":{"post":{"operationId":"SpacesController_create","summary":"Create a Space synchronously","description":"Copies a Valuecase template, applies company and contact data, assigns an owner and teams, and optionally attaches Space Properties and external-record mappings. The request waits for creation to finish and returns the participant URL immediately. Use asynchronous creation for complex templates or production automations that should not wait on a long-running request.","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateSpaceDto"}}}},"responses":{"201":{"description":"The completed Space, including its participant URL and access token.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SpaceCreationResult"}}}},"400":{"description":"The request parameters or body are invalid.","content":{"application/json":{"schema":{"type":"object","required":["statusCode","message"],"properties":{"statusCode":{"type":"number","description":"HTTP status code.","example":400},"message":{"oneOf":[{"type":"string"},{"type":"array","items":{"type":"string"}}],"description":"Human-readable explanation of the error.","example":"The request could not be processed."},"error":{"type":"string","description":"HTTP error name, when supplied by the endpoint.","example":"Bad Request"}}},"example":{"statusCode":400,"message":"The request could not be processed.","error":"Bad Request"}}}},"401":{"description":"The Bearer access token is missing, invalid, or expired. Exchange your API credentials for a new token and retry the request.","content":{"application/json":{"schema":{"type":"object","required":["statusCode","message"],"properties":{"statusCode":{"type":"number","description":"HTTP status code.","example":400},"message":{"oneOf":[{"type":"string"},{"type":"array","items":{"type":"string"}}],"description":"Human-readable explanation of the error.","example":"The request could not be processed."},"error":{"type":"string","description":"HTTP error name, when supplied by the endpoint.","example":"Bad Request"}}},"example":{"statusCode":401,"message":"Unauthorized","error":"Unauthorized"}}}},"403":{"description":"The access token is valid but does not grant the required permission for this resource.","content":{"application/json":{"schema":{"type":"object","required":["statusCode","message"],"properties":{"statusCode":{"type":"number","description":"HTTP status code.","example":400},"message":{"oneOf":[{"type":"string"},{"type":"array","items":{"type":"string"}}],"description":"Human-readable explanation of the error.","example":"The request could not be processed."},"error":{"type":"string","description":"HTTP error name, when supplied by the endpoint.","example":"Bad Request"}}},"example":{"statusCode":403,"message":"Forbidden resource","error":"Forbidden"}}}},"404":{"description":"The requested resource does not exist or is not accessible.","content":{"application/json":{"schema":{"type":"object","required":["statusCode","message"],"properties":{"statusCode":{"type":"number","description":"HTTP status code.","example":400},"message":{"oneOf":[{"type":"string"},{"type":"array","items":{"type":"string"}}],"description":"Human-readable explanation of the error.","example":"The request could not be processed."},"error":{"type":"string","description":"HTTP error name, when supplied by the endpoint.","example":"Bad Request"}}},"example":{"statusCode":404,"message":"Resource not found","error":"Not Found"}}}},"429":{"description":"The monthly API request limit has been reached. The message and rate-limit headers indicate when the allowance resets.","headers":{"Retry-After":{"description":"Seconds until the request allowance resets.","schema":{"type":"integer","example":86400}},"X-RateLimit-Limit":{"description":"Maximum requests in the current monthly period.","schema":{"type":"integer","example":20000}},"X-RateLimit-Remaining":{"description":"Requests remaining in the current monthly period.","schema":{"type":"integer","example":0}},"X-RateLimit-Reset":{"description":"Seconds until the current monthly period resets.","schema":{"type":"integer","example":86400}}},"content":{"application/json":{"schema":{"type":"object","required":["statusCode","message"],"properties":{"statusCode":{"type":"number","description":"HTTP status code.","example":400},"message":{"oneOf":[{"type":"string"},{"type":"array","items":{"type":"string"}}],"description":"Human-readable explanation of the error.","example":"The request could not be processed."},"error":{"type":"string","description":"HTTP error name, when supplied by the endpoint.","example":"Bad Request"}}},"example":{"statusCode":429,"message":"You have exceeded the monthly request limit. Please retry in 86400 seconds","error":"Too Many Requests"}}}}},"tags":["Spaces"],"security":[{"bearer":[]}]},"get":{"operationId":"SpacesController_list","summary":"List Spaces","description":"Returns a paginated list of Spaces accessible to the token. Filter by owner, team, template, lifecycle state, timestamps, action-plan state, form completion, Space Properties, or linked external records. Optional flags add Forms, engagement, activity, and Space Property details to each result.","parameters":[{"name":"spaceType","required":false,"in":"query","description":"Filter by lifecycle state.","schema":{"default":"all","example":"active","enum":["all","active","archived"],"type":"string"}},{"name":"spaceName","required":false,"in":"query","description":"Filter by company or Space name.","schema":{"example":"Example Inc.","type":"string"}},{"name":"ownerIds","required":false,"in":"query","description":"Return Spaces owned by any of these Valuecase user IDs.","schema":{"example":["valuecase|99ad6b1a-c49d-4b51-8d39-e9590687b50b"],"type":"array","items":{"type":"string"}}},{"name":"spaceIds","required":false,"in":"query","description":"Return Spaces with any of these database IDs.","schema":{"example":["clw7h6z8u000108l8g3hd2m5r"],"type":"array","items":{"type":"string"}}},{"name":"mapStatus","required":false,"in":"query","description":"Filter by mutual action plan progress state.","schema":{"example":["inProgress","overdue"],"type":"array","items":{"type":"string","enum":["notCreated","notStarted","stalled","inProgress","overdue","completed"]}}},{"name":"templateIds","required":false,"in":"query","description":"Return Spaces created from any of these template IDs.","schema":{"example":["clw7h6z8u000108l8g3hd2m5r"],"type":"array","items":{"type":"string"}}},{"name":"templateRootNodeIds","required":false,"in":"query","description":"Return Spaces created from any of these template root node IDs.","schema":{"example":["ze3ljqvzwaw8ufyitv6jdq08"],"type":"array","items":{"type":"string"}}},{"name":"spaceRootNodeIds","required":false,"in":"query","description":"Return Spaces with any of these root node IDs.","schema":{"example":["yp8gw6jc85sg3fyefg1yept7"],"type":"array","items":{"type":"string"}}},{"name":"slugs","required":false,"in":"query","description":"Return Spaces with any of these URL slugs.","schema":{"example":["example-inc-onboarding"],"type":"array","items":{"type":"string"}}},{"name":"page","required":false,"in":"query","description":"One-based result page.","schema":{"minimum":1,"default":1,"example":1,"type":"number"}},{"name":"pageSize","required":false,"in":"query","description":"Number of Spaces returned per page.","schema":{"minimum":1,"default":25,"example":25,"type":"number"}},{"name":"sortBy","required":false,"in":"query","description":"Field used to order results.","schema":{"default":"createdAt","example":"createdAt","enum":["companyName","mapProgress","createdAt","updatedAt","ownerId","lastVisit","activitiesCount","score","visits","formCompletions"],"type":"string"}},{"name":"sortDirection","required":false,"in":"query","description":"Sort results in ascending or descending order.","schema":{"default":"desc","example":"desc","enum":["asc","desc"],"type":"string"}},{"name":"includeActionPlanSummaryFields","required":false,"in":"query","description":"Include mutual action plan status, progress, start date, and target date.","schema":{"example":true,"type":"boolean"}},{"name":"includeScores","required":false,"in":"query","description":"Include the current engagement score for each Space.","schema":{"example":true,"type":"boolean"}},{"name":"includeActivitiesCount","required":false,"in":"query","description":"Include the number of recorded participant activities.","schema":{"default":true,"example":true,"type":"boolean"}},{"name":"filterToInternalPropertiesOnly","required":false,"in":"query","description":"When custom properties are included, return only internal Space Properties.","schema":{"default":false,"example":false,"type":"boolean"}},{"name":"includeCustomProperties","required":false,"in":"query","description":"Include Space Properties in each result.","schema":{"default":true,"example":true,"type":"boolean"}},{"name":"teamIds","required":false,"in":"query","description":"Return Spaces assigned to any of these team IDs. Cannot be combined with the other team-access filters.","schema":{"example":["8f1c6b2a-5d47-4e93-a0f8-3b7c9d1e5a24","c04e7a19-2b83-4d61-9f7e-5a8c3b0d6e42"],"type":"array","items":{"type":"string"}}},{"name":"collaboratorAccess","required":false,"in":"query","description":"Return Spaces on which the current user is a collaborator. Cannot be combined with the other team-access filters.","schema":{"example":true,"type":"boolean"}},{"name":"createdAfter","required":false,"in":"query","description":"Return Spaces created after this timestamp.","schema":{"format":"date-time","example":"2026-01-01T00:00:00.000Z","type":"string"}},{"name":"updatedAfter","required":false,"in":"query","description":"Return Spaces updated after this timestamp.","schema":{"format":"date-time","example":"2026-05-01T12:00:00.000Z","type":"string"}},{"name":"myTeamAccess","required":false,"in":"query","description":"Return Spaces accessible to the current user's teams. Cannot be combined with the other team-access filters.","schema":{"example":true,"type":"boolean"}},{"name":"companyTeamAccess","required":false,"in":"query","description":"Return Spaces accessible company-wide. Cannot be combined with the other team-access filters.","schema":{"example":true,"type":"boolean"}},{"name":"thirdParty","required":false,"in":"query","description":"External system type (Salesforce, HubSpot or Custom)","schema":{"example":"Salesforce","enum":["HubSpot","Salesforce","Pipedrive","Custom"],"type":"string"}},{"name":"thirdPartyId","required":false,"in":"query","description":"External system-specific corresponding entity ID (e.g. Lead ID, Opportunity ID, etc.)","schema":{"example":"1954687215","type":"string"}},{"name":"thirdPartyEntityType","required":false,"in":"query","description":"External system-specific entity type (e.g. Lead, Opportunity, etc.)","schema":{"example":"Opportunity","type":"string"}},{"name":"includeActionPlanKeyDetails","required":false,"in":"query","description":"Include key mutual action plan details used by dashboard views.","schema":{"example":true,"type":"boolean"}},{"name":"includeForms","required":false,"in":"query","description":"Include Forms and their completion summaries in each Space.","schema":{"example":true,"type":"boolean"}},{"name":"internalPropertyFilters","required":false,"in":"query","description":"Internal property filters as JSON object. Select properties use { propertyKey: [value1, value2] }. Typed properties use { propertyKey: { operator: \"greaterThan\" | \"lessThan\", value } }. Use \"__UNASSIGNED__\" for select properties without a value.","schema":{"example":"{\"stage\":[\"Contracting\",\"Closed\"],\"revenue\":{\"operator\":\"greaterThan\",\"value\":1000}}","type":"string"}},{"name":"formCompletions","required":false,"in":"query","description":"Filter Spaces by whether no Forms or at least one Form has been completed.","schema":{"example":"atLeastOne","enum":["none","atLeastOne"],"type":"string"}},{"name":"groupBy","required":false,"in":"query","description":"Internal property key to group spaces by (for Kanban view)","schema":{"example":"status","type":"string"}},{"name":"groupValue","required":false,"in":"query","description":"Specific internal property value to filter by (used with groupBy for per-column pagination)","schema":{"example":"In Progress","type":"string"}}],"responses":{"200":{"description":"Paginated Spaces matching the supplied filters.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SpaceListResponse"}}}},"400":{"description":"The request parameters or body are invalid.","content":{"application/json":{"schema":{"type":"object","required":["statusCode","message"],"properties":{"statusCode":{"type":"number","description":"HTTP status code.","example":400},"message":{"oneOf":[{"type":"string"},{"type":"array","items":{"type":"string"}}],"description":"Human-readable explanation of the error.","example":"The request could not be processed."},"error":{"type":"string","description":"HTTP error name, when supplied by the endpoint.","example":"Bad Request"}}},"example":{"statusCode":400,"message":"The request could not be processed.","error":"Bad Request"}}}},"401":{"description":"The Bearer access token is missing, invalid, or expired. Exchange your API credentials for a new token and retry the request.","content":{"application/json":{"schema":{"type":"object","required":["statusCode","message"],"properties":{"statusCode":{"type":"number","description":"HTTP status code.","example":400},"message":{"oneOf":[{"type":"string"},{"type":"array","items":{"type":"string"}}],"description":"Human-readable explanation of the error.","example":"The request could not be processed."},"error":{"type":"string","description":"HTTP error name, when supplied by the endpoint.","example":"Bad Request"}}},"example":{"statusCode":401,"message":"Unauthorized","error":"Unauthorized"}}}},"403":{"description":"The access token is valid but does not grant the required permission for this resource.","content":{"application/json":{"schema":{"type":"object","required":["statusCode","message"],"properties":{"statusCode":{"type":"number","description":"HTTP status code.","example":400},"message":{"oneOf":[{"type":"string"},{"type":"array","items":{"type":"string"}}],"description":"Human-readable explanation of the error.","example":"The request could not be processed."},"error":{"type":"string","description":"HTTP error name, when supplied by the endpoint.","example":"Bad Request"}}},"example":{"statusCode":403,"message":"Forbidden resource","error":"Forbidden"}}}},"429":{"description":"The monthly API request limit has been reached. The message and rate-limit headers indicate when the allowance resets.","headers":{"Retry-After":{"description":"Seconds until the request allowance resets.","schema":{"type":"integer","example":86400}},"X-RateLimit-Limit":{"description":"Maximum requests in the current monthly period.","schema":{"type":"integer","example":20000}},"X-RateLimit-Remaining":{"description":"Requests remaining in the current monthly period.","schema":{"type":"integer","example":0}},"X-RateLimit-Reset":{"description":"Seconds until the current monthly period resets.","schema":{"type":"integer","example":86400}}},"content":{"application/json":{"schema":{"type":"object","required":["statusCode","message"],"properties":{"statusCode":{"type":"number","description":"HTTP status code.","example":400},"message":{"oneOf":[{"type":"string"},{"type":"array","items":{"type":"string"}}],"description":"Human-readable explanation of the error.","example":"The request could not be processed."},"error":{"type":"string","description":"HTTP error name, when supplied by the endpoint.","example":"Bad Request"}}},"example":{"statusCode":429,"message":"You have exceeded the monthly request limit. Please retry in 86400 seconds","error":"Too Many Requests"}}}}},"tags":["Spaces"],"security":[{"bearer":[]}]}},"/spaces/{spaceSlug}":{"patch":{"operationId":"SpacesController_update","summary":"Update a space","description":"Updates supported Space lifecycle and access settings. Use this operation to reassign ownership, archive or restore a Space, or disable sharing and participant downloads.","parameters":[{"name":"spaceSlug","required":true,"in":"path","description":"Root node ID of the Space to update.","schema":{"example":"yp8gw6jc85sg3fyefg1yept7","type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateSpaceDto"}}}},"responses":{"200":{"description":"The updated Space."},"400":{"description":"The request parameters or body are invalid.","content":{"application/json":{"schema":{"type":"object","required":["statusCode","message"],"properties":{"statusCode":{"type":"number","description":"HTTP status code.","example":400},"message":{"oneOf":[{"type":"string"},{"type":"array","items":{"type":"string"}}],"description":"Human-readable explanation of the error.","example":"The request could not be processed."},"error":{"type":"string","description":"HTTP error name, when supplied by the endpoint.","example":"Bad Request"}}},"example":{"statusCode":400,"message":"The request could not be processed.","error":"Bad Request"}}}},"401":{"description":"The Bearer access token is missing, invalid, or expired. Exchange your API credentials for a new token and retry the request.","content":{"application/json":{"schema":{"type":"object","required":["statusCode","message"],"properties":{"statusCode":{"type":"number","description":"HTTP status code.","example":400},"message":{"oneOf":[{"type":"string"},{"type":"array","items":{"type":"string"}}],"description":"Human-readable explanation of the error.","example":"The request could not be processed."},"error":{"type":"string","description":"HTTP error name, when supplied by the endpoint.","example":"Bad Request"}}},"example":{"statusCode":401,"message":"Unauthorized","error":"Unauthorized"}}}},"403":{"description":"The access token is valid but does not grant the required permission for this resource.","content":{"application/json":{"schema":{"type":"object","required":["statusCode","message"],"properties":{"statusCode":{"type":"number","description":"HTTP status code.","example":400},"message":{"oneOf":[{"type":"string"},{"type":"array","items":{"type":"string"}}],"description":"Human-readable explanation of the error.","example":"The request could not be processed."},"error":{"type":"string","description":"HTTP error name, when supplied by the endpoint.","example":"Bad Request"}}},"example":{"statusCode":403,"message":"Forbidden resource","error":"Forbidden"}}}},"404":{"description":"The requested resource does not exist or is not accessible.","content":{"application/json":{"schema":{"type":"object","required":["statusCode","message"],"properties":{"statusCode":{"type":"number","description":"HTTP status code.","example":400},"message":{"oneOf":[{"type":"string"},{"type":"array","items":{"type":"string"}}],"description":"Human-readable explanation of the error.","example":"The request could not be processed."},"error":{"type":"string","description":"HTTP error name, when supplied by the endpoint.","example":"Bad Request"}}},"example":{"statusCode":404,"message":"Resource not found","error":"Not Found"}}}},"429":{"description":"The monthly API request limit has been reached. The message and rate-limit headers indicate when the allowance resets.","headers":{"Retry-After":{"description":"Seconds until the request allowance resets.","schema":{"type":"integer","example":86400}},"X-RateLimit-Limit":{"description":"Maximum requests in the current monthly period.","schema":{"type":"integer","example":20000}},"X-RateLimit-Remaining":{"description":"Requests remaining in the current monthly period.","schema":{"type":"integer","example":0}},"X-RateLimit-Reset":{"description":"Seconds until the current monthly period resets.","schema":{"type":"integer","example":86400}}},"content":{"application/json":{"schema":{"type":"object","required":["statusCode","message"],"properties":{"statusCode":{"type":"number","description":"HTTP status code.","example":400},"message":{"oneOf":[{"type":"string"},{"type":"array","items":{"type":"string"}}],"description":"Human-readable explanation of the error.","example":"The request could not be processed."},"error":{"type":"string","description":"HTTP error name, when supplied by the endpoint.","example":"Bad Request"}}},"example":{"statusCode":429,"message":"You have exceeded the monthly request limit. Please retry in 86400 seconds","error":"Too Many Requests"}}}}},"tags":["Spaces"],"security":[{"bearer":[]}]},"delete":{"operationId":"SpacesController_delete","summary":"Delete a space","description":"Permanently deletes one Space. Only the Space owner or a user with all-Spaces administration permission can delete it. Use the update endpoint with archived=true when the Space may need to be restored later.","parameters":[{"name":"spaceSlug","required":true,"in":"path","description":"Root node ID of the Space to delete.","schema":{"example":"yp8gw6jc85sg3fyefg1yept7","type":"string"}}],"responses":{"200":{"description":"The Space was deleted."},"401":{"description":"The Bearer access token is missing, invalid, or expired. Exchange your API credentials for a new token and retry the request.","content":{"application/json":{"schema":{"type":"object","required":["statusCode","message"],"properties":{"statusCode":{"type":"number","description":"HTTP status code.","example":400},"message":{"oneOf":[{"type":"string"},{"type":"array","items":{"type":"string"}}],"description":"Human-readable explanation of the error.","example":"The request could not be processed."},"error":{"type":"string","description":"HTTP error name, when supplied by the endpoint.","example":"Bad Request"}}},"example":{"statusCode":401,"message":"Unauthorized","error":"Unauthorized"}}}},"403":{"description":"The access token is valid but does not grant the required permission for this resource.","content":{"application/json":{"schema":{"type":"object","required":["statusCode","message"],"properties":{"statusCode":{"type":"number","description":"HTTP status code.","example":400},"message":{"oneOf":[{"type":"string"},{"type":"array","items":{"type":"string"}}],"description":"Human-readable explanation of the error.","example":"The request could not be processed."},"error":{"type":"string","description":"HTTP error name, when supplied by the endpoint.","example":"Bad Request"}}},"example":{"statusCode":403,"message":"Forbidden resource","error":"Forbidden"}}}},"404":{"description":"The requested resource does not exist or is not accessible.","content":{"application/json":{"schema":{"type":"object","required":["statusCode","message"],"properties":{"statusCode":{"type":"number","description":"HTTP status code.","example":400},"message":{"oneOf":[{"type":"string"},{"type":"array","items":{"type":"string"}}],"description":"Human-readable explanation of the error.","example":"The request could not be processed."},"error":{"type":"string","description":"HTTP error name, when supplied by the endpoint.","example":"Bad Request"}}},"example":{"statusCode":404,"message":"Resource not found","error":"Not Found"}}}},"429":{"description":"The monthly API request limit has been reached. The message and rate-limit headers indicate when the allowance resets.","headers":{"Retry-After":{"description":"Seconds until the request allowance resets.","schema":{"type":"integer","example":86400}},"X-RateLimit-Limit":{"description":"Maximum requests in the current monthly period.","schema":{"type":"integer","example":20000}},"X-RateLimit-Remaining":{"description":"Requests remaining in the current monthly period.","schema":{"type":"integer","example":0}},"X-RateLimit-Reset":{"description":"Seconds until the current monthly period resets.","schema":{"type":"integer","example":86400}}},"content":{"application/json":{"schema":{"type":"object","required":["statusCode","message"],"properties":{"statusCode":{"type":"number","description":"HTTP status code.","example":400},"message":{"oneOf":[{"type":"string"},{"type":"array","items":{"type":"string"}}],"description":"Human-readable explanation of the error.","example":"The request could not be processed."},"error":{"type":"string","description":"HTTP error name, when supplied by the endpoint.","example":"Bad Request"}}},"example":{"statusCode":429,"message":"You have exceeded the monthly request limit. Please retry in 86400 seconds","error":"Too Many Requests"}}}}},"tags":["Spaces"],"security":[{"bearer":[]}]}},"/spaces/{rootNodeId}/auth-settings":{"get":{"operationId":"SpacesController_getSpaceAuthSettings","summary":"Get a Space's sharing settings","description":"Returns who may open the Space, whether a password is required and which email domains are whitelisted.","parameters":[{"name":"rootNodeId","required":true,"in":"path","description":"Root node ID of the Space.","schema":{"example":"yp8gw6jc85sg3fyefg1yept7","type":"string"}}],"responses":{"200":{"description":"The sharing settings, or null for Spaces where sharing was never configured.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SpaceAuthSettingsResponseDto"}}}},"400":{"description":"The request parameters or body are invalid.","content":{"application/json":{"schema":{"type":"object","required":["statusCode","message"],"properties":{"statusCode":{"type":"number","description":"HTTP status code.","example":400},"message":{"oneOf":[{"type":"string"},{"type":"array","items":{"type":"string"}}],"description":"Human-readable explanation of the error.","example":"The request could not be processed."},"error":{"type":"string","description":"HTTP error name, when supplied by the endpoint.","example":"Bad Request"}}},"example":{"statusCode":400,"message":"The request could not be processed.","error":"Bad Request"}}}},"401":{"description":"The Bearer access token is missing, invalid, or expired. Exchange your API credentials for a new token and retry the request.","content":{"application/json":{"schema":{"type":"object","required":["statusCode","message"],"properties":{"statusCode":{"type":"number","description":"HTTP status code.","example":400},"message":{"oneOf":[{"type":"string"},{"type":"array","items":{"type":"string"}}],"description":"Human-readable explanation of the error.","example":"The request could not be processed."},"error":{"type":"string","description":"HTTP error name, when supplied by the endpoint.","example":"Bad Request"}}},"example":{"statusCode":401,"message":"Unauthorized","error":"Unauthorized"}}}},"403":{"description":"The access token is valid but does not grant the required permission for this resource.","content":{"application/json":{"schema":{"type":"object","required":["statusCode","message"],"properties":{"statusCode":{"type":"number","description":"HTTP status code.","example":400},"message":{"oneOf":[{"type":"string"},{"type":"array","items":{"type":"string"}}],"description":"Human-readable explanation of the error.","example":"The request could not be processed."},"error":{"type":"string","description":"HTTP error name, when supplied by the endpoint.","example":"Bad Request"}}},"example":{"statusCode":403,"message":"Forbidden resource","error":"Forbidden"}}}},"404":{"description":"The requested resource does not exist or is not accessible.","content":{"application/json":{"schema":{"type":"object","required":["statusCode","message"],"properties":{"statusCode":{"type":"number","description":"HTTP status code.","example":400},"message":{"oneOf":[{"type":"string"},{"type":"array","items":{"type":"string"}}],"description":"Human-readable explanation of the error.","example":"The request could not be processed."},"error":{"type":"string","description":"HTTP error name, when supplied by the endpoint.","example":"Bad Request"}}},"example":{"statusCode":404,"message":"Resource not found","error":"Not Found"}}}},"429":{"description":"The monthly API request limit has been reached. The message and rate-limit headers indicate when the allowance resets.","headers":{"Retry-After":{"description":"Seconds until the request allowance resets.","schema":{"type":"integer","example":86400}},"X-RateLimit-Limit":{"description":"Maximum requests in the current monthly period.","schema":{"type":"integer","example":20000}},"X-RateLimit-Remaining":{"description":"Requests remaining in the current monthly period.","schema":{"type":"integer","example":0}},"X-RateLimit-Reset":{"description":"Seconds until the current monthly period resets.","schema":{"type":"integer","example":86400}}},"content":{"application/json":{"schema":{"type":"object","required":["statusCode","message"],"properties":{"statusCode":{"type":"number","description":"HTTP status code.","example":400},"message":{"oneOf":[{"type":"string"},{"type":"array","items":{"type":"string"}}],"description":"Human-readable explanation of the error.","example":"The request could not be processed."},"error":{"type":"string","description":"HTTP error name, when supplied by the endpoint.","example":"Bad Request"}}},"example":{"statusCode":429,"message":"You have exceeded the monthly request limit. Please retry in 86400 seconds","error":"Too Many Requests"}}}}},"tags":["Spaces"],"security":[{"bearer":[]}]},"put":{"operationId":"SpacesController_updateSpaceAuthSettings","summary":"Update a Space's sharing settings","description":"Replaces the sharing settings of the Space in full: settings left out of the payload are cleared. The share token cannot be changed and is always carried over.","parameters":[{"name":"rootNodeId","required":true,"in":"path","description":"Root node ID of the Space.","schema":{"example":"yp8gw6jc85sg3fyefg1yept7","type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateSpaceAuthSettingsDto"}}}},"responses":{"200":{"description":"The sharing settings after the update.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SpaceAuthSettingsResponseDto"}}}},"400":{"description":"The request parameters or body are invalid.","content":{"application/json":{"schema":{"type":"object","required":["statusCode","message"],"properties":{"statusCode":{"type":"number","description":"HTTP status code.","example":400},"message":{"oneOf":[{"type":"string"},{"type":"array","items":{"type":"string"}}],"description":"Human-readable explanation of the error.","example":"The request could not be processed."},"error":{"type":"string","description":"HTTP error name, when supplied by the endpoint.","example":"Bad Request"}}},"example":{"statusCode":400,"message":"The request could not be processed.","error":"Bad Request"}}}},"401":{"description":"The Bearer access token is missing, invalid, or expired. Exchange your API credentials for a new token and retry the request.","content":{"application/json":{"schema":{"type":"object","required":["statusCode","message"],"properties":{"statusCode":{"type":"number","description":"HTTP status code.","example":400},"message":{"oneOf":[{"type":"string"},{"type":"array","items":{"type":"string"}}],"description":"Human-readable explanation of the error.","example":"The request could not be processed."},"error":{"type":"string","description":"HTTP error name, when supplied by the endpoint.","example":"Bad Request"}}},"example":{"statusCode":401,"message":"Unauthorized","error":"Unauthorized"}}}},"403":{"description":"The access token is valid but does not grant the required permission for this resource.","content":{"application/json":{"schema":{"type":"object","required":["statusCode","message"],"properties":{"statusCode":{"type":"number","description":"HTTP status code.","example":400},"message":{"oneOf":[{"type":"string"},{"type":"array","items":{"type":"string"}}],"description":"Human-readable explanation of the error.","example":"The request could not be processed."},"error":{"type":"string","description":"HTTP error name, when supplied by the endpoint.","example":"Bad Request"}}},"example":{"statusCode":403,"message":"Forbidden resource","error":"Forbidden"}}}},"404":{"description":"The requested resource does not exist or is not accessible.","content":{"application/json":{"schema":{"type":"object","required":["statusCode","message"],"properties":{"statusCode":{"type":"number","description":"HTTP status code.","example":400},"message":{"oneOf":[{"type":"string"},{"type":"array","items":{"type":"string"}}],"description":"Human-readable explanation of the error.","example":"The request could not be processed."},"error":{"type":"string","description":"HTTP error name, when supplied by the endpoint.","example":"Bad Request"}}},"example":{"statusCode":404,"message":"Resource not found","error":"Not Found"}}}},"429":{"description":"The monthly API request limit has been reached. The message and rate-limit headers indicate when the allowance resets.","headers":{"Retry-After":{"description":"Seconds until the request allowance resets.","schema":{"type":"integer","example":86400}},"X-RateLimit-Limit":{"description":"Maximum requests in the current monthly period.","schema":{"type":"integer","example":20000}},"X-RateLimit-Remaining":{"description":"Requests remaining in the current monthly period.","schema":{"type":"integer","example":0}},"X-RateLimit-Reset":{"description":"Seconds until the current monthly period resets.","schema":{"type":"integer","example":86400}}},"content":{"application/json":{"schema":{"type":"object","required":["statusCode","message"],"properties":{"statusCode":{"type":"number","description":"HTTP status code.","example":400},"message":{"oneOf":[{"type":"string"},{"type":"array","items":{"type":"string"}}],"description":"Human-readable explanation of the error.","example":"The request could not be processed."},"error":{"type":"string","description":"HTTP error name, when supplied by the endpoint.","example":"Bad Request"}}},"example":{"statusCode":429,"message":"You have exceeded the monthly request limit. Please retry in 86400 seconds","error":"Too Many Requests"}}}}},"tags":["Spaces"],"security":[{"bearer":[]}]}},"/spaces/{id}/integration-id-mappings":{"post":{"operationId":"SpacesController_addIntegrationIdMapping","summary":"Add integration ID mappings to a space","description":"Links a Space to records in an external system, such as a CRM lead, deal, opportunity, or onboarding project. Identical mappings are idempotently skipped. Legacy HubSpot IDs may use the format {portalId}_{objectId}.","parameters":[{"name":"id","required":true,"in":"path","description":"Database ID of the Space.","schema":{"example":"clw7h6z8u000108l8g3hd2m5r","type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SpaceIntegrationIdMappingsDto"}}}},"responses":{"204":{"description":"The mappings were attached or already existed."},"400":{"description":"The request parameters or body are invalid.","content":{"application/json":{"schema":{"type":"object","required":["statusCode","message"],"properties":{"statusCode":{"type":"number","description":"HTTP status code.","example":400},"message":{"oneOf":[{"type":"string"},{"type":"array","items":{"type":"string"}}],"description":"Human-readable explanation of the error.","example":"The request could not be processed."},"error":{"type":"string","description":"HTTP error name, when supplied by the endpoint.","example":"Bad Request"}}},"example":{"statusCode":400,"message":"The request could not be processed.","error":"Bad Request"}}}},"401":{"description":"The Bearer access token is missing, invalid, or expired. Exchange your API credentials for a new token and retry the request.","content":{"application/json":{"schema":{"type":"object","required":["statusCode","message"],"properties":{"statusCode":{"type":"number","description":"HTTP status code.","example":400},"message":{"oneOf":[{"type":"string"},{"type":"array","items":{"type":"string"}}],"description":"Human-readable explanation of the error.","example":"The request could not be processed."},"error":{"type":"string","description":"HTTP error name, when supplied by the endpoint.","example":"Bad Request"}}},"example":{"statusCode":401,"message":"Unauthorized","error":"Unauthorized"}}}},"403":{"description":"The access token is valid but does not grant the required permission for this resource.","content":{"application/json":{"schema":{"type":"object","required":["statusCode","message"],"properties":{"statusCode":{"type":"number","description":"HTTP status code.","example":400},"message":{"oneOf":[{"type":"string"},{"type":"array","items":{"type":"string"}}],"description":"Human-readable explanation of the error.","example":"The request could not be processed."},"error":{"type":"string","description":"HTTP error name, when supplied by the endpoint.","example":"Bad Request"}}},"example":{"statusCode":403,"message":"Forbidden resource","error":"Forbidden"}}}},"404":{"description":"The requested resource does not exist or is not accessible.","content":{"application/json":{"schema":{"type":"object","required":["statusCode","message"],"properties":{"statusCode":{"type":"number","description":"HTTP status code.","example":400},"message":{"oneOf":[{"type":"string"},{"type":"array","items":{"type":"string"}}],"description":"Human-readable explanation of the error.","example":"The request could not be processed."},"error":{"type":"string","description":"HTTP error name, when supplied by the endpoint.","example":"Bad Request"}}},"example":{"statusCode":404,"message":"Resource not found","error":"Not Found"}}}},"429":{"description":"The monthly API request limit has been reached. The message and rate-limit headers indicate when the allowance resets.","headers":{"Retry-After":{"description":"Seconds until the request allowance resets.","schema":{"type":"integer","example":86400}},"X-RateLimit-Limit":{"description":"Maximum requests in the current monthly period.","schema":{"type":"integer","example":20000}},"X-RateLimit-Remaining":{"description":"Requests remaining in the current monthly period.","schema":{"type":"integer","example":0}},"X-RateLimit-Reset":{"description":"Seconds until the current monthly period resets.","schema":{"type":"integer","example":86400}}},"content":{"application/json":{"schema":{"type":"object","required":["statusCode","message"],"properties":{"statusCode":{"type":"number","description":"HTTP status code.","example":400},"message":{"oneOf":[{"type":"string"},{"type":"array","items":{"type":"string"}}],"description":"Human-readable explanation of the error.","example":"The request could not be processed."},"error":{"type":"string","description":"HTTP error name, when supplied by the endpoint.","example":"Bad Request"}}},"example":{"statusCode":429,"message":"You have exceeded the monthly request limit. Please retry in 86400 seconds","error":"Too Many Requests"}}}}},"tags":["Spaces"],"security":[{"bearer":[]}]},"get":{"operationId":"SpacesController_getIntegrationIdMappings","summary":"Get integration ID mappings for a space","description":"Lists the external records linked to a Space so integrations can reconcile Valuecase Spaces with CRM or workflow entities. Legacy HubSpot IDs may use the format {portalId}_{objectId}.","parameters":[{"name":"id","required":true,"in":"path","description":"Database ID of the Space.","schema":{"example":"clw7h6z8u000108l8g3hd2m5r","type":"string"}}],"responses":{"200":{"description":"External-record mappings linked to the Space.","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/SpaceIntegrationIdMappingResponseDto"}}}}},"401":{"description":"The Bearer access token is missing, invalid, or expired. Exchange your API credentials for a new token and retry the request.","content":{"application/json":{"schema":{"type":"object","required":["statusCode","message"],"properties":{"statusCode":{"type":"number","description":"HTTP status code.","example":400},"message":{"oneOf":[{"type":"string"},{"type":"array","items":{"type":"string"}}],"description":"Human-readable explanation of the error.","example":"The request could not be processed."},"error":{"type":"string","description":"HTTP error name, when supplied by the endpoint.","example":"Bad Request"}}},"example":{"statusCode":401,"message":"Unauthorized","error":"Unauthorized"}}}},"403":{"description":"The access token is valid but does not grant the required permission for this resource.","content":{"application/json":{"schema":{"type":"object","required":["statusCode","message"],"properties":{"statusCode":{"type":"number","description":"HTTP status code.","example":400},"message":{"oneOf":[{"type":"string"},{"type":"array","items":{"type":"string"}}],"description":"Human-readable explanation of the error.","example":"The request could not be processed."},"error":{"type":"string","description":"HTTP error name, when supplied by the endpoint.","example":"Bad Request"}}},"example":{"statusCode":403,"message":"Forbidden resource","error":"Forbidden"}}}},"404":{"description":"The requested resource does not exist or is not accessible.","content":{"application/json":{"schema":{"type":"object","required":["statusCode","message"],"properties":{"statusCode":{"type":"number","description":"HTTP status code.","example":400},"message":{"oneOf":[{"type":"string"},{"type":"array","items":{"type":"string"}}],"description":"Human-readable explanation of the error.","example":"The request could not be processed."},"error":{"type":"string","description":"HTTP error name, when supplied by the endpoint.","example":"Bad Request"}}},"example":{"statusCode":404,"message":"Resource not found","error":"Not Found"}}}},"429":{"description":"The monthly API request limit has been reached. The message and rate-limit headers indicate when the allowance resets.","headers":{"Retry-After":{"description":"Seconds until the request allowance resets.","schema":{"type":"integer","example":86400}},"X-RateLimit-Limit":{"description":"Maximum requests in the current monthly period.","schema":{"type":"integer","example":20000}},"X-RateLimit-Remaining":{"description":"Requests remaining in the current monthly period.","schema":{"type":"integer","example":0}},"X-RateLimit-Reset":{"description":"Seconds until the current monthly period resets.","schema":{"type":"integer","example":86400}}},"content":{"application/json":{"schema":{"type":"object","required":["statusCode","message"],"properties":{"statusCode":{"type":"number","description":"HTTP status code.","example":400},"message":{"oneOf":[{"type":"string"},{"type":"array","items":{"type":"string"}}],"description":"Human-readable explanation of the error.","example":"The request could not be processed."},"error":{"type":"string","description":"HTTP error name, when supplied by the endpoint.","example":"Bad Request"}}},"example":{"statusCode":429,"message":"You have exceeded the monthly request limit. Please retry in 86400 seconds","error":"Too Many Requests"}}}}},"tags":["Spaces"],"security":[{"bearer":[]}]},"delete":{"operationId":"SpacesController_deleteIntegrationIdMappings","summary":"Delete integration ID mappings from a space","description":"Removes external-record mappings that exactly match the provider, entity type, record ID, and organization ID supplied in the request. The Space itself is not changed or deleted.","parameters":[{"name":"id","required":true,"in":"path","description":"Database ID of the Space.","schema":{"example":"clw7h6z8u000108l8g3hd2m5r","type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/DeleteSpaceIntegrationIdMappingDto"}}}},"responses":{"200":{"description":"Number of matching mappings removed.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DeleteSpaceIntegrationIdMappingResultDto"}}}},"400":{"description":"The request parameters or body are invalid.","content":{"application/json":{"schema":{"type":"object","required":["statusCode","message"],"properties":{"statusCode":{"type":"number","description":"HTTP status code.","example":400},"message":{"oneOf":[{"type":"string"},{"type":"array","items":{"type":"string"}}],"description":"Human-readable explanation of the error.","example":"The request could not be processed."},"error":{"type":"string","description":"HTTP error name, when supplied by the endpoint.","example":"Bad Request"}}},"example":{"statusCode":400,"message":"The request could not be processed.","error":"Bad Request"}}}},"401":{"description":"The Bearer access token is missing, invalid, or expired. Exchange your API credentials for a new token and retry the request.","content":{"application/json":{"schema":{"type":"object","required":["statusCode","message"],"properties":{"statusCode":{"type":"number","description":"HTTP status code.","example":400},"message":{"oneOf":[{"type":"string"},{"type":"array","items":{"type":"string"}}],"description":"Human-readable explanation of the error.","example":"The request could not be processed."},"error":{"type":"string","description":"HTTP error name, when supplied by the endpoint.","example":"Bad Request"}}},"example":{"statusCode":401,"message":"Unauthorized","error":"Unauthorized"}}}},"403":{"description":"The access token is valid but does not grant the required permission for this resource.","content":{"application/json":{"schema":{"type":"object","required":["statusCode","message"],"properties":{"statusCode":{"type":"number","description":"HTTP status code.","example":400},"message":{"oneOf":[{"type":"string"},{"type":"array","items":{"type":"string"}}],"description":"Human-readable explanation of the error.","example":"The request could not be processed."},"error":{"type":"string","description":"HTTP error name, when supplied by the endpoint.","example":"Bad Request"}}},"example":{"statusCode":403,"message":"Forbidden resource","error":"Forbidden"}}}},"404":{"description":"The requested resource does not exist or is not accessible.","content":{"application/json":{"schema":{"type":"object","required":["statusCode","message"],"properties":{"statusCode":{"type":"number","description":"HTTP status code.","example":400},"message":{"oneOf":[{"type":"string"},{"type":"array","items":{"type":"string"}}],"description":"Human-readable explanation of the error.","example":"The request could not be processed."},"error":{"type":"string","description":"HTTP error name, when supplied by the endpoint.","example":"Bad Request"}}},"example":{"statusCode":404,"message":"Resource not found","error":"Not Found"}}}},"429":{"description":"The monthly API request limit has been reached. The message and rate-limit headers indicate when the allowance resets.","headers":{"Retry-After":{"description":"Seconds until the request allowance resets.","schema":{"type":"integer","example":86400}},"X-RateLimit-Limit":{"description":"Maximum requests in the current monthly period.","schema":{"type":"integer","example":20000}},"X-RateLimit-Remaining":{"description":"Requests remaining in the current monthly period.","schema":{"type":"integer","example":0}},"X-RateLimit-Reset":{"description":"Seconds until the current monthly period resets.","schema":{"type":"integer","example":86400}}},"content":{"application/json":{"schema":{"type":"object","required":["statusCode","message"],"properties":{"statusCode":{"type":"number","description":"HTTP status code.","example":400},"message":{"oneOf":[{"type":"string"},{"type":"array","items":{"type":"string"}}],"description":"Human-readable explanation of the error.","example":"The request could not be processed."},"error":{"type":"string","description":"HTTP error name, when supplied by the endpoint.","example":"Bad Request"}}},"example":{"statusCode":429,"message":"You have exceeded the monthly request limit. Please retry in 86400 seconds","error":"Too Many Requests"}}}}},"tags":["Spaces"],"security":[{"bearer":[]}]}},"/spaces/async":{"post":{"operationId":"SpacesController_createAsync","summary":"Create a Space asynchronously","description":"Queues Space creation and returns immediately. The request body is identical to synchronous creation. Poll the status endpoint every one to two seconds until the state is COMPLETED or FAILED; completed requests include the created Space details and participant URL.","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateSpaceDto"}}}},"responses":{"201":{"description":"The Space creation request was accepted and queued.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SpaceCreationRequestAcceptedDto"}}}},"400":{"description":"The request parameters or body are invalid.","content":{"application/json":{"schema":{"type":"object","required":["statusCode","message"],"properties":{"statusCode":{"type":"number","description":"HTTP status code.","example":400},"message":{"oneOf":[{"type":"string"},{"type":"array","items":{"type":"string"}}],"description":"Human-readable explanation of the error.","example":"The request could not be processed."},"error":{"type":"string","description":"HTTP error name, when supplied by the endpoint.","example":"Bad Request"}}},"example":{"statusCode":400,"message":"The request could not be processed.","error":"Bad Request"}}}},"401":{"description":"The Bearer access token is missing, invalid, or expired. Exchange your API credentials for a new token and retry the request.","content":{"application/json":{"schema":{"type":"object","required":["statusCode","message"],"properties":{"statusCode":{"type":"number","description":"HTTP status code.","example":400},"message":{"oneOf":[{"type":"string"},{"type":"array","items":{"type":"string"}}],"description":"Human-readable explanation of the error.","example":"The request could not be processed."},"error":{"type":"string","description":"HTTP error name, when supplied by the endpoint.","example":"Bad Request"}}},"example":{"statusCode":401,"message":"Unauthorized","error":"Unauthorized"}}}},"403":{"description":"The access token is valid but does not grant the required permission for this resource.","content":{"application/json":{"schema":{"type":"object","required":["statusCode","message"],"properties":{"statusCode":{"type":"number","description":"HTTP status code.","example":400},"message":{"oneOf":[{"type":"string"},{"type":"array","items":{"type":"string"}}],"description":"Human-readable explanation of the error.","example":"The request could not be processed."},"error":{"type":"string","description":"HTTP error name, when supplied by the endpoint.","example":"Bad Request"}}},"example":{"statusCode":403,"message":"Forbidden resource","error":"Forbidden"}}}},"404":{"description":"The requested resource does not exist or is not accessible.","content":{"application/json":{"schema":{"type":"object","required":["statusCode","message"],"properties":{"statusCode":{"type":"number","description":"HTTP status code.","example":400},"message":{"oneOf":[{"type":"string"},{"type":"array","items":{"type":"string"}}],"description":"Human-readable explanation of the error.","example":"The request could not be processed."},"error":{"type":"string","description":"HTTP error name, when supplied by the endpoint.","example":"Bad Request"}}},"example":{"statusCode":404,"message":"Resource not found","error":"Not Found"}}}},"429":{"description":"The monthly API request limit has been reached. The message and rate-limit headers indicate when the allowance resets.","headers":{"Retry-After":{"description":"Seconds until the request allowance resets.","schema":{"type":"integer","example":86400}},"X-RateLimit-Limit":{"description":"Maximum requests in the current monthly period.","schema":{"type":"integer","example":20000}},"X-RateLimit-Remaining":{"description":"Requests remaining in the current monthly period.","schema":{"type":"integer","example":0}},"X-RateLimit-Reset":{"description":"Seconds until the current monthly period resets.","schema":{"type":"integer","example":86400}}},"content":{"application/json":{"schema":{"type":"object","required":["statusCode","message"],"properties":{"statusCode":{"type":"number","description":"HTTP status code.","example":400},"message":{"oneOf":[{"type":"string"},{"type":"array","items":{"type":"string"}}],"description":"Human-readable explanation of the error.","example":"The request could not be processed."},"error":{"type":"string","description":"HTTP error name, when supplied by the endpoint.","example":"Bad Request"}}},"example":{"statusCode":429,"message":"You have exceeded the monthly request limit. Please retry in 86400 seconds","error":"Too Many Requests"}}}}},"tags":["Spaces"],"security":[{"bearer":[]}]}},"/spaces/async/active-requests":{"get":{"operationId":"SpacesController_getActiveAsyncRequests","summary":"List active asynchronous creation requests","description":"Returns the current caller's queued and started Space creation requests. Completed and failed requests are omitted; use the status endpoint with a known request ID to retrieve a terminal result.","parameters":[],"responses":{"200":{"description":"Non-terminal creation requests for the current API user.","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/SpaceCreationRequestDto"}}}}},"401":{"description":"The Bearer access token is missing, invalid, or expired. Exchange your API credentials for a new token and retry the request.","content":{"application/json":{"schema":{"type":"object","required":["statusCode","message"],"properties":{"statusCode":{"type":"number","description":"HTTP status code.","example":400},"message":{"oneOf":[{"type":"string"},{"type":"array","items":{"type":"string"}}],"description":"Human-readable explanation of the error.","example":"The request could not be processed."},"error":{"type":"string","description":"HTTP error name, when supplied by the endpoint.","example":"Bad Request"}}},"example":{"statusCode":401,"message":"Unauthorized","error":"Unauthorized"}}}},"403":{"description":"The access token is valid but does not grant the required permission for this resource.","content":{"application/json":{"schema":{"type":"object","required":["statusCode","message"],"properties":{"statusCode":{"type":"number","description":"HTTP status code.","example":400},"message":{"oneOf":[{"type":"string"},{"type":"array","items":{"type":"string"}}],"description":"Human-readable explanation of the error.","example":"The request could not be processed."},"error":{"type":"string","description":"HTTP error name, when supplied by the endpoint.","example":"Bad Request"}}},"example":{"statusCode":403,"message":"Forbidden resource","error":"Forbidden"}}}},"429":{"description":"The monthly API request limit has been reached. The message and rate-limit headers indicate when the allowance resets.","headers":{"Retry-After":{"description":"Seconds until the request allowance resets.","schema":{"type":"integer","example":86400}},"X-RateLimit-Limit":{"description":"Maximum requests in the current monthly period.","schema":{"type":"integer","example":20000}},"X-RateLimit-Remaining":{"description":"Requests remaining in the current monthly period.","schema":{"type":"integer","example":0}},"X-RateLimit-Reset":{"description":"Seconds until the current monthly period resets.","schema":{"type":"integer","example":86400}}},"content":{"application/json":{"schema":{"type":"object","required":["statusCode","message"],"properties":{"statusCode":{"type":"number","description":"HTTP status code.","example":400},"message":{"oneOf":[{"type":"string"},{"type":"array","items":{"type":"string"}}],"description":"Human-readable explanation of the error.","example":"The request could not be processed."},"error":{"type":"string","description":"HTTP error name, when supplied by the endpoint.","example":"Bad Request"}}},"example":{"statusCode":429,"message":"You have exceeded the monthly request limit. Please retry in 86400 seconds","error":"Too Many Requests"}}}}},"tags":["Spaces"],"security":[{"bearer":[]}]}},"/spaces/async/{id}/status":{"get":{"operationId":"SpacesController_getAsyncStatus","summary":"Get asynchronous creation status","description":"Returns the latest state of one asynchronous Space creation request. Poll every one to two seconds until COMPLETED or FAILED. A completed response includes the Space root node ID, participant URL, and participant access token.","parameters":[{"name":"id","required":true,"in":"path","description":"Asynchronous creation request ID.","schema":{"format":"uuid","example":"3fa85f64-5717-4562-b3fc-2c963f66afa6","type":"string"}}],"responses":{"200":{"description":"Current state and result of the creation request.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SpaceCreationRequestDto"}}}},"401":{"description":"The Bearer access token is missing, invalid, or expired. Exchange your API credentials for a new token and retry the request.","content":{"application/json":{"schema":{"type":"object","required":["statusCode","message"],"properties":{"statusCode":{"type":"number","description":"HTTP status code.","example":400},"message":{"oneOf":[{"type":"string"},{"type":"array","items":{"type":"string"}}],"description":"Human-readable explanation of the error.","example":"The request could not be processed."},"error":{"type":"string","description":"HTTP error name, when supplied by the endpoint.","example":"Bad Request"}}},"example":{"statusCode":401,"message":"Unauthorized","error":"Unauthorized"}}}},"404":{"description":"The requested resource does not exist or is not accessible.","content":{"application/json":{"schema":{"type":"object","required":["statusCode","message"],"properties":{"statusCode":{"type":"number","description":"HTTP status code.","example":400},"message":{"oneOf":[{"type":"string"},{"type":"array","items":{"type":"string"}}],"description":"Human-readable explanation of the error.","example":"The request could not be processed."},"error":{"type":"string","description":"HTTP error name, when supplied by the endpoint.","example":"Bad Request"}}},"example":{"statusCode":404,"message":"Resource not found","error":"Not Found"}}}},"429":{"description":"The monthly API request limit has been reached. The message and rate-limit headers indicate when the allowance resets.","headers":{"Retry-After":{"description":"Seconds until the request allowance resets.","schema":{"type":"integer","example":86400}},"X-RateLimit-Limit":{"description":"Maximum requests in the current monthly period.","schema":{"type":"integer","example":20000}},"X-RateLimit-Remaining":{"description":"Requests remaining in the current monthly period.","schema":{"type":"integer","example":0}},"X-RateLimit-Reset":{"description":"Seconds until the current monthly period resets.","schema":{"type":"integer","example":86400}}},"content":{"application/json":{"schema":{"type":"object","required":["statusCode","message"],"properties":{"statusCode":{"type":"number","description":"HTTP status code.","example":400},"message":{"oneOf":[{"type":"string"},{"type":"array","items":{"type":"string"}}],"description":"Human-readable explanation of the error.","example":"The request could not be processed."},"error":{"type":"string","description":"HTTP error name, when supplied by the endpoint.","example":"Bad Request"}}},"example":{"statusCode":429,"message":"You have exceeded the monthly request limit. Please retry in 86400 seconds","error":"Too Many Requests"}}}}},"tags":["Spaces"],"security":[{"bearer":[]}]}},"/spaces/{spaceSlug}/custom-properties":{"get":{"operationId":"SpaceCustomPropertiesController_spaceCustomProperties","summary":"List custom properties for a space","description":"Returns the Space Property values used for personalization, content visibility, reporting, and workflow automation. Values use SINGLE_VALUE or MULTI_VALUE cardinality according to the tenant-level property definition.","parameters":[{"name":"spaceSlug","required":true,"in":"path","description":"Root node ID of the Space.","schema":{"example":"yp8gw6jc85sg3fyefg1yept7","type":"string"}},{"name":"includeHidden","required":false,"in":"query","description":"Include audit-only property rows that are normally hidden from API results.","schema":{"example":false,"type":"boolean"}}],"responses":{"200":{"description":"An array of space custom properties.","content":{"application/json":{"schema":{"type":"array","items":{"oneOf":[{"$ref":"#/components/schemas/SingleValueSpaceCustomPropertyResponseDto"},{"$ref":"#/components/schemas/MultiValueSpaceCustomPropertyResponseDto"}],"discriminator":{"propertyName":"type"}}}}}},"401":{"description":"The Bearer access token is missing, invalid, or expired. Exchange your API credentials for a new token and retry the request.","content":{"application/json":{"schema":{"type":"object","required":["statusCode","message"],"properties":{"statusCode":{"type":"number","description":"HTTP status code.","example":400},"message":{"oneOf":[{"type":"string"},{"type":"array","items":{"type":"string"}}],"description":"Human-readable explanation of the error.","example":"The request could not be processed."},"error":{"type":"string","description":"HTTP error name, when supplied by the endpoint.","example":"Bad Request"}}},"example":{"statusCode":401,"message":"Unauthorized","error":"Unauthorized"}}}},"403":{"description":"The access token is valid but does not grant the required permission for this resource.","content":{"application/json":{"schema":{"type":"object","required":["statusCode","message"],"properties":{"statusCode":{"type":"number","description":"HTTP status code.","example":400},"message":{"oneOf":[{"type":"string"},{"type":"array","items":{"type":"string"}}],"description":"Human-readable explanation of the error.","example":"The request could not be processed."},"error":{"type":"string","description":"HTTP error name, when supplied by the endpoint.","example":"Bad Request"}}},"example":{"statusCode":403,"message":"Forbidden resource","error":"Forbidden"}}}},"404":{"description":"The requested resource does not exist or is not accessible.","content":{"application/json":{"schema":{"type":"object","required":["statusCode","message"],"properties":{"statusCode":{"type":"number","description":"HTTP status code.","example":400},"message":{"oneOf":[{"type":"string"},{"type":"array","items":{"type":"string"}}],"description":"Human-readable explanation of the error.","example":"The request could not be processed."},"error":{"type":"string","description":"HTTP error name, when supplied by the endpoint.","example":"Bad Request"}}},"example":{"statusCode":404,"message":"Resource not found","error":"Not Found"}}}},"429":{"description":"The monthly API request limit has been reached. The message and rate-limit headers indicate when the allowance resets.","headers":{"Retry-After":{"description":"Seconds until the request allowance resets.","schema":{"type":"integer","example":86400}},"X-RateLimit-Limit":{"description":"Maximum requests in the current monthly period.","schema":{"type":"integer","example":20000}},"X-RateLimit-Remaining":{"description":"Requests remaining in the current monthly period.","schema":{"type":"integer","example":0}},"X-RateLimit-Reset":{"description":"Seconds until the current monthly period resets.","schema":{"type":"integer","example":86400}}},"content":{"application/json":{"schema":{"type":"object","required":["statusCode","message"],"properties":{"statusCode":{"type":"number","description":"HTTP status code.","example":400},"message":{"oneOf":[{"type":"string"},{"type":"array","items":{"type":"string"}}],"description":"Human-readable explanation of the error.","example":"The request could not be processed."},"error":{"type":"string","description":"HTTP error name, when supplied by the endpoint.","example":"Bad Request"}}},"example":{"statusCode":429,"message":"You have exceeded the monthly request limit. Please retry in 86400 seconds","error":"Too Many Requests"}}}},"500":{"description":"An unexpected error occurred while processing the request.","content":{"application/json":{"schema":{"type":"object","required":["statusCode","message"],"properties":{"statusCode":{"type":"number","description":"HTTP status code.","example":400},"message":{"oneOf":[{"type":"string"},{"type":"array","items":{"type":"string"}}],"description":"Human-readable explanation of the error.","example":"The request could not be processed."},"error":{"type":"string","description":"HTTP error name, when supplied by the endpoint.","example":"Bad Request"}}},"example":{"statusCode":500,"message":"Internal server error","error":"Internal Server Error"}}}}},"tags":["Spaces"],"security":[{"bearer":[]}]}},"/spaces/{spaceSlug}/custom-properties/{key}":{"patch":{"operationId":"SpaceCustomPropertiesController_updateCustomPropertyByKey","summary":"Update a custom property by key","description":"Updates one Space Property using its configured key. The value must match the tenant-level property definition; use a scalar string or number for single-value properties and an array of strings for multi-value properties. Updating an internal property can trigger configured workflows.","parameters":[{"name":"spaceSlug","required":true,"in":"path","description":"Root node ID of the Space.","schema":{"example":"yp8gw6jc85sg3fyefg1yept7","type":"string"}},{"name":"key","required":true,"in":"path","description":"Configured key of the Space Property to update.","schema":{"example":"country_code","type":"string"}}],"requestBody":{"required":true,"description":"The custom property data to update. Must include `name` and `value`. The value type is determined based on tenant-level custom property definitions.","content":{"application/json":{"schema":{"type":"object","properties":{"name":{"type":"string","description":"Space Property name. Keep this aligned with the key in the request path.","example":"country_code"},"value":{"oneOf":[{"type":"string"},{"type":"number"},{"type":"array","items":{"type":"string"}}],"description":"Value for the Space Property. The accepted shape is determined by its tenant-level definition.","example":"DE"},"expectedCategory":{"type":"string","enum":["SPACE_PROPERTY","INTERNAL_PROPERTY","MARKDOWN_CONTENT"],"description":"Optional safety check that rejects the update if the configured property belongs to a different category.","example":"SPACE_PROPERTY"},"type":{"type":"string","nullable":true,"deprecated":true,"description":"Deprecated and ignored. Cardinality is determined by the configured property definition.","example":null}},"required":["name","value"],"example":{"name":"country_code","value":"DE"}}}}},"responses":{"200":{"description":"The updated custom property.","content":{"application/json":{"schema":{"oneOf":[{"$ref":"#/components/schemas/SingleValueSpaceCustomPropertyResponseDto"},{"$ref":"#/components/schemas/MultiValueSpaceCustomPropertyResponseDto"}],"discriminator":{"propertyName":"type"}}}}},"400":{"description":"The request parameters or body are invalid.","content":{"application/json":{"schema":{"type":"object","required":["statusCode","message"],"properties":{"statusCode":{"type":"number","description":"HTTP status code.","example":400},"message":{"oneOf":[{"type":"string"},{"type":"array","items":{"type":"string"}}],"description":"Human-readable explanation of the error.","example":"The request could not be processed."},"error":{"type":"string","description":"HTTP error name, when supplied by the endpoint.","example":"Bad Request"}}},"example":{"statusCode":400,"message":"The request could not be processed.","error":"Bad Request"}}}},"401":{"description":"The Bearer access token is missing, invalid, or expired. Exchange your API credentials for a new token and retry the request.","content":{"application/json":{"schema":{"type":"object","required":["statusCode","message"],"properties":{"statusCode":{"type":"number","description":"HTTP status code.","example":400},"message":{"oneOf":[{"type":"string"},{"type":"array","items":{"type":"string"}}],"description":"Human-readable explanation of the error.","example":"The request could not be processed."},"error":{"type":"string","description":"HTTP error name, when supplied by the endpoint.","example":"Bad Request"}}},"example":{"statusCode":401,"message":"Unauthorized","error":"Unauthorized"}}}},"403":{"description":"The access token is valid but does not grant the required permission for this resource.","content":{"application/json":{"schema":{"type":"object","required":["statusCode","message"],"properties":{"statusCode":{"type":"number","description":"HTTP status code.","example":400},"message":{"oneOf":[{"type":"string"},{"type":"array","items":{"type":"string"}}],"description":"Human-readable explanation of the error.","example":"The request could not be processed."},"error":{"type":"string","description":"HTTP error name, when supplied by the endpoint.","example":"Bad Request"}}},"example":{"statusCode":403,"message":"Forbidden resource","error":"Forbidden"}}}},"404":{"description":"The requested resource does not exist or is not accessible.","content":{"application/json":{"schema":{"type":"object","required":["statusCode","message"],"properties":{"statusCode":{"type":"number","description":"HTTP status code.","example":400},"message":{"oneOf":[{"type":"string"},{"type":"array","items":{"type":"string"}}],"description":"Human-readable explanation of the error.","example":"The request could not be processed."},"error":{"type":"string","description":"HTTP error name, when supplied by the endpoint.","example":"Bad Request"}}},"example":{"statusCode":404,"message":"Resource not found","error":"Not Found"}}}},"429":{"description":"The monthly API request limit has been reached. The message and rate-limit headers indicate when the allowance resets.","headers":{"Retry-After":{"description":"Seconds until the request allowance resets.","schema":{"type":"integer","example":86400}},"X-RateLimit-Limit":{"description":"Maximum requests in the current monthly period.","schema":{"type":"integer","example":20000}},"X-RateLimit-Remaining":{"description":"Requests remaining in the current monthly period.","schema":{"type":"integer","example":0}},"X-RateLimit-Reset":{"description":"Seconds until the current monthly period resets.","schema":{"type":"integer","example":86400}}},"content":{"application/json":{"schema":{"type":"object","required":["statusCode","message"],"properties":{"statusCode":{"type":"number","description":"HTTP status code.","example":400},"message":{"oneOf":[{"type":"string"},{"type":"array","items":{"type":"string"}}],"description":"Human-readable explanation of the error.","example":"The request could not be processed."},"error":{"type":"string","description":"HTTP error name, when supplied by the endpoint.","example":"Bad Request"}}},"example":{"statusCode":429,"message":"You have exceeded the monthly request limit. Please retry in 86400 seconds","error":"Too Many Requests"}}}},"500":{"description":"An unexpected error occurred while processing the request.","content":{"application/json":{"schema":{"type":"object","required":["statusCode","message"],"properties":{"statusCode":{"type":"number","description":"HTTP status code.","example":400},"message":{"oneOf":[{"type":"string"},{"type":"array","items":{"type":"string"}}],"description":"Human-readable explanation of the error.","example":"The request could not be processed."},"error":{"type":"string","description":"HTTP error name, when supplied by the endpoint.","example":"Bad Request"}}},"example":{"statusCode":500,"message":"Internal server error","error":"Internal Server Error"}}}}},"tags":["Spaces"],"security":[{"bearer":[]}]}},"/forms":{"get":{"operationId":"FormController_getForms","summary":"List forms","description":"Returns a paginated collection of forms across accessible Spaces. Filter by Space, completion state, or completion timestamp, and optionally embed submissions for synchronization workflows.","parameters":[{"description":"Filter forms by their owning Space database IDs.","required":false,"name":"spaceIds","in":"query","schema":{"example":["clw7h6z8u000108l8g3hd2m5r"],"type":"array","items":{"type":"string"}}},{"description":"Filter forms by their owning Space root node IDs.","required":false,"name":"spaceRootNodeIds","in":"query","schema":{"example":["yp8gw6jc85sg3fyefg1yept7"],"type":"array","items":{"type":"string"}}},{"description":"One-based result page.","required":false,"name":"page","in":"query","schema":{"minimum":1,"default":1,"example":1,"type":"number"}},{"description":"Number of forms returned per page, from 1 to 100.","required":false,"name":"itemsPerPage","in":"query","schema":{"minimum":1,"maximum":100,"default":10,"example":25,"type":"number"}},{"description":"Include soft-deleted forms.","required":false,"name":"includeDeleted","in":"query","schema":{"default":false,"example":false,"type":"boolean"}},{"description":"Include forms that have not been completed.","required":false,"name":"includeNotCompleted","in":"query","schema":{"default":false,"example":true,"type":"boolean"}},{"description":"Return forms completed after this timestamp.","required":false,"name":"completedAfter","in":"query","schema":{"format":"date-time","example":"2026-01-01T00:00:00.000Z","type":"string"}},{"description":"Include form submissions in each form result.","required":false,"name":"includeSubmissions","in":"query","schema":{"default":false,"example":true,"type":"boolean"}},{"description":"Represent table-answer object keys using stable UUIDs or column labels.","required":false,"name":"tableColumnKeys","in":"query","schema":{"default":"label","example":"label","enum":["uuid","label"],"type":"string"}}],"responses":{"200":{"description":"Paginated forms matching the supplied filters.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/FormListResponse"}}}},"400":{"description":"The request parameters or body are invalid.","content":{"application/json":{"schema":{"type":"object","required":["statusCode","message"],"properties":{"statusCode":{"type":"number","description":"HTTP status code.","example":400},"message":{"oneOf":[{"type":"string"},{"type":"array","items":{"type":"string"}}],"description":"Human-readable explanation of the error.","example":"The request could not be processed."},"error":{"type":"string","description":"HTTP error name, when supplied by the endpoint.","example":"Bad Request"}}},"example":{"statusCode":400,"message":"The request could not be processed.","error":"Bad Request"}}}},"401":{"description":"The Bearer access token is missing, invalid, or expired. Exchange your API credentials for a new token and retry the request.","content":{"application/json":{"schema":{"type":"object","required":["statusCode","message"],"properties":{"statusCode":{"type":"number","description":"HTTP status code.","example":400},"message":{"oneOf":[{"type":"string"},{"type":"array","items":{"type":"string"}}],"description":"Human-readable explanation of the error.","example":"The request could not be processed."},"error":{"type":"string","description":"HTTP error name, when supplied by the endpoint.","example":"Bad Request"}}},"example":{"statusCode":401,"message":"Unauthorized","error":"Unauthorized"}}}},"403":{"description":"The access token is valid but does not grant the required permission for this resource.","content":{"application/json":{"schema":{"type":"object","required":["statusCode","message"],"properties":{"statusCode":{"type":"number","description":"HTTP status code.","example":400},"message":{"oneOf":[{"type":"string"},{"type":"array","items":{"type":"string"}}],"description":"Human-readable explanation of the error.","example":"The request could not be processed."},"error":{"type":"string","description":"HTTP error name, when supplied by the endpoint.","example":"Bad Request"}}},"example":{"statusCode":403,"message":"Forbidden resource","error":"Forbidden"}}}},"429":{"description":"The monthly API request limit has been reached. The message and rate-limit headers indicate when the allowance resets.","headers":{"Retry-After":{"description":"Seconds until the request allowance resets.","schema":{"type":"integer","example":86400}},"X-RateLimit-Limit":{"description":"Maximum requests in the current monthly period.","schema":{"type":"integer","example":20000}},"X-RateLimit-Remaining":{"description":"Requests remaining in the current monthly period.","schema":{"type":"integer","example":0}},"X-RateLimit-Reset":{"description":"Seconds until the current monthly period resets.","schema":{"type":"integer","example":86400}}},"content":{"application/json":{"schema":{"type":"object","required":["statusCode","message"],"properties":{"statusCode":{"type":"number","description":"HTTP status code.","example":400},"message":{"oneOf":[{"type":"string"},{"type":"array","items":{"type":"string"}}],"description":"Human-readable explanation of the error.","example":"The request could not be processed."},"error":{"type":"string","description":"HTTP error name, when supplied by the endpoint.","example":"Bad Request"}}},"example":{"statusCode":429,"message":"You have exceeded the monthly request limit. Please retry in 86400 seconds","error":"Too Many Requests"}}}}},"tags":["Forms"],"security":[{"bearer":[]}]}},"/forms/{formNodeId}/submissions":{"get":{"operationId":"FormController_getFormSubmissions","summary":"List submissions for a form","description":"Returns a paginated history of response sets for one form. Use tableColumnKeys to choose whether table-answer objects use stable column UUIDs or human-readable labels.","parameters":[{"name":"formNodeId","required":true,"in":"path","description":"Stable node ID of the form.","schema":{"example":"t4k9vqz2wsd7hxfm1jgnp58b","type":"string"}},{"description":"One-based result page.","required":false,"name":"page","in":"query","schema":{"minimum":1,"default":1,"example":1,"type":"number"}},{"description":"Number of submissions returned per page, from 1 to 100.","required":false,"name":"itemsPerPage","in":"query","schema":{"minimum":1,"maximum":100,"default":10,"example":25,"type":"number"}},{"description":"Represent table-answer object keys using stable UUIDs or column labels.","required":false,"name":"tableColumnKeys","in":"query","schema":{"default":"label","example":"label","enum":["uuid","label"],"type":"string"}}],"responses":{"200":{"description":"Paginated submissions for the requested form.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/FormSubmissionListResponse"}}}},"400":{"description":"The request parameters or body are invalid.","content":{"application/json":{"schema":{"type":"object","required":["statusCode","message"],"properties":{"statusCode":{"type":"number","description":"HTTP status code.","example":400},"message":{"oneOf":[{"type":"string"},{"type":"array","items":{"type":"string"}}],"description":"Human-readable explanation of the error.","example":"The request could not be processed."},"error":{"type":"string","description":"HTTP error name, when supplied by the endpoint.","example":"Bad Request"}}},"example":{"statusCode":400,"message":"The request could not be processed.","error":"Bad Request"}}}},"401":{"description":"The Bearer access token is missing, invalid, or expired. Exchange your API credentials for a new token and retry the request.","content":{"application/json":{"schema":{"type":"object","required":["statusCode","message"],"properties":{"statusCode":{"type":"number","description":"HTTP status code.","example":400},"message":{"oneOf":[{"type":"string"},{"type":"array","items":{"type":"string"}}],"description":"Human-readable explanation of the error.","example":"The request could not be processed."},"error":{"type":"string","description":"HTTP error name, when supplied by the endpoint.","example":"Bad Request"}}},"example":{"statusCode":401,"message":"Unauthorized","error":"Unauthorized"}}}},"403":{"description":"The access token is valid but does not grant the required permission for this resource.","content":{"application/json":{"schema":{"type":"object","required":["statusCode","message"],"properties":{"statusCode":{"type":"number","description":"HTTP status code.","example":400},"message":{"oneOf":[{"type":"string"},{"type":"array","items":{"type":"string"}}],"description":"Human-readable explanation of the error.","example":"The request could not be processed."},"error":{"type":"string","description":"HTTP error name, when supplied by the endpoint.","example":"Bad Request"}}},"example":{"statusCode":403,"message":"Forbidden resource","error":"Forbidden"}}}},"404":{"description":"The requested resource does not exist or is not accessible.","content":{"application/json":{"schema":{"type":"object","required":["statusCode","message"],"properties":{"statusCode":{"type":"number","description":"HTTP status code.","example":400},"message":{"oneOf":[{"type":"string"},{"type":"array","items":{"type":"string"}}],"description":"Human-readable explanation of the error.","example":"The request could not be processed."},"error":{"type":"string","description":"HTTP error name, when supplied by the endpoint.","example":"Bad Request"}}},"example":{"statusCode":404,"message":"Resource not found","error":"Not Found"}}}},"429":{"description":"The monthly API request limit has been reached. The message and rate-limit headers indicate when the allowance resets.","headers":{"Retry-After":{"description":"Seconds until the request allowance resets.","schema":{"type":"integer","example":86400}},"X-RateLimit-Limit":{"description":"Maximum requests in the current monthly period.","schema":{"type":"integer","example":20000}},"X-RateLimit-Remaining":{"description":"Requests remaining in the current monthly period.","schema":{"type":"integer","example":0}},"X-RateLimit-Reset":{"description":"Seconds until the current monthly period resets.","schema":{"type":"integer","example":86400}}},"content":{"application/json":{"schema":{"type":"object","required":["statusCode","message"],"properties":{"statusCode":{"type":"number","description":"HTTP status code.","example":400},"message":{"oneOf":[{"type":"string"},{"type":"array","items":{"type":"string"}}],"description":"Human-readable explanation of the error.","example":"The request could not be processed."},"error":{"type":"string","description":"HTTP error name, when supplied by the endpoint.","example":"Bad Request"}}},"example":{"statusCode":429,"message":"You have exceeded the monthly request limit. Please retry in 86400 seconds","error":"Too Many Requests"}}}}},"tags":["Forms"],"security":[{"bearer":[]}]},"post":{"operationId":"FormController_createOrUpdateFormSubmission","summary":"Create or update a form submission","description":"Writes answers for a form using stable question node IDs. Send isSubmitted=true to complete the response, or omit it to keep the response as a draft. Existing draft answers for the caller are updated when applicable.","parameters":[{"name":"formNodeId","required":true,"in":"path","description":"Stable node ID of the form.","schema":{"example":"t4k9vqz2wsd7hxfm1jgnp58b","type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateOrUpdateFormSubmissionDto"}}}},"responses":{"201":{"description":"The created or updated form submission.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/FormSubmission"}}}},"400":{"description":"The request parameters or body are invalid.","content":{"application/json":{"schema":{"type":"object","required":["statusCode","message"],"properties":{"statusCode":{"type":"number","description":"HTTP status code.","example":400},"message":{"oneOf":[{"type":"string"},{"type":"array","items":{"type":"string"}}],"description":"Human-readable explanation of the error.","example":"The request could not be processed."},"error":{"type":"string","description":"HTTP error name, when supplied by the endpoint.","example":"Bad Request"}}},"example":{"statusCode":400,"message":"The request could not be processed.","error":"Bad Request"}}}},"401":{"description":"The Bearer access token is missing, invalid, or expired. Exchange your API credentials for a new token and retry the request.","content":{"application/json":{"schema":{"type":"object","required":["statusCode","message"],"properties":{"statusCode":{"type":"number","description":"HTTP status code.","example":400},"message":{"oneOf":[{"type":"string"},{"type":"array","items":{"type":"string"}}],"description":"Human-readable explanation of the error.","example":"The request could not be processed."},"error":{"type":"string","description":"HTTP error name, when supplied by the endpoint.","example":"Bad Request"}}},"example":{"statusCode":401,"message":"Unauthorized","error":"Unauthorized"}}}},"403":{"description":"The access token is valid but does not grant the required permission for this resource.","content":{"application/json":{"schema":{"type":"object","required":["statusCode","message"],"properties":{"statusCode":{"type":"number","description":"HTTP status code.","example":400},"message":{"oneOf":[{"type":"string"},{"type":"array","items":{"type":"string"}}],"description":"Human-readable explanation of the error.","example":"The request could not be processed."},"error":{"type":"string","description":"HTTP error name, when supplied by the endpoint.","example":"Bad Request"}}},"example":{"statusCode":403,"message":"Forbidden resource","error":"Forbidden"}}}},"404":{"description":"The requested resource does not exist or is not accessible.","content":{"application/json":{"schema":{"type":"object","required":["statusCode","message"],"properties":{"statusCode":{"type":"number","description":"HTTP status code.","example":400},"message":{"oneOf":[{"type":"string"},{"type":"array","items":{"type":"string"}}],"description":"Human-readable explanation of the error.","example":"The request could not be processed."},"error":{"type":"string","description":"HTTP error name, when supplied by the endpoint.","example":"Bad Request"}}},"example":{"statusCode":404,"message":"Resource not found","error":"Not Found"}}}},"429":{"description":"The monthly API request limit has been reached. The message and rate-limit headers indicate when the allowance resets.","headers":{"Retry-After":{"description":"Seconds until the request allowance resets.","schema":{"type":"integer","example":86400}},"X-RateLimit-Limit":{"description":"Maximum requests in the current monthly period.","schema":{"type":"integer","example":20000}},"X-RateLimit-Remaining":{"description":"Requests remaining in the current monthly period.","schema":{"type":"integer","example":0}},"X-RateLimit-Reset":{"description":"Seconds until the current monthly period resets.","schema":{"type":"integer","example":86400}}},"content":{"application/json":{"schema":{"type":"object","required":["statusCode","message"],"properties":{"statusCode":{"type":"number","description":"HTTP status code.","example":400},"message":{"oneOf":[{"type":"string"},{"type":"array","items":{"type":"string"}}],"description":"Human-readable explanation of the error.","example":"The request could not be processed."},"error":{"type":"string","description":"HTTP error name, when supplied by the endpoint.","example":"Bad Request"}}},"example":{"statusCode":429,"message":"You have exceeded the monthly request limit. Please retry in 86400 seconds","error":"Too Many Requests"}}}}},"tags":["Forms"],"security":[{"bearer":[]}]}},"/forms/{formNodeId}/submissions/{submissionId}/revert":{"post":{"operationId":"FormController_revertFormSubmission","summary":"Revert a form submission","description":"Reopens a completed submission by reverting it to its previous state. The form and submission must belong to the authenticated tenant, and the token must permit Space modification.","parameters":[{"name":"formNodeId","required":true,"in":"path","description":"Stable node ID of the form.","schema":{"example":"t4k9vqz2wsd7hxfm1jgnp58b","type":"string"}},{"name":"submissionId","required":true,"in":"path","description":"Database ID of the submission to revert.","schema":{"format":"uuid","example":"9c8f2d1e-4b7a-4c3d-9e6f-1a2b3c4d5e6f","type":"string"}}],"responses":{"201":{"description":"The reverted form submission.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/FormSubmission"}}}},"400":{"description":"The request parameters or body are invalid.","content":{"application/json":{"schema":{"type":"object","required":["statusCode","message"],"properties":{"statusCode":{"type":"number","description":"HTTP status code.","example":400},"message":{"oneOf":[{"type":"string"},{"type":"array","items":{"type":"string"}}],"description":"Human-readable explanation of the error.","example":"The request could not be processed."},"error":{"type":"string","description":"HTTP error name, when supplied by the endpoint.","example":"Bad Request"}}},"example":{"statusCode":400,"message":"The request could not be processed.","error":"Bad Request"}}}},"401":{"description":"The Bearer access token is missing, invalid, or expired. Exchange your API credentials for a new token and retry the request.","content":{"application/json":{"schema":{"type":"object","required":["statusCode","message"],"properties":{"statusCode":{"type":"number","description":"HTTP status code.","example":400},"message":{"oneOf":[{"type":"string"},{"type":"array","items":{"type":"string"}}],"description":"Human-readable explanation of the error.","example":"The request could not be processed."},"error":{"type":"string","description":"HTTP error name, when supplied by the endpoint.","example":"Bad Request"}}},"example":{"statusCode":401,"message":"Unauthorized","error":"Unauthorized"}}}},"403":{"description":"The access token is valid but does not grant the required permission for this resource.","content":{"application/json":{"schema":{"type":"object","required":["statusCode","message"],"properties":{"statusCode":{"type":"number","description":"HTTP status code.","example":400},"message":{"oneOf":[{"type":"string"},{"type":"array","items":{"type":"string"}}],"description":"Human-readable explanation of the error.","example":"The request could not be processed."},"error":{"type":"string","description":"HTTP error name, when supplied by the endpoint.","example":"Bad Request"}}},"example":{"statusCode":403,"message":"Forbidden resource","error":"Forbidden"}}}},"404":{"description":"The requested resource does not exist or is not accessible.","content":{"application/json":{"schema":{"type":"object","required":["statusCode","message"],"properties":{"statusCode":{"type":"number","description":"HTTP status code.","example":400},"message":{"oneOf":[{"type":"string"},{"type":"array","items":{"type":"string"}}],"description":"Human-readable explanation of the error.","example":"The request could not be processed."},"error":{"type":"string","description":"HTTP error name, when supplied by the endpoint.","example":"Bad Request"}}},"example":{"statusCode":404,"message":"Resource not found","error":"Not Found"}}}},"429":{"description":"The monthly API request limit has been reached. The message and rate-limit headers indicate when the allowance resets.","headers":{"Retry-After":{"description":"Seconds until the request allowance resets.","schema":{"type":"integer","example":86400}},"X-RateLimit-Limit":{"description":"Maximum requests in the current monthly period.","schema":{"type":"integer","example":20000}},"X-RateLimit-Remaining":{"description":"Requests remaining in the current monthly period.","schema":{"type":"integer","example":0}},"X-RateLimit-Reset":{"description":"Seconds until the current monthly period resets.","schema":{"type":"integer","example":86400}}},"content":{"application/json":{"schema":{"type":"object","required":["statusCode","message"],"properties":{"statusCode":{"type":"number","description":"HTTP status code.","example":400},"message":{"oneOf":[{"type":"string"},{"type":"array","items":{"type":"string"}}],"description":"Human-readable explanation of the error.","example":"The request could not be processed."},"error":{"type":"string","description":"HTTP error name, when supplied by the endpoint.","example":"Bad Request"}}},"example":{"statusCode":429,"message":"You have exceeded the monthly request limit. Please retry in 86400 seconds","error":"Too Many Requests"}}}}},"tags":["Forms"],"security":[{"bearer":[]}]}}},"info":{"title":"Valuecase Public API","description":"\nBuild integrations that create and manage Spaces, link them to external systems, work with Space Properties, and synchronize Form responses.\n\n### Getting started\n1. Open [Administration → Developer](https://app.valuecase.com/dashboard/administration/developer) to get your client ID and client secret.\n2. Start with **Authentication** below and exchange the credentials for an access token.\n3. Send the token with every request as `Authorization: Bearer <access_token>`.\n\nAccess tokens are valid for **600 seconds (10 minutes)**. Request a new token when the current token expires or an API request returns HTTP 401.\n\n### Monthly request limits\nPublic API requests share a tenant-level monthly allowance. Standard limits are:\n\n| Plan | Requests per month |\n| --- | ---: |\n| Trial | 1,000 |\n| Starter | 1,000 |\n| Growth | 20,000 |\n| Scale | 100,000 |\n\nWhen the allowance is exhausted, requests return **HTTP 429**. The response message and rate-limit headers report how many seconds remain until the allowance resets at the end of the month.\n\n### Guides\n- [Valuecase Public API overview](https://help.valuecase.com/en/articles/521957-valuecase-public-api)\n- [Creating Spaces via API](https://help.valuecase.com/en/articles/677384-creating-spaces-via-api)\n    ","version":"1.0","contact":{}},"tags":[{"name":"Authentication","description":"Start here. Exchange the API client ID and client secret from Administration → Developer for a Bearer access token, then use that token with the Spaces and Forms endpoints. Tokens are valid for 600 seconds (10 minutes); keep the client secret in server-side code or a secret manager and request a fresh token when needed."},{"name":"Spaces","description":"Spaces are secure, customer-facing collaboration environments created from a Valuecase template. Use these endpoints to create and manage Spaces, attach Space Properties, and map Spaces to records in your CRM or another external system. For production workflows that can take longer, prefer asynchronous creation and poll the request status."},{"name":"Forms","description":"Forms collect structured information inside a Space. Use these endpoints to discover Forms, read submissions, create or update answers, and revert a submission. Form and submission identifiers come from the content of the Space."}],"servers":[{"url":"/spaces/api"}],"components":{"securitySchemes":{"bearer":{"scheme":"bearer","bearerFormat":"JWT","type":"http","description":"Pass the access token returned by the Authentication API in the Authorization header using the format \"Bearer {token}\". Tokens expire after 600 seconds."}},"schemas":{"ExchangeApiKeyDto":{"type":"object","required":["client_id","client_secret"],"properties":{"client_id":{"type":"string","description":"API client ID shown in Administration → Developer. This identifies the tenant API credential.","example":"client_2f4d7390-3e61-4fa8-9af5-9d61ea647c70"},"client_secret":{"type":"string","format":"password","description":"API client secret shown in Administration → Developer. Treat it like a password and never expose it in client-side code or logs.","example":"vc_secret_example_do_not_use"}}},"ExchangeApiKeyResult":{"type":"object","required":["access_token","token_type","expires_in"],"properties":{"access_token":{"type":"string","description":"JWT access token to send in the Authorization header of Valuecase Public API requests.","example":"eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9.example.signature"},"token_type":{"type":"string","default":"Bearer","description":"Type of the access token. Always `Bearer`.","example":"Bearer"},"expires_in":{"type":"number","default":600,"description":"Access token lifetime in seconds. Request a new token after this period.","example":600}}},"SpaceDto":{"type":"object","properties":{"companyName":{"type":"string","description":"Customer or company name displayed throughout the Space.","example":"Example Inc."},"companyWebsite":{"type":"string","description":"Public website of the customer or company.","example":"https://example.com"},"contactEmail":{"type":"string","description":"Email address of the primary customer contact.","example":"contact@example.com"},"contactFirstName":{"type":"string","description":"First name of the primary customer contact.","example":"Ada"},"contactLastName":{"type":"string","description":"Last name of the primary customer contact.","example":"Lovelace"},"blockNavigationEnabled":{"type":"boolean","description":"When true, buyers must complete content in sequence instead of navigating freely.","example":true},"commentsOpenByDefault":{"type":"boolean","description":"When true, comment threads are expanded when a participant opens the Space.","example":true},"companyLogoUrl":{"type":"string","description":"Publicly reachable logo URL used to personalize the created Space.","example":"https://example.com/logo.png"}},"required":["companyName","contactFirstName","contactLastName"]},"SpaceIntegrationAttribute":{"type":"object","properties":{"thirdParty":{"type":"string","enum":["HubSpot"],"description":"Deprecated integration provider identifier.","example":"HubSpot","deprecated":true},"attributeName":{"type":"string","description":"Deprecated HubSpot property name.","example":"dealname","deprecated":true},"attributeValue":{"type":"string","description":"Deprecated value to associate with the HubSpot property.","example":"Example Inc. Expansion","deprecated":true}},"required":["thirdParty","attributeName","attributeValue"]},"SpaceIntegrationIdMappingDto":{"type":"object","properties":{"thirdParty":{"type":"string","enum":["Custom"],"description":"External system provider. Public integrations should normally use Custom.","example":"Custom"},"thirdPartyEntityType":{"type":"string","description":"External system-specific entity type (e.g. Lead, Opportunity, etc.)","example":"Lead"},"thirdPartyId":{"type":"string","description":"External system-specific corresponding entity ID (e.g. Deal ID, Opportunity ID, etc.). Note: For HubSpot integrations, this field is prefixed with the portal ID in the format {portalId}_{objectId}.","example":"1954687215"},"thirdPartyOrganizationId":{"type":"string","description":"External system-specific organization ID (e.g. Salesforce Organization ID)","example":"1954687215"}},"required":["thirdParty","thirdPartyEntityType","thirdPartyId"]},"CreateSpaceDto":{"type":"object","properties":{"templateId":{"type":"string","description":"Root node ID of the Valuecase template to copy when creating the Space.","example":"ze3ljqvzwaw8ufyitv6jdq08"},"ownerId":{"type":"string","description":"Valuecase user ID to assign as the Space owner. Supply either ownerId or ownerEmail.","example":null,"nullable":true},"ownerEmail":{"type":"string","description":"Email address of the Valuecase user to assign as owner when ownerId is not known. Supply either ownerId or ownerEmail.","example":"owner@example.com"},"data":{"description":"Standard company, contact, branding, and buyer-experience values used to personalize the new Space.","example":{"companyName":"Example Inc.","companyWebsite":"https://example.com","contactEmail":"contact@example.com","contactFirstName":"Ada","contactLastName":"Lovelace","companyLogoUrl":"https://example.com/logo.png","blockNavigationEnabled":true,"commentsOpenByDefault":true},"allOf":[{"$ref":"#/components/schemas/SpaceDto"}]},"integrationAttributes":{"description":"Deprecated HubSpot attribute mapping. Use integrationIds to link the Space to external records.","example":[{"thirdParty":"HubSpot","attributeName":"dealname","attributeValue":"Example Inc. Expansion"}],"deprecated":true,"type":"array","items":{"$ref":"#/components/schemas/SpaceIntegrationAttribute"}},"integrationIds":{"description":"External records to link to the new Space, such as a CRM lead, opportunity, or deal.","example":[{"thirdParty":"Custom","thirdPartyEntityType":"Lead","thirdPartyId":"1954687215","thirdPartyOrganizationId":"1954687215"}],"type":"array","items":{"$ref":"#/components/schemas/SpaceIntegrationIdMappingDto"}},"customProperties":{"type":"array","description":"Additional custom properties can be added here. The type is determined based on tenant-level custom property definitions.","items":{"type":"object","properties":{"name":{"type":"string","description":"The name of the custom property","example":"country_code"},"value":{"oneOf":[{"type":"string"},{"type":"number"},{"type":"array","items":{"type":"string"}}],"description":"Value for the Space Property. The accepted shape is determined by its tenant-level definition.","example":"DE"},"values":{"type":"array","items":{"type":"string"},"description":"Alias for value when sending a multi-value Space Property. Supply value or values, never both.","example":["Sales","Marketing"]},"type":{"type":"string","enum":["SINGLE_VALUE","MULTI_VALUE"],"description":"Deprecated and ignored. Cardinality is determined by the configured Space Property definition.","deprecated":true,"example":"MULTI_VALUE"}},"required":["name"],"oneOf":[{"required":["value"]},{"required":["values"]}],"example":{"name":"country_code","value":"DE"}},"example":[{"name":"country_code","value":"DE"},{"name":"departments","values":["Sales","Marketing"]}]},"teamIds":{"description":"Ids of teams which can access this Space. If not provided, the Space will be accessible to everyone in the Tenant.","example":["8f1c6b2a-5d47-4e93-a0f8-3b7c9d1e5a24","c04e7a19-2b83-4d61-9f7e-5a8c3b0d6e42"],"type":"array","items":{"type":"string"}}},"required":["templateId","data"]},"SpaceCreationResult":{"type":"object","properties":{"id":{"type":"string","description":"Root node ID of the created Space.","example":"yp8gw6jc85sg3fyefg1yept7"},"slug":{"type":"string","description":"URL slug assigned to the created Space.","example":"example-inc-onboarding"},"createdAt":{"type":"string","description":"Timestamp at which the Space was created.","format":"date-time","example":"2026-05-21T17:09:42.266Z"},"ownerId":{"type":"string","description":"Valuecase user ID of the assigned Space owner.","example":"valuecase|99ad6b1a-c49d-4b51-8d39-e9590687b50b"},"url":{"type":"string","description":"Shareable participant URL for the created Space.","example":"https://share.valuecase.com/spaces/example-inc-onboarding?token=6e52a46c8f1"},"authToken":{"type":"string","description":"This auth token is used to authorize external access to the space (e.g. when you send it to the end-user), and should be passed as a 'token' query parameter to the space URL. For example: https://share.valuecase.com/spaces/demo?token=123","example":"6e52a46c8f1"}},"required":["id","slug","createdAt","ownerId","url","authToken"]},"UpdateSpaceDto":{"type":"object","properties":{"ownerId":{"type":"string","description":"Valuecase user ID to assign as the new Space owner.","example":"valuecase|99ad6b1a-c49d-4b51-8d39-e9590687b50b"},"archived":{"type":"boolean","description":"Set to true to archive the Space, or false to restore it to active Spaces.","example":true},"disableShareSpace":{"type":"boolean","description":"Disable the ability to share the Space from Valuecase.","example":false},"disableDownloads":{"type":"boolean","description":"Disable downloads for participants in the Space.","example":false}}},"SpaceAuthOrganizationDto":{"type":"object","properties":{"domain":{"type":"string","description":"Email domain whose members may open the Space.","example":"example.com"},"name":{"type":"string","description":"Display name of the organization owning the domain.","example":"Example Inc"}},"required":["domain","name"]},"SpaceAuthSettingsResponseDto":{"type":"object","properties":{"restriction":{"enum":["OPEN","OPEN_WITH_EMAIL","RESTRICTED"],"type":"string","description":"Who may open the Space: OPEN = anyone with the link, OPEN_WITH_EMAIL = anyone with the link after entering an email address, RESTRICTED = only whitelisted users and domains.","example":"OPEN"},"passwordRequired":{"type":"boolean","description":"Whether opening the Space additionally requires the password. Requires `password` to be set.","example":false},"password":{"type":"string","description":"Password guarding the Space.","example":"correct-horse-battery"},"passwordAutoGenerated":{"type":"boolean","description":"Whether the current password was generated by Valuecase rather than chosen by a user.","example":false},"whitelistedOrganizations":{"description":"Organizations whose email domains may open the Space even when it is RESTRICTED.","example":[{"domain":"example.com","name":"Example Inc"}],"type":"array","items":{"$ref":"#/components/schemas/SpaceAuthOrganizationDto"}},"token":{"type":"string","description":"Token authorizing external access to the Space, to be passed as the 'token' query parameter of the Space URL. Read-only.","example":"6e52a46c8f1"}},"required":["restriction","token"]},"UpdateSpaceAuthSettingsDto":{"type":"object","properties":{"restriction":{"enum":["OPEN","OPEN_WITH_EMAIL","RESTRICTED"],"type":"string","description":"Who may open the Space: OPEN = anyone with the link, OPEN_WITH_EMAIL = anyone with the link after entering an email address, RESTRICTED = only whitelisted users and domains.","example":"OPEN"},"passwordRequired":{"type":"boolean","description":"Whether opening the Space additionally requires the password. Requires `password` to be set.","example":false},"password":{"type":"string","description":"Password guarding the Space.","example":"correct-horse-battery"},"passwordAutoGenerated":{"type":"boolean","description":"Whether the current password was generated by Valuecase rather than chosen by a user.","example":false},"whitelistedOrganizations":{"description":"Organizations whose email domains may open the Space even when it is RESTRICTED.","example":[{"domain":"example.com","name":"Example Inc"}],"type":"array","items":{"$ref":"#/components/schemas/SpaceAuthOrganizationDto"}}},"required":["restriction"]},"SpaceListItem":{"type":"object","properties":{"id":{"type":"string","description":"Database ID of the Space.","example":"clw7h6z8u000108l8g3hd2m5r"},"companyName":{"type":"object","description":"Customer or company name displayed in the Space.","example":"Example Inc."},"createdAt":{"type":"string","description":"Timestamp at which the Space was created.","format":"date-time","example":"2026-05-21T17:09:42.266Z"},"ownerId":{"type":"string","description":"Valuecase user ID of the Space owner.","example":"valuecase|99ad6b1a-c49d-4b51-8d39-e9590687b50b"},"collaboratorIds":{"description":"Valuecase user IDs collaborating on the Space.","example":["valuecase|99ad6b1a-c49d-4b51-8d39-e9590687b50b"],"type":"array","items":{"type":"string"}},"lastVisit":{"type":"string","nullable":true,"description":"Most recent participant visit, or null if never visited.","format":"date-time","example":"2026-05-22T09:15:00.000Z"},"visits":{"type":"number","description":"Total count of end-user visits to this space","example":12},"authToken":{"type":"string","description":"This auth token is used to authorize external access to the space (e.g. when you send it to the end-user), and should be passed as a 'token' query parameter to the space URL. For example: https://share.valuecase.com/spaces/demo?token=123","example":"6e52a46c8f1"},"activitiesCount":{"type":"number","description":"Total count of end-user activities in this space (clicks and other interactions)","example":37},"actionPlanSummary":{"type":"object","properties":{"status":{"required":true,"type":"object"},"progress":{"required":true,"type":"number"},"startDate":{"format":"date-time","required":false,"type":"string","nullable":true},"targetDate":{"format":"date-time","required":false,"type":"string","nullable":true}}},"parentTemplateName":{"type":"string","nullable":true,"description":"The name of the template that was used to create this space","example":"Demo"},"link":{"type":"string","description":"Shareable participant URL for the Space.","example":"https://share.valuecase.com/spaces/example-inc-onboarding"},"engagementSummary":{"type":"object","description":"Current engagement score summary","example":{"score":78,"scoreBreakdown":{"sessionScore":20,"activitiesPerVisitScore":18,"activitiesScore":20,"stakeholdersScore":20},"inputs":null}}},"required":["id","companyName","createdAt","lastVisit","visits","actionPlanSummary"]},"SpaceListResponse":{"type":"object","properties":{"spaces":{"description":"Spaces on the requested page.","type":"array","items":{"$ref":"#/components/schemas/SpaceListItem"}},"totalPages":{"type":"number","description":"Number of result pages after applying filters.","example":4},"totalCount":{"type":"number","description":"Total Spaces accessible to the caller before applying query filters.","example":126},"totalCountWithFilters":{"type":"number","description":"Total Spaces matching the supplied filters.","example":83},"currentPage":{"type":"number","description":"One-based page returned by the request.","example":1}},"required":["spaces","totalPages","totalCount","totalCountWithFilters","currentPage"]},"SpaceIntegrationIdMappingsDto":{"type":"object","properties":{"integrationIdMappings":{"description":"External record identifiers to attach to the Space. Existing identical mappings are skipped.","example":[{"thirdParty":"Custom","thirdPartyEntityType":"Lead","thirdPartyId":"1954687215","thirdPartyOrganizationId":"1954687215"}],"type":"array","items":{"$ref":"#/components/schemas/SpaceIntegrationIdMappingDto"}}},"required":["integrationIdMappings"]},"SpaceIntegrationIdMappingResponseDto":{"type":"object","properties":{"thirdParty":{"type":"string","enum":["Custom"],"description":"External system provider. Public integrations should normally use Custom.","example":"Custom"},"thirdPartyEntityType":{"type":"string","description":"External system-specific entity type (e.g. Lead, Opportunity, etc.)","example":"Lead"},"thirdPartyId":{"type":"string","description":"External system-specific corresponding entity ID (e.g. Deal ID, Opportunity ID, etc.). Note: For HubSpot integrations, this field is prefixed with the portal ID in the format {portalId}_{objectId}.","example":"1954687215"},"thirdPartyOrganizationId":{"type":"string","description":"External system-specific organization ID (e.g. Salesforce Organization ID)","example":"1954687215"},"id":{"type":"string","description":"Database ID of the integration mapping.","example":"clw7m3p4q000108l9a2b6c8d0"},"spaceId":{"type":"string","description":"Database ID of the linked Space.","example":"clw7h6z8u000108l8g3hd2m5r"},"createdAt":{"type":"string","description":"Timestamp at which the mapping was created.","format":"date-time","example":"2026-05-21T17:09:42.266Z"},"createdById":{"type":"string","nullable":true,"description":"Valuecase user ID that created the mapping, when available.","example":"valuecase|99ad6b1a-c49d-4b51-8d39-e9590687b50b"}},"required":["thirdParty","thirdPartyEntityType","thirdPartyId","id","spaceId","createdAt"]},"DeleteSpaceIntegrationIdMappingDto":{"type":"object","properties":{"thirdParty":{"type":"string","enum":["HubSpot","Salesforce","Pipedrive","Custom"],"description":"The third party integration type; one of: HubSpot, Salesforce, Pipedrive, Custom","example":"HubSpot"},"thirdPartyEntityType":{"type":"string","description":"External system-specific entity type (e.g. Deal, Opportunity, etc.)","example":"Deal"},"thirdPartyId":{"type":"string","description":"External system-specific corresponding entity ID. Note: For HubSpot integrations, this field is prefixed with the portal ID in the format {portalId}_{objectId}.","example":"1954687215"},"thirdPartyOrganizationId":{"type":"string","description":"External system-specific organization ID (e.g. Salesforce Organization ID)","example":"1954687215"}},"required":["thirdParty","thirdPartyEntityType","thirdPartyId","thirdPartyOrganizationId"]},"DeleteSpaceIntegrationIdMappingResultDto":{"type":"object","properties":{"deletedCount":{"type":"number","description":"Number of matching integration mappings removed.","example":1}},"required":["deletedCount"]},"SpaceCreationRequestAcceptedDto":{"type":"object","properties":{"requestId":{"type":"string","description":"Identifier used to poll the asynchronous Space creation request.","format":"uuid","example":"3fa85f64-5717-4562-b3fc-2c963f66afa6"}},"required":["requestId"]},"SpaceCreationRequestDto":{"type":"object","properties":{"requestId":{"type":"string","description":"Unique identifier of the asynchronous request.","format":"uuid","example":"3fa85f64-5717-4562-b3fc-2c963f66afa6"},"userId":{"type":"string","description":"System-user ID that submitted the request.","example":"system|valuecase-api-client"},"tenantId":{"type":"string","description":"Tenant that owns the request and resulting Space.","example":"clw7t0n8x000008l6d2k4f9r3"},"status":{"enum":["QUEUED","STARTED","COMPLETED","FAILED"],"type":"string","description":"Current processing state. Poll until the status is COMPLETED or FAILED.","example":"QUEUED"},"spaceId":{"type":"string","nullable":true,"description":"Database ID of the created Space. Null until creation completes.","example":null},"spaceRootNodeId":{"type":"string","nullable":true,"description":"Root node ID of the created Space. Null until creation completes.","example":null},"space":{"nullable":true,"description":"Created Space details. Populated when status is COMPLETED; otherwise null.","example":null,"allOf":[{"$ref":"#/components/schemas/SpaceCreationResult"}]},"error":{"type":"string","nullable":true,"description":"Failure explanation when status is FAILED; otherwise null.","example":null},"createdAt":{"type":"string","description":"Timestamp at which the request was accepted.","format":"date-time","example":"2026-05-21T10:00:00.000Z"},"startedAt":{"type":"string","nullable":true,"description":"Timestamp at which processing began, or null while queued.","format":"date-time","example":null},"completedAt":{"type":"string","nullable":true,"description":"Timestamp at which creation completed, or null otherwise.","format":"date-time","example":null},"failedAt":{"type":"string","nullable":true,"description":"Timestamp at which creation failed, or null otherwise.","format":"date-time","example":null}},"required":["requestId","userId","tenantId","status","spaceId","spaceRootNodeId","space","error","createdAt","startedAt","completedAt","failedAt"]},"SingleValueSpaceCustomPropertyResponseDto":{"type":"object","properties":{"name":{"type":"string","description":"Additional data property name","example":"country_code"},"type":{"type":"string","default":"SINGLE_VALUE","enum":["SINGLE_VALUE"],"description":"Specifies property type as SINGLE_VALUE","example":"SINGLE_VALUE"},"value":{"description":"Single string or numeric value.","oneOf":[{"type":"string"},{"type":"number"}],"example":"US"},"id":{"type":"string","description":"Stable identifier of the Space Property value.","example":"clw7j2r9m000108l6f7z13a4p"},"managedByWorkflowId":{"type":"string","description":"ID of the workflow that manages this property, if any.","example":"clw7j5p81000208l6g4e5k9s2"},"hidden":{"type":"boolean","description":"Whether this is a hidden row (audit-only, e.g. baked markdown content). Only returned when includeHidden is set.","example":false}},"required":["name","type","value"]},"MultiValueSpaceCustomPropertyResponseDto":{"type":"object","properties":{"name":{"type":"string","description":"Additional data property name","example":"associated_users"},"type":{"type":"string","enum":["MULTI_VALUE"],"description":"Specifies property type as MULTI_VALUE","example":"MULTI_VALUE"},"value":{"type":"array","description":"Multiple values as an array of strings","items":{"type":"string"},"example":["user1@example.com","user2@example.com"]},"id":{"type":"string","description":"Stable identifier of the Space Property value.","example":"clw7j2r9m000108l6f7z13a4p"},"managedByWorkflowId":{"type":"string","description":"ID of the workflow that manages this property, if any.","example":"clw7j5p81000208l6g4e5k9s2"},"hidden":{"type":"boolean","description":"Whether this is a hidden row (audit-only, e.g. baked markdown content). Only returned when includeHidden is set.","example":false}},"required":["name","type","value"]},"FormListQueryDto":{"type":"object","properties":{"spaceIds":{"description":"Filter forms by their owning Space database IDs.","example":["clw7h6z8u000108l8g3hd2m5r"],"type":"array","items":{"type":"string"}},"spaceRootNodeIds":{"description":"Filter forms by their owning Space root node IDs.","example":["yp8gw6jc85sg3fyefg1yept7"],"type":"array","items":{"type":"string"}},"page":{"type":"number","description":"One-based result page.","minimum":1,"default":1,"example":1},"itemsPerPage":{"type":"number","description":"Number of forms returned per page, from 1 to 100.","minimum":1,"maximum":100,"default":10,"example":25},"includeDeleted":{"type":"boolean","description":"Include soft-deleted forms.","default":false,"example":false},"includeNotCompleted":{"type":"boolean","description":"Include forms that have not been completed.","default":false,"example":true},"completedAfter":{"type":"string","description":"Return forms completed after this timestamp.","format":"date-time","example":"2026-01-01T00:00:00.000Z"},"includeSubmissions":{"type":"boolean","description":"Include form submissions in each form result.","default":false,"example":true},"tableColumnKeys":{"type":"string","description":"Represent table-answer object keys using stable UUIDs or column labels.","enum":["uuid","label"],"default":"label","example":"label"}}},"FormQuestionAnswer":{"type":"object","properties":{"question":{"type":"string","description":"Question label as it appeared when the answer was returned.","example":"Which departments will use Valuecase?"},"questionId":{"type":"string","description":"Database ID of the question.","format":"uuid","example":"2b7e5c14-9a3d-4f6b-8c1e-7d5a9f2b4c60"},"questionNodeId":{"type":"string","description":"Stable question node ID used when writing answers.","example":"w8mq3xk7vn2shd5fj9gtpb14"},"questionType":{"type":"string","description":"Question type that determines the answer shape.","enum":["BLOCK_FORM_QUESTION_SHORT_TEXT","BLOCK_FORM_QUESTION_LONG_TEXT","BLOCK_FORM_QUESTION_SINGLE_SELECT","BLOCK_FORM_QUESTION_MULTI_SELECT","BLOCK_FORM_QUESTION_FILE_UPLOAD","BLOCK_FORM_QUESTION_TABLE"],"example":"BLOCK_FORM_QUESTION_MULTI_SELECT"},"answer":{"description":"Answer value. Its shape depends on questionType; unanswered questions return null.","oneOf":[{"type":"string","example":"Yes"},{"type":"array","items":{"type":"string"},"example":["Sales","Legal"]},{"type":"array","items":{"type":"object","additionalProperties":{"type":"string"}},"example":[{"company":"Example Inc.","role":"Buyer"}]}],"nullable":true,"example":["Sales","Marketing"]}},"required":["question","questionId","questionNodeId","questionType","answer"]},"FormSubmission":{"type":"object","properties":{"id":{"type":"string","description":"Database ID of the submission.","format":"uuid","example":"9c8f2d1e-4b7a-4c3d-9e6f-1a2b3c4d5e6f"},"formId":{"type":"string","description":"Database ID of the submitted form.","format":"uuid","example":"6d4b8f21-3c7e-4a9d-b5f1-2e8c0a7d9b34"},"formNodeId":{"type":"string","description":"Stable node ID of the submitted form.","example":"t4k9vqz2wsd7hxfm1jgnp58b"},"completedAt":{"type":"object","description":"Completion timestamp, or null for a draft submission.","format":"date-time","nullable":true,"example":"2026-05-21T12:00:00.000Z"},"completedBy":{"type":"object","description":"ID of the participant who completed the submission.","nullable":true,"example":"clw7u2v5b000208l6h4j8n1q7"},"completedByName":{"type":"object","description":"Display name of the participant who completed the submission.","nullable":true,"example":"Ada Lovelace"},"createdAt":{"type":"string","description":"Timestamp at which the submission was created.","format":"date-time","example":"2026-05-21T11:45:00.000Z"},"updatedAt":{"type":"string","description":"Timestamp at which the submission was last updated.","format":"date-time","example":"2026-05-21T12:00:00.000Z"},"questionAnswers":{"description":"Answers included in this submission.","type":"array","items":{"$ref":"#/components/schemas/FormQuestionAnswer"}}},"required":["id","formId","formNodeId","completedAt","completedBy","completedByName","createdAt","updatedAt","questionAnswers"]},"Form":{"type":"object","properties":{"id":{"type":"string","description":"Database ID of the form.","format":"uuid","example":"6d4b8f21-3c7e-4a9d-b5f1-2e8c0a7d9b34"},"tenantId":{"type":"string","description":"Tenant that owns the form.","example":"clw7t0n8x000008l6d2k4f9r3"},"spaceId":{"type":"string","description":"Database ID of the Space containing the form.","example":"clw7h6z8u000108l8g3hd2m5r"},"spaceSlug":{"type":"object","description":"URL slug of the Space containing the form.","nullable":true,"example":"example-inc-onboarding"},"title":{"type":"string","description":"Form title shown to participants.","example":"Onboarding questionnaire"},"description":{"type":"string","description":"Optional explanatory text shown with the form.","nullable":true,"example":"Tell us about your rollout requirements."},"deletedAt":{"type":"string","description":"Soft-deletion timestamp, or null for an active form.","format":"date-time","nullable":true,"example":null},"createdAt":{"type":"string","description":"Timestamp at which the form was created.","format":"date-time","example":"2026-05-20T09:00:00.000Z"},"updatedAt":{"type":"string","description":"Timestamp at which the form was last updated.","format":"date-time","example":"2026-05-21T11:30:00.000Z"},"completedAt":{"type":"string","description":"Form completion timestamp, or null if incomplete.","format":"date-time","nullable":true,"example":"2026-05-21T12:00:00.000Z"},"completedBy":{"type":"string","description":"ID of the participant who completed the form.","nullable":true,"example":"clw7u2v5b000208l6h4j8n1q7"},"questions":{"type":"array","description":"Questions and current answers in the form.","items":{"oneOf":[{"$ref":"#/components/schemas/ShortTextQuestion"},{"$ref":"#/components/schemas/LongTextQuestion"},{"$ref":"#/components/schemas/SingleSelectQuestion"},{"$ref":"#/components/schemas/MultiSelectQuestion"},{"$ref":"#/components/schemas/FileUploadQuestion"},{"$ref":"#/components/schemas/TableQuestion"}]},"nullable":true},"submissions":{"description":"Submissions for this form when includeSubmissions is true; otherwise omitted.","nullable":true,"type":"array","items":{"$ref":"#/components/schemas/FormSubmission"}},"submissionMode":{"type":"string","description":"Whether the form accepts a single or multiple submissions.","enum":["SINGLE","MULTI"],"example":"MULTI"},"hidden":{"type":"boolean","description":"Whether the form itself is hidden.","example":false},"hiddenByAncestor":{"type":"boolean","description":"Whether an ancestor block causes the form to be hidden.","example":false},"nodeId":{"type":"string","description":"Stable form node ID used by submission endpoints.","example":"t4k9vqz2wsd7hxfm1jgnp58b"},"sortOrder":{"type":"number","description":"Zero-based position of the form within its parent.","example":3}},"required":["id","tenantId","spaceId","spaceSlug","title","description","deletedAt","createdAt","updatedAt","completedAt","completedBy","questions","nodeId"]},"ShortTextQuestion":{"type":"object","properties":{"id":{"type":"string","description":"Database ID of the question.","format":"uuid","example":"2b7e5c14-9a3d-4f6b-8c1e-7d5a9f2b4c60"},"formId":{"type":"string","description":"Database ID of the form containing the question.","format":"uuid","example":"6d4b8f21-3c7e-4a9d-b5f1-2e8c0a7d9b34"},"question":{"type":"string","description":"Question label shown to participants.","example":"Which departments will use Valuecase?"},"description":{"type":"string","description":"Additional guidance displayed with the question.","nullable":true,"example":"Select every department that applies."},"options":{"description":"Available choices for select questions; null otherwise.","nullable":true,"example":["Sales","Marketing","Legal"],"type":"array","items":{"type":"string"}},"sortOrder":{"type":"number","description":"Zero-based position of the question within the form.","example":0},"createdAt":{"type":"string","description":"Timestamp at which the question was created.","format":"date-time","example":"2026-05-20T09:00:00.000Z"},"updatedAt":{"type":"string","description":"Timestamp at which the question was last updated.","format":"date-time","example":"2026-05-21T11:30:00.000Z"},"hidden":{"type":"boolean","description":"Whether the question itself is hidden.","example":false},"hiddenByAncestor":{"type":"boolean","description":"Whether an ancestor block causes the question to be hidden.","example":false},"nodeId":{"type":"string","description":"Stable node ID used when writing answers.","example":"w8mq3xk7vn2shd5fj9gtpb14"},"type":{"type":"string","description":"Short-text question discriminator.","enum":["BLOCK_FORM_QUESTION_SHORT_TEXT"],"example":"BLOCK_FORM_QUESTION_SHORT_TEXT"},"answer":{"type":"string","description":"Current short-text answer.","nullable":true,"example":"Example Inc."}},"required":["id","formId","question","description","options","sortOrder","createdAt","updatedAt","hidden","hiddenByAncestor","nodeId","type","answer"]},"LongTextQuestion":{"type":"object","properties":{"id":{"type":"string","description":"Database ID of the question.","format":"uuid","example":"2b7e5c14-9a3d-4f6b-8c1e-7d5a9f2b4c60"},"formId":{"type":"string","description":"Database ID of the form containing the question.","format":"uuid","example":"6d4b8f21-3c7e-4a9d-b5f1-2e8c0a7d9b34"},"question":{"type":"string","description":"Question label shown to participants.","example":"Which departments will use Valuecase?"},"description":{"type":"string","description":"Additional guidance displayed with the question.","nullable":true,"example":"Select every department that applies."},"options":{"description":"Available choices for select questions; null otherwise.","nullable":true,"example":["Sales","Marketing","Legal"],"type":"array","items":{"type":"string"}},"sortOrder":{"type":"number","description":"Zero-based position of the question within the form.","example":0},"createdAt":{"type":"string","description":"Timestamp at which the question was created.","format":"date-time","example":"2026-05-20T09:00:00.000Z"},"updatedAt":{"type":"string","description":"Timestamp at which the question was last updated.","format":"date-time","example":"2026-05-21T11:30:00.000Z"},"hidden":{"type":"boolean","description":"Whether the question itself is hidden.","example":false},"hiddenByAncestor":{"type":"boolean","description":"Whether an ancestor block causes the question to be hidden.","example":false},"nodeId":{"type":"string","description":"Stable node ID used when writing answers.","example":"w8mq3xk7vn2shd5fj9gtpb14"},"type":{"type":"string","description":"Long-text question discriminator.","enum":["BLOCK_FORM_QUESTION_LONG_TEXT"],"example":"BLOCK_FORM_QUESTION_LONG_TEXT"},"answer":{"type":"string","description":"Current long-text answer.","nullable":true,"example":"We plan to roll out the workspace to our sales organization."}},"required":["id","formId","question","description","options","sortOrder","createdAt","updatedAt","hidden","hiddenByAncestor","nodeId","type","answer"]},"SingleSelectQuestion":{"type":"object","properties":{"id":{"type":"string","description":"Database ID of the question.","format":"uuid","example":"2b7e5c14-9a3d-4f6b-8c1e-7d5a9f2b4c60"},"formId":{"type":"string","description":"Database ID of the form containing the question.","format":"uuid","example":"6d4b8f21-3c7e-4a9d-b5f1-2e8c0a7d9b34"},"question":{"type":"string","description":"Question label shown to participants.","example":"Which departments will use Valuecase?"},"description":{"type":"string","description":"Additional guidance displayed with the question.","nullable":true,"example":"Select every department that applies."},"options":{"description":"Available choices for select questions; null otherwise.","nullable":true,"example":["Sales","Marketing","Legal"],"type":"array","items":{"type":"string"}},"sortOrder":{"type":"number","description":"Zero-based position of the question within the form.","example":0},"createdAt":{"type":"string","description":"Timestamp at which the question was created.","format":"date-time","example":"2026-05-20T09:00:00.000Z"},"updatedAt":{"type":"string","description":"Timestamp at which the question was last updated.","format":"date-time","example":"2026-05-21T11:30:00.000Z"},"hidden":{"type":"boolean","description":"Whether the question itself is hidden.","example":false},"hiddenByAncestor":{"type":"boolean","description":"Whether an ancestor block causes the question to be hidden.","example":false},"nodeId":{"type":"string","description":"Stable node ID used when writing answers.","example":"w8mq3xk7vn2shd5fj9gtpb14"},"type":{"type":"string","description":"Single-select question discriminator.","enum":["BLOCK_FORM_QUESTION_SINGLE_SELECT"],"example":"BLOCK_FORM_QUESTION_SINGLE_SELECT"},"answer":{"type":"string","description":"Selected option, or null if unanswered.","nullable":true,"example":"Sales"}},"required":["id","formId","question","description","options","sortOrder","createdAt","updatedAt","hidden","hiddenByAncestor","nodeId","type","answer"]},"MultiSelectQuestion":{"type":"object","properties":{"id":{"type":"string","description":"Database ID of the question.","format":"uuid","example":"2b7e5c14-9a3d-4f6b-8c1e-7d5a9f2b4c60"},"formId":{"type":"string","description":"Database ID of the form containing the question.","format":"uuid","example":"6d4b8f21-3c7e-4a9d-b5f1-2e8c0a7d9b34"},"question":{"type":"string","description":"Question label shown to participants.","example":"Which departments will use Valuecase?"},"description":{"type":"string","description":"Additional guidance displayed with the question.","nullable":true,"example":"Select every department that applies."},"options":{"description":"Available choices for select questions; null otherwise.","nullable":true,"example":["Sales","Marketing","Legal"],"type":"array","items":{"type":"string"}},"sortOrder":{"type":"number","description":"Zero-based position of the question within the form.","example":0},"createdAt":{"type":"string","description":"Timestamp at which the question was created.","format":"date-time","example":"2026-05-20T09:00:00.000Z"},"updatedAt":{"type":"string","description":"Timestamp at which the question was last updated.","format":"date-time","example":"2026-05-21T11:30:00.000Z"},"hidden":{"type":"boolean","description":"Whether the question itself is hidden.","example":false},"hiddenByAncestor":{"type":"boolean","description":"Whether an ancestor block causes the question to be hidden.","example":false},"nodeId":{"type":"string","description":"Stable node ID used when writing answers.","example":"w8mq3xk7vn2shd5fj9gtpb14"},"type":{"type":"string","description":"Multi-select question discriminator.","enum":["BLOCK_FORM_QUESTION_MULTI_SELECT"],"example":"BLOCK_FORM_QUESTION_MULTI_SELECT"},"answer":{"description":"Selected options, or null if unanswered.","nullable":true,"example":["Sales","Marketing"],"type":"array","items":{"type":"string"}}},"required":["id","formId","question","description","options","sortOrder","createdAt","updatedAt","hidden","hiddenByAncestor","nodeId","type","answer"]},"FileAnswer":{"type":"object","properties":{"fileName":{"type":"string","description":"Original uploaded file name.","example":"security-questionnaire.pdf"},"mimeType":{"type":"string","description":"MIME type reported for the uploaded file.","example":"application/pdf"},"s3ObjectUrl":{"type":"string","description":"Signed URL from which the uploaded file can be downloaded.","format":"uri","example":"https://files.example.com/security-questionnaire.pdf"}},"required":["fileName","mimeType","s3ObjectUrl"]},"FileUploadQuestion":{"type":"object","properties":{"id":{"type":"string","description":"Database ID of the question.","format":"uuid","example":"2b7e5c14-9a3d-4f6b-8c1e-7d5a9f2b4c60"},"formId":{"type":"string","description":"Database ID of the form containing the question.","format":"uuid","example":"6d4b8f21-3c7e-4a9d-b5f1-2e8c0a7d9b34"},"question":{"type":"string","description":"Question label shown to participants.","example":"Which departments will use Valuecase?"},"description":{"type":"string","description":"Additional guidance displayed with the question.","nullable":true,"example":"Select every department that applies."},"options":{"description":"Available choices for select questions; null otherwise.","nullable":true,"example":["Sales","Marketing","Legal"],"type":"array","items":{"type":"string"}},"sortOrder":{"type":"number","description":"Zero-based position of the question within the form.","example":0},"createdAt":{"type":"string","description":"Timestamp at which the question was created.","format":"date-time","example":"2026-05-20T09:00:00.000Z"},"updatedAt":{"type":"string","description":"Timestamp at which the question was last updated.","format":"date-time","example":"2026-05-21T11:30:00.000Z"},"hidden":{"type":"boolean","description":"Whether the question itself is hidden.","example":false},"hiddenByAncestor":{"type":"boolean","description":"Whether an ancestor block causes the question to be hidden.","example":false},"nodeId":{"type":"string","description":"Stable node ID used when writing answers.","example":"w8mq3xk7vn2shd5fj9gtpb14"},"type":{"type":"string","description":"File-upload question discriminator.","enum":["BLOCK_FORM_QUESTION_FILE_UPLOAD"],"example":"BLOCK_FORM_QUESTION_FILE_UPLOAD"},"answer":{"description":"Uploaded files, or null if unanswered.","nullable":true,"example":[{"fileName":"security-questionnaire.pdf","mimeType":"application/pdf","s3ObjectUrl":"https://files.example.com/security-questionnaire.pdf"}],"type":"array","items":{"$ref":"#/components/schemas/FileAnswer"}}},"required":["id","formId","question","description","options","sortOrder","createdAt","updatedAt","hidden","hiddenByAncestor","nodeId","type","answer"]},"TableQuestion":{"type":"object","properties":{"id":{"type":"string","description":"Database ID of the question.","format":"uuid","example":"2b7e5c14-9a3d-4f6b-8c1e-7d5a9f2b4c60"},"formId":{"type":"string","description":"Database ID of the form containing the question.","format":"uuid","example":"6d4b8f21-3c7e-4a9d-b5f1-2e8c0a7d9b34"},"question":{"type":"string","description":"Question label shown to participants.","example":"Which departments will use Valuecase?"},"description":{"type":"string","description":"Additional guidance displayed with the question.","nullable":true,"example":"Select every department that applies."},"options":{"description":"Available choices for select questions; null otherwise.","nullable":true,"example":["Sales","Marketing","Legal"],"type":"array","items":{"type":"string"}},"sortOrder":{"type":"number","description":"Zero-based position of the question within the form.","example":0},"createdAt":{"type":"string","description":"Timestamp at which the question was created.","format":"date-time","example":"2026-05-20T09:00:00.000Z"},"updatedAt":{"type":"string","description":"Timestamp at which the question was last updated.","format":"date-time","example":"2026-05-21T11:30:00.000Z"},"hidden":{"type":"boolean","description":"Whether the question itself is hidden.","example":false},"hiddenByAncestor":{"type":"boolean","description":"Whether an ancestor block causes the question to be hidden.","example":false},"nodeId":{"type":"string","description":"Stable node ID used when writing answers.","example":"w8mq3xk7vn2shd5fj9gtpb14"},"type":{"type":"string","description":"Table question discriminator.","enum":["BLOCK_FORM_QUESTION_TABLE"],"example":"BLOCK_FORM_QUESTION_TABLE"},"answer":{"type":"array","description":"Table rows keyed by column label or UUID, depending on tableColumnKeys.","items":{"type":"object","additionalProperties":{"type":"string"}},"nullable":true,"example":[{"company":"Example Inc.","role":"Buyer"}]}},"required":["id","formId","question","description","options","sortOrder","createdAt","updatedAt","hidden","hiddenByAncestor","nodeId","type","answer"]},"FormListResponse":{"type":"object","properties":{"items":{"description":"Forms on the requested page.","type":"array","items":{"$ref":"#/components/schemas/Form"}},"currentPage":{"type":"number","description":"One-based current page.","example":1},"itemsPerPage":{"type":"number","description":"Items returned per page.","example":25},"totalPages":{"type":"number","description":"Number of result pages.","example":4},"totalItems":{"type":"number","description":"Number of matching forms.","example":83},"itemsExist":{"type":"boolean","description":"Whether any forms exist before applying the current filter set.","example":true}},"required":["items","currentPage","itemsPerPage","totalPages","totalItems","itemsExist"]},"FormSubmissionListQueryDto":{"type":"object","properties":{"page":{"type":"number","description":"One-based result page.","minimum":1,"default":1,"example":1},"itemsPerPage":{"type":"number","description":"Number of submissions returned per page, from 1 to 100.","minimum":1,"maximum":100,"default":10,"example":25},"tableColumnKeys":{"type":"string","description":"Represent table-answer object keys using stable UUIDs or column labels.","enum":["uuid","label"],"default":"label","example":"label"}}},"FormSubmissionsMeta":{"type":"object","properties":{"totalSubmissions":{"type":"number","description":"Total submissions for the form.","example":42},"lastSubmissionAt":{"type":"object","description":"Timestamp of the most recent submission, or null if none.","format":"date-time","nullable":true,"example":"2026-05-21T12:00:00.000Z"}},"required":["totalSubmissions","lastSubmissionAt"]},"FormSubmissionListResponse":{"type":"object","properties":{"items":{"description":"Submissions on the requested page.","type":"array","items":{"$ref":"#/components/schemas/FormSubmission"}},"totalItems":{"type":"number","description":"Number of matching submissions.","example":42},"currentPage":{"type":"number","description":"One-based current page.","example":1},"totalPages":{"type":"number","description":"Number of result pages.","example":2},"itemsPerPage":{"type":"number","description":"Items returned per page.","example":25},"itemsExist":{"type":"boolean","description":"Whether any submissions exist before applying the current filter set.","example":true},"meta":{"description":"Submission summary metadata.","example":{"totalSubmissions":42,"lastSubmissionAt":"2026-05-21T12:00:00.000Z"},"allOf":[{"$ref":"#/components/schemas/FormSubmissionsMeta"}]}},"required":["items","totalItems","currentPage","totalPages","itemsPerPage","itemsExist"]},"QuestionAnswerInput":{"type":"object","properties":{"questionNodeId":{"type":"string","description":"Stable node ID of the question to answer.","example":"w8mq3xk7vn2shd5fj9gtpb14"},"answer":{"description":"Answer value. Use null to clear an answer; the accepted shape depends on the question type.","oneOf":[{"type":"string","example":"Yes"},{"type":"array","items":{"type":"string"},"example":["Sales","Legal"]},{"type":"array","items":{"type":"object","additionalProperties":{"type":"string"}},"example":[{"company":"Example Inc.","role":"Buyer"}]}],"nullable":true,"example":["Sales","Marketing"]}},"required":["questionNodeId","answer"]},"CreateOrUpdateFormSubmissionDto":{"type":"object","properties":{"questionAnswers":{"description":"Answers to create or update, keyed by stable question node ID.","example":[{"questionNodeId":"w8mq3xk7vn2shd5fj9gtpb14","answer":["Sales","Marketing"]}],"type":"array","items":{"$ref":"#/components/schemas/QuestionAnswerInput"}},"isSubmitted":{"type":"boolean","description":"Set true to complete the submission; omit or set false to save it as a draft.","default":false,"example":true}},"required":["questionAnswers"]}}}}