{"openapi":"3.0.0","info":{"title":"Afineo Webservices API — record-asset","description":"Module `record-asset` of the Afineo API v3 (19 endpoints).\n\nFull asset lifecycle management: create, update, delete, move and copy assets in both repository and project contexts. Also handles file uploads, status changes, type reassignment, and tree operations (move, copy, detach).\n\nFull specification: https://api.afineo.io/openapi.json","version":"3.0.0","contact":{"name":"Afineo Solutions","url":"https://www.afineo.com"},"x-logo":{"url":"./logo.png","altText":"Afineo - Powerful Data, Powerful People"}},"servers":[{"url":"https://{instance}.afineo.io","description":"Afineo instance","variables":{"instance":{"description":"Your Afineo instance name","default":"client"}}}],"tags":[{"name":"record-asset","description":"Full asset lifecycle management: create, update, delete, move and copy assets in both repository and project contexts. Also handles file uploads, status changes, type reassignment, and tree operations (move, copy, detach)."}],"paths":{"/api/v3/record-asset/add-asset-to-project/":{"post":{"tags":["record-asset"],"summary":"Add repository asset to project","description":"## Purpose\n\nCreates a contextualized node from a repository asset in a project. Returns created node_id.\n","security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Add asset to project response","content":{"application/json":{"schema":{"oneOf":[{"type":"object","title":"Success Response","properties":{"status_code":{"type":"integer","example":1,"description":"Status code (1 = success)"},"status_message":{"type":"string","example":"","description":"Status message"},"result":{"type":"object","properties":{"node_id":{"type":"integer","example":4576,"description":"Node ID"}},"required":["node_id"],"description":"Created node ID"}},"required":["status_code","status_message","result"]},{"type":"object","title":"Error Response","properties":{"status_code":{"type":"integer","example":2,"description":"Status code (2 = error, 3 = Aborted because this asset already exists in this node)"},"status_message":{"type":"string","example":"Asset does not exist or has been deleted","description":"Error message"},"result":{"type":"array","items":{"type":"object"},"example":[],"description":"Empty array on error"}},"required":["status_code","status_message","result"]}]}}}}},"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"class_id":{"type":"integer","description":"Library ID. Use POST /api/v3/administration/classes/list to get available libraries.","example":4},"asset_id":{"type":"integer","description":"Asset ID. Use POST /api/v3/get-asset/by-search/repository to find assets.","example":5684},"parent_node_id":{"type":"integer","description":"Parent node ID. Use POST /api/v3/get-asset/by-search/node to find project nodes.","example":69852},"status_id":{"type":"integer","description":"Status ID. Use POST /api/v3/permissions/statuses/list to get available statuses.","example":102}},"required":["class_id","asset_id","parent_node_id"]}}}}}},"/api/v3/record-asset/available-attributes-creation/":{"post":{"tags":["record-asset"],"summary":"Get available attributes for creation","description":"## Purpose\n\nReturns list of available attributes for a specific type to help build dynamic creation forms.\n","security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Attribute list response","content":{"application/json":{"schema":{"oneOf":[{"type":"object","title":"Success Response","properties":{"status_code":{"type":"integer","example":1,"description":"Status code (1 = success)"},"status_message":{"type":"string","example":"","description":"Status message"},"result":{"type":"array","items":{"type":"string"},"description":"Attribute list for creation (key = attribute ID, value = attribute label)"}},"required":["status_code","status_message","result"]},{"type":"object","title":"Error Response","properties":{"status_code":{"type":"integer","example":3,"description":"Status code (2 = error, 3 = no result)"},"status_message":{"type":"string","example":"No results found","description":"Error message"},"result":{"type":"array","items":{"type":"object"},"example":[],"description":"Empty array on error"}},"required":["status_code","status_message","result"]}]}}}}},"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"type_id":{"type":"integer","description":"Asset type ID. Use POST /api/v3/types/list with class_id to get available types.","example":89}},"required":["type_id"]}}}}}},"/api/v3/record-asset/copy-node-in-project/":{"post":{"tags":["record-asset"],"summary":"Copy node in project","description":"## Purpose\n\nDuplicates a node (and children) to a new location within the project. Returns new node_id.\n","security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Copy node in project response","content":{"application/json":{"schema":{"oneOf":[{"type":"object","title":"Success Response","properties":{"status_code":{"type":"integer","example":1,"description":"Status code (1 = success)"},"status_message":{"type":"string","example":"","description":"Status message"},"result":{"type":"object","properties":{"node_id":{"type":"integer","example":4578,"description":"Node ID"}},"required":["node_id"],"description":"Created node ID"}},"required":["status_code","status_message","result"]},{"type":"object","title":"Error Response","properties":{"status_code":{"type":"integer","example":2,"description":"Status code (2 = error, 3 = Aborted because this asset already exists in this node)"},"status_message":{"type":"string","example":"Parent node does not exist or has been deleted","description":"Error message"},"result":{"type":"array","items":{"type":"object"},"example":[],"description":"Empty array on error"}},"required":["status_code","status_message","result"]}]}}}}},"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"class_id":{"type":"integer","description":"Library ID. Use POST /api/v3/administration/classes/list to get available libraries.","example":4},"node_id":{"type":"integer","description":"Node ID. Use POST /api/v3/get-asset/by-search/node to find project nodes.","example":56845},"parent_node_id":{"type":"integer","description":"Parent node ID. Use POST /api/v3/get-asset/by-search/node to find project nodes.","example":69852}},"required":["class_id","node_id","parent_node_id"]}}}}}},"/api/v3/record-asset/create/node/":{"post":{"tags":["record-asset"],"summary":"Create node in project","description":"## Purpose\n\nCreates a new contextualized node directly in project (not linked to repository).\n\n## Additional Information\n\n### Parameter \"attribute_list_simple\"\n\n#### Updating a simple dropdown list attribute\n\nTo update a **simple** dropdown list attribute, you need to send the element.\nIt is possible to insert either the identifier, the code, or the label — all three options are valid.\n\n```json\n{\"attribute_id\":1113,\"value\":\"1234\"}\n{\"attribute_id\":1113,\"value\":\"OPTION_CODE_4\"}\n{\"attribute_id\":1113,\"value\":\"Option label 2\"}\n```\n\n#### For other attribute types\n\nFor attributes with specific formatting (example: a price), it is possible to send a decimal number separated by either a comma or a dot — both will work.\nFor date attributes, the possible formats are as follows :\n- timestamp\n- ISO 8601 format : 2023-09-14T15:04:00.000Z\n- English format separated by \"-\" (with or without time) : 2017-12-13 or 2017-12-13 15:05:13\n- French format separated by \"-\" or \"/\" (with or without time) : 13-12-2017 or 13/12/2017 or 13-12-2017 15:05:13 or 13/12/2017 15:05:13\n- Timezone format with or without Greenwich time : 2017:12:13 10:15:59+02:00 or 2017:12:13 10:15:59\n\n### Parameter \"attribute_list_multiple\"\n\n#### Updating a associated data attribute\n\nTo update a related data attribute, you need to send an array containing one or more assets id :\n\n```json\n{\"attribute_id\":1113,\"value\":[1111]}\n{\"attribute_id\":1113,\"value\":[2222, 3333, 4444]}\n```\n\nIf you want to add one or more associated assets using the value of an attribute instead of the asset id (as in an import), this is possible using the \"key\" option :\n\n```json\n{\"attribute_id\":1113,\"key\":1284,\"value\":[\"asset\"]}\n{\"attribute_id\":1113,\"key\":1284,\"value\":[\"asset 1\", \"asset 2\"]}\n```\n\n#### Updating a multiple dropdown list attribute\nTo update a multiple dropdown list attribute, you also need to send an array containing one or more elements.\nIt is possible to insert either the identifier, the code, or the label — all three options are valid.\n\n```json\n{\"attribute_id\":1113,\"value\":[\"Option\"]}\n{\"attribute_id\":1113,\"value\":[1234, \"OPTION_CODE_4\", \"Option label 2\"]}\n```\n\n**Note :** If the code or the label of the desired option (for both simple and multiple dropdown lists) is an integer and corresponds to the identifier of another option in the same list, that option will be taken into account.\n","security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Asset creation node response","content":{"application/json":{"schema":{"oneOf":[{"type":"object","title":"Success Response","properties":{"status_code":{"type":"integer","example":1,"description":"Status code (1 = success)"},"status_message":{"type":"string","example":"","description":"Status message"},"result":{"type":"object","properties":{"asset_id":{"type":"integer","example":0,"description":"Asset ID"},"node_id":{"type":"integer","example":49324,"description":"Node ID"},"asset_id_duplicate":{"type":"integer","nullable":true,"example":45177,"description":"Asset ID for duplication"}},"required":["asset_id","node_id"],"description":"Return information about the created asset"}},"required":["status_code","status_message","result"]},{"type":"object","title":"Error Response","properties":{"status_code":{"type":"integer","example":2,"description":"Status code (2 = error)"},"status_message":{"type":"string","example":"The value for the parameter \"type_id\" (456) is invalid","description":"Error message"},"result":{"type":"array","items":{"type":"object"},"example":[],"description":"Empty array on error"}},"required":["status_code","status_message","result"]}]}}}}},"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"class_id":{"type":"integer","description":"Library ID. Use POST /api/v3/administration/classes/list to get available libraries.","example":4},"type_id":{"type":"integer","description":"Asset type ID. Use POST /api/v3/types/list with class_id to get available types.","example":89},"parent_id":{"type":"integer","description":"Parent node ID in the project tree. Set to 0 to create the asset at the root of the project. Use POST /api/v3/get-asset/by-search/node with class_id and project_node_id to browse the project tree and find existing parent nodes.","example":4350},"version_id":{"type":"integer","description":"Version ID. Use POST /api/v3/administration/versions/list with class_id to get available versions.","example":1},"attribute_list_simple":{"type":"array","description":"List of attributes to be filled in, only simple attributes. List of properties to apply : \"attribute_id\", \"value\", \"suffix_value\" (optional) (Array of objects - see example for structure)","example":[{"attribute_id":231,"value":"3-seater leather sofa"},{"attribute_id":658,"value":"1234"},{"attribute_id":659,"value":"100","suffix_value":"EUR"}],"items":{"type":"object","properties":{"attribute_id":{"type":"integer","description":"Attribute ID. Use POST /api/v3/attributes/list with class_id to get available attributes."},"value":{"type":"string","description":"Value to set. Format depends on attribute type (text, date, list option ID/code/label)."},"suffix_value":{"type":"string","description":"Suffix value for attributes with dropdown suffix (input, select-items, price). Accepts ID, code, or label."}},"required":["attribute_id","value"],"title":"Item"}},"attribute_list_multiple":{"type":"array","description":"List of attributes to be filled in, only multiple attributes (associated data, dynamic attribute, multiple drop-down list). List of properties to apply : \"attribute_id\", \"value\", \"key\" (optional) (Array of objects - see example for structure)","example":[{"attribute_id":724,"value":["Accessory A"]},{"attribute_id":660,"value":["Label 1"],"key":2749},{"attribute_id":659,"value":[1234,2345,4567]},{"attribute_id":660,"value":["Label 1","Label 2","Label 3"],"key":2749}],"items":{"type":"object","properties":{"attribute_id":{"type":"integer","description":"Attribute ID. Use POST /api/v3/attributes/list with class_id to get available attributes."},"value":{"type":"array","description":"Value to set. Format depends on attribute type (text, date, list option ID/code/label).","items":{"type":"string"}},"key":{"type":"integer","description":"With this property, you can add one or more associated assets using the value of an attribute and not with the asset ID (as with import) - only for associated data attribute"}},"required":["attribute_id","value"],"title":"Item"}}},"required":["class_id","type_id","parent_id"]}}}}}},"/api/v3/record-asset/create/repository/":{"post":{"tags":["record-asset"],"summary":"Create asset in repository","description":"## Purpose\n\nCreates a new master data record in repository with initial attribute values.\n\n## Attribute Lists\n\n- `attribute_list_simple`: Simple attributes (text, number, date, single dropdown)\n- `attribute_list_multiple`: Multiple attributes (associated data, dynamic, multiple dropdown)\n\n## Additional Information\n\n### Parameter \"attribute_list_simple\"\n\n#### Updating a simple dropdown list attribute\n\nTo update a **simple** dropdown list attribute, you need to send the element.\nIt is possible to insert either the identifier, the code, or the label — all three options are valid.\n\n```json\n{\"attribute_id\":1113,\"value\":\"1234\"}\n{\"attribute_id\":1113,\"value\":\"OPTION_CODE_4\"}\n{\"attribute_id\":1113,\"value\":\"Option label 2\"}\n```\n\n#### For other attribute types\n\nFor attributes with specific formatting (example: a price), it is possible to send a decimal number separated by either a comma or a dot — both will work.\nFor date attributes, the possible formats are as follows :\n- timestamp\n- ISO 8601 format : 2023-09-14T15:04:00.000Z\n- English format separated by \"-\" (with or without time) : 2017-12-13 or 2017-12-13 15:05:13\n- French format separated by \"-\" or \"/\" (with or without time) : 13-12-2017 or 13/12/2017 or 13-12-2017 15:05:13 or 13/12/2017 15:05:13\n- Timezone format with or without Greenwich time : 2017:12:13 10:15:59+02:00 or 2017:12:13 10:15:59\n\n### Parameter \"attribute_list_multiple\"\n\n#### Updating a associated data attribute\n\nTo update a related data attribute, you need to send an array containing one or more assets id :\n\n```json\n{\"attribute_id\":1113,\"value\":[1111]}\n{\"attribute_id\":1113,\"value\":[2222, 3333, 4444]}\n```\n\nIf you want to add one or more associated assets using the value of an attribute instead of the asset id (as in an import), this is possible using the \"key\" option :\n\n```json\n{\"attribute_id\":1113,\"key\":1284,\"value\":[\"asset\"]}\n{\"attribute_id\":1113,\"key\":1284,\"value\":[\"asset 1\", \"asset 2\"]}\n```\n\n#### Updating a multiple dropdown list attribute\nTo update a multiple dropdown list attribute, you also need to send an array containing one or more elements.\nIt is possible to insert either the identifier, the code, or the label — all three options are valid.\n\n```json\n{\"attribute_id\":1113,\"value\":[\"Option\"]}\n{\"attribute_id\":1113,\"value\":[1234, \"OPTION_CODE_4\", \"Option label 2\"]}\n```\n\n**Note :** If the code or the label of the desired option (for both simple and multiple dropdown lists) is an integer and corresponds to the identifier of another option in the same list, that option will be taken into account.\n","security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Asset creation repository response","content":{"application/json":{"schema":{"oneOf":[{"type":"object","title":"Success Response","properties":{"status_code":{"type":"integer","example":1,"description":"Status code (1 = success)"},"status_message":{"type":"string","example":"","description":"Status message"},"result":{"type":"object","properties":{"asset_id":{"type":"integer","example":43178,"description":"Asset ID"},"node_id":{"type":"integer","example":0,"description":"Node ID"},"asset_id_duplicate":{"type":"integer","nullable":true,"example":45177,"description":"Asset ID for duplication"}},"required":["asset_id","node_id"],"description":"Return information about the created asset"}},"required":["status_code","status_message","result"]},{"type":"object","title":"Error Response","properties":{"status_code":{"type":"integer","example":2,"description":"Status code (2 = error)"},"status_message":{"type":"string","example":"The value for the parameter \"type_id\" (456) is invalid","description":"Error message"},"result":{"type":"array","items":{"type":"object"},"example":[],"description":"Empty array on error"}},"required":["status_code","status_message","result"]}]}}}}},"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"class_id":{"type":"integer","description":"Library ID. Use POST /api/v3/administration/classes/list to get available libraries.","example":4},"type_id":{"type":"integer","description":"Asset type ID. Use POST /api/v3/types/list with class_id to get available types.","example":89},"parent_id":{"type":"integer","description":"Parent node ID in the repository tree. Set to 0 to create the asset at the root of the repository. Use POST /api/v3/get-asset/by-search/repository with class_id and parent_id=0 to browse the repository tree and find existing parent nodes.","example":4350},"version_id":{"type":"integer","description":"Version ID. Use POST /api/v3/administration/versions/list with class_id to get available versions.","example":1},"attribute_list_simple":{"type":"array","description":"List of attributes to be filled in, only simple attributes. List of properties to apply : \"attribute_id\", \"value\", \"suffix_value\" (optional) (Array of objects - see example for structure)","example":[{"attribute_id":231,"value":"3-seater leather sofa"},{"attribute_id":658,"value":"1234"},{"attribute_id":659,"value":"100","suffix_value":"EUR"}],"items":{"type":"object","properties":{"attribute_id":{"type":"integer","description":"Attribute ID. Use POST /api/v3/attributes/list with class_id to get available attributes."},"value":{"type":"string","description":"Value to set. Format depends on attribute type (text, date, list option ID/code/label)."},"suffix_value":{"type":"string","description":"Suffix value for attributes with dropdown suffix (input, select-items, price). Accepts ID, code, or label."}},"required":["attribute_id","value"],"title":"Item"}},"attribute_list_multiple":{"type":"array","description":"List of attributes to be filled in, only multiple attributes (associated data, dynamic attribute, multiple drop-down list). List of properties to apply : \"attribute_id\", \"value\", \"key\" (optional) (Array of objects - see example for structure)","example":[{"attribute_id":724,"value":["Accessory A"]},{"attribute_id":660,"value":["Label 1"],"key":2749},{"attribute_id":659,"value":[1234,2345,4567]},{"attribute_id":660,"value":["Label 1","Label 2","Label 3"],"key":2749}],"items":{"type":"object","properties":{"attribute_id":{"type":"integer","description":"Attribute ID. Use POST /api/v3/attributes/list with class_id to get available attributes."},"value":{"type":"array","description":"Value to set. Format depends on attribute type (text, date, list option ID/code/label).","items":{"type":"string"}},"key":{"type":"integer","description":"With this property, you can add one or more associated assets using the value of an attribute and not with the asset ID (as with import) - only for associated data attribute"}},"required":["attribute_id","value"],"title":"Item"}}},"required":["class_id","type_id","parent_id"]}}}}}},"/api/v3/record-asset/destroy/node/":{"post":{"tags":["record-asset"],"summary":"Delete node and repository asset","description":"## Purpose\n\nIRREVERSIBLY removes both project node AND repository master data with all children. Cascading deletion affects all projects.\n\n⚠️ Extremely destructive - prefer `detach` for reversible removal.\n","security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Destroy node response","content":{"application/json":{"schema":{"oneOf":[{"type":"object","title":"Success Response","properties":{"status_code":{"type":"integer","example":1,"description":"Status code (1 = success)"},"status_message":{"type":"string","example":"Node and all child nodes have been deleted","description":"Status message"},"result":{"type":"array","items":{"type":"object"},"example":[],"description":"Empty array"}},"required":["status_code","status_message","result"]},{"type":"object","title":"Error Response","properties":{"status_code":{"type":"integer","example":2,"description":"Status code (2 = error)"},"status_message":{"type":"string","example":"Impossible to destroy this node because it is classified elsewhere","description":"Error message"},"result":{"type":"array","items":{"type":"object"},"example":[],"description":"Empty array on error"}},"required":["status_code","status_message","result"]}]}}}}},"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"id":{"type":"integer","description":"Node ID. Use POST /api/v3/get-asset/by-search/node to find nodes and get their IDs.","example":58450},"class_id":{"type":"integer","description":"Library ID. Use POST /api/v3/administration/classes/list to get available libraries.","example":4}},"required":["id","class_id"]}}}}}},"/api/v3/record-asset/destroy/repository/":{"post":{"tags":["record-asset"],"summary":"Delete repository asset permanently","description":"## Purpose\n\nIRREVERSIBLY removes asset and children from repository. Prefer `detach` for reversible removal.\n","security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Destroy repository response","content":{"application/json":{"schema":{"oneOf":[{"type":"object","title":"Success Response","properties":{"status_code":{"type":"integer","example":1,"description":"Status code (1 = success)"},"status_message":{"type":"string","example":"Asset and all child assets have been deleted","description":"Status message"},"result":{"type":"array","items":{"type":"object"},"example":[],"description":"Empty array"}},"required":["status_code","status_message","result"]},{"type":"object","title":"Error Response","properties":{"status_code":{"type":"integer","example":2,"description":"Status code (2 = error)"},"status_message":{"type":"string","example":"Impossible to destroy this asset because it is classified","description":"Error message"},"result":{"type":"array","items":{"type":"object"},"example":[],"description":"Empty array on error"}},"required":["status_code","status_message","result"]}]}}}}},"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"id":{"type":"integer","description":"Asset ID. Use POST /api/v3/get-asset/by-search/repository to find assets and get their IDs.","example":5845},"class_id":{"type":"integer","description":"Library ID. Use POST /api/v3/administration/classes/list to get available libraries.","example":4}},"required":["id","class_id"]}}}}}},"/api/v3/record-asset/detach/node/":{"post":{"tags":["record-asset"],"summary":"Detach node from project","description":"## Purpose\n\nRemoves node and children from project tree without affecting repository. Reversible operation - repository asset remains intact and can be re-added.\n","security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Detach node response","content":{"application/json":{"schema":{"oneOf":[{"type":"object","title":"Success Response","properties":{"status_code":{"type":"integer","example":1,"description":"Status code (1 = success)"},"status_message":{"type":"string","example":"Node and all child nodes have been detached","description":"Status message"},"result":{"type":"array","items":{"type":"object"},"example":[],"description":"Empty array"}},"required":["status_code","status_message","result"]},{"type":"object","title":"Error Response","properties":{"status_code":{"type":"integer","example":2,"description":"Status code (2 = error)"},"status_message":{"type":"string","example":"You don't have the rights to detach child assets from the node","description":"Error message"},"result":{"type":"array","items":{"type":"object"},"example":[],"description":"Empty array on error"}},"required":["status_code","status_message","result"]}]}}}}},"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"id":{"type":"integer","description":"Node ID. Use POST /api/v3/get-asset/by-search/node to find nodes and get their IDs.","example":58450},"class_id":{"type":"integer","description":"Library ID. Use POST /api/v3/administration/classes/list to get available libraries.","example":4}},"required":["id","class_id"]}}}}}},"/api/v3/record-asset/detach/repository/":{"post":{"tags":["record-asset"],"summary":"Detach asset from repository tree","description":"## Purpose\n\nMoves asset and children to Unclassified folder (reversible). Asset remains accessible for reclassification.\n","security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Detach repository response","content":{"application/json":{"schema":{"oneOf":[{"type":"object","title":"Success Response","properties":{"status_code":{"type":"integer","example":1,"description":"Status code (1 = success)"},"status_message":{"type":"string","example":"Asset and all child assets have been detached","description":"Status message"},"result":{"type":"array","items":{"type":"object"},"example":[],"description":"Empty array"}},"required":["status_code","status_message","result"]},{"type":"object","title":"Error Response","properties":{"status_code":{"type":"integer","example":2,"description":"Status code (2 = error)"},"status_message":{"type":"string","example":"You don't have the rights to detach child assets from the asset","description":"Error message"},"result":{"type":"array","items":{"type":"object"},"example":[],"description":"Empty array on error"}},"required":["status_code","status_message","result"]}]}}}}},"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"id":{"type":"integer","description":"Asset ID. Use POST /api/v3/get-asset/by-search/repository to find assets and get their IDs.","example":5845},"class_id":{"type":"integer","description":"Library ID. Use POST /api/v3/administration/classes/list to get available libraries.","example":4}},"required":["id","class_id"]}}}}}},"/api/v3/record-asset/move-asset-in-repository/":{"post":{"tags":["record-asset"],"summary":"Move an asset to a different parent in the repository hierarchy","description":"## Purpose\n\nMoves an asset (and its children) to a new parent location within the repository hierarchy.\n\nUse `parent_id = 0` to move the asset to the root of the repository.\n\n## Requirements\n\n- **Permission**: The user must have the `cut/move` permission (LCA) on the source asset.\n- **Same library**: The `parent_id` must belong to the same `class_id` as the `asset_id`.\n\n## Common Errors\n\n| Error | Cause | Solution |\n|-------|-------|----------|\n| `Asset does not exist or has been deleted` | `asset_id` is invalid or deleted | Verify with POST /api/v3/get-asset/by-search/repository/ |\n| `Parent asset does not exist or has been deleted` | `parent_id` is invalid or deleted (when > 0) | Verify with POST /api/v3/get-asset/by-search/repository/ |\n| `Cannot move an asset into itself` | `asset_id` == `parent_id` | Use a different `parent_id` |\n| `Cannot move an asset into one of its own children` | `parent_id` is a descendant of `asset_id` | Choose a parent that is not a child of the moved asset |\n| `Operation not allowed` | Insufficient LCA permissions | Check user permissions on the source asset |\n","security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Move asset in repository response","content":{"application/json":{"schema":{"oneOf":[{"type":"object","title":"Success Response","properties":{"status_code":{"type":"integer","example":1,"description":"Status code (1 = success)"},"status_message":{"type":"string","example":"","description":"Status message"},"result":{"type":"object","properties":{"asset_id":{"type":"integer","example":1234,"description":"Asset ID"}},"required":["asset_id"],"description":"The ID of the asset that was successfully moved"}},"required":["status_code","status_message","result"]},{"type":"object","title":"Error Response","properties":{"status_code":{"type":"integer","example":2,"description":"Status code (2 = error)"},"status_message":{"type":"string","example":"Asset does not exist or has been deleted","description":"Error message. Possible values: \"Asset does not exist or has been deleted\", \"Parent asset does not exist or has been deleted\", \"Cannot move an asset into itself\", \"Cannot move an asset into one of its own children\", \"Operation not allowed\""},"result":{"type":"array","items":{"type":"object"},"example":[],"description":"Empty array on error"}},"required":["status_code","status_message","result"]}]}}}}},"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"class_id":{"type":"integer","description":"Library ID. Use POST /api/v3/administration/classes/list to get available libraries.","example":4},"asset_id":{"type":"integer","description":"Asset ID to move. Use POST /api/v3/get-asset/by-search/repository to find repository assets.","example":1234},"parent_id":{"type":"integer","description":"Destination parent asset ID within the same library. Must belong to the same class_id as asset_id. Use 0 to move to the root of the repository. Use POST /api/v3/get-asset/by-search/repository/ to find valid parent assets.","example":5678}},"required":["class_id","asset_id","parent_id"]}}}}}},"/api/v3/record-asset/move-node-in-project/":{"post":{"tags":["record-asset"],"summary":"Move node in project","description":"## Purpose\n\nMoves a node (and children) to a new parent location within the project.\n","security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Move node in project response","content":{"application/json":{"schema":{"oneOf":[{"type":"object","title":"Success Response","properties":{"status_code":{"type":"integer","example":1,"description":"Status code (1 = success)"},"status_message":{"type":"string","example":"","description":"Status message"},"result":{"type":"object","properties":{"node_id":{"type":"integer","example":4577,"description":"Node ID"}},"required":["node_id"],"description":"Created node ID"}},"required":["status_code","status_message","result"]},{"type":"object","title":"Error Response","properties":{"status_code":{"type":"integer","example":2,"description":"Status code (2 = error)"},"status_message":{"type":"string","example":"Node does not exist or has been deleted","description":"Error message"},"result":{"type":"array","items":{"type":"object"},"example":[],"description":"Empty array on error"}},"required":["status_code","status_message","result"]}]}}}}},"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"class_id":{"type":"integer","description":"Library ID. Use POST /api/v3/administration/classes/list to get available libraries.","example":4},"node_id":{"type":"integer","description":"Node ID. Use POST /api/v3/get-asset/by-search/node to find project nodes.","example":56845},"parent_node_id":{"type":"integer","description":"Parent node ID. Use POST /api/v3/get-asset/by-search/node to find project nodes.","example":69852}},"required":["class_id","node_id","parent_node_id"]}}}}}},"/api/v3/record-asset/repoint/node/":{"post":{"tags":["record-asset"],"summary":"Repoint a node to a different asset","description":"## Purpose\n\nRepoints a node (project position) to a different asset (master record). Useful to correct import mistakes.\n\n## Preserved Data\n\n- Node identity (publications, history, statuses, workflows)\n- All contextual data associated with the node\n- Alias positions (automatically updated)\n\n## Links Processing\n\n- **Non-workspace attributes**: Links updated to point to new asset\n- **Workspace attributes** (scope=5): Links deleted (workspace data not transferred)\n\n## Constraints\n\n- **Duplicate prevention**: Blocked if sibling node already references target asset\n- **Cascade to aliases**: All alias positions automatically updated\n- **Workspace data**: Cleanup processed if no other nodes reference old asset\n- **Indexation**: Automatic reindexation triggered\n","security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Node repoint response","content":{"application/json":{"schema":{"oneOf":[{"type":"object","title":"Success Response","properties":{"status_code":{"type":"integer","example":1,"description":"Status code (1 = success)"},"status_message":{"type":"string","example":"","description":"Status message or warning"},"result":{"type":"object","properties":{"node_id":{"type":"integer","example":12345,"description":"Node ID that was repointed"},"old_asset_id":{"type":"integer","example":54321,"description":"Previous asset ID"},"new_asset_id":{"type":"integer","example":67890,"description":"New asset ID"},"aliases_updated":{"type":"integer","example":2,"description":"Number of alias positions updated"},"links_updated":{"type":"integer","example":15,"description":"Number of non-workspace links updated"},"workspace_links_deleted":{"type":"integer","example":3,"description":"Number of workspace links deleted"},"workspace_id":{"type":"integer","example":789,"description":"Workspace ID"}},"required":["node_id","old_asset_id","new_asset_id","aliases_updated","links_updated","workspace_links_deleted","workspace_id"],"description":"Details of the repoint operation"}},"required":["status_code","status_message","result"]},{"type":"object","title":"Error Response","properties":{"status_code":{"type":"integer","example":2,"description":"Status code (2 = parameter error, 3 = processing error)"},"status_message":{"type":"string","example":"Node does not exist or has been deleted","description":"Error message"},"result":{"type":"array","items":{"type":"object"},"example":[],"description":"Empty array on error"}},"required":["status_code","status_message","result"]}]}}}}},"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"node_id":{"type":"integer","description":"Node ID (position in project) to repoint. Use POST /api/v3/get-asset/by-search/node to find nodes.","example":12345},"asset_id":{"type":"integer","description":"Target asset ID (referential). Use POST /api/v3/get-asset/by-search/repository to find assets.","example":67890},"class_id":{"type":"integer","description":"Library ID. Use POST /api/v3/administration/classes/list to get available libraries.","example":4}},"required":["node_id","asset_id","class_id"]}}}}}},"/api/v3/record-asset/update-datas/node/":{"post":{"tags":["record-asset"],"summary":"Update project node attributes","description":"## Purpose\n\nUpdates project-specific attribute values (simple and multiple types) for an existing node. Creates contextualized overrides without affecting repository master data. Use for catalog or publication-specific adaptations.\n\n## When to Use\n\n- Use `/node/` to update project-specific overrides (does not affect master data). Use `/repository/` variant to update master data that propagates to all projects.\n- Use POST /api/v3/attributes/list with class_id to discover available attributes and their types (simple vs multiple)\n- Use POST /api/v3/get-asset/by-search/node with class_id and parent_id to find node IDs to update\n\n## Requirements\n\n- **Node existence**: Node ID must exist and not be deleted\n- **Library context**: Valid class_id must be provided\n\n⚠️ Project node updates do not affect repository master data.\n\n---\n\n## Simple Attributes (`attribute_list_simple`)\n\nFor: Text, number, date, simple dropdown list, and other single-value attributes.\n\n| Property | Required | Description |\n|----------|----------|-------------|\n| `attribute_id` | ✅ | Attribute identifier |\n| `value` | ✅ | Value to set (empty string to clear) |\n| `version_id` | ❌ | Target language version (default if not specified) |\n\n### Simple Dropdown Lists\n\nPass element identifier, code, or label. All three formats are accepted.\n\n```json\n{\"attribute_id\":1113,\"value\":\"1234\"}\n{\"attribute_id\":1113,\"value\":\"OPTION_CODE_4\"}\n{\"attribute_id\":1113,\"value\":\"Red color\"}\n```\n\n### Date Formats\n\nSupported formats:\n- Timestamp: `1694704440`\n- ISO 8601: `2023-09-14T15:04:00.000Z`\n- English (YYYY-MM-DD): `2017-12-13` or `2017-12-13 15:05:13`\n- European (DD-MM-YYYY or DD/MM/YYYY): `13-12-2017` or `13/12/2017 15:05:13`\n- Timezone format: `2017:12:13 10:15:59+02:00`\n\n### Numeric Attributes\n\nDecimal separator: comma or dot accepted (e.g., `12.99` or `12,99`).\n\n### Clearing Values\n\nSet `value` to empty string to clear attribute value:\n\n```json\n{\"attribute_id\":1113,\"value\":\"\"}\n```\n\n---\n\n## Multiple Attributes (`attribute_list_multiple`)\n\nFor: Associated data, dynamic attributes, and multiple dropdown lists.\n\n| Property | Required | Description |\n|----------|----------|-------------|\n| `attribute_id` | ✅ | Attribute identifier |\n| `value` | ✅ | Array of values (empty array to clear all) |\n| `synchronization` | ✅ | `false` = add mode, `true` = sync mode |\n| `key` | ❌ | Attribute ID to use as lookup key (associated data only) |\n| `version_id` | ❌ | Target language version (default if not specified) |\n\n### Associated Data\n\nPass array of asset IDs:\n\n```json\n{\"attribute_id\":724,\"value\":[1111],\"synchronization\":false}\n{\"attribute_id\":724,\"value\":[2222, 3333, 4444],\"synchronization\":true}\n```\n\n**Synchronization modes**:\n- `false` (Add mode): Appends values without removing existing ones\n- `true` (Sync mode): Removes values not in array, adds missing ones, preserves matching ones\n\n**Using attribute values as keys** (import-style lookup):\n\n```json\n{\"attribute_id\":724,\"key\":1284,\"value\":[\"SKU-12345\"],\"synchronization\":true}\n{\"attribute_id\":724,\"key\":1284,\"value\":[\"Product A\", \"Product B\"],\"synchronization\":false}\n```\n\n### Multiple Dropdown Lists\n\nPass array of identifiers, codes, or labels:\n\n```json\n{\"attribute_id\":1113,\"value\":[\"Red\"],\"synchronization\":true}\n{\"attribute_id\":1113,\"value\":[1234, \"OPTION_CODE_4\", \"Blue color\"],\"synchronization\":false}\n```\n\n⚠️ If a code or label is numeric and matches another option ID, the ID match takes precedence.\n\n---\n\n## Example\n\n```json\n{\n  \"id\": 58450,\n  \"class_id\": 4,\n  \"attribute_list_simple\": [\n    {\"attribute_id\": 231, \"value\": \"3-seater sofa\"},\n    {\"attribute_id\": 1234, \"value\": \"\"},\n    {\"attribute_id\": 658, \"value\": \"Red leather\", \"version_id\": 2},\n    {\"attribute_id\": 658, \"value\": \"Cuir rouge\", \"version_id\": 1}\n  ],\n  \"attribute_list_multiple\": [\n    {\"attribute_id\": 724, \"value\": [\"Red\", \"Black\"], \"synchronization\": true},\n    {\"attribute_id\": 660, \"value\": [\"Chair legs\"], \"synchronization\": false, \"key\": 2749},\n    {\"attribute_id\": 659, \"value\": [1234, 2345], \"synchronization\": false, \"version_id\": 2}\n  ]\n}\n```\n","security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Update datas asset node response","content":{"application/json":{"schema":{"oneOf":[{"type":"object","title":"Success Response","properties":{"status_code":{"type":"integer","example":1,"description":"Status code (1 = success)"},"status_message":{"type":"string","example":"Asset data updated","description":"Status message"},"result":{"type":"array","items":{"type":"object"},"example":[],"description":"Empty array"}},"required":["status_code","status_message","result"]},{"type":"object","title":"Error Response","properties":{"status_code":{"type":"integer","example":2,"description":"Status code (2 = error)"},"status_message":{"type":"string","example":"Node does not exist or has been deleted","description":"Error message"},"result":{"type":"array","items":{"type":"object"},"example":[],"description":"Empty array on error"}},"required":["status_code","status_message","result"]}]}}}}},"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"id":{"type":"integer","description":"Node ID. Use POST /api/v3/get-asset/by-search/node to find nodes and get their IDs.","example":58450},"class_id":{"type":"integer","description":"Library ID. Use POST /api/v3/administration/classes/list to get available libraries.","example":4},"attribute_list_simple":{"type":"array","description":"Simple attributes (text, number, date, single dropdown). Pass same attribute_id multiple times with different version_id to update multiple languages. (Array of objects - see example for structure)","example":[{"attribute_id":231,"value":"3-seater sofa"},{"attribute_id":1234,"value":""},{"attribute_id":658,"value":"Red leather","version_id":2},{"attribute_id":658,"value":"Cuir rouge","version_id":1},{"attribute_id":658,"value":"Cuero rojo","version_id":3},{"attribute_id":659,"value":"100","suffix_value":"EUR"}],"items":{"type":"object","properties":{"attribute_id":{"type":"integer","description":"Attribute ID. Use POST /api/v3/attributes/list with class_id to get available attributes."},"value":{"type":"string","description":"Value to set. Format depends on attribute type. Empty string clears the value."},"version_id":{"type":"integer","description":"Version ID for multilingual data. Use POST /api/v3/administration/versions/list."},"suffix_value":{"type":"string","description":"Suffix value for attributes with dropdown suffix (input, select-items, price). Accepts ID, code, or label."}},"required":["attribute_id","value"],"title":"Item"}},"attribute_list_multiple":{"type":"array","description":"Multiple attributes (associated data, multiple dropdown). Pass same attribute_id multiple times with different version_id to update multiple languages. (Array of objects - see example for structure)","example":[{"attribute_id":724,"value":["Red","Black"],"synchronization":true},{"attribute_id":660,"value":["Chair legs"],"synchronization":false,"key":2749},{"attribute_id":659,"value":[1234,2345,4567],"synchronization":false,"version_id":2}],"items":{"type":"object","properties":{"attribute_id":{"type":"integer","description":"Attribute ID. Use POST /api/v3/attributes/list with class_id to get available attributes."},"value":{"type":"array","description":"Array of values (empty array to clear all)","items":{"type":"string"}},"synchronization":{"type":"boolean","description":"false = add mode, true = sync mode (remove unlisted, add missing)"},"key":{"type":"integer","description":"Attribute ID to use as lookup key (associated data only)"},"version_id":{"type":"integer","description":"Version ID. Use POST /api/v3/administration/versions/list with class_id. Default if omitted"}},"required":["attribute_id","value","synchronization"],"title":"Item"}}},"required":["id","class_id"]}}}}}},"/api/v3/record-asset/update-datas/repository/":{"post":{"tags":["record-asset"],"summary":"Update repository asset attributes","description":"## Purpose\n\nUpdates attribute values (simple and multiple types) of an existing asset in the **repository** (master data). Changes propagate to all projects where the asset is used, unless a local override exists.\n\n## When to Use\n\n- Use `/repository/` to update master data (affects all projects). Use `/node/` variant to update project-specific overrides without affecting master data.\n- Use POST /api/v3/attributes/list with class_id to discover available attributes and their types (simple vs multiple)\n- Use POST /api/v3/get-asset/by-search/repository to find asset IDs to update\n\n## Requirements\n\n- **Asset existence**: Asset ID must exist and not be deleted\n- **Library context**: Valid class_id must be provided\n\n⚠️ Repository updates propagate to all projects unless local overrides exist.\n\n---\n\n## Simple Attributes (`attribute_list_simple`)\n\nFor: Text, number, date, simple dropdown list, and other single-value attributes.\n\n| Property | Required | Description |\n|----------|----------|-------------|\n| `attribute_id` | ✅ | Attribute identifier |\n| `value` | ✅ | Value to set (empty string to clear) |\n| `version_id` | ❌ | Target language version (default if not specified) |\n\n### Simple Dropdown Lists\n\nPass element identifier, code, or label. All three formats are accepted.\n\n```json\n{\"attribute_id\":1113,\"value\":\"1234\"}\n{\"attribute_id\":1113,\"value\":\"OPTION_CODE_4\"}\n{\"attribute_id\":1113,\"value\":\"Red color\"}\n```\n\n### Date Formats\n\nSupported formats:\n- Timestamp: `1694704440`\n- ISO 8601: `2023-09-14T15:04:00.000Z`\n- English (YYYY-MM-DD): `2017-12-13` or `2017-12-13 15:05:13`\n- European (DD-MM-YYYY or DD/MM/YYYY): `13-12-2017` or `13/12/2017 15:05:13`\n- Timezone format: `2017:12:13 10:15:59+02:00`\n\n### Numeric Attributes\n\nDecimal separator: comma or dot accepted (e.g., `12.99` or `12,99`).\n\n### Clearing Values\n\nSet `value` to empty string to clear attribute value:\n\n```json\n{\"attribute_id\":1113,\"value\":\"\"}\n```\n\n---\n\n## Multiple Attributes (`attribute_list_multiple`)\n\nFor: Associated data, dynamic attributes, and multiple dropdown lists.\n\n| Property | Required | Description |\n|----------|----------|-------------|\n| `attribute_id` | ✅ | Attribute identifier |\n| `value` | ✅ | Array of values (empty array to clear all) |\n| `synchronization` | ✅ | `false` = add mode, `true` = sync mode |\n| `key` | ❌ | Attribute ID to use as lookup key (associated data only) |\n| `version_id` | ❌ | Target language version (default if not specified) |\n\n### Associated Data\n\nPass array of asset IDs:\n\n```json\n{\"attribute_id\":724,\"value\":[1111],\"synchronization\":false}\n{\"attribute_id\":724,\"value\":[2222, 3333, 4444],\"synchronization\":true}\n```\n\n**Synchronization modes**:\n- `false` (Add mode): Appends values without removing existing ones\n- `true` (Sync mode): Removes values not in array, adds missing ones, preserves matching ones\n\n**Using attribute values as keys** (import-style lookup):\n\n```json\n{\"attribute_id\":724,\"key\":1284,\"value\":[\"SKU-12345\"],\"synchronization\":true}\n{\"attribute_id\":724,\"key\":1284,\"value\":[\"Product A\", \"Product B\"],\"synchronization\":false}\n```\n\n### Multiple Dropdown Lists\n\nPass array of identifiers, codes, or labels:\n\n```json\n{\"attribute_id\":1113,\"value\":[\"Red\"],\"synchronization\":true}\n{\"attribute_id\":1113,\"value\":[1234, \"OPTION_CODE_4\", \"Blue color\"],\"synchronization\":false}\n```\n\n⚠️ If a code or label is numeric and matches another option ID, the ID match takes precedence.\n\n---\n\n## Example\n\n```json\n{\n  \"id\": 5845,\n  \"class_id\": 4,\n  \"attribute_list_simple\": [\n    {\"attribute_id\": 231, \"value\": \"3-seater sofa\"},\n    {\"attribute_id\": 1234, \"value\": \"\"},\n    {\"attribute_id\": 658, \"value\": \"Red leather\", \"version_id\": 2},\n    {\"attribute_id\": 658, \"value\": \"Cuir rouge\", \"version_id\": 1}\n  ],\n  \"attribute_list_multiple\": [\n    {\"attribute_id\": 724, \"value\": [\"Red\", \"Black\"], \"synchronization\": true},\n    {\"attribute_id\": 660, \"value\": [\"Chair legs\"], \"synchronization\": false, \"key\": 2749},\n    {\"attribute_id\": 659, \"value\": [1234, 2345], \"synchronization\": false, \"version_id\": 2}\n  ]\n}\n```\n","security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Asset data update response","content":{"application/json":{"schema":{"oneOf":[{"type":"object","title":"Success Response","properties":{"status_code":{"type":"integer","example":1,"description":"Status code (1 = success)"},"status_message":{"type":"string","example":"Asset data updated","description":"Status message"},"result":{"type":"array","items":{"type":"object"},"example":[],"description":"Empty array"}},"required":["status_code","status_message","result"]},{"type":"object","title":"Error Response","properties":{"status_code":{"type":"integer","example":2,"description":"Status code (2 = parameter error)"},"status_message":{"type":"string","example":"Asset does not exist or has been deleted","description":"Error message"},"result":{"type":"array","items":{"type":"object"},"example":[],"description":"Empty array on error"}},"required":["status_code","status_message","result"]}]}}}}},"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"id":{"type":"integer","description":"Asset ID. Use POST /api/v3/get-asset/by-search/repository to find assets and get their IDs.","example":5845},"class_id":{"type":"integer","description":"Library ID. Use POST /api/v3/administration/classes/list to get available libraries.","example":4},"attribute_list_simple":{"type":"array","description":"Simple attributes (text, number, date, single dropdown). Pass same attribute_id multiple times with different version_id to update multiple languages. (Array of objects - see example for structure)","example":[{"attribute_id":231,"value":"3-seater sofa"},{"attribute_id":1234,"value":""},{"attribute_id":658,"value":"Red leather","version_id":2},{"attribute_id":658,"value":"Cuir rouge","version_id":1},{"attribute_id":658,"value":"Cuero rojo","version_id":3},{"attribute_id":659,"value":"100","suffix_value":"EUR"}],"items":{"type":"object","properties":{"attribute_id":{"type":"integer","description":"Attribute ID. Use POST /api/v3/attributes/list with class_id to get available attributes."},"value":{"type":"string","description":"Value to set. Format depends on attribute type. Empty string clears the value."},"version_id":{"type":"integer","description":"Version ID for multilingual data. Use POST /api/v3/administration/versions/list."},"suffix_value":{"type":"string","description":"Suffix value for attributes with dropdown suffix (input, select-items, price). Accepts ID, code, or label."}},"required":["attribute_id","value"],"title":"Item"}},"attribute_list_multiple":{"type":"array","description":"Multiple attributes (associated data, multiple dropdown). Pass same attribute_id multiple times with different version_id to update multiple languages. (Array of objects - see example for structure)","example":[{"attribute_id":724,"value":["Red","Black"],"synchronization":true},{"attribute_id":660,"value":["Chair legs"],"synchronization":false,"key":2749},{"attribute_id":659,"value":[1234,2345,4567],"synchronization":false,"version_id":2}],"items":{"type":"object","properties":{"attribute_id":{"type":"integer","description":"Attribute ID. Use POST /api/v3/attributes/list with class_id to get available attributes."},"value":{"type":"array","description":"Array of values (empty array to clear all)","items":{"type":"string"}},"synchronization":{"type":"boolean","description":"false = add mode, true = sync mode (remove unlisted, add missing)"},"key":{"type":"integer","description":"Attribute ID to use as lookup key (associated data only)"},"version_id":{"type":"integer","description":"Version ID. Use POST /api/v3/administration/versions/list with class_id. Default if omitted"}},"required":["attribute_id","value","synchronization"],"title":"Item"}}},"required":["id","class_id"]}}}}}},"/api/v3/record-asset/update-status/node/":{"post":{"tags":["record-asset"],"summary":"Update project node status","description":"## Purpose\n\nUpdates workflow status (LCA) of a project node. Optionally propagate to repository asset.\n","security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Update status node response","content":{"application/json":{"schema":{"oneOf":[{"type":"object","title":"Success Response","properties":{"status_code":{"type":"integer","example":1,"description":"Status code (1 = success)"},"status_message":{"type":"string","example":"Status updated","description":"Status message"},"result":{"type":"array","items":{"type":"object"},"example":[],"description":"Empty array"}},"required":["status_code","status_message","result"]},{"type":"object","title":"Error Response","properties":{"status_code":{"type":"integer","example":2,"description":"Status code (2 = error)"},"status_message":{"type":"string","example":"The status of the asset is already the same as the one you want to set","description":"Error message"},"result":{"type":"array","items":{"type":"object"},"example":[],"description":"Empty array on error"}},"required":["status_code","status_message","result"]}]}}}}},"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"id":{"type":"integer","description":"Node ID. Use POST /api/v3/get-asset/by-search/node to find nodes and get their IDs.","example":5684},"class_id":{"type":"integer","description":"Library ID. Use POST /api/v3/administration/classes/list to get available libraries.","example":4},"status_id":{"type":"integer","description":"Status ID. Use POST /api/v3/permissions/statuses/list to get available statuses.","example":102},"force_propagation_asset":{"type":"boolean","description":"If set to true, the status will be propagated to the repository asset","example":true}},"required":["id","class_id","status_id"]}}}}}},"/api/v3/record-asset/update-status/repository/":{"post":{"tags":["record-asset"],"summary":"Update repository asset status","description":"## Purpose\n\nUpdates workflow status (LCA) of a repository asset. Changes propagate to all projects unless overridden.\n","security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Update status repository response","content":{"application/json":{"schema":{"oneOf":[{"type":"object","title":"Success Response","properties":{"status_code":{"type":"integer","example":1,"description":"Status code (1 = success)"},"status_message":{"type":"string","example":"Status updated","description":"Status message"},"result":{"type":"array","items":{"type":"object"},"example":[],"description":"Empty array"}},"required":["status_code","status_message","result"]},{"type":"object","title":"Error Response","properties":{"status_code":{"type":"integer","example":2,"description":"Status code (2 = error)"},"status_message":{"type":"string","example":"You don't have the rights to update the status of this asset","description":"Error message"},"result":{"type":"array","items":{"type":"object"},"example":[],"description":"Empty array on error"}},"required":["status_code","status_message","result"]}]}}}}},"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"id":{"type":"integer","description":"Asset ID. Use POST /api/v3/get-asset/by-search/repository to find assets and get their IDs.","example":5684},"class_id":{"type":"integer","description":"Library ID. Use POST /api/v3/administration/classes/list to get available libraries.","example":4},"status_id":{"type":"integer","description":"Status ID. Use POST /api/v3/permissions/statuses/list to get available statuses.","example":102}},"required":["id","class_id","status_id"]}}}}}},"/api/v3/record-asset/update-type/":{"post":{"tags":["record-asset"],"summary":"Change asset type","description":"## Purpose\n\nReclassifies asset to a different type within the same class.\n","security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Update type response","content":{"application/json":{"schema":{"oneOf":[{"type":"object","title":"Success Response","properties":{"status_code":{"type":"integer","example":1,"description":"Status code (1 = success)"},"status_message":{"type":"string","example":"Asset type updated","description":"Status message"},"result":{"type":"array","items":{"type":"object"},"example":[],"description":"Empty array"}},"required":["status_code","status_message","result"]},{"type":"object","title":"Error Response","properties":{"status_code":{"type":"integer","example":2,"description":"Status code (2 = error)"},"status_message":{"type":"string","example":"You don't have the rights to update the type of this asset","description":"Error message"},"result":{"type":"array","items":{"type":"object"},"example":[],"description":"Empty array on error"}},"required":["status_code","status_message","result"]}]}}}}},"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"id":{"type":"integer","description":"Asset ID. Use POST /api/v3/get-asset/by-search/repository to find assets and get their IDs.","example":5684},"class_id":{"type":"integer","description":"Library ID. Use POST /api/v3/administration/classes/list to get available libraries.","example":4},"type_id":{"type":"integer","description":"Asset type ID. Use POST /api/v3/types/list with class_id to get available types.","example":89}},"required":["id","class_id","type_id"]}}}}}},"/api/v3/record-asset/upload-file/node/":{"post":{"tags":["record-asset"],"summary":"Upload file to project node","description":"## Purpose\n\nAttaches a physical file to a project-specific node. File exists only in this project context.\n\n## Content-Type\n\n**Important**: The request must be sent as `multipart/form-data`. The `file` field must include a `filename` with a valid extension (e.g. `filename=\"image.jpg\"`). The file extension is used to validate the file type against the allowed extensions configured for your application. Sending the file as raw binary without a filename will result in a \"This type of file is not allowed\" error.\n\n## Example with curl\n\n```bash\ncurl -X POST \"https://{instance}.afineo.io/api/v3/record-asset/upload-file_node/\" \\\n  -H \"Authorization: Bearer YOUR_TOKEN\" \\\n  --form 'id=\"5684\"' \\\n  --form 'class_id=\"4\"' \\\n  --form 'file=@\"/path/to/image.jpg\"'\n```\n","security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Upload file node response","content":{"application/json":{"schema":{"oneOf":[{"type":"object","title":"Success Response","properties":{"status_code":{"type":"integer","example":1,"description":"Status code (1 = success)"},"status_message":{"type":"string","example":"Update done","description":"Status message"},"result":{"type":"array","items":{"type":"object"},"example":[],"description":"Empty array"}},"required":["status_code","status_message","result"]},{"type":"object","title":"Error Response","properties":{"status_code":{"type":"integer","example":2,"description":"Status code (2 = error, 3 = no action done)"},"status_message":{"type":"string","example":"This type of file is not allowed","description":"Error message"},"result":{"type":"array","items":{"type":"object"},"example":[],"description":"Empty array on error"}},"required":["status_code","status_message","result"]}]}}}}},"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"id":{"type":"integer","description":"Node ID. Use POST /api/v3/get-asset/by-search/node to find nodes and get their IDs.","example":5684},"class_id":{"type":"integer","description":"Library ID. Use POST /api/v3/administration/classes/list to get available libraries.","example":4},"file":{"type":"string","format":"binary","description":"The file to upload. Must be sent as multipart/form-data with a filename including a valid extension (e.g. image.jpg). The extension is checked against the allowed file types configured for your application.","example":"image.jpg"}},"required":["id","class_id"]}}}}}},"/api/v3/record-asset/upload-file/repository/":{"post":{"tags":["record-asset"],"summary":"Upload file to repository asset","description":"## Purpose\n\nAttaches a physical file to a repository asset. File becomes available for all projects.\n\n## Content-Type\n\n**Important**: The request must be sent as `multipart/form-data`. The `file` field must include a `filename` with a valid extension (e.g. `filename=\"image.jpg\"`). The file extension is used to validate the file type against the allowed extensions configured for your application. Sending the file as raw binary without a filename will result in a \"This type of file is not allowed\" error.\n\n## Example with curl\n\n```bash\ncurl -X POST \"https://{instance}.afineo.io/api/v3/record-asset/upload-file_repository/\" \\\n  -H \"Authorization: Bearer YOUR_TOKEN\" \\\n  --form 'id=\"5684\"' \\\n  --form 'class_id=\"4\"' \\\n  --form 'file=@\"/path/to/image.jpg\"'\n```\n","security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Upload file repository response","content":{"application/json":{"schema":{"oneOf":[{"type":"object","title":"Success Response","properties":{"status_code":{"type":"integer","example":1,"description":"Status code (1 = success)"},"status_message":{"type":"string","example":"Creation done","description":"Status message"},"result":{"type":"array","items":{"type":"object"},"example":[],"description":"Empty array"}},"required":["status_code","status_message","result"]},{"type":"object","title":"Error Response","properties":{"status_code":{"type":"integer","example":3,"description":"Status code (2 = error, 3 = no action done)"},"status_message":{"type":"string","example":"No action done","description":"Error message"},"result":{"type":"array","items":{"type":"object"},"example":[],"description":"Empty array on error"}},"required":["status_code","status_message","result"]}]}}}}},"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"id":{"type":"integer","description":"Asset ID. Use POST /api/v3/get-asset/by-search/repository to find assets and get their IDs.","example":5684},"class_id":{"type":"integer","description":"Library ID. Use POST /api/v3/administration/classes/list to get available libraries.","example":4},"file":{"type":"string","format":"binary","description":"The file to upload. Must be sent as multipart/form-data with a filename including a valid extension (e.g. image.jpg). The extension is checked against the allowed file types configured for your application.","example":"image.jpg"}},"required":["id","class_id"]}}}}}}},"components":{"securitySchemes":{"bearerAuth":{"type":"http","scheme":"bearer","bearerFormat":"JWT","description":"JWT token generated with /api/v3/token/get/"}}}}