On April 11, 2022 Adobe announced the full release of the annotations feature for Adobe Analytics.

The Analytics 2.0 Annotations APIs allow you to retrieve, update, or create annotations programmatically through Adobe I/O. These APIs use the same data and methods that Adobe uses inside the product UI.

More detailed API documentation and information can be found on developer.adobe.com. The first version of our support in adobeanalyticsr includes functions for retreiving annotations (aw_get_annotations()) as well as building them (annotation_build()).

Getting Annotations

The basic function to get a dataframe of annotations from a specific company is the function aw_get_annotations(). There are 8 different arguments that can help you refine the annotations and metadata returned from the API. In addition, there are 2 arguments, “debug” and “company_id”, which which are not directly related to the data.

The following is an explanation of the different arguments you can use.

  1. “id” - Filter the results to one specific annotation by the annotation id. If not used, a list of annotations will be returned limited by the ‘limit’ and ‘page’ arguments.
  2. “expansion” - Obtain additional information around an annotation. You can include multiple expansions using the ‘c()’ function. Expansion options include the following:
    • name: The name of the annotation.
    • description The annotation’s description.
    • dateRange The date range of the annotation.
    • color: An enum representing the annotation’s color. Supported values include STANDARD1 through STANDARD9. These correspond to these colors in order: ‘blue’, ‘purple’, ‘green’, ‘orange’, ‘red’, ‘light green’, ‘pink’, ‘dark green’, and ‘yellow’.
    • applyToAllReports: A boolean that determines if the annotation applies to all report suites.
    • scope: An object including the metrics and filters that the annotation uses.
    • createdDate: The date that the annotation was created.
    • modifiedDate: The date that the annotation was last modified.
    • modifiedById: The ID of the user who last modified the annotation.
    • tags: The tags applied to the annotation.
    • shares: The shares applied to the annotation.
    • approved: A boolean that determines if the annotation is approved by an admin.
    • favorite: A boolean that determines if the user has this annotation favorited (starred).
    • usageSummary: An object that shows where this annotation is used.
    • owner: An object showing the ID, name, and login of the user that created the annotation.
    • companyId: The login company ID of the annotation.
    • reportSuiteName: The report suite’s friendly name.
    • rsid: The report suite ID.
  3. “includeType” - Include additional segments not owned by the user. Available values are all (default) and shared. The all option takes precedence over “shared”.
  4. “locale” - A query string that returns strings localized by Adobe into the desired language. Localization does not apply to user-defined fields, such as annotation names.
  5. “filterByModifiedAfter” - An ISO 8601 date that returns only annotations that were modified after the desired date. example datetime format: ‘YYYY-MM-DDTHH:MM:SSZ’
  6. “filterByDateRange” - Two ISO 8601 dates separated by a forward slash (/) that returns only annotations that fully reside within the desired date range. example format: ‘MM:SSZ/YYYY-MM-DDTHH:MM:SSZ’
  7. “limit” - An integer that represents the number of results per page. Default is 10
  8. “page” - An integer that represents which page to return results. The first page is 0. The API supports up to 1000 pages
  9. “debug” - Include the output and input of the api call in the console for debugging. Default is FALSE
  10. “company_id” - As with all API calls to Adobe Analytics, the Company ID is required. If an environment variable called AW_COMPANY_ID exists in .Renviron or elsewhere and no company_id argument is provided, then the AW_COMPANY_ID value will be used. Use get_me to get a list of available company_id values.

The basic function to pull a data set of 10 annotations can be done like this:

annotes <- aw_get_annotations(limit = 10, expansion = c('name', 'description', 'scope'), debug = F, includeType = 'shared')
annotes$name
annotes[annotes$name == "Test Annotation", ]$lists$scope

Build a basic annotation

(jsonlite::fromJSON(ann))
$id
[1] "626f451ac7bee35c05060753"
ann <- annotation_build("A new annotation",
                        "the description can be long or short, depending on what you need",
                        color = 'orange', 
                        filter_id = list('page', 's300003965_5eab136b34d05f0ff1c318ff'), 
                        filter_compType = list('d', 's'), 
                        filter_verb = list('exists'), 
                        filter_dimType = list('string'),
                        debug = T)
LS0tCnRpdGxlOiAiQW5ub3RhdGlvbnMiCmF1dGhvcjogIkJlbiBXb29kYXJkIgpkYXRlOiAnMjAyMi0wNC0xMicKb3V0cHV0OiBodG1sX25vdGVib29rCi0tLQpgYGB7ciBzZXR1cCwgaW5jbHVkZT1GQUxTRX0Ka25pdHI6Om9wdHNfY2h1bmskc2V0KGVjaG8gPSBUUlVFKQpsaWJyYXJ5KGFkb2JlYW5hbHl0aWNzcikKYXdfYXV0aCgnb2F1dGgnKQpgYGAKCk9uIEFwcmlsIDExLCAyMDIyIEFkb2JlIGFubm91bmNlZCB0aGUgZnVsbCByZWxlYXNlIG9mIHRoZSBhbm5vdGF0aW9ucyBmZWF0dXJlIGZvciBBZG9iZSBBbmFseXRpY3MuICAKCj5UaGUgQW5hbHl0aWNzIDIuMCBBbm5vdGF0aW9ucyBBUElzIGFsbG93IHlvdSB0byByZXRyaWV2ZSwgdXBkYXRlLCBvciBjcmVhdGUgYW5ub3RhdGlvbnMgcHJvZ3JhbW1hdGljYWxseSB0aHJvdWdoIEFkb2JlIEkvTy4gVGhlc2UgQVBJcyB1c2UgdGhlIHNhbWUgZGF0YSBhbmQgbWV0aG9kcyB0aGF0IEFkb2JlIHVzZXMgaW5zaWRlIHRoZSBwcm9kdWN0IFVJLgoKTW9yZSBkZXRhaWxlZCBBUEkgZG9jdW1lbnRhdGlvbiBhbmQgaW5mb3JtYXRpb24gY2FuIGJlIGZvdW5kIG9uIFtkZXZlbG9wZXIuYWRvYmUuY29tXShodHRwczovL2RldmVsb3Blci5hZG9iZS5jb20vYW5hbHl0aWNzLWFwaXMvZG9jcy8yLjAvZ3VpZGVzL2VuZHBvaW50cy9hbm5vdGF0aW9ucy8pLiBUaGUgZmlyc3QgdmVyc2lvbiBvZiBvdXIgc3VwcG9ydCBpbiBhZG9iZWFuYWx5dGljc3IgaW5jbHVkZXMgZnVuY3Rpb25zIGZvciByZXRyZWl2aW5nIGFubm90YXRpb25zIChgYXdfZ2V0X2Fubm90YXRpb25zKClgKSBhcyB3ZWxsIGFzIGJ1aWxkaW5nIHRoZW0gKGBhbm5vdGF0aW9uX2J1aWxkKClgKS4KCiMjIEdldHRpbmcgQW5ub3RhdGlvbnMKClRoZSBiYXNpYyBmdW5jdGlvbiB0byBnZXQgYSBkYXRhZnJhbWUgb2YgYW5ub3RhdGlvbnMgZnJvbSBhIHNwZWNpZmljIGNvbXBhbnkgaXMgdGhlIGZ1bmN0aW9uIGBhd19nZXRfYW5ub3RhdGlvbnMoKWAuICBUaGVyZSBhcmUgOCBkaWZmZXJlbnQgYXJndW1lbnRzIHRoYXQgY2FuIGhlbHAgeW91IHJlZmluZSB0aGUgYW5ub3RhdGlvbnMgYW5kIG1ldGFkYXRhIHJldHVybmVkIGZyb20gdGhlIEFQSS4gSW4gYWRkaXRpb24sIHRoZXJlIGFyZSAyIGFyZ3VtZW50cywgImRlYnVnIiBhbmQgImNvbXBhbnlfaWQiLCB3aGljaCB3aGljaCBhcmUgbm90IGRpcmVjdGx5IHJlbGF0ZWQgdG8gdGhlIGRhdGEuCgpUaGUgZm9sbG93aW5nIGlzIGFuIGV4cGxhbmF0aW9uIG9mIHRoZSBkaWZmZXJlbnQgYXJndW1lbnRzIHlvdSBjYW4gdXNlLgoKMS4gImlkIgktIEZpbHRlciB0aGUgcmVzdWx0cyB0byBvbmUgc3BlY2lmaWMgYW5ub3RhdGlvbiBieSB0aGUgYW5ub3RhdGlvbiBpZC4gSWYgbm90IHVzZWQsIGEgbGlzdCBvZiBhbm5vdGF0aW9ucyB3aWxsIGJlIHJldHVybmVkIGxpbWl0ZWQgYnkgdGhlIOKAmGxpbWl04oCZIGFuZCDigJhwYWdl4oCZIGFyZ3VtZW50cy4KMi4gImV4cGFuc2lvbiIgLSBPYnRhaW4gYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBhcm91bmQgYW4gYW5ub3RhdGlvbi4gWW91IGNhbiBpbmNsdWRlIG11bHRpcGxlIGV4cGFuc2lvbnMgdXNpbmcgdGhlIOKAmGMoKeKAmSBmdW5jdGlvbi4gRXhwYW5zaW9uIG9wdGlvbnMgaW5jbHVkZSB0aGUgZm9sbG93aW5nOgogICAgICAtIG5hbWU6IFRoZSBuYW1lIG9mIHRoZSBhbm5vdGF0aW9uLgogICAgICAtIGRlc2NyaXB0aW9uIFRoZSBhbm5vdGF0aW9u4oCZcyBkZXNjcmlwdGlvbi4KICAgICAgLSBkYXRlUmFuZ2UgVGhlIGRhdGUgcmFuZ2Ugb2YgdGhlIGFubm90YXRpb24uCiAgICAgIC0gY29sb3I6IEFuIGVudW0gcmVwcmVzZW50aW5nIHRoZSBhbm5vdGF0aW9u4oCZcyBjb2xvci4gU3VwcG9ydGVkIHZhbHVlcyBpbmNsdWRlIFNUQU5EQVJEMSAgIHRocm91Z2ggU1RBTkRBUkQ5LiBUaGVzZSBjb3JyZXNwb25kIHRvIHRoZXNlIGNvbG9ycyBpbiBvcmRlcjogJ2JsdWUnLCAncHVycGxlJywgJ2dyZWVuJywgJ29yYW5nZScsICdyZWQnLCAnbGlnaHQgZ3JlZW4nLCAncGluaycsICdkYXJrIGdyZWVuJywgYW5kICd5ZWxsb3cnLgogICAgICAtIGFwcGx5VG9BbGxSZXBvcnRzOiBBIGJvb2xlYW4gdGhhdCBkZXRlcm1pbmVzIGlmIHRoZSBhbm5vdGF0aW9uIGFwcGxpZXMgdG8gYWxsIHJlcG9ydCBzdWl0ZXMuCiAgICAgIC0gc2NvcGU6IEFuIG9iamVjdCBpbmNsdWRpbmcgdGhlIG1ldHJpY3MgYW5kIGZpbHRlcnMgdGhhdCB0aGUgYW5ub3RhdGlvbiB1c2VzLgogICAgICAtIGNyZWF0ZWREYXRlOiBUaGUgZGF0ZSB0aGF0IHRoZSBhbm5vdGF0aW9uIHdhcyBjcmVhdGVkLgogICAgICAtIG1vZGlmaWVkRGF0ZTogVGhlIGRhdGUgdGhhdCB0aGUgYW5ub3RhdGlvbiB3YXMgbGFzdCBtb2RpZmllZC4KICAgICAgLSBtb2RpZmllZEJ5SWQ6IFRoZSBJRCBvZiB0aGUgdXNlciB3aG8gbGFzdCBtb2RpZmllZCB0aGUgYW5ub3RhdGlvbi4KICAgICAgLSB0YWdzOiBUaGUgdGFncyBhcHBsaWVkIHRvIHRoZSBhbm5vdGF0aW9uLgogICAgICAtIHNoYXJlczogVGhlIHNoYXJlcyBhcHBsaWVkIHRvIHRoZSBhbm5vdGF0aW9uLgogICAgICAtIGFwcHJvdmVkOiBBIGJvb2xlYW4gdGhhdCBkZXRlcm1pbmVzIGlmIHRoZSBhbm5vdGF0aW9uIGlzIGFwcHJvdmVkIGJ5IGFuIGFkbWluLgogICAgICAtIGZhdm9yaXRlOiBBIGJvb2xlYW4gdGhhdCBkZXRlcm1pbmVzIGlmIHRoZSB1c2VyIGhhcyB0aGlzIGFubm90YXRpb24gZmF2b3JpdGVkIChzdGFycmVkKS4KICAgICAgLSB1c2FnZVN1bW1hcnk6IEFuIG9iamVjdCB0aGF0IHNob3dzIHdoZXJlIHRoaXMgYW5ub3RhdGlvbiBpcyB1c2VkLgogICAgICAtIG93bmVyOiBBbiBvYmplY3Qgc2hvd2luZyB0aGUgSUQsIG5hbWUsIGFuZCBsb2dpbiBvZiB0aGUgdXNlciB0aGF0IGNyZWF0ZWQgdGhlIGFubm90YXRpb24uCiAgICAgIC0gY29tcGFueUlkOiBUaGUgbG9naW4gY29tcGFueSBJRCBvZiB0aGUgYW5ub3RhdGlvbi4KICAgICAgLSByZXBvcnRTdWl0ZU5hbWU6IFRoZSByZXBvcnQgc3VpdGXigJlzIGZyaWVuZGx5IG5hbWUuCiAgICAgIC0gcnNpZDogVGhlIHJlcG9ydCBzdWl0ZSBJRC4KMy4gImluY2x1ZGVUeXBlIiAtIEluY2x1ZGUgYWRkaXRpb25hbCBzZWdtZW50cyBub3Qgb3duZWQgYnkgdGhlIHVzZXIuIEF2YWlsYWJsZSB2YWx1ZXMgYXJlIGFsbCAoZGVmYXVsdCkgYW5kIHNoYXJlZC4gVGhlIGFsbCBvcHRpb24gdGFrZXMgcHJlY2VkZW5jZSBvdmVyICJzaGFyZWQiLgo0LiAibG9jYWxlIgktIEEgcXVlcnkgc3RyaW5nIHRoYXQgcmV0dXJucyBzdHJpbmdzIGxvY2FsaXplZCBieSBBZG9iZSBpbnRvIHRoZSBkZXNpcmVkIGxhbmd1YWdlLiBMb2NhbGl6YXRpb24gZG9lcyBub3QgYXBwbHkgdG8gdXNlci1kZWZpbmVkIGZpZWxkcywgc3VjaCBhcyBhbm5vdGF0aW9uIG5hbWVzLiAKNS4gImZpbHRlckJ5TW9kaWZpZWRBZnRlciIgLSBBbiBJU08gODYwMSBkYXRlIHRoYXQgcmV0dXJucyBvbmx5IGFubm90YXRpb25zIHRoYXQgd2VyZSBtb2RpZmllZCBhZnRlciB0aGUgZGVzaXJlZCBkYXRlLiBleGFtcGxlIGRhdGV0aW1lIGZvcm1hdDog4oCYWVlZWS1NTS1ERFRISDpNTTpTU1rigJkKNi4gImZpbHRlckJ5RGF0ZVJhbmdlIiAtIFR3byBJU08gODYwMSBkYXRlcyBzZXBhcmF0ZWQgYnkgYSBmb3J3YXJkIHNsYXNoICgvKSB0aGF0IHJldHVybnMgb25seSBhbm5vdGF0aW9ucyB0aGF0IGZ1bGx5IHJlc2lkZSB3aXRoaW4gdGhlIGRlc2lyZWQgZGF0ZSByYW5nZS4gZXhhbXBsZSBmb3JtYXQ6IOKAmE1NOlNTWi9ZWVlZLU1NLUREVEhIOk1NOlNTWuKAmQo3LiAibGltaXQiIC0gQW4gaW50ZWdlciB0aGF0IHJlcHJlc2VudHMgdGhlIG51bWJlciBvZiByZXN1bHRzIHBlciBwYWdlLiBEZWZhdWx0IGlzIDEwCjguICJwYWdlIgktIEFuIGludGVnZXIgdGhhdCByZXByZXNlbnRzIHdoaWNoIHBhZ2UgdG8gcmV0dXJuIHJlc3VsdHMuIFRoZSBmaXJzdCBwYWdlIGlzIDAuIFRoZSBBUEkgc3VwcG9ydHMgdXAgdG8gMTAwMCBwYWdlcwo5LiAiZGVidWciCS0gSW5jbHVkZSB0aGUgb3V0cHV0IGFuZCBpbnB1dCBvZiB0aGUgYXBpIGNhbGwgaW4gdGhlIGNvbnNvbGUgZm9yIGRlYnVnZ2luZy4gRGVmYXVsdCBpcyBGQUxTRQoxMC4gImNvbXBhbnlfaWQiIC0gQXMgd2l0aCBhbGwgQVBJIGNhbGxzIHRvIEFkb2JlIEFuYWx5dGljcywgdGhlIENvbXBhbnkgSUQgaXMgcmVxdWlyZWQuICBJZiBhbiBlbnZpcm9ubWVudCB2YXJpYWJsZSBjYWxsZWQgQVdfQ09NUEFOWV9JRCBleGlzdHMgaW4gLlJlbnZpcm9uIG9yIGVsc2V3aGVyZSBhbmQgbm8gY29tcGFueV9pZCBhcmd1bWVudCBpcyBwcm92aWRlZCwgdGhlbiB0aGUgQVdfQ09NUEFOWV9JRCB2YWx1ZSB3aWxsIGJlIHVzZWQuIFVzZSBnZXRfbWUgdG8gZ2V0IGEgbGlzdCBvZiBhdmFpbGFibGUgY29tcGFueV9pZCB2YWx1ZXMuCgpUaGUgYmFzaWMgZnVuY3Rpb24gdG8gcHVsbCBhIGRhdGEgc2V0IG9mIDEwIGFubm90YXRpb25zIGNhbiBiZSBkb25lIGxpa2UgdGhpczoKYGBge3IgZWNobz1UfQphbm5vdGVzIDwtIGF3X2dldF9hbm5vdGF0aW9ucyhsaW1pdCA9IDEwLCBleHBhbnNpb24gPSBjKCduYW1lJywgJ2Rlc2NyaXB0aW9uJywgJ3Njb3BlJyksIGRlYnVnID0gRiwgaW5jbHVkZVR5cGUgPSAnc2hhcmVkJykKYW5ub3RlcyRuYW1lCmFubm90ZXNbYW5ub3RlcyRuYW1lID09ICJUZXN0IEFubm90YXRpb24iLCBdJGxpc3RzJHNjb3BlCmBgYAoKIyMgQnVpbGQgYSBiYXNpYyBhbm5vdGF0aW9uCmBgYHtyfQphbm4gPC0gYW5ub3RhdGlvbl9idWlsZCgiQSBkYXJrIGdyZWVuIGJhc2ljIGFubm90YXRpb24iLAogICAgICAgICAgICAgICAgICAgICAgICAidGhpcyBpcyBhIGRlc2NyaXB0aW9uIHRoYXQgc2hvdWxkIGluY2x1ZGUgdGhlIGJhc2ljIGluZm9ybWF0aW9uIHJlZ2FyZGluZyB0aGUgYW5ub3RhdGlvbnMuIiwKICAgICAgICAgICAgICAgICAgICAgICAgY29sb3IgPSAnZGFyayBncmVlbicsCiAgICAgICAgICAgICAgICAgICAgICAgIGRhdGVfcmFuZ2UgPSBjKCcyMDIyLTAxLTAxJywgJzIwMjItMDMtMDEnKSwKICAgICAgICAgICAgICAgICAgICAgICAgZGVidWcgPSBGKQphbm4KCihqc29ubGl0ZTo6ZnJvbUpTT04oYW5uKSkKYGBgCgoKYGBge3J9CmFubiA8LSBhbm5vdGF0aW9uX2J1aWxkKCJBIG5ldyBhbm5vdGF0aW9uIiwKICAgICAgICAgICAgICAgICAgICAgICAgInRoZSBkZXNjcmlwdGlvbiBjYW4gYmUgbG9uZyBvciBzaG9ydCwgZGVwZW5kaW5nIG9uIHdoYXQgeW91IG5lZWQiLAogICAgICAgICAgICAgICAgICAgICAgICBjb2xvciA9ICdvcmFuZ2UnLCAKICAgICAgICAgICAgICAgICAgICAgICAgZmlsdGVyX2lkID0gbGlzdCgncGFnZScsICdzMzAwMDAzOTY1XzVlYWIxMzZiMzRkMDVmMGZmMWMzMThmZicpLCAKICAgICAgICAgICAgICAgICAgICAgICAgZmlsdGVyX2NvbXBUeXBlID0gbGlzdCgnZCcsICdzJyksIAogICAgICAgICAgICAgICAgICAgICAgICBmaWx0ZXJfdmVyYiA9IGxpc3QoJ2V4aXN0cycpLCAKICAgICAgICAgICAgICAgICAgICAgICAgZmlsdGVyX2RpbVR5cGUgPSBsaXN0KCdzdHJpbmcnKSwKICAgICAgICAgICAgICAgICAgICAgICAgZGVidWcgPSBUKQpgYGAKCg==