---
id: config-update-push-notification
title: "Update push notification"
description: "Replaces the Google service account that the service uses to send Firebase Cloud Messaging push notifications. It does the same as Configure push notification: send the full JSON key of the new service account."
sidebar_label: "Update push notification"
hide_title: true
hide_table_of_contents: true
api: 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
sidebar_class_name: "put api-method"
info_path: docs/consent-management-admin-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"}>Update push notification</h1>

<MethodEndpoint method={"put"} path={"/v4/config/platform/push-notification"}></MethodEndpoint>



Replaces the Google service account that the service uses to send Firebase Cloud Messaging push notifications. It does the same as Configure push notification: send the full JSON key of the new service account.

## Request

<MimeTabs className={"openapi-tabs__mime"}><TabItem label={"application/json"} value={"application/json-schema"}><details style={{}} className={"openapi-markdown__details mime"} data-collapsed={false} open={true}><summary style={{}} className={"openapi-markdown__details-summary-mime"}><h3 className={"openapi-markdown__details-summary-header-body"}>Body</h3><strong className={"openapi-schema__required"}>required</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"}>serviceAccountCredential</strong><span className={"openapi-schema__name"}> object</span><span className={"openapi-schema__divider"}></span><span className={"openapi-schema__required"}>required</span></span></summary><div style={{"marginLeft":"1rem"}}><div style={{"marginTop":".5rem","marginBottom":".5rem"}}>

The JSON key of a Google service account that can send Firebase Cloud Messaging push notifications: the file that you download from the Google Cloud console, with its member names as they are. The service sends the push notifications to your individuals with it.

</div><SchemaItem collapsible={false} name={"type"} required={true} schemaName={"string"} qualifierMessage={"**Possible values:** [`service_account`]"} schema={{"type":"string","description":"Must be `service_account`.","enum":["service_account"],"example":"service_account"}}></SchemaItem><SchemaItem collapsible={false} name={"project_id"} required={true} schemaName={"string"} qualifierMessage={undefined} schema={{"type":"string","description":"ID of the Google Cloud project.","example":"acme-mobile-app"}}></SchemaItem><SchemaItem collapsible={false} name={"private_key_id"} required={false} schemaName={"string"} qualifierMessage={undefined} schema={{"type":"string","description":"ID of the private key.","example":"<private-key-id>"}}></SchemaItem><SchemaItem collapsible={false} name={"private_key"} required={true} schemaName={"string"} qualifierMessage={undefined} schema={{"type":"string","description":"The private key, a PEM RSA key (PKCS","example":"<private-key>"}}></SchemaItem><SchemaItem collapsible={false} name={"client_email"} required={true} schemaName={"string"} qualifierMessage={undefined} schema={{"type":"string","description":"Email address of the service account.","example":"push@acme-mobile-app.iam.gserviceaccount.com"}}></SchemaItem><SchemaItem collapsible={false} name={"client_id"} required={false} schemaName={"string"} qualifierMessage={undefined} schema={{"type":"string","description":"Client ID of the service account.","example":"<client-id>"}}></SchemaItem><SchemaItem collapsible={false} name={"auth_uri"} required={false} schemaName={"string"} qualifierMessage={undefined} schema={{"type":"string","example":"https://accounts.google.com/o/oauth2/auth"}}></SchemaItem><SchemaItem collapsible={false} name={"token_uri"} required={false} schemaName={"string"} qualifierMessage={undefined} schema={{"type":"string","example":"https://oauth2.googleapis.com/token"}}></SchemaItem><SchemaItem collapsible={false} name={"auth_provider_x509_cert_url"} required={false} schemaName={"string"} qualifierMessage={undefined} schema={{"type":"string","example":"https://www.googleapis.com/oauth2/v1/certs"}}></SchemaItem><SchemaItem collapsible={false} name={"client_x509_cert_url"} required={false} schemaName={"string"} qualifierMessage={undefined} schema={{"type":"string","example":"https://www.googleapis.com/robot/v1/metadata/x509/push%40acme-mobile-app.iam.gserviceaccount.com"}}></SchemaItem><SchemaItem collapsible={false} name={"universe_domain"} required={false} schemaName={"string"} qualifierMessage={undefined} schema={{"type":"string","example":"googleapis.com"}}></SchemaItem></div></details></SchemaItem></ul></details></TabItem></MimeTabs><div><div><ApiTabs label={undefined} id={undefined}><TabItem label={"200"} value={"200"}><div>

The service account is saved. The response has no body.

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

The body is not valid JSON or has an unknown member, `serviceAccountCredential` is missing, `type` is not `service_account`, `project_id`, `private_key` or `client_email` is empty, the private key is not a PEM RSA key, or the key is not a valid Google service account.

</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={"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 or token does not allow this call. An API key without the scope of the operation gets the older body `{"Code", "Message"}`. An `X-SandboxOrgId` header that names another sandbox organisation than the one of the API key gets `{"errorCode", "errorDescription"}`. When a platform admin has turned off the feature of the operation for the organisation, the answer has `errorKey` `feature_disabled` and the member `feature` (the name of the feature).

</div><details style={{"textAlign":"left","marginBottom":"1rem"}} className={"openapi-markdown__details"} data-collaposed={true} open={false}><summary style={{}}><strong>Response Headers</strong></summary><ul style={{"marginLeft":"1rem"}}></ul></details><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><TabItem label={"Example"} value={"Example"}><ResponseSamples responseExample={"{\n  \"Code\": 403,\n  \"Message\": \"Unauthorized access;User doesn't have enough permissions;\"\n}"} language={"json"}></ResponseSamples></TabItem></SchemaTabs></TabItem></MimeTabs></div></TabItem><TabItem label={"500"} value={"500"}><div>

The organisation cannot be read, or the server could not save the service account.

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