I get that information, indeed from CampaignCriterionService.
I do use a predicate on CriterionType. (In case you don't know, a predicate is essentially a filter). The predicate is:
CriteriaType EQUALS "AD_SCHEDULE"
Note: If I don't set up this predicate I get thousands of rows back
on other criterion types, like languages and locations and what else. If you insist on not setting up this predicate, you should prepare your software for a lot of different results. And a slow response from the API as well. And you have to implement paging because the API won't return more than a few thousand rows in a single call.