---
id: service-delete-individual
title: "Delete individual"
description: "Deletes an individual. The service marks the record as deleted, so no route finds the individual again, and deletes the login account of the individual, if it has one. The consent records of the individual are not deleted. The response returns the individual as it was."
sidebar_label: "Delete individual"
hide_title: true
hide_table_of_contents: true
api: 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
sidebar_class_name: "delete 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"}>Delete individual</h1>

<MethodEndpoint method={"delete"} path={"/v4/service/platform/individual/{individualId}"}></MethodEndpoint>



Deletes an individual. The service marks the record as deleted, so no route finds the individual again, and deletes the login account of the individual, if it has one. The consent records of the individual are not deleted. The response returns the individual as it was.

This route takes an API key, or a token of the identity provider of the organisation: with such a token the individual can delete only its own record, and another ID gets `403`. An individual token and a token of the privacy dashboard login get `403`.

## 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":"Individual ID.","in":"path","name":"individualId","required":true,"schema":{"type":"string"},"example":"6af0821c38e8f33dcf79962e"}}></ParamsItem></ul></div></details><div><div><ApiTabs label={undefined} id={undefined}><TabItem label={"200"} value={"200"}><div>

The deleted individual.

</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={true} className={"schemaItem"}><details style={{}} className={"openapi-markdown__details"}><summary style={{}}><span className={"openapi-schema__container"}><strong className={"openapi-schema__property"}>individual</strong><span className={"openapi-schema__name"}> object</span></span></summary><div style={{"marginLeft":"1rem"}}><div style={{"marginTop":".5rem","marginBottom":".5rem"}}>

A person whose consent the organisation records, for example a customer. The record can point to the person in another system through `externalId`. Keep personal data in it to the minimum that you need.

</div><SchemaItem collapsible={false} name={"id"} required={false} schemaName={"string"} qualifierMessage={undefined} schema={{"type":"string","example":"6af081b138e8f33dcf799628","description":"Individual ID. The server sets it. Send it in the `X-ConsentBB-IndividualId` header of the consent record routes."}}></SchemaItem><SchemaItem collapsible={false} name={"externalId"} required={false} schemaName={"string"} qualifierMessage={undefined} schema={{"type":"string","example":"customer-1001","description":"Your own ID of the person, for example a customer number. It is unique in the organisation: a second individual with the same external ID gets `409`."}}></SchemaItem><SchemaItem collapsible={false} name={"externalIdType"} required={false} schemaName={"string"} qualifierMessage={undefined} schema={{"type":"string","example":"customerNumber","description":"What kind of ID `externalId` is, for example `customerNumber` or `email`."}}></SchemaItem><SchemaItem collapsible={false} name={"identityProviderId"} required={false} schemaName={"string"} qualifierMessage={undefined} schema={{"type":"string","description":"ID of the identity provider of the organisation that the person logs in with, if any."}}></SchemaItem><SchemaItem collapsible={false} name={"name"} required={false} schemaName={"string"} qualifierMessage={undefined} schema={{"type":"string","example":"Alex Doe","description":"Name of the individual."}}></SchemaItem><SchemaItem collapsible={false} name={"iamId"} required={false} schemaName={"string"} qualifierMessage={undefined} schema={{"type":"string","description":"ID of the login account of the individual at the identity service. The server sets it when the individual has an `email`."}}></SchemaItem><SchemaItem collapsible={false} name={"email"} required={false} schemaName={"string"} qualifierMessage={undefined} schema={{"type":"string","description":"Email address. With an email address, the server also makes a login account for the individual (for the privacy dashboard). An email address that has an account already gets `400`."}}></SchemaItem><SchemaItem collapsible={false} name={"phone"} required={false} schemaName={"string"} qualifierMessage={undefined} schema={{"type":"string","description":"Phone number."}}></SchemaItem><SchemaItem collapsible={false} name={"pushNotificationToken"} required={false} schemaName={"string"} qualifierMessage={undefined} schema={{"type":"string","description":"Push notification token of the device of the individual."}}></SchemaItem><SchemaItem collapsible={false} name={"deviceType"} required={false} schemaName={"string"} qualifierMessage={"**Possible values:** [``, `android`, `ios`]"} schema={{"type":"string","description":"Operating system of the device for push notifications. Empty when not set. Any other value gets `400`.","enum":["","android","ios"]}}></SchemaItem><SchemaItem collapsible={false} name={"mapperId"} required={false} schemaName={"string"} qualifierMessage={undefined} schema={{"type":"string","description":"A second ID of your choice, for example the ID of the person in a mobile app. It is unique in the organisation: a second individual with the same mapper ID gets `409`."}}></SchemaItem></div></details></SchemaItem></ul></details></TabItem><TabItem label={"Example (from schema)"} value={"Example (from schema)"}><ResponseSamples responseExample={"{\n  \"individual\": {\n    \"id\": \"6af081b138e8f33dcf799628\",\n    \"externalId\": \"customer-1001\",\n    \"externalIdType\": \"customerNumber\",\n    \"identityProviderId\": \"string\",\n    \"name\": \"Alex Doe\",\n    \"iamId\": \"string\",\n    \"email\": \"string\",\n    \"phone\": \"string\",\n    \"pushNotificationToken\": \"string\",\n    \"deviceType\": \"\",\n    \"mapperId\": \"string\"\n  }\n}"} language={"json"}></ResponseSamples></TabItem><TabItem label={"Example"} value={"Example"}><ResponseSamples responseExample={"{\n  \"individual\": {\n    \"id\": \"6af0821c38e8f33dcf79962e\",\n    \"externalId\": \"customer-1002\",\n    \"externalIdType\": \"customerNumber\",\n    \"identityProviderId\": \"\",\n    \"name\": \"Sam Doe\",\n    \"iamId\": \"\",\n    \"email\": \"\",\n    \"phone\": \"\",\n    \"pushNotificationToken\": \"<push-notification-token>\",\n    \"deviceType\": \"ios\",\n    \"mapperId\": \"\"\n  }\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={"403"} value={"403"}><div>

The API key does not have the scope, or a token asks for another individual or is not allowed on this route.

</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"}}><div><span className={"badge badge--info"}>anyOf</span><SchemaTabs><TabItem label={"MOD1"} value={"0-item-properties"}><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></TabItem><TabItem label={"Older error body"} value={"1-item-properties"}><SchemaItem collapsible={false} name={"Code"} required={true} schemaName={"integer"} qualifierMessage={undefined} schema={{"type":"integer","description":"The HTTP status.","example":403}}></SchemaItem><SchemaItem collapsible={false} name={"Message"} required={true} schemaName={"string"} qualifierMessage={undefined} schema={{"type":"string","description":"What went wrong.","example":"Unauthorized access;User doesn't have enough permissions;"}}></SchemaItem></TabItem></SchemaTabs></div></ul></details></TabItem><TabItem label={"Example (from schema)"} value={"Example (from schema)"}><ResponseSamples responseExample={"{}"} language={"json"}></ResponseSamples></TabItem></SchemaTabs></TabItem></MimeTabs></div></TabItem><TabItem label={"500"} value={"500"}><div>

The individual does not exist (`Failed to fetch individual: <individualId>`), or the server could not delete the login account or save the change.

</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>
      