I can't update a couple of budgets of one of our customers (I have only a refresh token), it fails with an undocumented error BudgetError.BUDGET_AMOUNT_MUST_BE_UNSET_FOR_BUDGET_PERIOD_CUSTOM, at least I couldn't find it.
[http-bio-5050-exec-7] WARN com.google.api.ads.adwords.lib.client.AdWordsServiceClient.requestInfoLogger - Request made: Service: BudgetService Method: mutate clientCustomerId: XXXXXX URL:
https://adwords.google.com/api/adwords/cm/v201710/BudgetService Request ID: 00056a6a1f8274100a379a113f01f938 ResponseTime(ms): 191 OperationsCount: 1 IsFault: true FaultMessage: ApiException{applicationExceptionType=ApiException, errors=[BudgetError{apiErrorType=BudgetError, errorString=BudgetError.BUDGET_AMOUNT_MUST_BE_UNSET_FOR_BUDGET_PERIOD_CUSTOM, fieldPath=operations[0].operand.amount, fieldPathElements=[FieldPathElement{field=operations, index=0}, FieldPathElement{field=operand}, FieldPathElement{field=amount}], reason=BUDGET_ERROR, trigger=}]}
[http-bio-5050-exec-7] INFO com.google.api.ads.adwords.lib.client.AdWordsServiceClient.soapXmlLogger - SOAP request:
<soapenv:Header>
<ns1:clientCustomerId>XXXXXXXX</ns1:clientCustomerId>
<ns1:developerToken>REDACTED</ns1:developerToken>
<ns1:userAgent>XXXXX (AwApi-Java, AdWords-Axis/3.10.0, Common-Java/3.10.0, Axis/1.4, Java/1.8.0_152, maven)</ns1:userAgent>
<ns1:validateOnly>false</ns1:validateOnly>
<ns1:partialFailure>false</ns1:partialFailure>
</ns1:RequestHeader>
</soapenv:Header>
<soapenv:Body>
<operations>
<operator>SET</operator>
<operand>
<budgetId>XXXXXXX</budgetId>
<amount>
<microAmount>1000000</microAmount>
</amount>
</operand>
</operations>
</mutate>
</soapenv:Body>
</soapenv:Envelope>
[http-bio-5050-exec-7] INFO com.google.api.ads.adwords.lib.client.AdWordsServiceClient.soapXmlLogger - SOAP response:
<soap:Header>
<requestId>00056a6a1f8274100a379a113f01f938</requestId>
<serviceName>BudgetService</serviceName>
<methodName>mutate</methodName>
<operations>1</operations>
<responseTime>191</responseTime>
</ResponseHeader>
</soap:Header>
<soap:Body>
<soap:Fault>
<faultcode>soap:Client</faultcode>
<faultstring>[BudgetError.BUDGET_AMOUNT_MUST_BE_UNSET_FOR_BUDGET_PERIOD_CUSTOM @ operations[0].operand.amount]</faultstring>
<detail>
<message>[BudgetError.BUDGET_AMOUNT_MUST_BE_UNSET_FOR_BUDGET_PERIOD_CUSTOM @ operations[0].operand.amount]</message>
<ApplicationException.Type>ApiException</ApplicationException.Type>
<fieldPath>operations[0].operand.amount</fieldPath>
<fieldPathElements>
<field>operations</field>
<index>0</index>
</fieldPathElements>
<fieldPathElements>
<field>operand</field>
</fieldPathElements>
<fieldPathElements>
<field>amount</field>
</fieldPathElements>
<trigger/>
<errorString>BudgetError.BUDGET_AMOUNT_MUST_BE_UNSET_FOR_BUDGET_PERIOD_CUSTOM</errorString>
<ApiError.Type>BudgetError</ApiError.Type>
<reason>BUDGET_ERROR</reason>
</errors>
</ApiExceptionFault>
</detail>
</soap:Fault>
</soap:Body>
</soap:Envelope>
AxisFault
faultSubcode:
faultString: [BudgetError.BUDGET_AMOUNT_MUST_BE_UNSET_FOR_BUDGET_PERIOD_CUSTOM @ operations[0].operand.amount]
faultActor:
faultNode:
faultDetail:
{
https://adwords.google.com/api/adwords/cm/v201710}ApiExceptionFault:<message>[BudgetError.BUDGET_AMOUNT_MUST_BE_UNSET_FOR_BUDGET_PERIOD_CUSTOM @ operations[0].operand.amount]</message><ApplicationException.Type>ApiException</ApplicationException.Type><errors xmlns:xsi="
http://www.w3.org/2001/XMLSchema-instance" xsi:type="BudgetError"><fieldPath>operations[0].operand.amount</fieldPath><fieldPathElements><field>operations</field><index>0</index></fieldPathElements><fieldPathElements><field>operand</field></fieldPathElements><fieldPathElements><field>amount</field></fieldPathElements><trigger/><errorString>BudgetError.BUDGET_AMOUNT_MUST_BE_UNSET_FOR_BUDGET_PERIOD_CUSTOM</errorString><ApiError.Type>BudgetError</ApiError.Type><reason>BUDGET_ERROR</reason></errors>
ApiException{applicationExceptionType=ApiException, errors=[BudgetError{apiErrorType=BudgetError, errorString=BudgetError.BUDGET_AMOUNT_MUST_BE_UNSET_FOR_BUDGET_PERIOD_CUSTOM, fieldPath=operations[0].operand.amount, fieldPathElements=[FieldPathElement{field=operations, index=0}, FieldPathElement{field=operand}, FieldPathElement{field=amount}], reason=BUDGET_ERROR, trigger=}]}
at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
at sun.reflect.NativeConstructorAccessorImpl.newInstance(Unknown Source)
at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(Unknown Source)
at java.lang.reflect.Constructor.newInstance(Unknown Source)
at java.lang.Class.newInstance(Unknown Source)
at org.apache.axis.encoding.ser.BeanDeserializer.<init>(BeanDeserializer.java:104)
at org.apache.axis.encoding.ser.BeanDeserializer.<init>(BeanDeserializer.java:90)
at com.google.api.ads.adwords.axis.v201710.cm.ApiException.getDeserializer(ApiException.java:165)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
at java.lang.reflect.Method.invoke(Unknown Source)
at org.apache.axis.encoding.ser.BaseDeserializerFactory.getSpecialized(BaseDeserializerFactory.java:154)
at org.apache.axis.encoding.ser.BaseDeserializerFactory.getDeserializerAs(BaseDeserializerFactory.java:84)
at org.apache.axis.encoding.DeserializationContext.getDeserializer(DeserializationContext.java:464)
at org.apache.axis.encoding.DeserializationContext.getDeserializerForType(DeserializationContext.java:547)
at org.apache.axis.message.SOAPFaultDetailsBuilder.onStartChild(SOAPFaultDetailsBuilder.java:157)
at org.apache.axis.encoding.DeserializationContext.startElement(DeserializationContext.java:1035)
at org.apache.xerces.parsers.AbstractSAXParser.startElement(Unknown Source)
at org.apache.xerces.impl.XMLNSDocumentScannerImpl.scanStartElement(Unknown Source)
at org.apache.xerces.impl.XMLDocumentFragmentScannerImpl$FragmentContentDispatcher.dispatch(Unknown Source)
at org.apache.xerces.impl.XMLDocumentFragmentScannerImpl.scanDocument(Unknown Source)
at org.apache.xerces.parsers.DTDConfiguration.parse(Unknown Source)
at org.apache.xerces.parsers.DTDConfiguration.parse(Unknown Source)
at org.apache.xerces.parsers.XMLParser.parse(Unknown Source)
at org.apache.xerces.parsers.AbstractSAXParser.parse(Unknown Source)
at javax.xml.parsers.SAXParser.parse(Unknown Source)
at org.apache.axis.encoding.DeserializationContext.parse(DeserializationContext.java:227)
at org.apache.axis.SOAPPart.getAsSOAPEnvelope(SOAPPart.java:696)
at org.apache.axis.Message.getSOAPEnvelope(Message.java:435)
at org.apache.axis.handlers.soap.MustUnderstandChecker.invoke(MustUnderstandChecker.java:62)
at org.apache.axis.client.AxisClient.invoke(AxisClient.java:206)
at org.apache.axis.client.Call.invokeEngine(Call.java:2784)
at org.apache.axis.client.Call.invoke(Call.java:2767)
at org.apache.axis.client.Call.invoke(Call.java:2443)
at org.apache.axis.client.Call.invoke(Call.java:2366)
at org.apache.axis.client.Call.invoke(Call.java:1812)
at com.google.api.ads.adwords.axis.v201710.cm.BudgetServiceSoapBindingStub.mutate(BudgetServiceSoapBindingStub.java:851)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
at java.lang.reflect.Method.invoke(Unknown Source)
at com.google.api.ads.common.lib.soap.SoapClientHandler.invoke(SoapClientHandler.java:100)
at com.google.api.ads.common.lib.soap.axis.AxisHandler.invokeSoapCall(AxisHandler.java:234)
at com.google.api.ads.common.lib.soap.SoapServiceClient.callSoapClient(SoapServiceClient.java:63)
at com.google.api.ads.common.lib.soap.SoapServiceClient.invoke(SoapServiceClient.java:93)
at com.sun.proxy.$Proxy36.mutate(Unknown Source)