google/data-manager-api-audience-ingestion
>- Guides developers through uploading audience members to Google products using the Data Manager API /v1/audienceMembers/ingest endpoint and its associated client libraries. Use this skill when the user wants to upload audience members for Customer Match, mobile device ID audiences, or any other audience use case supported by the Data Manager API. Don't use for uploading events or conversions (use the data-manager-api-event-ingestion skill).
npx skills add https://github.com/google/skills --skill data-manager-api-audience-ingestion
the Data Manager API or install the client and utility libraries, refer to
the data-manager-api-setup skill.
explicitly stated, STOP and CLARIFY with the user where the data is being
sent (e.g., Google Ads, Display & Video 360, etc.) BEFORE generating any
code. Do not assume Google Ads by default. This maps to the account_type
field of the operating_account in the Destination.
your destination to implement the integration, as steps for configuring
and sending the request may vary between destinations:
> [!IMPORTANT]
> If writing or updating an ingestion script, ALWAYS retrieve the relevant code
> sample to use as a reference:
| Language | Sample |
| :--- | :--- |
| Python | ingest_audience_members.py |
| Java | IngestAudienceMembers.java |
| PHP | ingest_audience_members.php |
| Node | ingest_audience_members.ts |
| .NET| IngestAudienceMembers.cs |
> [!CRITICAL]
> If refactoring code to upgrade from another Google API, ALWAYS
> extract the full contents of the relevant field mapping guide.
Google Ads API to Customer Match Migration Field Mappings
Display & Video 360 API to Customer Match Migration Field Mappings
Implement the ingestion logic using the following checkpoints:
(IngestionServiceClient).
Destination object using theproduct_destination_id and the appropriate account configurations:
operating_account (target account receiving data), login_account (if
authenticating using a manager account or a data partner account), and
linked_account (if you're a data partner accessing the account via a
partner link to a manager account). STRONGLY RECOMMENDED: Refer to
the Configure destinations and headers
guide for more details on configuring destinations.
hash user identifiers correctly.
(IngestAudienceMembersRequest) containing the destinations, formatted
members, and consent permissions.
validate_only booleanoption on the IngestAudienceMembersRequest to allow developers to validate
schemas without actually uploading data.
ingest_audience_members and record thereturned request ID for logging/troubleshooting.
using diagnostics. Since request processing is asynchronous, a
successful ingestion response (HTTP 200 OK returning a request_id) only
indicates the payload was received. To check if the records actually
succeeded, partially succeeded, or failed to process, query
client.retrieve_request_status using the request_id. Skipping this
step is a common user mistake.
guide and use that as the source of truth for formatting and
normalization rules.
(emails, phone numbers, addresses).
Python Example:
from google.ads.datamanager_util import Formatter
from google.ads.datamanager_util.format import Encoding
formatter: Formatter = Formatter()
processed_email: str = formatter.process_email_address(
email, Encoding.HEX
)
address field on UserIdentifier if all required fields(postal_code, family_name, given_name, region_code) are present;
incomplete address fields will cause the API request to fail.
product_destination_id must be a numeric string. It is NOT a resourcename.
ConsentStatus are CONSENT_GRANTED andCONSENT_DENIED. Do not use the values GRANTED and DENIED.
UserIdentifier are email_address and phone_number. Donot use the Google Ads API field names hashed_email and
hashed_phone_number.
retrieve_request_status) ifvalidate_only is set to true.
> [!IMPORTANT]
> Refer to Understand API Errors
> for a detailed guide on how to understand the structure of errors returned by
> the API.
Periodically poll for status using exponential backoff, starting at least
30 minutes after sending the IngestAudienceMembersRequest.
client.retrieve_request_status usingRetrieveRequestStatusRequest(request_id=...).
request_status_per_destination in the response to inspecteach target's request_status.
request_status is SUCCESS,PARTIAL_SUCCESS, or FAILED, inspect diagnostic values:
nested under audience_members_ingestion_status (for example,
composite_data_ingestion_status).
record_count (includes both success andfailure).
(e.g., data_type_counts for composite_data_ingestion_status or
user_identifier_count for user_data_ingestion_status; see the
for other status types).
user_data and composite_data uploads,check upload_match_rate_range.
FAILED or PARTIAL_SUCCESS, inspecteach error's reason and record_count under
error_info.error_counts.
reason and record_countunder warning_info.warning_counts (even if the destination status is
SUCCESS).
Take google/data-manager-api-audience-ingestion from the repository into ~/.claude/skills for personal
use, or into .claude/skills inside a project.
The agent identifies a skill by the name field in its header. Two skills with the
same name cannot sit side by side — one of them will be ignored.