---
id: service-update-my-data
title: "Request to update a data attribute of the individual"
description: "Makes a request of the individual to update the data of one data attribute, under one of its consent records. The request has no body: the path names the consent record, its data agreement and the data attribute. The request starts in state `1` (initiated), and your organisation gets the webhook event `data.update.initiated` with the three IDs. Your organisation then handles the request and sets its state with [Update data request](/docs/consent-management-admin-api/config-update-data-request). The request stores the e-mail address of the individual as `userName`."
sidebar_label: "Request to update a data attribute of the individual"
hide_title: true
hide_table_of_contents: true
api: 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
sidebar_class_name: "post api-method"
info_path: docs/consent-management-individual-api/igrant-io-api-documentation
custom_edit_url: null
---

> **Build this with an AI coding agent.** Install the iGrant.io Agent Skills, then ask your agent to build the integration:
>
> ```bash
> npx skills add L3-iGrant/skills
> ```


import ApiTabs from "@theme/ApiTabs";
import DiscriminatorTabs from "@theme/DiscriminatorTabs";
import MethodEndpoint from "@theme/ApiExplorer/MethodEndpoint";
import SecuritySchemes from "@theme/ApiExplorer/SecuritySchemes";
import MimeTabs from "@theme/MimeTabs";
import ParamsItem from "@theme/ParamsItem";
import ResponseSamples from "@theme/ResponseSamples";
import SchemaItem from "@theme/SchemaItem";
import SchemaTabs from "@theme/SchemaTabs";
import Markdown from "@theme/Markdown";
import OperationTabs from "@theme/OperationTabs";
import TabItem from "@theme/TabItem";

<h1 className={"openapi__heading"}>Request to update a data attribute of the individual</h1>

<MethodEndpoint method={"post"} path={"/v4/service/consent/organisation/consent-record/{consentRecordId}/data-agreement/{dataAgreementId}/data-attribute/{dataAttributeId}/data-update"}></MethodEndpoint>



Makes a request of the individual to update the data of one data attribute, under one of its consent records. The request has no body: the path names the consent record, its data agreement and the data attribute. The request starts in state `1` (initiated), and your organisation gets the webhook event `data.update.initiated` with the three IDs. Your organisation then handles the request and sets its state with [Update data request](/docs/consent-management-admin-api/config-update-data-request). The request stores the e-mail address of the individual as `userName`.

The consent record must be a consent record of the individual, and `dataAgreementId` must be its data agreement. The server does not check `dataAttributeId`. The individual can have more than one open update request. The answer is `200` with an empty body. This route takes an API key or a token of the identity provider of the organisation, not an individual token or a token of the privacy dashboard login.

## Request

<details style={{"marginBottom":"1rem"}} className={"openapi-markdown__details"} data-collapsed={false} open={true}><summary style={{}}><h3 className={"openapi-markdown__details-summary-header-params"}>Path Parameters</h3></summary><div><ul><ParamsItem className={"paramsItem"} param={{"description":"Consent record ID.","in":"path","name":"consentRecordId","required":true,"schema":{"type":"string"},"example":"6af081ea2d6fb7b6ac6efc71"}}></ParamsItem><ParamsItem className={"paramsItem"} param={{"description":"Data agreement ID.","in":"path","name":"dataAgreementId","required":true,"schema":{"type":"string"},"example":"6af080eb2d6fb7b6ac6efc57"}}></ParamsItem><ParamsItem className={"paramsItem"} param={{"description":"Data attribute ID, from the `dataAttributes` of a data agreement.","in":"path","name":"dataAttributeId","required":true,"schema":{"type":"string"},"example":"6af081a12d6fb7b6ac6efc6d"}}></ParamsItem></ul></div></details><details style={{"marginBottom":"1rem"}} className={"openapi-markdown__details"} data-collapsed={false} open={true}><summary style={{}}><h3 className={"openapi-markdown__details-summary-header-params"}>Header Parameters</h3></summary><div><ul><ParamsItem className={"paramsItem"} param={{"in":"header","name":"X-ConsentBB-IndividualId","required":false,"schema":{"type":"string"},"example":"6af081b138e8f33dcf799628","description":"ID of the individual, or its `externalId`. Mandatory with an API key: without it the answer is `400` (\"IndividualId is not present in request header\"), and an unknown individual gets `400` too. With an individual token, leave it out: the server takes the individual from the token. Send it only on the routes that list it: with an API key that has resource scopes (for example `consent-records:read`), another route answers `400` to a request with this header."}}></ParamsItem></ul></div></details><div><div><ApiTabs label={undefined} id={undefined}><TabItem label={"200"} value={"200"}><div>

The server saved the request. The body is empty.

</div><div></div></TabItem><TabItem label={"400"} value={"400"}><div>

The `X-ConsentBB-IndividualId` header is missing, the individual does not exist, the consent record is not a consent record of the individual (`Failed to fetch consent record: ...`), or the data agreement is not the data agreement of the consent record (`Data agreement id and consent record id does not match: ...`).

</div><div><MimeTabs className={"openapi-tabs__mime"} schemaType={"response"}><TabItem label={"application/json"} value={"application/json"}><SchemaTabs className={"openapi-tabs__schema"}><TabItem label={"Schema"} value={"Schema"}><details style={{}} className={"openapi-markdown__details response"} data-collapsed={false} open={true}><summary style={{}} className={"openapi-markdown__details-summary-response"}><strong>Schema</strong></summary><div style={{"textAlign":"left","marginLeft":"1rem"}}></div><ul style={{"marginLeft":"1rem"}}><SchemaItem collapsible={false} name={"errorCode"} required={true} schemaName={"integer"} qualifierMessage={undefined} schema={{"type":"integer","example":400}}></SchemaItem><SchemaItem collapsible={false} name={"errorDescription"} required={true} schemaName={"string"} qualifierMessage={undefined} schema={{"type":"string","example":"Bad input parameter"}}></SchemaItem><SchemaItem collapsible={false} name={"errorKey"} required={false} schemaName={"string"} qualifierMessage={undefined} schema={{"type":"string","description":"A text code of the refusal that does not change when the text changes. Only some refusals have it, for example `organisation_suspended`, `feature_disabled` or `purpose_exists`."}}></SchemaItem></ul></details></TabItem><TabItem label={"Example (from schema)"} value={"Example (from schema)"}><ResponseSamples responseExample={"{\n  \"errorCode\": 400,\n  \"errorDescription\": \"Bad input parameter\",\n  \"errorKey\": \"string\"\n}"} language={"json"}></ResponseSamples></TabItem><TabItem label={"Example"} value={"Example"}><ResponseSamples responseExample={"{\n  \"errorCode\": 400,\n  \"errorDescription\": \"Data agreement id and consent record id does not match: 6af084602d6fb7b6ac6efc8b\"\n}"} language={"json"}></ResponseSamples></TabItem></SchemaTabs></TabItem></MimeTabs></div></TabItem><TabItem label={"401"} value={"401"}><div>

The API key or the token is missing or not valid.

</div><div><MimeTabs className={"openapi-tabs__mime"} schemaType={"response"}><TabItem label={"application/json"} value={"application/json"}><SchemaTabs className={"openapi-tabs__schema"}><TabItem label={"Schema"} value={"Schema"}><details style={{}} className={"openapi-markdown__details response"} data-collapsed={false} open={true}><summary style={{}} className={"openapi-markdown__details-summary-response"}><strong>Schema</strong></summary><div style={{"textAlign":"left","marginLeft":"1rem"}}></div><ul style={{"marginLeft":"1rem"}}><SchemaItem collapsible={false} name={"errorCode"} required={true} schemaName={"integer"} qualifierMessage={undefined} schema={{"type":"integer","example":400}}></SchemaItem><SchemaItem collapsible={false} name={"errorDescription"} required={true} schemaName={"string"} qualifierMessage={undefined} schema={{"type":"string","example":"Bad input parameter"}}></SchemaItem><SchemaItem collapsible={false} name={"errorKey"} required={false} schemaName={"string"} qualifierMessage={undefined} schema={{"type":"string","description":"A text code of the refusal that does not change when the text changes. Only some refusals have it, for example `organisation_suspended`, `feature_disabled` or `purpose_exists`."}}></SchemaItem></ul></details></TabItem><TabItem label={"Example (from schema)"} value={"Example (from schema)"}><ResponseSamples responseExample={"{\n  \"errorCode\": 400,\n  \"errorDescription\": \"Bad input parameter\",\n  \"errorKey\": \"string\"\n}"} language={"json"}></ResponseSamples></TabItem></SchemaTabs></TabItem></MimeTabs></div></TabItem><TabItem label={"500"} value={"500"}><div>

The server could not read the e-mail address of the individual (`Failed to read the user name`) or could not save the request.

</div><div><MimeTabs className={"openapi-tabs__mime"} schemaType={"response"}><TabItem label={"application/json"} value={"application/json"}><SchemaTabs className={"openapi-tabs__schema"}><TabItem label={"Schema"} value={"Schema"}><details style={{}} className={"openapi-markdown__details response"} data-collapsed={false} open={true}><summary style={{}} className={"openapi-markdown__details-summary-response"}><strong>Schema</strong></summary><div style={{"textAlign":"left","marginLeft":"1rem"}}></div><ul style={{"marginLeft":"1rem"}}><SchemaItem collapsible={false} name={"errorCode"} required={true} schemaName={"integer"} qualifierMessage={undefined} schema={{"type":"integer","example":400}}></SchemaItem><SchemaItem collapsible={false} name={"errorDescription"} required={true} schemaName={"string"} qualifierMessage={undefined} schema={{"type":"string","example":"Bad input parameter"}}></SchemaItem><SchemaItem collapsible={false} name={"errorKey"} required={false} schemaName={"string"} qualifierMessage={undefined} schema={{"type":"string","description":"A text code of the refusal that does not change when the text changes. Only some refusals have it, for example `organisation_suspended`, `feature_disabled` or `purpose_exists`."}}></SchemaItem></ul></details></TabItem><TabItem label={"Example (from schema)"} value={"Example (from schema)"}><ResponseSamples responseExample={"{\n  \"errorCode\": 400,\n  \"errorDescription\": \"Bad input parameter\",\n  \"errorKey\": \"string\"\n}"} language={"json"}></ResponseSamples></TabItem></SchemaTabs></TabItem></MimeTabs></div></TabItem><TabItem label={"503"} value={"503"}><div>

The server could not read the e-mail address of the individual for a short time (`Failed to read data from the api`). Try again later.

</div><div><MimeTabs className={"openapi-tabs__mime"} schemaType={"response"}><TabItem label={"application/json"} value={"application/json"}><SchemaTabs className={"openapi-tabs__schema"}><TabItem label={"Schema"} value={"Schema"}><details style={{}} className={"openapi-markdown__details response"} data-collapsed={false} open={true}><summary style={{}} className={"openapi-markdown__details-summary-response"}><strong>Schema</strong></summary><div style={{"textAlign":"left","marginLeft":"1rem"}}></div><ul style={{"marginLeft":"1rem"}}><SchemaItem collapsible={false} name={"errorCode"} required={true} schemaName={"integer"} qualifierMessage={undefined} schema={{"type":"integer","example":400}}></SchemaItem><SchemaItem collapsible={false} name={"errorDescription"} required={true} schemaName={"string"} qualifierMessage={undefined} schema={{"type":"string","example":"Bad input parameter"}}></SchemaItem><SchemaItem collapsible={false} name={"errorKey"} required={false} schemaName={"string"} qualifierMessage={undefined} schema={{"type":"string","description":"A text code of the refusal that does not change when the text changes. Only some refusals have it, for example `organisation_suspended`, `feature_disabled` or `purpose_exists`."}}></SchemaItem></ul></details></TabItem><TabItem label={"Example (from schema)"} value={"Example (from schema)"}><ResponseSamples responseExample={"{\n  \"errorCode\": 400,\n  \"errorDescription\": \"Bad input parameter\",\n  \"errorKey\": \"string\"\n}"} language={"json"}></ResponseSamples></TabItem></SchemaTabs></TabItem></MimeTabs></div></TabItem></ApiTabs></div></div>
      