Re: quota_error: resource_exhausted without quotaerrordetails

2023-05-22 Thread Markus Heiden
Hi, sorry for getting back to you again, but my main question is still unanswered: Why are there no QuotaErrorDetails in this case? That would provide guidance about how long to wait. I cannot determine that upfront in a distributed environment as you already pointed out. In other words: Feat

Re: when are the historical metrics available?

2023-05-05 Thread Markus Heiden
Hi, thanks for your explanation. I already read that, but I did not find what I was searching for: If there is no API call for retrieving that information (as you pointed out), it would have been nice, if at least the day-in-month would be documented from that the data is guaranteed to be avai

Re: quota_error: resource_exhausted without quotaerrordetails

2023-05-05 Thread Markus Heiden
Hi, thanks for pointing out that I hit the daily API operations limit. I didn't expect that :-) It would have been nice if there had been a reference to the daily limit in the error. Or does RESOURCE_EXHAUSTED always just relates to the daily limit? If so, I misunderstood the description "too

Re: when are the historical metrics available?

2023-05-04 Thread Markus Heiden
Hi, I am aware of the fact that the data is not available yet. But is there any documentation on when the data will be available exactly? Or an API that provides that information? Otherwise programmatic access would be a bit unreliable. Best regards, Markus Google Ads API Forum Advisor schrieb

Re: quota_error: resource_exhausted without quotaerrordetails

2023-05-03 Thread Markus Heiden
Hi, the main (unanswered) question was: Why do I get a rate limit error _without QuotaErrorDetails_? IMO that makes automation hard, because it is required by the docs that I have to wait the provided amount of time. I wouldn't like to resort to parsing error messages to extract the retry delay

When are the historical metrics available?

2023-05-03 Thread Markus Heiden
Hi, I am using KeywordPlanIdeaService.generateKeywordIdeas(). If I set the date range for the historical metrics (today: 3rd of May 2023) to the last month (start and end: April 2023) I get an INVALID_VALUE: Request --- MethodName: google.ads.googleads.v13.services.KeywordPlanIdeaService/G

quota_error: RESOURCE_EXHAUSTED without QuotaErrorDetails

2023-04-28 Thread Markus Heiden
Hi, I am using KeywordPlanIdeaService.generateKeywordIdeas() and sometimes getting quota errors though I obey the 1 QPS rate limit. Furthermore the quota error message says that I need to wait for 30 seconds. But there are no corresponding QuotaErrorDetails (hasDetails() says false). So I am no

What means "Assets are duplicated across operations."?

2023-01-04 Thread Markus Heiden
Hi, we get an ASSET_ERROR / DUPLICATE_ASSET "Assets are duplicated across operations." when creating an AdGroupAd / Ad / ResponsiveSearchAdInfo. Please explain in a bit more detail what may cause the problem. In this case, the headline at position 9 seems to be the problem. But against what is

Re: Quota: Requests per service per method?

2022-12-19 Thread Markus Heiden
Hello Darwin, thanks for taking a second look. I was pretty sure that we don't violate the 1 RPS limit because we use a Guava rate limiter that should ensure that. So maybe I'll try a little less than 1 RPS to avoid this kind of problem. Thanks, Markus adsapi schrieb am Montag, 14. November 2

Re: Quota: Requests per service per method?

2022-11-13 Thread Markus Heiden
Hello Yasar, I already found that limit. But IMO I do not exceed the 1 QPS limit. As the error message reads this is IMO not the 1 QPS limit that I hit but the concurrency limit per service method. I issue a query each second, even if the prior query has not finished yet. If these requests ta

Quota: Requests per service per method?

2022-11-05 Thread Markus Heiden
Hello, I get errors that I interpret as calling a method (KeywordPlanService#generateHistoricalMetrics) too concurrently. I wonder where that limit is documented? error_code { quota_error: RESOURCE_EXHAUSTED } message: "Too many requests. Retry in 4 seconds." details { quota_error_details {

Re: Unable to find RSA from ad_group_ad query in Google Ads

2022-08-18 Thread Markus Heiden
Hi Ernie, one additional info: We opened the account in the Google Ads Editor. There these RSAs are all displayed. Regards, Markus adsapi schrieb am Donnerstag, 18. August 2022 um 10:35:30 UTC+2: > Hi Markus, > > Thank you for the reply and providing information. Allow me to continue > the di

Re: Unable to find RSA from ad_group_ad query in Google Ads

2022-08-18 Thread Markus Heiden
Hello Aryeh, the above problem arises for RSAs that are in the same ad group. Thus the status of the campaign or ad group shouldn't be an issue. The logs I will provide privately. Regards, Markus adsapi schrieb am Mittwoch, 17. August 2022 um 21:24:40 UTC+2: > Hi Markus, > > The Ads UI has def

Unable to find RSA from ad_group_ad query in Google Ads

2022-08-17 Thread Markus Heiden
Hi, we download RSAs programmatically with an `ad_group_ad` query. I am unable to find some of the (enabled) RSAs returned by the query on the Google Ads website. In Google Ads, I selected the correct account to which these RSAs belong. I selected "Ad status: All". I filter for the Ad ID (with t

Re: EOS on SearchGoogleAdsStreamRequests

2022-07-28 Thread Markus Heiden
Hi Anthony, I hope that it is possible to resolve this issue without the request and response logs. The query and the type of request are shown above. The response is none as mentioned above. With that information, I hope it should be possible to at least guess why the Google Ads API v10 does n

EOS on SearchGoogleAdsStreamRequests

2022-07-27 Thread Markus Heiden
Hi, we experience an EOS after almost exactly 1 hour for SearchGoogleAdsStreamRequests (Java library) like SELECT ad_group.id, ad_group_ad.ad.id, ad_group_ad.status, ad_group_ad.ad.responsive_search_ad.headlines, ad_group_ad.ad.responsive_search_ad.descriptions, ad_group_ad.ad.responsive_search_

Re: ResourceCountLimitExceededError for labels

2022-05-09 Thread Markus Heiden
I sent it via "reply to author". So the default subject "Re: ResourceCountLimitExceededError for labels" should have been used. I will send it again. On Tuesday, May 10, 2022 at 4:25:47 AM UTC+2 adsapi wrote: > Hi Markus, > > Thank you for getting back to us. > > Moving forward, could you confi

Re: ResourceCountLimitExceededError for labels

2022-05-09 Thread Markus Heiden
Did you receive my private mail? The copy I received looks like I only sent it to myself. Markus Heiden schrieb am Freitag, 6. Mai 2022 um 19:17:01 UTC+2: > The error type is LIMITED_LABELS_PER_TYPE_PER_CUSTOMER. Details will > follow via private mail. > > adsapi schrieb am Mitt

Re: ResourceCountLimitExceededError for labels

2022-05-06 Thread Markus Heiden
The error type is LIMITED_LABELS_PER_TYPE_PER_CUSTOMER. Details will follow via private mail. adsapi schrieb am Mittwoch, 4. Mai 2022 um 15:11:24 UTC+2: > Hi Markus, > > Thanks for reaching out. If you can *privately* provide the complete > request and response logs, we can check exactly which

ResourceCountLimitExceededError for labels

2022-05-03 Thread Markus Heiden
Hi, we currently get an ResourceCountLimitExceededError.RESOURCE_LIMIT (existing count = 764, limit = 200) when creating labels for a specific customer. This limit is not documented IMO. The closest match I found was https://developers.google.com/google-ads/api/docs/best-practices/system-limi

The error code is not in this version

2022-03-29 Thread Markus Heiden
When I try to create a keyword plan ad group via the GoogleAdsService v10 API (with the Java SDK 17.0.1) I get a non-saying error message. What am I doing wrong? mutate_operation_responses { keyword_plan_ad_group_result { } } partial_failure_error { code: 3 message: "The error code is no

Re: Sitelink limit exceeded error though not too many sitelinks

2021-11-02 Thread Markus Heiden
Hi Peter, did you receive my private message with the logs? Is there any progress on this issue? Regards, Markus adsapi schrieb am Montag, 25. Oktober 2021 um 03:33:56 UTC+2: > Hi Markus, > > Thank you for your follow up. > > Please note that our API team would *need* the complete request >

Adding of custom parameters possible without overwriting all custom parameters via Google Ads API?

2021-10-30 Thread Markus Heiden
Hi, with the AdWords API it was possible to just add some custom tracking parameters e.g. to groups. I am missing the equivalent to the "doReplace = false" option of the AdWords API CustomParameters in the Google Ads API. I am aware that I can retrieve the existing custom parameters, add my new

Re: Sitelink limit exceeded error though not too many sitelinks

2021-10-22 Thread Markus Heiden
Hi Ernie, maybe you misunderstood me. There is a request id in the log. That was the source of the request id I posted privately. I was just not able to find an accessor for it in the Java lib response object. Regards, Markus adsapi schrieb am Freitag, 22. Oktober 2021 um 12:55:55 UTC+2: > Hi

OAuth differences between AdWords and Google Ads API

2021-10-22 Thread Markus Heiden
Hi, I experienced some differences in the authentication between AdWords and Google Ads API access using the Java libs. We have a setup with 1) The main MCC account that gets authenticated. 2) Below that a MCC which we use as "clientCustomerId" / "login-customer-id". 3) Below that a "normal" a

Re: Sitelink limit exceeded error though not too many sitelinks

2021-10-21 Thread Markus Heiden
Hi Ernie, Yes and no. I can grab the request id from the log. But to avoid log spam, the log is usually turned off. So it would be nice to have a possibility to get the request id programmatically from each response and exception. That way I can automatically persist it and/or just log it. Reg

Re: Sitelink limit exceeded error though not too many sitelinks

2021-10-20 Thread Markus Heiden
Hi Aryeh, BTW Why has MutateGoogleAdsResponse no request ID attribute like SearchGoogleAdsStreamResponse? Regards, Markus adsapi schrieb am Mittwoch, 20. Oktober 2021 um 19:55:52 UTC+2: > Hi Markus, > > I work with Peter and will assist you. Thank you for giving us the steps > to reproduce, ho

Re: Sitelink limit exceeded error though not too many sitelinks

2021-10-20 Thread Markus Heiden
Hi Peter, The bug is also reproducible in the Google Ads frontend: 1) Create 20 sitelinks. 2) Remove 1 sitelink. 3) Add 1 new sitelink -> Limit exceeded error. 4) Press again on the add button -> OK. Sitelink shows up. Best regards, Markus adsapi schrieb am Mittwoch, 20. Oktober 2021 um 04:00:33 U

Re: Sitelink limit exceeded error though not too many sitelinks

2021-10-19 Thread Markus Heiden
We tested the above scenario with the Google Ads frontend too and it shows the same strange behavior. Markus Heiden schrieb am Montag, 18. Oktober 2021 um 23:50:43 UTC+2: > I am trying to book sitelink assets / customer assets connected by > temporary ids via the GoogleAdsService. >

Sitelink limit exceeded error though not too many sitelinks

2021-10-18 Thread Markus Heiden
I am trying to book sitelink assets / customer assets connected by temporary ids via the GoogleAdsService. Error case: I have 19 active sitelink assets / customer assets and several already removed ones. When booking the 20th sitelink asset / customer asset I get a limit exceeded error on the

Re: Size Limit Error meaning

2020-11-16 Thread Markus Heiden
Hi Xiaoming, I am not using the BatchJobService for this purpose and it happened in production with a regular account. I am using the CampaignExtensionSettingServiceInterface.mutate() directly. adsapiforumadvisor schrieb am Donnerstag, 29. Oktober 2020 um 21:41:12 UTC+1: > Hi Markus, > > Than

Size Limit Error meaning

2020-10-29 Thread Markus Heiden
Hello, I got a size limit error, when creating many sitelinks with exactly 250 CampaignExtensionSettingOperations (officially documented limit): SizeLimitError{apiErrorType=SizeLimitError, errorString=SizeLimitError.REQUEST_SIZE_LIMIT_EXCEEDED, fieldPath=, reason=REQUEST_SIZE_LIMIT_EXCEEDED, t

Re: Migration to Google Ads API possible?

2020-08-10 Thread Markus Heiden
Hi Danica, First thanks for the detailed response. But I am still a bit confused: How am I supposed to use new features, if they are not added to the production (AdWords) API? Regards, Markus adsapiforumadvisor schrieb am Donnerstag, 16. Juli 2020 um 21:00:33 UTC+2: > Hi Markus, > > Thank you

Migration to Google Ads API possible?

2020-07-16 Thread Markus Heiden
Since the Google Ads API is around for some time now, I got a few questions about the migration: Where do I find reliable information what and when to migrate to the Google Ads API? Which parts are considered "production ready"? When will the AdWords API be deprecated? Why is the AdWords API stu

Telephone number used too often?

2019-06-20 Thread Markus Heiden
We are using a test account for each of our customers for providing them an additional "playground" system. For that purposes we use a cell phone number to create these test accounts. Recently I always get an error "telephone number used too often" when using the cell phone number when creating t

Timeouts when calling AdServiceInterface.mutate

2019-06-13 Thread Markus Heiden
Hi, I am updating many (10+) expanded text ads via the AdServiceInterface.mutate() method. Most requests are successful, but some always run in a socket timeout error. I already tried to reduce the number of operations per request from 2000 to 500, but this did not solve the problem. Are the

Re: Why are PolicyFindingError thrown by AdServiceInterface instead of returned as partial errors?

2019-06-13 Thread Markus Heiden
Hi Peter, before we just created ads via the AdGroupAdServiceInterface.mutate(), which supports partial failures. So the successful operations are executed and the failed ones are reported. Now we additionally update ads via AdServiceInterface.mutate(). I am not sure how to reliably update ads

Why are PolicyFindingError thrown by AdServiceInterface instead of returned as partial errors?

2019-06-11 Thread Markus Heiden
Hello, AdServiceInterface.mutate throws an ApiException for PolicyFindingErrors instead of returning them as partial errors, though AdReturnValue supports partial errors. Are the operations without errors executed anyway or does an exception always mean that all operations of the request have n

Re: Missing required fields error with AdService

2018-11-22 Thread Markus Heiden
Hi Dannison, thanks for clarify the required fields and update details. But there is still no statement regarding whether the performance data are kept under all circumstances. Are the performance data still kept, if I update all fields or just if I update only headlinePart1, headlinePart2, de

Re: Missing required fields error with AdService

2018-11-21 Thread Markus Heiden
Hi Dannison, I already read that guide (just the german version, because I found no switch for the language) and there is no point about *updating* expanded text ads, just the creation via the AdGroupAdService is mentioned. My concern is that there are no details about *updating* expanded text

Missing required fields error with AdService

2018-11-20 Thread Markus Heiden
Hello, I tried to update the final URL of an existing expanded text ad by creating a SET operation with just the ad id and the new final URL and passing it to AdService.mutate. But AdWords complains about a missing headlinePart1, headlinePart2 and description. With all other services I just ne

Deprecated german AdWords API reference

2018-09-05 Thread Markus Heiden
The current AdWords API references are not linked in the german "reference index page" https://developers.google.com/adwords/api/docs/reference/?hl=de. The most current version mentioned there is 201702. Please fix that, e.g. by linking to the english page. Regards, Markus -- -- =~=~=~=~=~=

Re: Are labels supported for negatives?

2018-07-31 Thread Markus Heiden
Hi Danisson, sorry for bugging you again. I noticed that labels on negatives ARE supported when creating a new negative via the API, by setting the "labels" field of "NegativeAdGroupCriterion". So we ended up with a lot labels that we cannot manage (Because we label all elements managed by o

Re: Is setting the ad rotation at campaign level still supported?

2018-07-23 Thread markus . heiden
Hi Dannison, I am a bit confused, because one of our customers got this answer from their Google AdWords support: > "Ad rotation setting is made available for Adgroups as well along with campaigns from the v201710 version of AdWords API. They could use the adServingOptimizationStatus field of

Re: Is setting the ad rotation at campaign level still supported?

2018-07-19 Thread markus . heiden
Hi Dannison, thanks for clarifying this. I was just a bit confused since the API documentation (https://developers.google.com/adwords/api/docs/reference/v201806/CampaignService.Campaign#adservingoptimizationstatus) does not mention the fact, that the adServingOptimizationStatus is read-only.

Is setting the ad rotation at campaign level still supported?

2018-07-19 Thread markus . heiden
Hello, the release note for the 201710 AdWords API says: > Simplified and improved ad rotation settings are now available at the ad group level via the adGroupRotationMode field. *Campaign-level rotation settings in the adServingOptimizationStatus field are now read-only*. Due to this we moved

Re: Are labels supported for negatives?

2018-07-10 Thread Markus Heiden
Hi Dannison, what I am interested in most is, whether there is any way to add labels to negatives via the API or not. The UI is not important for me. Regards, Markus -- -- =~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~ Also find us on our blog: https://googleadsdeveloper.blogspot.com/ =~=~=

Re: Are labels supported for negatives?

2018-07-03 Thread Markus Heiden
Hi Dannison, I am not able to see that the "here" links says that labels are not supported for negatives. I do not see any difference to the documentation of BiddableAdGroupCriterion, which supports labels. Campaigns, ad groups, keywords, ads all support assigning labels to them when creating

Are labels supported for negatives?

2018-07-02 Thread Markus Heiden
Hi, we are adding labels to our negatives (NegativeAdGroupCriterion) when booking them since quite a while. Recently we added functionality to add labels to already booked negatives. Then we got some AdGroupCriterionError.CANNOT_ADD_LABEL_TO_NEGATIVE_CRITERION errors and ask ourselves where

Re: Invalid CombinedApprovalStatus display values

2017-08-29 Thread markus . heiden
Hi Shwetha, I do not known that, because I noticed that with our migration from v20172 to v20178 where this field has been added. Regards, Markus -- -- =~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~ Also find us on our blog and Google+: https://googleadsdeveloper.blogspot.com/ https://plus.

Invalid CombinedApprovalStatus display values

2017-08-26 Thread markus . heiden
Hi, I experienced invalid values in the ad performance report when downloading it as csv with the v201708 AdWords API. In the column "CombinedApprovalStatus" (returned as "Approval status") all values are returned as lower case, e.g. "approved" instead of "Approved" since today. Are there any

How to detected trademark violations via the ad performance report?

2017-08-23 Thread markus . heiden
Hi, prior to v201705 we used the column "AdGroupAdTrademarkDisapproved" of the ad performance report to record our trademark violations. Since v201705 I find no replacement for that. Is "PolicySummary" maybe suitable for that? If so: How can the complex type "AdGroupAdPolicySummary" be downloa

Re: How can Base Ad group ID be zero in keyword performance report?

2017-04-11 Thread markus . heiden
Hi Sreelakshmi, > The BaseAdGroupId will have the AdGroupId of the base AdGroup if it is trial and if it is a base AdGroup, > it will have the same value for the AdGroupId and the BaseAdGroupId. > In your report, there are three AdGroups which are having BaseAdGroupId as 0 and all of them are

How can Base Ad group ID be zero in keyword performance report?

2017-04-06 Thread markus . heiden
Since around a week, we are experiencing "strange" behaviour of the keyword performance report: Some of the keywords have a "Base Ad group ID" of 0, unlike the "Base Campaign ID" which is still set. These keywords are in finished tests. Is this expected behaviour? -- -- =~=~=~=~=~=~=~=~=~=~=~

Re: Why are trial campaigns not returned with predicate CampaignStatus == ENABLED?

2017-01-10 Thread markus . heiden
Hi, today everything works as expected. I don't know what went wrong yesterday. Thanks, Markus -- -- =~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~ Also find us on our blog and Google+: https://googleadsdeveloper.blogspot.com/ https://plus.google.com/+GoogleAdsDevelopers/posts =~=~=~=~=~=~=~

Why are trial campaigns not returned with predicate CampaignStatus == ENABLED?

2017-01-09 Thread markus . heiden
Hi, I am experiencing some strange behaviour of the campaign performance report (include zero impressions == true). When requesting all campaigns, base campaigns and trials are returned both having "CampaignStatus" == "ENABLED". When I add a predicate "CampaignStatus" EQUALS "ENABLED" the trials

Re: label id uniqueness

2016-11-15 Thread markus . heiden
At least in the german documentation this still has not been documented yet. -- -- =~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~ Also find us on our blog and Google+: https://googleadsdeveloper.blogspot.com/ https://plus.google.com/+GoogleAdsDevelopers/posts =~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~

Re: Where to find job prerequisites in BatchJobService?

2016-07-20 Thread markus . heiden
Hello Vishal, sure, I could merge my two jobs into one to ensure precedence. But what I want to know is: How to ensure that a job has successfully been executed before a second depending job gets executed (the purpose of the prerequisites in the old MutateJobService)? Because jobs are limited

Where to find job prerequisites in BatchJobService?

2016-07-19 Thread markus . heiden
I am currently migration from the MutateJobService to the BatchJobService and cannot find job prerequisites in BatchJobService. How can I declare job dependencies with the new BatchJobService? Are jobs for the same account get sequentially executed with the new BatchJobService instead? -- --

Re: What is a CampaignError.CANNOT_MODIFY_FOR_TRIAL_CAMPAIGN?

2016-06-10 Thread markus . heiden
Hello Joyce, we had one experiment created with the AdWords UI. We deleted that now and the job runs without an error. So we need to filter the campaign performance report to not contain experiments. Anyway it would be nice, if this error message gets documented. Thanks, Markus -- -- =~=~=~

What is a CampaignError.CANNOT_MODIFY_FOR_TRIAL_CAMPAIGN?

2016-06-10 Thread markus . heiden
Hello, we are using the AdWords v201601 API via Java and recently got a CampaignError.CANNOT_MODIFY_FOR_TRIAL_CAMPAIGN. I am not able to find this error in the AdWords Java libs nor on Google. Where does it come from and what does it mean? What have I to change on the campaign to make this err

How to add AccountLabels to ManagedCustomers?

2016-06-01 Thread markus . heiden
Hi, I successfully created an AccountLabel. But adding it to a ManagedCustomer during creation (ADD) via ManagedCustomerService.mutate has no effect. The ManagedCustomer is always created without the label assigned. Is using mutateLabel after creating the ManagedCustomer the only possibility to

Valid "AdType" enum values?

2015-11-03 Thread markus . heiden
I am doing an AD_PERFORMANCE_REPORT and try to add a predicate for "AdType" (e.g. EQUALS "Text Ad"). But I always get a SelectorError INVALID_PREDICATE_ENUM_VALUE. What are the valid enum values for "AdType"? -- -- =~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~ Also find us on our blog and G

Re: Invalid values for campaign state (and other types)

2015-04-27 Thread markus . heiden
Hi Josh, thanks for your response, it pointed me to the right direction. We used cached instance of XMLInputFactory concurrently which is not thread-safe too. After fixing this, the problem did not occur anymore. Thanks, Markus -- -- =~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~ Also fin

Valid predicate operators for SearchRankLostImpressionShare?

2015-02-27 Thread markus . heiden
Hi, I try to use a predicate for SearchRankLostImpressionShare in my keyword performance report. But for every predicate operator I try, I always get an "invalid predicate operator" error. How can I select keywords with SearchRankLostImpressionShare != null in keyword performance reports? -

Re: Invalid values for campaign state (and other types)

2015-02-12 Thread Markus Heiden
Hi Josh, we are downloading the XML-Reports with the Java com.google.api.ads.adwords.lib.utils.v201409.ReportDownloader. I tried to reproduce it today, but did not get this case. I will send you a XML file, if this error happens again. Markus 2015-02-11 20:04 GMT+01:00 Josh Radcliff (AdWords API

Invalid values for campaign state (and other types)

2015-02-11 Thread markus . heiden
Hi, when querying for campaign states sometimes invalid values are returned, e.g. "6nabled" instead of "Enabled". Is this a bug or a feature? This happens for other types like e.g. keyword match type too. The pattern seems to be, that the first character is replaced by a number. -- -- =~=~=~=

Re: Are campaign and ad group IDs unique across all accounts?

2015-02-10 Thread markus . heiden
Is it for sure that "global" uniqueness of ids (described in https://developers.google.com/adwords/api/docs/guides/working-with-objects) means "AdWords global"? I read on Stackoverflow (http://stackoverflow.com/questions/8111884/are-adwords-keyword-adgroup-campaign-ids-unique-across-multiple-ac