Stay organized with collections
Save and categorize content based on your preferences.
The client library for Python doesn't specify any default timeouts, nor are
any defaults specified at the gRPC transport layer. This means that, by default,
the client library for Python fully delegates timeout behavior to the server.
This is adequate for most use cases; however, if it's necessary to specify a
client-side timeout, the client library for Python does support timeout
overrides for both streaming and unary calls.
You can set the timeout to 2 hours or more, but the API might still time out
extremely long-running requests and return a
DEADLINE_EXCEEDED error.
If this becomes an issue, you can split up the query and execute the chunks in
parallel; this avoids the situation where a long-running request fails and the
only way to recover is to restart the request.
To override the default timeout, you need to add an extra parameter when calling
the method:
defmake_server_streaming_call(client:GoogleAdsClient,customer_id:str)-> None:"""Makes a server streaming call using a custom client timeout. Args: client: An initialized GoogleAds client. customer_id: The str Google Ads customer ID. """ga_service:GoogleAdsServiceClient=client.get_service("GoogleAdsService")campaign_ids:List[str]=[]try:search_request:SearchGoogleAdsStreamRequest=client.get_type("SearchGoogleAdsStreamRequest")search_request.customer_id=customer_idsearch_request.query=_QUERYstream:Iterator[SearchGoogleAdsStreamResponse]=(ga_service.search_stream(request=search_request,# When making any request, an optional "timeout" parameter can be# provided to specify a client-side response deadline in seconds.# If not set, then no timeout will be enforced by the client and# the channel will remain open until the response is completed or# severed, either manually or by the server.timeout=_CLIENT_TIMEOUT_SECONDS,))batch:SearchGoogleAdsStreamResponseforbatchinstream:row:GoogleAdsRowforrowinbatch.results:campaign_ids.append(row.campaign.id)print("The server streaming call completed before the timeout.")exceptDeadlineExceeded:print("The server streaming call did not complete before the timeout.")sys.exit(1)exceptGoogleAdsExceptionasex:print(f"Request with ID '{ex.request_id}' failed with status "f"'{ex.error.code().name}' and includes the following errors:")forerrorinex.failure.errors:print(f"\tError with message '{error.message}'.")iferror.location:forfield_path_elementinerror.location.field_path_elements:print(f"\t\tOn field: {field_path_element.field_name}")sys.exit(1)print(f"Total # of campaign IDs retrieved: {len(campaign_ids)}")
To override the default timeout, you need to add an extra parameter when calling
the method:
defmake_unary_call(client:GoogleAdsClient,customer_id:str)-> None:"""Makes a unary call using a custom client timeout. Args: client: An initialized GoogleAds client. customer_id: The Google Ads customer ID. """ga_service:GoogleAdsServiceClient=client.get_service("GoogleAdsService")campaign_ids:List[str]=[]try:search_request:SearchGoogleAdsRequest=client.get_type("SearchGoogleAdsRequest")search_request.customer_id=customer_idsearch_request.query=_QUERYresults:Iterator[GoogleAdsRow]=ga_service.search(request=search_request,# When making any request, an optional "retry" parameter can be# provided to specify its retry behavior. Complete information about# these settings can be found here:# https://googleapis.dev/python/google-api-core/latest/retry.htmlretry=Retry(# Sets the maximum accumulative timeout of the call; it# includes all tries.deadline=_CLIENT_TIMEOUT_SECONDS,# Sets the timeout that is used for the first try to one tenth# of the maximum accumulative timeout of the call.# Note: This overrides the default value and can lead to# RequestError.RPC_DEADLINE_TOO_SHORT errors when too small. We# recommend changing the value only if necessary.initial=_CLIENT_TIMEOUT_SECONDS/10,# Sets the maximum timeout that can be used for any given try# to one fifth of the maximum accumulative timeout of the call# (two times greater than the timeout that is needed for the# first try).maximum=_CLIENT_TIMEOUT_SECONDS/5,),)row:GoogleAdsRowforrowinresults:campaign_ids.append(row.campaign.id)print("The unary call completed before the timeout.")exceptDeadlineExceeded:print("The unary call did not complete before the timeout.")sys.exit(1)exceptGoogleAdsExceptionasex:print(f"Request with ID '{ex.request_id}' failed with status "f"'{ex.error.code().name}' and includes the following errors:")forerrorinex.failure.errors:print(f"\tError with message '{error.message}'.")iferror.location:forfield_path_elementinerror.location.field_path_elements:print(f"\t\tOn field: {field_path_element.field_name}")sys.exit(1)print(f"Total # of campaign IDs retrieved: {len(campaign_ids)}")
[[["Easy to understand","easyToUnderstand","thumb-up"],["Solved my problem","solvedMyProblem","thumb-up"],["Other","otherUp","thumb-up"]],[["Missing the information I need","missingTheInformationINeed","thumb-down"],["Too complicated / too many steps","tooComplicatedTooManySteps","thumb-down"],["Out of date","outOfDate","thumb-down"],["Samples / code issue","samplesCodeIssue","thumb-down"],["Other","otherDown","thumb-down"]],["Last updated 2025-08-25 UTC."],[[["\u003cp\u003eThe Google Ads client library for Python does not set default timeouts, relying on server-side timeouts.\u003c/p\u003e\n"],["\u003cp\u003eClient-side timeouts can be set to override this default behavior for both streaming and unary calls using a \u003ccode\u003etimeout\u003c/code\u003e parameter.\u003c/p\u003e\n"],["\u003cp\u003eWhile timeouts can be extended to 2 hours or more, extremely long API requests might still encounter \u003ccode\u003eDEADLINE_EXCEEDED\u003c/code\u003e errors and may require splitting into smaller, parallel requests.\u003c/p\u003e\n"],["\u003cp\u003eStreaming calls, such as \u003ccode\u003eGoogleAdsService.SearchStream\u003c/code\u003e, use a direct \u003ccode\u003etimeout\u003c/code\u003e parameter for client-side timeout enforcement.\u003c/p\u003e\n"],["\u003cp\u003eUnary calls, like \u003ccode\u003eGoogleAdsService.Search\u003c/code\u003e and \u003ccode\u003eGoogleAdsService.Mutate\u003c/code\u003e, leverage a \u003ccode\u003eretry\u003c/code\u003e parameter with a \u003ccode\u003edeadline\u003c/code\u003e for timeout control, and can further fine-tune initial and maximum timeout per try.\u003c/p\u003e\n"]]],[],null,["# Timeouts\n\nThe client library for Python doesn't specify any default timeouts, nor are\nany defaults specified at the gRPC transport layer. This means that, by default,\nthe client library for Python fully delegates timeout behavior to the server.\n\nThis is adequate for most use cases; however, if it's necessary to specify a\nclient-side timeout, the client library for Python does support timeout\noverrides for both streaming and unary calls.\n\nYou can set the timeout to 2 hours or more, but the API might still time out\nextremely long-running requests and return a\n[`DEADLINE_EXCEEDED`](/google-ads/api/reference/rpc/v21/InternalErrorEnum.InternalError) error.\nIf this becomes an issue, you can split up the query and execute the chunks in\nparallel; this avoids the situation where a long-running request fails and the\nonly way to recover is to restart the request.\n\nStreaming call timeouts\n-----------------------\n\nThe only Google Ads API service method that uses this type of call is\n[`GoogleAdsService.SearchStream`](/google-ads/api/reference/rpc/v21/GoogleAdsService/SearchStream).\n\nTo override the default timeout, you need to add an extra parameter when calling\nthe method:\n\n\n```python\ndef make_server_streaming_call(\n client: GoogleAdsClient, customer_id: str\n) -\u003e None:\n \"\"\"Makes a server streaming call using a custom client timeout.\n\n Args:\n client: An initialized GoogleAds client.\n customer_id: The str Google Ads customer ID.\n \"\"\"\n ga_service: GoogleAdsServiceClient = client.get_service(\"GoogleAdsService\")\n campaign_ids: List[str] = []\n\n try:\n search_request: SearchGoogleAdsStreamRequest = client.get_type(\n \"SearchGoogleAdsStreamRequest\"\n )\n search_request.customer_id = customer_id\n search_request.query = _QUERY\n stream: Iterator[SearchGoogleAdsStreamResponse] = (\n ga_service.search_stream(\n request=search_request,\n # When making any request, an optional \"timeout\" parameter can be\n # provided to specify a client-side response deadline in seconds.\n # If not set, then no timeout will be enforced by the client and\n # the channel will remain open until the response is completed or\n # severed, either manually or by the server.\n timeout=_CLIENT_TIMEOUT_SECONDS,\n )\n )\n\n batch: SearchGoogleAdsStreamResponse\n for batch in stream:\n row: GoogleAdsRow\n for row in batch.results:\n campaign_ids.append(row.campaign.id)\n\n print(\"The server streaming call completed before the timeout.\")\n except DeadlineExceeded:\n print(\"The server streaming call did not complete before the timeout.\")\n sys.exit(1)\n except GoogleAdsException as ex:\n print(\n f\"Request with ID '{ex.request_id}' failed with status \"\n f\"'{ex.error.code().name}' and includes the following errors:\"\n )\n for error in ex.failure.errors:\n print(f\"\\tError with message '{error.message}'.\")\n if error.location:\n for field_path_element in error.location.field_path_elements:\n print(f\"\\t\\tOn field: {field_path_element.field_name}\")\n sys.exit(1)\n\n print(f\"Total # of campaign IDs retrieved: {len(campaign_ids)}\")https://github.com/googleads/google-ads-python/blob/d0595698b8a7de6cc00684b467462601037c9db9/examples/misc/set_custom_client_timeouts.py#L57-L109\n \n```\n\n\u003cbr /\u003e\n\nUnary call timeouts\n-------------------\n\nMost of the Google Ads API service methods use unary calls; typical examples are\n[`GoogleAdsService.Search`](/google-ads/api/reference/rpc/v21/GoogleAdsService/Search) and\n[`GoogleAdsService.Mutate`](/google-ads/api/reference/rpc/v21/GoogleAdsService/Mutate).\n\nTo override the default timeout, you need to add an extra parameter when calling\nthe method:\n\n\n```python\ndef make_unary_call(client: GoogleAdsClient, customer_id: str) -\u003e None:\n \"\"\"Makes a unary call using a custom client timeout.\n\n Args:\n client: An initialized GoogleAds client.\n customer_id: The Google Ads customer ID.\n \"\"\"\n ga_service: GoogleAdsServiceClient = client.get_service(\"GoogleAdsService\")\n campaign_ids: List[str] = []\n\n try:\n search_request: SearchGoogleAdsRequest = client.get_type(\n \"SearchGoogleAdsRequest\"\n )\n search_request.customer_id = customer_id\n search_request.query = _QUERY\n results: Iterator[GoogleAdsRow] = ga_service.search(\n request=search_request,\n # When making any request, an optional \"retry\" parameter can be\n # provided to specify its retry behavior. Complete information about\n # these settings can be found here:\n # https://googleapis.dev/python/google-api-core/latest/retry.html\n retry=Retry(\n # Sets the maximum accumulative timeout of the call; it\n # includes all tries.\n deadline=_CLIENT_TIMEOUT_SECONDS,\n # Sets the timeout that is used for the first try to one tenth\n # of the maximum accumulative timeout of the call.\n # Note: This overrides the default value and can lead to\n # RequestError.RPC_DEADLINE_TOO_SHORT errors when too small. We\n # recommend changing the value only if necessary.\n initial=_CLIENT_TIMEOUT_SECONDS / 10,\n # Sets the maximum timeout that can be used for any given try\n # to one fifth of the maximum accumulative timeout of the call\n # (two times greater than the timeout that is needed for the\n # first try).\n maximum=_CLIENT_TIMEOUT_SECONDS / 5,\n ),\n )\n\n row: GoogleAdsRow\n for row in results:\n campaign_ids.append(row.campaign.id)\n\n print(\"The unary call completed before the timeout.\")\n except DeadlineExceeded:\n print(\"The unary call did not complete before the timeout.\")\n sys.exit(1)\n except GoogleAdsException as ex:\n print(\n f\"Request with ID '{ex.request_id}' failed with status \"\n f\"'{ex.error.code().name}' and includes the following errors:\"\n )\n for error in ex.failure.errors:\n print(f\"\\tError with message '{error.message}'.\")\n if error.location:\n for field_path_element in error.location.field_path_elements:\n print(f\"\\t\\tOn field: {field_path_element.field_name}\")\n sys.exit(1)\n\n print(f\"Total # of campaign IDs retrieved: {len(campaign_ids)}\")https://github.com/googleads/google-ads-python/blob/d0595698b8a7de6cc00684b467462601037c9db9/examples/misc/set_custom_client_timeouts.py#L114-L174\n \n```\n\n\u003cbr /\u003e"]]