---
title: "Invite a user to an ad account by email"
method: POST
path: "/v1/ads/accounts/user-invitations"
tags: ["Ad Accounts"]
---

# Invite a user to an ad account by email

`POST /v1/ads/accounts/user-invitations`

## Request

- Base URL: `https://zernio.com/api`
- URL: `https://zernio.com/api/v1/ads/accounts/user-invitations`
- Auth: HTTP bearer

Emails someone an invitation to a Google Ads account with the access role you choose, for example to hand a client account you created under your manager to its owner.

Creates a user access invitation (Google's CustomerUserAccessInvitationService) on `adAccountId`. The connection's Google user needs admin access to that account, directly or through a manager above it, which is the case for an account created with POST /v1/ads/accounts. The recipient accepts from the email, possibly with another Google account. When Google requires multi-party approval, nothing is sent until a second admin of the account approves the request in Google Ads: the response then has `status: PENDING_APPROVAL` and a `multiPartyAuthReviewId` instead of an `invitationId`, which DELETE /v1/ads/accounts/user-invitations/pending-approvals withdraws. Not idempotent: Google refuses a second invitation while the email has one pending or awaiting approval. Google has no server-side check for this call, so `validateOnly: true` reads the account's invitations with the same credentials (proving the account is reachable) and fails if the email already has a pending one, without sending anything.

## Request body

- object
  - `accountId` string, required: Google ads SocialAccount id.
  - `adAccountId` string, required: Google Ads customer id to invite the user to, digits only.
  - `emailAddress` string, email, required
  - `accessRole` 'ADMIN' | 'STANDARD' | 'READ_ONLY' | 'EMAIL_ONLY', required: ADMIN manages the account and its users, STANDARD edits campaigns, READ_ONLY views them, EMAIL_ONLY only receives the account's emails.
  - `validateOnly` boolean

## Response `200`

Validated only (validateOnly true), nothing sent

- GoogleAdsUserAccessInvitationResult
  - `customerId` string
  - `emailAddress` string
  - `accessRole` 'ADMIN' | 'STANDARD' | 'READ_ONLY' | 'EMAIL_ONLY': ADMIN manages the account and its users, STANDARD edits campaigns, READ_ONLY views them, EMAIL_ONLY only receives the account's emails.
  - `status` 'PENDING' | 'PENDING_APPROVAL': PENDING once the email is sent; PENDING_APPROVAL while Google waits for a second admin's multi-party approval.
  - `invitationId` string, nullable: Null on validateOnly and while the invitation awaits multi-party approval.
  - `multiPartyAuthReviewId` string, nullable: Google's multi-party approval review id when status is PENDING_APPROVAL.
  - `validateOnly` boolean

## Other responses

- `201`: Invitation sent, or held for multi-party approval
- `400`: Invalid request
- `401`: Missing or invalid API key. `code` is `missing_credentials` when no Authorization header was sent and `invalid_credentials` when the key is unknown, revoked or expired.
- `403`: The connection has selected ad accounts (its ad-account scope, set with the dashboard picker or GET /v1/connect/{platform}/ads with adAccountIds) and the ad account this request targets is not among them, so the connection may not act on it even though its token can reach it. Code `ad_account_not_selected`. `details` carries `accountId` (the connection), `adAccountId` (the refused ad account) and `selectedAdAccountIds`. Add the ad account to the selection (adAccountIds replaces the whole selection, so pass the ids already selected plus this one) or use a connection that has it selected. Connections without a selection keep reaching every ad account their token can manage.
- `404`: The account or requested resource was not found or is not accessible. An account ID may have been disconnected and removed. Read GET /v1/accounts for current account IDs.
- `409`: The account exists but is inactive or needs reconnection. Reconnect it, then read GET /v1/accounts for its current account ID before retrying. Code: ads_connection_required.
- `429`: Google Ads operations budget or quota exhausted; retry later.
- `501`: Only available on Google Ads accounts

## Changes

- **2026-10-21** `fd4ba69cb07a`: 1 info
  - endpoint added

[Operation history](https://skmtc.dev/zernio/apis/zernio-api/changes/v1/ads/accounts/user-invitations/post.md)

---

[API](https://skmtc.dev/zernio/apis/zernio-api.md) · [All operations](https://skmtc.dev/zernio/apis/zernio-api/llms.txt) · [OpenAPI document](https://skmtc.dev/zernio/apis/zernio-api/revisions/4e74db179e73?raw)
