>-
data-manager-api-setup skill.account_type field of the operating_account in the Destination,
and also determines valid event identifiers and requirements.[!IMPORTANT] If writing or updating an ingestion script, ALWAYS retrieve the relevant code sample to use as a reference:
| Language | Sample |
|---|---|
| Python | ingest_events.py |
| Java | IngestEvents.java |
| PHP | ingest_events.php |
| Node | ingest_events.ts |
| .NET | IngestEvents.cs |
[!CRITICAL] If refactoring code to upgrade from another Google API, ALWAYS extract the full contents of the relevant field mapping guide.
IngestionServiceClient).Destination object using the
product_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.IngestEventsRequest) containing the destinations, event records, and
consent permissions.validate_only boolean
option on the IngestEventsRequest to allow developers to validate schemas
without actually uploading data.ingest_events and record the returned
request ID for logging/troubleshooting.request_id) only
indicates the payload was received. To check if the records actually
succeeded, partially succeeded, or failed to process, query the
client.retrieve_request_status endpoint using the request_id. Skipping
this step is a common user mistake.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
)
product_destination_id as a numeric string. It is NOT a resource
name path.event_timestamp strictly in RFC 3339 format. Use the SDK's typed
timestamp object instead of a raw string where available.gclid, gbraid, wbraid) inside the
ad_identifiers block, not directly on the base event payload.ConsentStatus are CONSENT_GRANTED and
CONSENT_DENIED. Do not use the values GRANTED and DENIED.consent can be set globally on the IngestEventsRequest or on
individual Events.UserIdentifier uses email_address and phone_number.
Do not use the Google Ads API fields hashed_email and
hashed_phone_number.currency, not
currency_code.retrieve_request_status) if
validate_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.
IngestEventsRequest.client.retrieve_request_status using
RetrieveRequestStatusRequest(request_id=...).request_status_per_destination in the response to inspect
each target's request_status.request_status is SUCCESS,
PARTIAL_SUCCESS, or FAILED, inspect diagnostic values:
events_ingestion_status.record_count
(includes both success and failure).FAILED or PARTIAL_SUCCESS, inspect
each error's reason and record_count under
error_info.error_counts.reason and record_count
under warning_info.warning_counts (even if the destination status is
SUCCESS).