taboola-backstage-sdk 0.6.4 → 0.6.7

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/errors/index.ts","../src/auth/oauth.ts","../src/utils/http.ts","../src/api/accounts.ts","../src/api/campaigns.ts","../src/api/items.ts","../src/api/dictionary.ts","../src/api/publishers.ts","../src/api/targeting.ts","../src/api/combined-audiences.ts","../src/api/first-party-audiences.ts","../src/api/pixel.ts","../src/api/reports.ts","../src/api/shared-budget.ts","../src/client.ts"],"names":["ky","HTTPError"],"mappings":";;;;;;;;;AAOO,IAAM,YAAA,GAAN,cAA2B,KAAA,CAAM;AAAA;AAAA,EAE7B,UAAA;AAAA;AAAA,EAEA,QAAA;AAAA;AAAA,EAEA,GAAA;AAAA,EAET,WAAA,CACE,SACA,OAAA,EAMA;AACA,IAAA,KAAA,CAAM,OAAA,EAAS,EAAE,KAAA,EAAO,OAAA,EAAS,OAAO,CAAA;AACxC,IAAA,IAAA,CAAK,IAAA,GAAO,cAAA;AACZ,IAAA,IAAA,CAAK,aAAa,OAAA,EAAS,UAAA;AAC3B,IAAA,IAAA,CAAK,WAAW,OAAA,EAAS,QAAA;AACzB,IAAA,IAAA,CAAK,MAAM,OAAA,EAAS,GAAA;AAAA,EACtB;AACF;AAMO,IAAM,gBAAA,GAAN,cAA+B,YAAA,CAAa;AAAA,EACjD,WAAA,CACE,OAAA,GAAU,uBAAA,EACV,OAAA,EAKA;AACA,IAAA,KAAA,CAAM,SAAS,EAAE,UAAA,EAAY,GAAA,EAAK,GAAG,SAAS,CAAA;AAC9C,IAAA,IAAA,CAAK,IAAA,GAAO,kBAAA;AAAA,EACd;AACF;AAMO,IAAM,sBAAA,GAAN,cAAqC,YAAA,CAAa;AAAA;AAAA,EAE9C,WAAA;AAAA,EAET,WAAA,CACE,OAAA,GAAU,mBAAA,EACV,OAAA,EAMA;AACA,IAAA,KAAA,CAAM,SAAS,EAAE,UAAA,EAAY,GAAA,EAAK,GAAG,SAAS,CAAA;AAC9C,IAAA,IAAA,CAAK,IAAA,GAAO,wBAAA;AACZ,IAAA,IAAA,CAAK,cAAc,OAAA,EAAS,WAAA;AAAA,EAC9B;AACF;AAMO,IAAM,oBAAA,GAAN,cAAmC,YAAA,CAAa;AAAA;AAAA,EAE5C,YAAA;AAAA;AAAA,EAEA,UAAA;AAAA,EAET,WAAA,CACE,OAAA,GAAU,oBAAA,EACV,OAAA,EAOA;AACA,IAAA,KAAA,CAAM,SAAS,EAAE,UAAA,EAAY,GAAA,EAAK,GAAG,SAAS,CAAA;AAC9C,IAAA,IAAA,CAAK,IAAA,GAAO,sBAAA;AACZ,IAAA,IAAA,CAAK,eAAe,OAAA,EAAS,YAAA;AAC7B,IAAA,IAAA,CAAK,aAAa,OAAA,EAAS,UAAA;AAAA,EAC7B;AACF;AAMO,IAAM,qBAAA,GAAN,cAAoC,YAAA,CAAa;AAAA;AAAA,EAE7C,UAAA;AAAA,EAET,WAAA,CACE,OAAA,GAAU,qBAAA,EACV,OAAA,EAMA;AACA,IAAA,KAAA,CAAM,SAAS,EAAE,UAAA,EAAY,GAAA,EAAK,GAAG,SAAS,CAAA;AAC9C,IAAA,IAAA,CAAK,IAAA,GAAO,uBAAA;AACZ,IAAA,IAAA,CAAK,aAAa,OAAA,EAAS,UAAA;AAAA,EAC7B;AACF;AAMO,IAAM,qBAAA,GAAN,cAAoC,YAAA,CAAa;AAAA,EACtD,WAAA,CACE,OAAA,GAAU,kBAAA,EACV,OAAA,EAKA;AACA,IAAA,KAAA,CAAM,SAAS,EAAE,UAAA,EAAY,GAAA,EAAK,GAAG,SAAS,CAAA;AAC9C,IAAA,IAAA,CAAK,IAAA,GAAO,uBAAA;AAAA,EACd;AACF;AAMO,IAAM,kBAAA,GAAN,cAAiC,YAAA,CAAa;AAAA,EACnD,WAAA,CACE,OAAA,GAAU,cAAA,EACV,OAAA,EAMA;AACA,IAAA,KAAA,CAAM,OAAA,EAAS,EAAE,UAAA,EAAY,OAAA,EAAS,cAAc,GAAA,EAAK,GAAG,SAAS,CAAA;AACrE,IAAA,IAAA,CAAK,IAAA,GAAO,oBAAA;AAAA,EACd;AACF;AAKO,SAAS,aAAA,CAAc,UAAA,EAAoB,QAAA,EAAmB,GAAA,EAA2B;AAC9F,EAAA,MAAM,OAAA,GAAU,oBAAoB,QAAQ,CAAA;AAE5C,EAAA,QAAQ,UAAA;AAAY,IAClB,KAAK,GAAA,EAAK;AACR,MAAA,MAAM,WAAA,GAAc,mBAAmB,QAAQ,CAAA;AAC/C,MAAA,OAAO,IAAI,uBAAuB,OAAA,EAAS;AAAA,QACzC,QAAA;AAAA,QACA,GAAA;AAAA,QACA,GAAI,WAAA,KAAgB,MAAA,GAAY,EAAE,WAAA,KAAgB;AAAC,OACpD,CAAA;AAAA,IACH;AAAA,IACA,KAAK,GAAA;AACH,MAAA,OAAO,IAAI,gBAAA,CAAiB,OAAA,EAAS,EAAE,QAAA,EAAU,KAAK,CAAA;AAAA,IACxD,KAAK,GAAA;AACH,MAAA,OAAO,IAAI,qBAAA,CAAsB,OAAA,EAAS,EAAE,QAAA,EAAU,KAAK,CAAA;AAAA,IAC7D,KAAK,GAAA;AACH,MAAA,OAAO,IAAI,oBAAA,CAAqB,OAAA,EAAS,EAAE,QAAA,EAAU,KAAK,CAAA;AAAA,IAC5D,KAAK,GAAA,EAAK;AACR,MAAA,MAAM,UAAA,GAAa,kBAAkB,QAAQ,CAAA;AAC7C,MAAA,OAAO,IAAI,sBAAsB,OAAA,EAAS;AAAA,QACxC,QAAA;AAAA,QACA,GAAA;AAAA,QACA,GAAI,UAAA,KAAe,MAAA,GAAY,EAAE,UAAA,KAAe;AAAC,OAClD,CAAA;AAAA,IACH;AAAA,IACA;AACE,MAAA,IAAI,cAAc,GAAA,EAAK;AACrB,QAAA,OAAO,IAAI,kBAAA,CAAmB,OAAA,EAAS,EAAE,UAAA,EAAY,QAAA,EAAU,KAAK,CAAA;AAAA,MACtE;AACA,MAAA,OAAO,IAAI,YAAA,CAAa,OAAA,EAAS,EAAE,UAAA,EAAY,QAAA,EAAU,KAAK,CAAA;AAAA;AAEpE;AAKA,SAAS,oBAAoB,QAAA,EAA2B;AACtD,EAAA,IAAI,QAAA,IAAY,OAAO,QAAA,KAAa,QAAA,EAAU;AAC5C,IAAA,MAAM,IAAA,GAAO,QAAA;AACb,IAAA,IAAI,OAAO,IAAA,CAAK,OAAA,KAAY,QAAA,EAAU;AACpC,MAAA,OAAO,IAAA,CAAK,OAAA;AAAA,IACd;AACA,IAAA,IAAI,OAAO,IAAA,CAAK,KAAA,KAAU,QAAA,EAAU;AAClC,MAAA,OAAO,IAAA,CAAK,KAAA;AAAA,IACd;AACA,IAAA,IAAI,OAAO,IAAA,CAAK,iBAAA,KAAsB,QAAA,EAAU;AAC9C,MAAA,OAAO,IAAA,CAAK,iBAAA;AAAA,IACd;AAAA,EACF;AACA,EAAA,OAAO,eAAA;AACT;AAKA,SAAS,mBAAmB,QAAA,EAAyD;AACnF,EAAA,IAAI,QAAA,IAAY,OAAO,QAAA,KAAa,QAAA,EAAU;AAC5C,IAAA,MAAM,IAAA,GAAO,QAAA;AACb,IAAA,IAAI,IAAA,CAAK,MAAA,IAAU,OAAO,IAAA,CAAK,WAAW,QAAA,EAAU;AAClD,MAAA,OAAO,IAAA,CAAK,MAAA;AAAA,IACd;AAAA,EACF;AACA,EAAA,OAAO,MAAA;AACT;AAKA,SAAS,kBAAkB,QAAA,EAAuC;AAChE,EAAA,IAAI,QAAA,IAAY,OAAO,QAAA,KAAa,QAAA,EAAU;AAC5C,IAAA,MAAM,IAAA,GAAO,QAAA;AACb,IAAA,IAAI,OAAO,IAAA,CAAK,WAAA,KAAgB,QAAA,EAAU;AACxC,MAAA,OAAO,IAAA,CAAK,WAAA;AAAA,IACd;AAAA,EACF;AACA,EAAA,OAAO,MAAA;AACT;;;ACxOA,IAAM,SAAA,GAAY,qDAAA;AAGlB,IAAM,sBAAA,GAAyB,IAAI,EAAA,GAAK,GAAA;AAMjC,IAAM,eAAN,MAAmB;AAAA,EACP,QAAA;AAAA,EACA,YAAA;AAAA,EACT,WAAA,GAAkC,IAAA;AAAA,EAClC,YAAA,GAAuC,IAAA;AAAA,EAE/C,WAAA,CAAY,UAAkB,YAAA,EAAsB;AAClD,IAAA,IAAA,CAAK,QAAA,GAAW,QAAA;AAChB,IAAA,IAAA,CAAK,YAAA,GAAe,YAAA;AAAA,EACtB;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,cAAA,GAAkC;AAEtC,IAAA,IAAI,KAAK,WAAA,IAAe,CAAC,KAAK,cAAA,CAAe,IAAA,CAAK,WAAW,CAAA,EAAG;AAC9D,MAAA,OAAO,KAAK,WAAA,CAAY,WAAA;AAAA,IAC1B;AAGA,IAAA,IAAI,KAAK,YAAA,EAAc;AACrB,MAAA,OAAO,IAAA,CAAK,YAAA;AAAA,IACd;AAGA,IAAA,IAAA,CAAK,YAAA,GAAe,KAAK,UAAA,EAAW;AAEpC,IAAA,IAAI;AACF,MAAA,MAAM,KAAA,GAAQ,MAAM,IAAA,CAAK,YAAA;AACzB,MAAA,OAAO,KAAA;AAAA,IACT,CAAA,SAAE;AACA,MAAA,IAAA,CAAK,YAAA,GAAe,IAAA;AAAA,IACtB;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,YAAA,GAAgC;AACpC,IAAA,IAAA,CAAK,WAAA,GAAc,IAAA;AACnB,IAAA,OAAO,KAAK,cAAA,EAAe;AAAA,EAC7B;AAAA;AAAA;AAAA;AAAA,EAKA,UAAA,GAAmB;AACjB,IAAA,IAAA,CAAK,WAAA,GAAc,IAAA;AACnB,IAAA,IAAA,CAAK,YAAA,GAAe,IAAA;AAAA,EACtB;AAAA;AAAA;AAAA;AAAA,EAKQ,eAAe,KAAA,EAA6B;AAClD,IAAA,OAAO,IAAA,CAAK,GAAA,EAAI,IAAK,KAAA,CAAM,SAAA,GAAY,sBAAA;AAAA,EACzC;AAAA;AAAA;AAAA;AAAA,EAKA,MAAc,UAAA,GAA8B;AAC1C,IAAA,MAAM,IAAA,GAAO,IAAI,eAAA,CAAgB;AAAA,MAC/B,WAAW,IAAA,CAAK,QAAA;AAAA,MAChB,eAAe,IAAA,CAAK,YAAA;AAAA,MACpB,UAAA,EAAY;AAAA,KACb,CAAA;AAED,IAAA,IAAI,QAAA;AACJ,IAAA,IAAI;AACF,MAAA,QAAA,GAAW,MAAM,MAAM,SAAA,EAAW;AAAA,QAChC,MAAA,EAAQ,MAAA;AAAA,QACR,OAAA,EAAS;AAAA,UACP,cAAA,EAAgB;AAAA,SAClB;AAAA,QACA,IAAA,EAAM,KAAK,QAAA;AAAS,OACrB,CAAA;AAAA,IACH,SAAS,KAAA,EAAO;AACd,MAAA,MAAM,KAAA,GAAQ,KAAA,YAAiB,KAAA,GAAQ,KAAA,GAAQ,MAAA;AAC/C,MAAA,MAAM,IAAI,iBAAiB,4CAAA,EAA8C;AAAA,QACvE,GAAI,KAAA,GAAQ,EAAE,KAAA,KAAU;AAAC,OAC1B,CAAA;AAAA,IACH;AAEA,IAAA,IAAI,CAAC,SAAS,EAAA,EAAI;AAChB,MAAA,IAAI,SAAA;AACJ,MAAA,IAAI;AACF,QAAA,SAAA,GAAY,MAAM,SAAS,IAAA,EAAK;AAAA,MAClC,CAAA,CAAA,MAAQ;AACN,QAAA,SAAA,GAAY,MAAM,SAAS,IAAA,EAAK;AAAA,MAClC;AAEA,MAAA,MAAM,IAAI,gBAAA;AAAA,QACR,0BAA0B,MAAA,CAAO,QAAA,CAAS,MAAM,CAAC,CAAA,CAAA,EAAI,SAAS,UAAU,CAAA,CAAA;AAAA,QACxE,EAAE,UAAU,SAAA;AAAU,OACxB;AAAA,IACF;AAEA,IAAA,IAAI,aAAA;AACJ,IAAA,IAAI;AACF,MAAA,aAAA,GAAiB,MAAM,SAAS,IAAA,EAAK;AAAA,IACvC,CAAA,CAAA,MAAQ;AACN,MAAA,MAAM,IAAI,iBAAiB,oCAAoC,CAAA;AAAA,IACjE;AAEA,IAAA,IAAI,CAAC,cAAc,YAAA,EAAc;AAC/B,MAAA,MAAM,IAAI,iBAAiB,6BAAA,EAA+B;AAAA,QACxD,QAAA,EAAU;AAAA,OACX,CAAA;AAAA,IACH;AAGA,IAAA,IAAA,CAAK,WAAA,GAAc;AAAA,MACjB,aAAa,aAAA,CAAc,YAAA;AAAA,MAC3B,SAAA,EAAW,IAAA,CAAK,GAAA,EAAI,GAAI,cAAc,UAAA,GAAa;AAAA,KACrD;AAEA,IAAA,OAAO,KAAK,WAAA,CAAY,WAAA;AAAA,EAC1B;AACF;AChIO,IAAM,gBAAA,GAAmB;AAGhC,IAAM,eAAA,GAAkB,GAAA;AAGxB,IAAM,eAAA,GAAkB,CAAA;AAYjB,IAAM,aAAN,MAAiB;AAAA,EACL,MAAA;AAAA,EACA,WAAA;AAAA,EACA,KAAA;AAAA,EAEjB,WAAA,CAAY,WAAA,EAA2B,OAAA,GAA6B,EAAC,EAAG;AACtE,IAAA,IAAA,CAAK,WAAA,GAAc,WAAA;AACnB,IAAA,IAAA,CAAK,KAAA,GAAQ,QAAQ,KAAA,IAAS,KAAA;AAE9B,IAAA,IAAA,CAAK,MAAA,GAASA,oBAAG,MAAA,CAAO;AAAA,MACtB,SAAA,EAAW,QAAQ,OAAA,IAAW,gBAAA;AAAA,MAC9B,OAAA,EAAS,QAAQ,OAAA,IAAW,eAAA;AAAA,MAC5B,KAAA,EAAO;AAAA,QACL,KAAA,EAAO,QAAQ,OAAA,IAAW,eAAA;AAAA,QAC1B,SAAS,CAAC,KAAA,EAAO,MAAA,EAAQ,KAAA,EAAO,SAAS,QAAQ,CAAA;AAAA,QACjD,aAAa,CAAC,GAAA,EAAK,KAAK,GAAA,EAAK,GAAA,EAAK,KAAK,GAAG,CAAA;AAAA,QAC1C,YAAA,EAAc;AAAA,OAChB;AAAA,MACA,KAAA,EAAO;AAAA,QACL,aAAA,EAAe;AAAA,UACb,OAAO,OAAA,KAAqB;AAC1B,YAAA,MAAM,KAAA,GAAQ,MAAM,IAAA,CAAK,WAAA,CAAY,cAAA,EAAe;AACpD,YAAA,OAAA,CAAQ,OAAA,CAAQ,GAAA,CAAI,eAAA,EAAiB,CAAA,OAAA,EAAU,KAAK,CAAA,CAAE,CAAA;AACtD,YAAA,OAAA,CAAQ,OAAA,CAAQ,GAAA,CAAI,QAAA,EAAU,kBAAkB,CAAA;AAAA,UAClD;AAAA,SACF;AAAA,QACA,aAAA,EAAe;AAAA,UACb,OAAO,OAAA,EAAS,QAAA,EAAU,QAAA,KAAa;AACrC,YAAA,IAAI,KAAK,KAAA,EAAO;AACd,cAAA,OAAA,CAAQ,GAAA;AAAA,gBACN,CAAA,cAAA,EAAiB,OAAA,CAAQ,MAAM,CAAA,CAAA,EAAI,MAAA,CAAO,SAAS,MAAM,CAAC,CAAA,CAAA,EAAI,OAAA,CAAQ,GAAG,CAAA;AAAA,eAC3E;AAAA,YACF;AAGA,YAAA,IAAI,QAAA,CAAS,WAAW,GAAA,EAAK;AAC3B,cAAA,IAAI;AACF,gBAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,WAAA,CAAY,YAAA,EAAa;AACrD,gBAAA,OAAA,CAAQ,OAAA,CAAQ,GAAA,CAAI,eAAA,EAAiB,CAAA,OAAA,EAAU,QAAQ,CAAA,CAAE,CAAA;AACzD,gBAAA,OAAO,MAAMA,oBAAG,OAAO,CAAA;AAAA,cACzB,CAAA,CAAA,MAAQ;AACN,gBAAA,MAAM,IAAI,iBAAiB,sBAAsB,CAAA;AAAA,cACnD;AAAA,YACF;AAEA,YAAA,OAAO,QAAA;AAAA,UACT;AAAA;AACF;AACF,KACD,CAAA;AAAA,EACH;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,GAAA,CAAO,IAAA,EAAc,OAAA,EAAiC;AAC1D,IAAA,OAAO,IAAA,CAAK,OAAA,CAAW,KAAA,EAAO,IAAA,EAAM,OAAO,CAAA;AAAA,EAC7C;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,IAAA,CAAQ,IAAA,EAAc,IAAA,EAAgB,OAAA,EAAiC;AAC3E,IAAA,OAAO,IAAA,CAAK,QAAW,MAAA,EAAQ,IAAA,EAAM,EAAE,GAAG,OAAA,EAAS,IAAA,EAAM,IAAA,EAAM,CAAA;AAAA,EACjE;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,GAAA,CAAO,IAAA,EAAc,IAAA,EAAgB,OAAA,EAAiC;AAC1E,IAAA,OAAO,IAAA,CAAK,QAAW,KAAA,EAAO,IAAA,EAAM,EAAE,GAAG,OAAA,EAAS,IAAA,EAAM,IAAA,EAAM,CAAA;AAAA,EAChE;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,KAAA,CAAS,IAAA,EAAc,IAAA,EAAgB,OAAA,EAAiC;AAC5E,IAAA,OAAO,IAAA,CAAK,QAAW,OAAA,EAAS,IAAA,EAAM,EAAE,GAAG,OAAA,EAAS,IAAA,EAAM,IAAA,EAAM,CAAA;AAAA,EAClE;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,MAAA,CAAU,IAAA,EAAc,OAAA,EAAiC;AAC7D,IAAA,OAAO,IAAA,CAAK,OAAA,CAAW,QAAA,EAAU,IAAA,EAAM,OAAO,CAAA;AAAA,EAChD;AAAA;AAAA;AAAA;AAAA,EAKA,MAAc,OAAA,CACZ,MAAA,EACA,IAAA,EACA,OAAA,EACY;AACZ,IAAA,IAAI;AACF,MAAA,MAAM,WAAW,MAAM,IAAA,CAAK,OAAO,MAAM,CAAA,CAAE,MAAM,OAAO,CAAA;AAGxD,MAAA,MAAM,WAAA,GAAc,QAAA,CAAS,OAAA,CAAQ,GAAA,CAAI,cAAc,CAAA;AACvD,MAAA,IAAI,CAAC,WAAA,EAAa,QAAA,CAAS,kBAAkB,CAAA,EAAG;AAC9C,QAAA,OAAO,KAAA,CAAA;AAAA,MACT;AAEA,MAAA,OAAQ,MAAM,SAAS,IAAA,EAAK;AAAA,IAC9B,SAAS,KAAA,EAAgB;AACvB,MAAA,IAAI,iBAAiBC,YAAA,EAAW;AAC9B,QAAA,MAAM,GAAA,GAAM,MAAM,OAAA,CAAQ,GAAA;AAC1B,QAAA,IAAI,YAAA;AAEJ,QAAA,IAAI;AACF,UAAA,YAAA,GAAe,MAAM,KAAA,CAAM,QAAA,CAAS,IAAA,EAAK;AAAA,QAC3C,CAAA,CAAA,MAAQ;AACN,UAAA,IAAI;AACF,YAAA,YAAA,GAAe,MAAM,KAAA,CAAM,QAAA,CAAS,IAAA,EAAK;AAAA,UAC3C,CAAA,CAAA,MAAQ;AACN,YAAA,YAAA,GAAe,IAAA;AAAA,UACjB;AAAA,QACF;AAEA,QAAA,MAAM,aAAA,CAAc,KAAA,CAAM,QAAA,CAAS,MAAA,EAAQ,cAAc,GAAG,CAAA;AAAA,MAC9D;AAEA,MAAA,MAAM,KAAA;AAAA,IACR;AAAA,EACF;AACF;;;AC1IO,IAAM,cAAN,MAAkB;AAAA,EACvB,YAA6B,IAAA,EAAkB;AAAlB,IAAA,IAAA,CAAA,IAAA,GAAA,IAAA;AAAA,EAAmB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAchD,MAAM,UAAA,GAA+B;AACnC,IAAA,OAAO,IAAA,CAAK,IAAA,CAAK,GAAA,CAAa,uBAAuB,CAAA;AAAA,EACvD;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAeA,MAAM,UAAA,GAA+C;AACnD,IAAA,OAAO,IAAA,CAAK,IAAA,CAAK,GAAA,CAA6B,gCAAgC,CAAA;AAAA,EAChF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAiBA,MAAM,sBAAsB,SAAA,EAAwD;AAClF,IAAA,OAAO,IAAA,CAAK,IAAA,CAAK,GAAA,CAAgC,CAAA,EAAG,SAAS,CAAA,YAAA,CAAc,CAAA;AAAA,EAC7E;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAaA,MAAM,IAAI,SAAA,EAA+C;AAEvD,IAAA,MAAM,OAAA,GAAU,MAAM,IAAA,CAAK,UAAA,EAAW;AACtC,IAAA,MAAM,OAAA,GAAU,QAAQ,OAAA,CAAQ,IAAA,CAAK,CAAC,CAAA,KAAM,CAAA,CAAE,eAAe,SAAS,CAAA;AACtE,IAAA,IAAI,CAAC,OAAA,EAAS;AACZ,MAAA,MAAM,IAAI,KAAA,CAAM,CAAA,mBAAA,EAAsB,SAAS,CAAA,CAAE,CAAA;AAAA,IACnD;AACA,IAAA,OAAO,OAAA;AAAA,EACT;AACF;;;ACtDO,IAAM,eAAN,MAAmB;AAAA,EACxB,YAA6B,IAAA,EAAkB;AAAlB,IAAA,IAAA,CAAA,IAAA,GAAA,IAAA;AAAA,EAAmB;AAAA;AAAA;AAAA;AAAA,EAKhD,MAAM,IAAA,CAAK,SAAA,EAAmB,OAAA,GAAgC,EAAC,EAAkC;AAC/F,IAAA,MAAM,YAAA,GAAe,IAAI,eAAA,EAAgB;AAEzC,IAAA,IAAI,OAAA,CAAQ,SAAS,MAAA,EAAW;AAC9B,MAAA,YAAA,CAAa,GAAA,CAAI,MAAA,EAAQ,OAAA,CAAQ,IAAA,CAAK,UAAU,CAAA;AAAA,IAClD;AACA,IAAA,IAAI,OAAA,CAAQ,aAAa,MAAA,EAAW;AAClC,MAAA,YAAA,CAAa,GAAA,CAAI,WAAA,EAAa,OAAA,CAAQ,QAAA,CAAS,UAAU,CAAA;AAAA,IAC3D;AACA,IAAA,IAAI,OAAA,CAAQ,WAAW,MAAA,EAAW;AAChC,MAAA,YAAA,CAAa,GAAA,CAAI,QAAA,EAAU,OAAA,CAAQ,MAAM,CAAA;AAAA,IAC3C;AACA,IAAA,IAAI,OAAA,CAAQ,kBAAkB,MAAA,EAAW;AACvC,MAAA,YAAA,CAAa,GAAA,CAAI,gBAAA,EAAkB,OAAA,CAAQ,aAAa,CAAA;AAAA,IAC1D;AAEA,IAAA,MAAM,KAAA,GAAQ,aAAa,QAAA,EAAS;AACpC,IAAA,MAAM,IAAA,GAAO,GAAG,SAAS,CAAA,WAAA,EAAc,QAAQ,CAAA,CAAA,EAAI,KAAK,KAAK,EAAE,CAAA,CAAA;AAE/D,IAAA,OAAO,IAAA,CAAK,IAAA,CAAK,GAAA,CAA0B,IAAI,CAAA;AAAA,EACjD;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,SAAS,SAAA,EAAsD;AACnE,IAAA,OAAO,IAAA,CAAK,IAAA,CAAK,GAAA,CAA8B,CAAA,EAAG,SAAS,CAAA,eAAA,CAAiB,CAAA;AAAA,EAC9E;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,GAAA,CAAI,SAAA,EAAmB,UAAA,EAAuC;AAClE,IAAA,OAAO,KAAK,IAAA,CAAK,GAAA,CAAc,GAAG,SAAS,CAAA,WAAA,EAAc,UAAU,CAAA,CAAE,CAAA;AAAA,EACvE;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,MAAA,CAAO,SAAA,EAAmB,QAAA,EAAoD;AAClF,IAAA,OAAO,KAAK,IAAA,CAAK,IAAA,CAAe,CAAA,EAAG,SAAS,eAAe,QAAQ,CAAA;AAAA,EACrE;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,MAAA,CACJ,SAAA,EACA,UAAA,EACA,OAAA,EACmB;AACnB,IAAA,OAAO,IAAA,CAAK,KAAK,IAAA,CAAe,CAAA,EAAG,SAAS,CAAA,WAAA,EAAc,UAAU,IAAI,OAAO,CAAA;AAAA,EACjF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,MAAA,CAAO,SAAA,EAAmB,UAAA,EAAmC;AACjE,IAAA,MAAM,KAAK,IAAA,CAAK,MAAA,CAAO,GAAG,SAAS,CAAA,WAAA,EAAc,UAAU,CAAA,CAAE,CAAA;AAAA,EAC/D;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAUA,MAAM,SAAA,CACJ,SAAA,EACA,UAAA,EACA,SACA,kBAAA,EACmB;AACnB,IAAA,MAAM,YAAA,GAAe,IAAI,eAAA,EAAgB;AACzC,IAAA,IAAI,kBAAA,EAAoB;AACtB,MAAA,YAAA,CAAa,GAAA,CAAI,uBAAuB,kBAAkB,CAAA;AAAA,IAC5D;AACA,IAAA,MAAM,KAAA,GAAQ,aAAa,QAAA,EAAS;AACpC,IAAA,MAAM,IAAA,GAAO,CAAA,EAAG,SAAS,CAAA,WAAA,EAAc,UAAU,aAAa,KAAA,GAAQ,CAAA,CAAA,EAAI,KAAK,CAAA,CAAA,GAAK,EAAE,CAAA,CAAA;AACtF,IAAA,OAAO,IAAA,CAAK,IAAA,CAAK,IAAA,CAAe,IAAA,EAAM,OAAO,CAAA;AAAA,EAC/C;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,KAAA,CAAM,SAAA,EAAmB,UAAA,EAAuC;AACpE,IAAA,OAAO,KAAK,MAAA,CAAO,SAAA,EAAW,YAAY,EAAE,SAAA,EAAW,OAAO,CAAA;AAAA,EAChE;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,OAAA,CAAQ,SAAA,EAAmB,UAAA,EAAuC;AACtE,IAAA,OAAO,KAAK,MAAA,CAAO,SAAA,EAAW,YAAY,EAAE,SAAA,EAAW,MAAM,CAAA;AAAA,EAC/D;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,UAAA,CACJ,SAAA,EACA,OAAA,EAC+B;AAC/B,IAAA,OAAO,KAAK,IAAA,CAAK,GAAA,CAA0B,CAAA,EAAG,SAAS,mBAAmB,OAAO,CAAA;AAAA,EACnF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,MAAM,KAAA,CACJ,SAAA,EACA,UAAA,EACA,KAAA,EACmB;AACnB,IAAA,OAAO,IAAA,CAAK,KAAK,KAAA,CAAgB,CAAA,EAAG,SAAS,CAAA,WAAA,EAAc,UAAU,IAAI,KAAK,CAAA;AAAA,EAChF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,MAAM,YAAY,gBAAA,EAA6D;AAC7E,IAAA,OAAO,IAAA,CAAK,IAAA,CAAK,GAAA,CAA8B,CAAA,EAAG,gBAAgB,CAAA,eAAA,CAAiB,CAAA;AAAA,EACrF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,aAAA,CACJ,SAAA,EACA,MAAA,EACyC;AACzC,IAAA,OAAO,KAAK,IAAA,CAAK,IAAA;AAAA,MACf,GAAG,SAAS,CAAA,yBAAA,CAAA;AAAA,MACZ;AAAA,KACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,qBAAA,CACJ,SAAA,EACA,UAAA,EACsC;AACtC,IAAA,OAAO,KAAK,IAAA,CAAK,GAAA;AAAA,MACf,CAAA,EAAG,SAAS,CAAA,WAAA,EAAc,UAAU,CAAA,wCAAA;AAAA,KACtC;AAAA,EACF;AACF;;;ACnKO,IAAM,WAAN,MAAe;AAAA,EACpB,YAA6B,IAAA,EAAkB;AAAlB,IAAA,IAAA,CAAA,IAAA,GAAA,IAAA;AAAA,EAAmB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAiBhD,MAAM,IAAA,CACJ,SAAA,EACA,UAAA,EACA,OAAA,GAA4B,EAAC,EACM;AACnC,IAAA,MAAM,YAAA,GAAe,IAAI,eAAA,EAAgB;AAEzC,IAAA,IAAI,OAAA,CAAQ,SAAS,MAAA,EAAW;AAC9B,MAAA,YAAA,CAAa,GAAA,CAAI,MAAA,EAAQ,OAAA,CAAQ,IAAA,CAAK,UAAU,CAAA;AAAA,IAClD;AACA,IAAA,IAAI,OAAA,CAAQ,aAAa,MAAA,EAAW;AAClC,MAAA,YAAA,CAAa,GAAA,CAAI,WAAA,EAAa,OAAA,CAAQ,QAAA,CAAS,UAAU,CAAA;AAAA,IAC3D;AACA,IAAA,IAAI,OAAA,CAAQ,WAAW,MAAA,EAAW;AAChC,MAAA,YAAA,CAAa,GAAA,CAAI,QAAA,EAAU,OAAA,CAAQ,MAAM,CAAA;AAAA,IAC3C;AACA,IAAA,IAAI,OAAA,CAAQ,kBAAkB,MAAA,EAAW;AACvC,MAAA,YAAA,CAAa,GAAA,CAAI,gBAAA,EAAkB,OAAA,CAAQ,aAAa,CAAA;AAAA,IAC1D;AAEA,IAAA,MAAM,KAAA,GAAQ,aAAa,QAAA,EAAS;AACpC,IAAA,MAAM,IAAA,GAAO,CAAA,EAAG,SAAS,CAAA,WAAA,EAAc,UAAU,UAAU,KAAA,GAAQ,CAAA,CAAA,EAAI,KAAK,CAAA,CAAA,GAAK,EAAE,CAAA,CAAA;AAEnF,IAAA,OAAO,IAAA,CAAK,IAAA,CAAK,GAAA,CAA8B,IAAI,CAAA;AAAA,EACrD;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAeA,MAAM,GAAA,CAAI,SAAA,EAAmB,UAAA,EAAoB,MAAA,EAAuC;AACtF,IAAA,OAAO,IAAA,CAAK,KAAK,GAAA,CAAkB,CAAA,EAAG,SAAS,CAAA,WAAA,EAAc,UAAU,CAAA,OAAA,EAAU,MAAM,CAAA,CAAE,CAAA;AAAA,EAC3F;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAyBA,MAAM,MAAA,CACJ,SAAA,EACA,UAAA,EACA,IAAA,EACuB;AACvB,IAAA,OAAO,IAAA,CAAK,KAAK,IAAA,CAAmB,CAAA,EAAG,SAAS,CAAA,WAAA,EAAc,UAAU,UAAU,IAAI,CAAA;AAAA,EACxF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EA0CA,MAAM,MAAA,CACJ,SAAA,EACA,UAAA,EACA,QACA,OAAA,EACuB;AACvB,IAAA,OAAO,KAAK,IAAA,CAAK,IAAA;AAAA,MACf,CAAA,EAAG,SAAS,CAAA,WAAA,EAAc,UAAU,UAAU,MAAM,CAAA,CAAA;AAAA,MACpD;AAAA,KACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAcA,MAAM,MAAA,CAAO,SAAA,EAAmB,UAAA,EAAoB,MAAA,EAA+B;AACjF,IAAA,MAAM,IAAA,CAAK,KAAK,MAAA,CAAO,CAAA,EAAG,SAAS,CAAA,WAAA,EAAc,UAAU,CAAA,OAAA,EAAU,MAAM,CAAA,CAAE,CAAA;AAAA,EAC/E;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAcA,MAAM,KAAA,CAAM,SAAA,EAAmB,UAAA,EAAoB,MAAA,EAAuC;AACxF,IAAA,OAAO,IAAA,CAAK,OAAO,SAAA,EAAW,UAAA,EAAY,QAAQ,EAAE,SAAA,EAAW,OAAO,CAAA;AAAA,EACxE;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAcA,MAAM,OAAA,CAAQ,SAAA,EAAmB,UAAA,EAAoB,MAAA,EAAuC;AAC1F,IAAA,OAAO,IAAA,CAAK,OAAO,SAAA,EAAW,UAAA,EAAY,QAAQ,EAAE,SAAA,EAAW,MAAM,CAAA;AAAA,EACvE;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAoBA,MAAM,UAAA,CACJ,SAAA,EACA,UAAA,EACA,KAAA,EACkC;AAClC,IAAA,OAAO,KAAK,IAAA,CAAK,IAAA;AAAA,MACf,CAAA,EAAG,SAAS,CAAA,WAAA,EAAc,UAAU,CAAA,WAAA,CAAA;AAAA,MACpC,EAAE,YAAY,KAAA;AAAM,KACtB;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAiCA,MAAM,yBAAA,CACJ,SAAA,EACA,KAAA,EACkC;AAClC,IAAA,OAAO,IAAA,CAAK,KAAK,GAAA,CAA6B,CAAA,EAAG,SAAS,CAAA,WAAA,CAAA,EAAe,EAAE,OAAO,CAAA;AAAA,EACpF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAkBA,MAAM,UAAA,CACJ,SAAA,EACA,OAAA,EACmC;AACnC,IAAA,OAAO,KAAK,IAAA,CAAK,IAAA,CAA+B,CAAA,EAAG,SAAS,eAAe,OAAO,CAAA;AAAA,EACpF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAkBA,MAAM,UAAA,CAAW,SAAA,EAAmB,OAAA,EAAgD;AAClF,IAAA,MAAM,IAAA,CAAK,IAAA,CAAK,MAAA,CAAO,CAAA,EAAG,SAAS,CAAA,WAAA,CAAA,EAAe;AAAA,MAChD,IAAA,EAAM;AAAA,KACP,CAAA;AAAA,EACH;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAcA,MAAM,eAAA,CACJ,SAAA,EACA,UAAA,EACA,MAAA,EACkC;AAClC,IAAA,OAAO,KAAK,IAAA,CAAK,GAAA;AAAA,MACf,CAAA,EAAG,SAAS,CAAA,WAAA,EAAc,UAAU,UAAU,MAAM,CAAA,UAAA;AAAA,KACtD;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAUA,MAAM,WAAA,CACJ,SAAA,EACA,UAAA,EACA,QACA,OAAA,EACuB;AACvB,IAAA,OAAO,KAAK,IAAA,CAAK,GAAA;AAAA,MACf,GAAG,SAAS,CAAA,WAAA,EAAc,UAAU,CAAA,OAAA,EAAU,MAAM,aAAa,OAAO,CAAA;AAAA,KAC1E;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAWA,MAAM,cAAA,CACJ,SAAA,EACA,UAAA,EACA,MAAA,EACA,SACA,OAAA,EACuB;AACvB,IAAA,OAAO,KAAK,IAAA,CAAK,IAAA;AAAA,MACf,GAAG,SAAS,CAAA,WAAA,EAAc,UAAU,CAAA,OAAA,EAAU,MAAM,aAAa,OAAO,CAAA,CAAA;AAAA,MACxE;AAAA,KACF;AAAA,EACF;AACF;;;AC/WO,IAAM,gBAAN,MAAoB;AAAA,EACzB,YAA6B,IAAA,EAAkB;AAAlB,IAAA,IAAA,CAAA,IAAA,GAAA,IAAA;AAAA,EAAmB;AAAA;AAAA;AAAA;AAAA;AAAA,EAOhD,MAAM,YAAA,GAAmC;AACvC,IAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,IAAA,CAAK,IAAqC,qBAAqB,CAAA;AAC3F,IAAA,OAAO,QAAA,CAAS,OAAA;AAAA,EAClB;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,WAAW,WAAA,EAAwC;AACvD,IAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,IAAA,CAAK,GAAA;AAAA,MAC/B,uBAAuB,WAAW,CAAA,QAAA;AAAA,KACpC;AACA,IAAA,OAAO,QAAA,CAAS,OAAA;AAAA,EAClB;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,QAAQ,WAAA,EAAqC;AACjD,IAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,IAAA,CAAK,GAAA;AAAA,MAC/B,uBAAuB,WAAW,CAAA,IAAA;AAAA,KACpC;AACA,IAAA,OAAO,QAAA,CAAS,OAAA;AAAA,EAClB;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,cAAA,CACJ,WAAA,EACA,MAAA,EACuB;AACvB,IAAA,MAAM,YAAA,GAAe,IAAI,eAAA,EAAgB;AACzC,IAAA,IAAI,QAAQ,MAAA,EAAQ;AAClB,MAAA,YAAA,CAAa,GAAA,CAAI,QAAA,EAAU,MAAA,CAAO,MAAM,CAAA;AAAA,IAC1C;AACA,IAAA,IAAI,MAAA,EAAQ,SAAS,MAAA,EAAW;AAC9B,MAAA,YAAA,CAAa,GAAA,CAAI,MAAA,EAAQ,MAAA,CAAO,MAAA,CAAO,IAAI,CAAC,CAAA;AAAA,IAC9C;AACA,IAAA,IAAI,MAAA,EAAQ,cAAc,MAAA,EAAW;AACnC,MAAA,YAAA,CAAa,GAAA,CAAI,WAAA,EAAa,MAAA,CAAO,MAAA,CAAO,SAAS,CAAC,CAAA;AAAA,IACxD;AAEA,IAAA,MAAM,WAAA,GAAc,aAAa,QAAA,EAAS;AAC1C,IAAA,MAAM,IAAA,GAAO,uBAAuB,WAAW,CAAA,OAAA,CAAA;AAC/C,IAAA,MAAM,MAAM,WAAA,GAAc,CAAA,EAAG,IAAI,CAAA,CAAA,EAAI,WAAW,CAAA,CAAA,GAAK,IAAA;AAErD,IAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,IAAA,CAAK,IAAwC,GAAG,CAAA;AAC5E,IAAA,OAAO,QAAA,CAAS,OAAA;AAAA,EAClB;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,MAAM,YAAA,GAAoC;AACxC,IAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,IAAA,CAAK,IAAsC,qBAAqB,CAAA;AAC5F,IAAA,OAAO,QAAA,CAAS,OAAA;AAAA,EAClB;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,mBAAA,GAAsD;AAC1D,IAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,IAAA,CAAK,GAAA;AAAA,MAC/B;AAAA,KACF;AACA,IAAA,OAAO,QAAA,CAAS,OAAA;AAAA,EAClB;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,cAAA,GAAuC;AAC3C,IAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,IAAA,CAAK,GAAA;AAAA,MAC/B;AAAA,KACF;AACA,IAAA,OAAO,QAAA,CAAS,OAAA;AAAA,EAClB;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,kBAAA,GAA2C;AAC/C,IAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,IAAA,CAAK,GAAA;AAAA,MAC/B;AAAA,KACF;AACA,IAAA,OAAO,QAAA,CAAS,OAAA;AAAA,EAClB;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,WAAA,GAAkC;AACtC,IAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,IAAA,CAAK,IAAqC,oBAAoB,CAAA;AAC1F,IAAA,OAAO,QAAA,CAAS,OAAA;AAAA,EAClB;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,MAAM,gBAAA,GAA2C;AAC/C,IAAA,OAAO,IAAA,CAAK,IAAA,CAAK,GAAA,CAAmB,sCAAsC,CAAA;AAAA,EAC5E;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,YAAA,GAAmC;AACvC,IAAA,OAAO,IAAA,CAAK,IAAA,CAAK,GAAA,CAAe,kCAAkC,CAAA;AAAA,EACpE;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,aAAA,GAAsC;AAC1C,IAAA,MAAM,QAAA,GACJ,MAAM,IAAA,CAAK,IAAA,CAAK,IAAuC,wBAAwB,CAAA;AACjF,IAAA,OAAO,QAAA,CAAS,OAAA;AAAA,EAClB;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,MAAM,qBAAA,GAA2C;AAC/C,IAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,IAAA,CAAK,GAAA;AAAA,MAC/B;AAAA,KACF;AACA,IAAA,OAAO,SAAS,OAAA,CAAQ,GAAA,CAAI,CAAC,CAAA,KAAM,EAAE,KAAK,CAAA;AAAA,EAC5C;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,eAAA,GAAqC;AACzC,IAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,IAAA,CAAK,GAAA;AAAA,MAC/B;AAAA,KACF;AACA,IAAA,OAAO,SAAS,OAAA,CAAQ,GAAA,CAAI,CAAC,CAAA,KAAM,EAAE,KAAK,CAAA;AAAA,EAC5C;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,WAAA,GAAiC;AACrC,IAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,IAAA,CAAK,GAAA;AAAA,MAC/B;AAAA,KACF;AACA,IAAA,OAAO,SAAS,OAAA,CAAQ,GAAA,CAAI,CAAC,CAAA,KAAM,EAAE,KAAK,CAAA;AAAA,EAC5C;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,cAAA,GAAwC;AAC5C,IAAA,MAAM,QAAA,GACJ,MAAM,IAAA,CAAK,IAAA,CAAK,IAAwC,uBAAuB,CAAA;AACjF,IAAA,OAAO,QAAA,CAAS,OAAA;AAAA,EAClB;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,MAAM,wBAAA,GAA4D;AAChE,IAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,IAAA,CAAK,GAAA;AAAA,MAC/B;AAAA,KACF;AACA,IAAA,OAAO,QAAA,CAAS,OAAA;AAAA,EAClB;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,mBAAmB,SAAA,EAA6C;AACpE,IAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,IAAA,CAAK,GAAA;AAAA,MAC/B,GAAG,SAAS,CAAA,kBAAA;AAAA,KACd;AACA,IAAA,OAAO,QAAA,CAAS,OAAA;AAAA,EAClB;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,MAAM,wBAAwB,SAAA,EAAmD;AAC/E,IAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,IAAA,CAAK,GAAA;AAAA,MAC/B,GAAG,SAAS,CAAA,6BAAA;AAAA,KACd;AACA,IAAA,OAAO,QAAA,CAAS,OAAA;AAAA,EAClB;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,gCAAA,CACJ,SAAA,EACA,WAAA,EACgC;AAChC,IAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,IAAA,CAAK,GAAA;AAAA,MAC/B,CAAA,EAAG,SAAS,CAAA,8BAAA,EAAiC,WAAW,CAAA;AAAA,KAC1D;AACA,IAAA,OAAO,QAAA,CAAS,OAAA;AAAA,EAClB;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,sBAAsB,SAAA,EAAiD;AAC3E,IAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,IAAA,CAAK,GAAA;AAAA,MAC/B,GAAG,SAAS,CAAA,+BAAA;AAAA,KACd;AACA,IAAA,OAAO,QAAA,CAAS,OAAA;AAAA,EAClB;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,8BAAA,CACJ,SAAA,EACA,WAAA,EAC8B;AAC9B,IAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,IAAA,CAAK,GAAA;AAAA,MAC/B,CAAA,EAAG,SAAS,CAAA,gCAAA,EAAmC,WAAW,CAAA;AAAA,KAC5D;AACA,IAAA,OAAO,QAAA,CAAS,OAAA;AAAA,EAClB;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,sBAAsB,SAAA,EAAiD;AAC3E,IAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,IAAA,CAAK,GAAA;AAAA,MAC/B,GAAG,SAAS,CAAA,+BAAA;AAAA,KACd;AACA,IAAA,OAAO,QAAA,CAAS,OAAA;AAAA,EAClB;AACF;;;AC3QO,IAAM,gBAAN,MAAoB;AAAA,EACzB,YAA6B,IAAA,EAAkB;AAAlB,IAAA,IAAA,CAAA,IAAA,GAAA,IAAA;AAAA,EAAmB;AAAA;AAAA;AAAA;AAAA,EAKhD,MAAM,KAAK,SAAA,EAAyC;AAClD,IAAA,MAAM,WAAW,MAAM,IAAA,CAAK,KAAK,GAAA,CAA2B,CAAA,EAAG,SAAS,CAAA,mBAAA,CAAqB,CAAA;AAC7F,IAAA,OAAO,QAAA,CAAS,OAAA;AAAA,EAClB;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,WAAW,SAAA,EAAsC;AACrD,IAAA,MAAM,WAAW,MAAM,IAAA,CAAK,KAAK,GAAA,CAA+B,CAAA,EAAG,SAAS,CAAA,gBAAA,CAAkB,CAAA;AAC9F,IAAA,OAAO,QAAA,CAAS,KAAA;AAAA,EAClB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,MAAM,aAAA,CACJ,SAAA,EACA,OAAA,EACmB;AACnB,IAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,IAAA,CAAK,IAAA;AAAA,MAC/B,GAAG,SAAS,CAAA,gBAAA,CAAA;AAAA,MACZ;AAAA,KACF;AACA,IAAA,OAAO,QAAA,CAAS,KAAA;AAAA,EAClB;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,cAAA,CAAe,SAAA,EAAmB,IAAA,EAAiC;AACvE,IAAA,MAAM,OAAA,GAAU,MAAM,IAAA,CAAK,UAAA,CAAW,SAAS,CAAA;AAE/C,IAAA,IAAI,OAAA,CAAQ,QAAA,CAAS,IAAI,CAAA,EAAG;AAC1B,MAAA,OAAO,OAAA;AAAA,IACT;AAEA,IAAA,OAAO,IAAA,CAAK,cAAc,SAAA,EAAW;AAAA,MACnC,KAAA,EAAO,CAAC,GAAG,OAAA,EAAS,IAAI;AAAA,KACzB,CAAA;AAAA,EACH;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,gBAAA,CAAiB,SAAA,EAAmB,IAAA,EAAiC;AACzE,IAAA,MAAM,OAAA,GAAU,MAAM,IAAA,CAAK,UAAA,CAAW,SAAS,CAAA;AAC/C,IAAA,MAAM,gBAAgB,OAAA,CAAQ,MAAA,CAAO,CAAC,CAAA,KAAM,MAAM,IAAI,CAAA;AAEtD,IAAA,OAAO,IAAA,CAAK,cAAc,SAAA,EAAW;AAAA,MACnC,KAAA,EAAO;AAAA,KACR,CAAA;AAAA,EACH;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,aAAa,SAAA,EAAsC;AACvD,IAAA,OAAO,KAAK,aAAA,CAAc,SAAA,EAAW,EAAE,KAAA,EAAO,IAAI,CAAA;AAAA,EACpD;AACF;;;AC7DO,IAAM,eAAN,MAAmB;AAAA,EACxB,YAA6B,IAAA,EAAkB;AAAlB,IAAA,IAAA,CAAA,IAAA,GAAA,IAAA;AAAA,EAAmB;AAAA;AAAA;AAAA;AAAA;AAAA,EAOhD,MAAM,cAAA,CAAe,SAAA,EAAmB,UAAA,EAAkD;AACxF,IAAA,OAAO,KAAK,IAAA,CAAK,GAAA;AAAA,MACf,CAAA,EAAG,SAAS,CAAA,WAAA,EAAc,UAAU,CAAA,sBAAA;AAAA,KACtC;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,iBAAA,CACJ,SAAA,EACA,UAAA,EACA,SAAA,EAC8B;AAC9B,IAAA,OAAO,KAAK,IAAA,CAAK,IAAA;AAAA,MACf,CAAA,EAAG,SAAS,CAAA,WAAA,EAAc,UAAU,CAAA,sBAAA,CAAA;AAAA,MACpC;AAAA,KACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,MAAM,uBAAA,CAAwB,SAAA,EAAmB,UAAA,EAAgD;AAC/F,IAAA,OAAO,KAAK,IAAA,CAAK,GAAA;AAAA,MACf,CAAA,EAAG,SAAS,CAAA,WAAA,EAAc,UAAU,CAAA,4BAAA;AAAA,KACtC;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,0BAAA,CACJ,SAAA,EACA,UAAA,EACA,SAAA,EAC4B;AAC5B,IAAA,OAAO,KAAK,IAAA,CAAK,IAAA;AAAA,MACf,CAAA,EAAG,SAAS,CAAA,WAAA,EAAc,UAAU,CAAA,4BAAA,CAAA;AAAA,MACpC;AAAA,KACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,MAAM,kBAAA,CAAmB,SAAA,EAAmB,UAAA,EAAgD;AAC1F,IAAA,OAAO,KAAK,IAAA,CAAK,GAAA;AAAA,MACf,CAAA,EAAG,SAAS,CAAA,WAAA,EAAc,UAAU,CAAA,0BAAA;AAAA,KACtC;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,qBAAA,CACJ,SAAA,EACA,UAAA,EACA,SAAA,EAC4B;AAC5B,IAAA,OAAO,KAAK,IAAA,CAAK,IAAA;AAAA,MACf,CAAA,EAAG,SAAS,CAAA,WAAA,EAAc,UAAU,CAAA,0BAAA,CAAA;AAAA,MACpC;AAAA,KACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,MAAM,qBAAA,CACJ,SAAA,EACA,UAAA,EACqC;AACrC,IAAA,OAAO,KAAK,IAAA,CAAK,GAAA;AAAA,MACf,CAAA,EAAG,SAAS,CAAA,WAAA,EAAc,UAAU,CAAA,6BAAA;AAAA,KACtC;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,wBAAA,CACJ,SAAA,EACA,UAAA,EACA,SAAA,EACqC;AACrC,IAAA,OAAO,KAAK,IAAA,CAAK,IAAA;AAAA,MACf,CAAA,EAAG,SAAS,CAAA,WAAA,EAAc,UAAU,CAAA,6BAAA,CAAA;AAAA,MACpC;AAAA,KACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,MAAM,aAAA,CAAc,SAAA,EAAmB,UAAA,EAAkD;AACvF,IAAA,OAAO,KAAK,IAAA,CAAK,GAAA;AAAA,MACf,CAAA,EAAG,SAAS,CAAA,WAAA,EAAc,UAAU,CAAA,8BAAA;AAAA,KACtC;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,gBAAA,CACJ,SAAA,EACA,UAAA,EACA,SAAA,EAC8B;AAC9B,IAAA,OAAO,KAAK,IAAA,CAAK,IAAA;AAAA,MACf,CAAA,EAAG,SAAS,CAAA,WAAA,EAAc,UAAU,CAAA,8BAAA,CAAA;AAAA,MACpC;AAAA,KACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,MAAM,sBAAA,CACJ,SAAA,EACA,UAAA,EACsC;AACtC,IAAA,OAAO,KAAK,IAAA,CAAK,GAAA;AAAA,MACf,CAAA,EAAG,SAAS,CAAA,WAAA,EAAc,UAAU,CAAA,uBAAA;AAAA,KACtC;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,yBAAA,CACJ,SAAA,EACA,UAAA,EACA,SAAA,EACsC;AACtC,IAAA,OAAO,KAAK,IAAA,CAAK,IAAA;AAAA,MACf,CAAA,EAAG,SAAS,CAAA,WAAA,EAAc,UAAU,CAAA,uBAAA,CAAA;AAAA,MACpC;AAAA,KACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,MAAM,gBAAA,CAAiB,SAAA,EAAmB,UAAA,EAAqD;AAC7F,IAAA,OAAO,KAAK,IAAA,CAAK,GAAA;AAAA,MACf,CAAA,EAAG,SAAS,CAAA,WAAA,EAAc,UAAU,CAAA,yBAAA;AAAA,KACtC;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,mBAAA,CACJ,SAAA,EACA,UAAA,EACA,SAAA,EACiC;AACjC,IAAA,OAAO,KAAK,IAAA,CAAK,IAAA;AAAA,MACf,CAAA,EAAG,SAAS,CAAA,WAAA,EAAc,UAAU,CAAA,yBAAA,CAAA;AAAA,MACpC;AAAA,KACF;AAAA,EACF;AACF;;;AC9LO,IAAM,uBAAN,MAA2B;AAAA,EAChC,YAA6B,IAAA,EAAkB;AAAlB,IAAA,IAAA,CAAA,IAAA,GAAA,IAAA;AAAA,EAAmB;AAAA;AAAA;AAAA;AAAA,EAKhD,MAAM,cAAc,SAAA,EAAiD;AACnE,IAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,IAAA,CAAK,GAAA;AAAA,MAC/B,GAAG,SAAS,CAAA,uCAAA;AAAA,KACd;AACA,IAAA,OAAO,QAAA,CAAS,OAAA;AAAA,EAClB;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,KAAK,SAAA,EAAgD;AACzD,IAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,IAAA,CAAK,GAAA;AAAA,MAC/B,GAAG,SAAS,CAAA,mBAAA;AAAA,KACd;AACA,IAAA,OAAO,QAAA,CAAS,OAAA;AAAA,EAClB;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,GAAA,CAAI,SAAA,EAAmB,UAAA,EAA+C;AAC1E,IAAA,OAAO,KAAK,IAAA,CAAK,GAAA,CAAsB,GAAG,SAAS,CAAA,oBAAA,EAAuB,UAAU,CAAA,CAAE,CAAA;AAAA,EACxF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,MAAA,CACJ,SAAA,EACA,QAAA,EAC2B;AAC3B,IAAA,OAAO,KAAK,IAAA,CAAK,IAAA,CAAuB,CAAA,EAAG,SAAS,uBAAuB,QAAQ,CAAA;AAAA,EACrF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,MAAA,CACJ,SAAA,EACA,UAAA,EACA,OAAA,EAC2B;AAC3B,IAAA,OAAO,KAAK,IAAA,CAAK,IAAA;AAAA,MACf,CAAA,EAAG,SAAS,CAAA,oBAAA,EAAuB,UAAU,CAAA,CAAA;AAAA,MAC7C;AAAA,KACF;AAAA,EACF;AACF;;;ACvDO,IAAM,yBAAN,MAA6B;AAAA,EAClC,YAA6B,IAAA,EAAkB;AAAlB,IAAA,IAAA,CAAA,IAAA,GAAA,IAAA;AAAA,EAAmB;AAAA;AAAA;AAAA;AAAA,EAKhD,MAAM,KAAK,SAAA,EAAkD;AAC3D,IAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,IAAA,CAAK,GAAA;AAAA,MAC/B,GAAG,SAAS,CAAA,iCAAA;AAAA,KACd;AACA,IAAA,OAAO,QAAA,CAAS,OAAA;AAAA,EAClB;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,GAAA,CAAI,SAAA,EAAmB,UAAA,EAAiD;AAC5E,IAAA,OAAO,KAAK,IAAA,CAAK,GAAA;AAAA,MACf,CAAA,EAAG,SAAS,CAAA,kCAAA,EAAqC,UAAU,CAAA;AAAA,KAC7D;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,MAAA,CACJ,SAAA,EACA,QAAA,EAC6B;AAC7B,IAAA,OAAO,KAAK,IAAA,CAAK,IAAA,CAAyB,CAAA,EAAG,SAAS,+BAA+B,QAAQ,CAAA;AAAA,EAC/F;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,WAAA,CAAY,SAAA,EAAmB,OAAA,EAA8C;AACjF,IAAA,MAAM,KAAK,IAAA,CAAK,IAAA,CAAK,CAAA,EAAG,SAAS,2CAA2C,OAAO,CAAA;AAAA,EACrF;AACF;;;AC/BO,IAAM,WAAN,MAAe;AAAA,EACpB,YAA6B,IAAA,EAAkB;AAAlB,IAAA,IAAA,CAAA,IAAA,GAAA,IAAA;AAAA,EAAmB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAkBhD,MAAM,oBAAoB,SAAA,EAA8C;AACtE,IAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,IAAA,CAAK,GAAA;AAAA,MAC/B,GAAG,SAAS,CAAA,gCAAA;AAAA,KACd;AACA,IAAA,OAAO,QAAA,CAAS,OAAA;AAAA,EAClB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,MAAM,iBAAA,CAAkB,SAAA,EAAmB,MAAA,EAAyC;AAClF,IAAA,OAAO,KAAK,IAAA,CAAK,GAAA;AAAA,MACf,CAAA,EAAG,SAAS,CAAA,iCAAA,EAAoC,MAAA,CAAO,MAAM,CAAC,CAAA;AAAA,KAChE;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAWA,MAAM,4BAA4B,SAAA,EAAsD;AACtF,IAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,IAAA,CAAK,GAAA;AAAA,MAC/B,GAAG,SAAS,CAAA,qCAAA;AAAA,KACd;AACA,IAAA,OAAO,QAAA,CAAS,OAAA;AAAA,EAClB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAqCA,MAAM,oBAAA,CACJ,SAAA,EACA,IAAA,EACyB;AACzB,IAAA,OAAO,KAAK,IAAA,CAAK,IAAA,CAAqB,CAAA,EAAG,SAAS,oCAAoC,IAAI,CAAA;AAAA,EAC5F;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAUA,MAAM,oBAAA,CACJ,SAAA,EACA,MAAA,EACA,OAAA,EACyB;AACzB,IAAA,OAAO,KAAK,IAAA,CAAK,IAAA;AAAA,MACf,CAAA,EAAG,SAAS,CAAA,iCAAA,EAAoC,MAAA,CAAO,MAAM,CAAC,CAAA,CAAA;AAAA,MAC9D;AAAA,KACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAYA,MAAM,qBAAA,CAAsB,SAAA,EAAmB,MAAA,EAAyC;AACtF,IAAA,OAAO,KAAK,oBAAA,CAAqB,SAAA,EAAW,QAAQ,EAAE,MAAA,EAAQ,YAAY,CAAA;AAAA,EAC5E;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAWA,MAAM,uBAAA,CAAwB,SAAA,EAAmB,MAAA,EAAyC;AACxF,IAAA,OAAO,KAAK,oBAAA,CAAqB,SAAA,EAAW,QAAQ,EAAE,MAAA,EAAQ,UAAU,CAAA;AAAA,EAC1E;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAqBA,MAAM,wBAAwB,SAAA,EAAkD;AAC9E,IAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,IAAA,CAAK,GAAA;AAAA,MAC/B,GAAG,SAAS,CAAA,qCAAA;AAAA,KACd;AACA,IAAA,OAAO,QAAA,CAAS,OAAA;AAAA,EAClB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,MAAM,qBAAA,CAAsB,SAAA,EAAmB,MAAA,EAA6C;AAC1F,IAAA,OAAO,KAAK,IAAA,CAAK,GAAA;AAAA,MACf,CAAA,EAAG,SAAS,CAAA,sCAAA,EAAyC,MAAM,CAAA;AAAA,KAC7D;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAwBA,MAAM,wBAAA,CACJ,SAAA,EACA,IAAA,EAC6B;AAC7B,IAAA,OAAO,KAAK,IAAA,CAAK,IAAA;AAAA,MACf,GAAG,SAAS,CAAA,qCAAA,CAAA;AAAA,MACZ;AAAA,KACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAUA,MAAM,wBAAA,CACJ,SAAA,EACA,MAAA,EACA,OAAA,EAC6B;AAC7B,IAAA,OAAO,KAAK,IAAA,CAAK,IAAA;AAAA,MACf,CAAA,EAAG,SAAS,CAAA,sCAAA,EAAyC,MAAM,CAAA,CAAA;AAAA,MAC3D;AAAA,KACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAWA,MAAM,uBAAA,CAAwB,SAAA,EAAmB,MAAA,EAA6C;AAC5F,IAAA,OAAO,KAAK,wBAAA,CAAyB,SAAA,EAAW,QAAQ,EAAE,MAAA,EAAQ,UAAU,CAAA;AAAA,EAC9E;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,MAAM,wBAAA,CAAyB,SAAA,EAAmB,MAAA,EAA6C;AAC7F,IAAA,OAAO,KAAK,wBAAA,CAAyB,SAAA,EAAW,QAAQ,EAAE,MAAA,EAAQ,UAAU,CAAA;AAAA,EAC9E;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAYA,MAAM,yBAAA,CAA0B,SAAA,EAAmB,MAAA,EAA6C;AAC9F,IAAA,OAAO,KAAK,wBAAA,CAAyB,SAAA,EAAW,QAAQ,EAAE,MAAA,EAAQ,YAAY,CAAA;AAAA,EAChF;AACF;;;AC5QO,IAAM,aAAN,MAAiB;AAAA,EACtB,YAA6B,IAAA,EAAkB;AAAlB,IAAA,IAAA,CAAA,IAAA,GAAA,IAAA;AAAA,EAAmB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAwChD,MAAM,eAAA,CACJ,SAAA,EACA,SAAA,EACA,MAAA,EACgC;AAChC,IAAA,MAAM,YAAA,GAAe,IAAI,eAAA,EAAgB;AACzC,IAAA,YAAA,CAAa,GAAA,CAAI,YAAA,EAAc,MAAA,CAAO,UAAU,CAAA;AAChD,IAAA,YAAA,CAAa,GAAA,CAAI,UAAA,EAAY,MAAA,CAAO,QAAQ,CAAA;AAE5C,IAAA,IAAI,OAAO,QAAA,EAAU;AACnB,MAAA,YAAA,CAAa,GAAA,CAAI,UAAA,EAAY,MAAA,CAAO,QAAQ,CAAA;AAAA,IAC9C;AACA,IAAA,IAAI,OAAO,IAAA,EAAM;AACf,MAAA,YAAA,CAAa,GAAA,CAAI,MAAA,EAAQ,MAAA,CAAO,IAAI,CAAA;AAAA,IACtC;AACA,IAAA,IAAI,OAAO,OAAA,EAAS;AAClB,MAAA,YAAA,CAAa,GAAA,CAAI,SAAA,EAAW,MAAA,CAAO,OAAO,CAAA;AAAA,IAC5C;AACA,IAAA,IAAI,OAAO,QAAA,EAAU;AACnB,MAAA,YAAA,CAAa,GAAA,CAAI,UAAA,EAAY,MAAA,CAAO,QAAQ,CAAA;AAAA,IAC9C;AACA,IAAA,IAAI,OAAO,mBAAA,EAAqB;AAC9B,MAAA,YAAA,CAAa,GAAA,CAAI,qBAAA,EAAuB,MAAA,CAAO,mBAAmB,CAAA;AAAA,IACpE;AACA,IAAA,IAAI,MAAA,CAAO,8BAA8B,MAAA,EAAW;AAClD,MAAA,YAAA,CAAa,GAAA,CAAI,2BAAA,EAA6B,MAAA,CAAO,MAAA,CAAO,yBAAyB,CAAC,CAAA;AAAA,IACxF;AACA,IAAA,IAAI,OAAO,YAAA,EAAc;AACvB,MAAA,YAAA,CAAa,GAAA,CAAI,cAAA,EAAgB,MAAA,CAAO,YAAY,CAAA;AAAA,IACtD;AAEA,IAAA,OAAO,KAAK,IAAA,CAAK,GAAA;AAAA,MACf,GAAG,SAAS,CAAA,qCAAA,EAAwC,SAAS,CAAA,CAAA,EAAI,YAAA,CAAa,UAAU,CAAA;AAAA,KAC1F;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAyBA,MAAM,kBAAA,CACJ,SAAA,EACA,MAAA,EACmC;AACnC,IAAA,MAAM,YAAA,GAAe,IAAI,eAAA,EAAgB;AACzC,IAAA,YAAA,CAAa,GAAA,CAAI,YAAA,EAAc,MAAA,CAAO,UAAU,CAAA;AAChD,IAAA,YAAA,CAAa,GAAA,CAAI,UAAA,EAAY,MAAA,CAAO,QAAQ,CAAA;AAE5C,IAAA,IAAI,OAAO,QAAA,EAAU;AACnB,MAAA,YAAA,CAAa,GAAA,CAAI,UAAA,EAAY,MAAA,CAAO,QAAQ,CAAA;AAAA,IAC9C;AACA,IAAA,IAAI,MAAA,CAAO,UAAU,MAAA,EAAW;AAC9B,MAAA,YAAA,CAAa,GAAA,CAAI,OAAA,EAAS,MAAA,CAAO,MAAA,CAAO,KAAK,CAAC,CAAA;AAAA,IAChD;AACA,IAAA,IAAI,OAAO,mBAAA,EAAqB;AAC9B,MAAA,YAAA,CAAa,GAAA,CAAI,qBAAA,EAAuB,MAAA,CAAO,mBAAmB,CAAA;AAAA,IACpE;AAEA,IAAA,OAAO,KAAK,IAAA,CAAK,GAAA;AAAA,MACf,CAAA,EAAG,SAAS,CAAA,wDAAA,EAA2D,YAAA,CAAa,UAAU,CAAA;AAAA,KAChG;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAoCA,MAAM,gBAAA,CACJ,SAAA,EACA,SAAA,EACA,MAAA,EACiC;AACjC,IAAA,MAAM,YAAA,GAAe,IAAI,eAAA,EAAgB;AACzC,IAAA,YAAA,CAAa,GAAA,CAAI,YAAA,EAAc,MAAA,CAAO,UAAU,CAAA;AAChD,IAAA,YAAA,CAAa,GAAA,CAAI,UAAA,EAAY,MAAA,CAAO,QAAQ,CAAA;AAE5C,IAAA,IAAI,OAAO,QAAA,EAAU;AACnB,MAAA,YAAA,CAAa,GAAA,CAAI,UAAA,EAAY,MAAA,CAAO,QAAQ,CAAA;AAAA,IAC9C;AACA,IAAA,IAAI,OAAO,QAAA,EAAU;AACnB,MAAA,YAAA,CAAa,GAAA,CAAI,UAAA,EAAY,MAAA,CAAO,QAAQ,CAAA;AAAA,IAC9C;AACA,IAAA,IAAI,OAAO,OAAA,EAAS;AAClB,MAAA,YAAA,CAAa,GAAA,CAAI,SAAA,EAAW,MAAA,CAAO,OAAO,CAAA;AAAA,IAC5C;AACA,IAAA,IAAI,OAAO,OAAA,EAAS;AAClB,MAAA,YAAA,CAAa,GAAA,CAAI,SAAA,EAAW,MAAA,CAAO,OAAO,CAAA;AAAA,IAC5C;AACA,IAAA,IAAI,MAAA,CAAO,iBAAiB,MAAA,EAAW;AACrC,MAAA,YAAA,CAAa,GAAA,CAAI,cAAA,EAAgB,MAAA,CAAO,MAAA,CAAO,YAAY,CAAC,CAAA;AAAA,IAC9D;AAEA,IAAA,OAAO,KAAK,IAAA,CAAK,GAAA;AAAA,MACf,GAAG,SAAS,CAAA,8CAAA,EAAiD,SAAS,CAAA,CAAA,EAAI,YAAA,CAAa,UAAU,CAAA;AAAA,KACnG;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EA4BA,MAAM,WAAA,CACJ,SAAA,EACA,SAAA,EACA,MAAA,EAC4B;AAC5B,IAAA,MAAM,YAAA,GAAe,IAAI,eAAA,EAAgB;AACzC,IAAA,YAAA,CAAa,GAAA,CAAI,YAAA,EAAc,MAAA,CAAO,UAAU,CAAA;AAChD,IAAA,YAAA,CAAa,GAAA,CAAI,UAAA,EAAY,MAAA,CAAO,QAAQ,CAAA;AAC5C,IAAA,YAAA,CAAa,GAAA,CAAI,MAAA,EAAQ,MAAA,CAAO,IAAI,CAAA;AAEpC,IAAA,IAAI,OAAO,QAAA,EAAU;AACnB,MAAA,YAAA,CAAa,GAAA,CAAI,UAAA,EAAY,MAAA,CAAO,QAAQ,CAAA;AAAA,IAC9C;AACA,IAAA,IAAI,OAAO,QAAA,EAAU;AACnB,MAAA,YAAA,CAAa,GAAA,CAAI,UAAA,EAAY,MAAA,CAAO,QAAQ,CAAA;AAAA,IAC9C;AACA,IAAA,IAAI,OAAO,OAAA,EAAS;AAClB,MAAA,YAAA,CAAa,GAAA,CAAI,SAAA,EAAW,MAAA,CAAO,OAAO,CAAA;AAAA,IAC5C;AACA,IAAA,IAAI,OAAO,OAAA,EAAS;AAClB,MAAA,YAAA,CAAa,GAAA,CAAI,SAAA,EAAW,MAAA,CAAO,OAAO,CAAA;AAAA,IAC5C;AAEA,IAAA,OAAO,KAAK,IAAA,CAAK,GAAA;AAAA,MACf,GAAG,SAAS,CAAA,kDAAA,EAAqD,SAAS,CAAA,CAAA,EAAI,YAAA,CAAa,UAAU,CAAA;AAAA,KACvG;AAAA,EACF;AACF;;;AC1PO,IAAM,kBAAN,MAAsB;AAAA,EAC3B,YAA6B,IAAA,EAAkB;AAAlB,IAAA,IAAA,CAAA,IAAA,GAAA,IAAA;AAAA,EAAmB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAchD,MAAM,GAAA,CAAI,SAAA,EAAmB,cAAA,EAA+C;AAC1E,IAAA,OAAO,KAAK,IAAA,CAAK,GAAA,CAAkB,GAAG,SAAS,CAAA,eAAA,EAAkB,cAAc,CAAA,CAAE,CAAA;AAAA,EACnF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAiBA,MAAM,SAAS,SAAA,EAA0D;AACvE,IAAA,OAAO,IAAA,CAAK,IAAA,CAAK,GAAA,CAAkC,CAAA,EAAG,SAAS,CAAA,mBAAA,CAAqB,CAAA;AAAA,EACtF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAoBA,MAAM,MAAA,CAAO,SAAA,EAAmB,MAAA,EAA0D;AACxF,IAAA,OAAO,KAAK,IAAA,CAAK,IAAA,CAAmB,CAAA,EAAG,SAAS,kBAAkB,MAAM,CAAA;AAAA,EAC1E;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAiBA,MAAM,MAAA,CACJ,SAAA,EACA,cAAA,EACA,OAAA,EACuB;AACvB,IAAA,OAAO,IAAA,CAAK,KAAK,GAAA,CAAkB,CAAA,EAAG,SAAS,CAAA,eAAA,EAAkB,cAAc,IAAI,OAAO,CAAA;AAAA,EAC5F;AACF;;;AC5CO,IAAM,gBAAN,MAAoB;AAAA;AAAA;AAAA;AAAA,EAIhB,QAAA;AAAA;AAAA;AAAA;AAAA,EAKA,SAAA;AAAA;AAAA;AAAA;AAAA,EAKA,KAAA;AAAA;AAAA;AAAA;AAAA,EAKA,UAAA;AAAA;AAAA;AAAA;AAAA,EAKA,UAAA;AAAA;AAAA;AAAA;AAAA,EAKA,SAAA;AAAA;AAAA;AAAA;AAAA,EAKA,iBAAA;AAAA;AAAA;AAAA;AAAA,EAKA,mBAAA;AAAA;AAAA;AAAA;AAAA,EAKA,KAAA;AAAA;AAAA;AAAA;AAAA,EAKA,aAAA;AAAA;AAAA;AAAA;AAAA,EAKA,OAAA;AAAA;AAAA;AAAA;AAAA,EAKQ,WAAA;AAAA;AAAA;AAAA;AAAA,EAKA,UAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOjB,YAAY,MAAA,EAAuB;AACjC,IAAA,IAAI,CAAC,OAAO,QAAA,EAAU;AACpB,MAAA,MAAM,IAAI,MAAM,sBAAsB,CAAA;AAAA,IACxC;AACA,IAAA,IAAI,CAAC,OAAO,YAAA,EAAc;AACxB,MAAA,MAAM,IAAI,MAAM,0BAA0B,CAAA;AAAA,IAC5C;AAGA,IAAA,IAAA,CAAK,cAAc,IAAI,YAAA,CAAa,MAAA,CAAO,QAAA,EAAU,OAAO,YAAY,CAAA;AAGxE,IAAA,IAAA,CAAK,UAAA,GAAa,IAAI,UAAA,CAAW,IAAA,CAAK,WAAA,EAAa;AAAA,MACjD,OAAA,EAAS,OAAO,OAAA,IAAW,gBAAA;AAAA,MAC3B,SAAS,MAAA,CAAO,OAAA;AAAA,MAChB,SAAS,MAAA,CAAO,OAAA;AAAA,MAChB,OAAO,MAAA,CAAO;AAAA,KACf,CAAA;AAGD,IAAA,IAAA,CAAK,QAAA,GAAW,IAAI,WAAA,CAAY,IAAA,CAAK,UAAU,CAAA;AAC/C,IAAA,IAAA,CAAK,SAAA,GAAY,IAAI,YAAA,CAAa,IAAA,CAAK,UAAU,CAAA;AACjD,IAAA,IAAA,CAAK,KAAA,GAAQ,IAAI,QAAA,CAAS,IAAA,CAAK,UAAU,CAAA;AACzC,IAAA,IAAA,CAAK,UAAA,GAAa,IAAI,aAAA,CAAc,IAAA,CAAK,UAAU,CAAA;AACnD,IAAA,IAAA,CAAK,UAAA,GAAa,IAAI,aAAA,CAAc,IAAA,CAAK,UAAU,CAAA;AACnD,IAAA,IAAA,CAAK,SAAA,GAAY,IAAI,YAAA,CAAa,IAAA,CAAK,UAAU,CAAA;AACjD,IAAA,IAAA,CAAK,iBAAA,GAAoB,IAAI,oBAAA,CAAqB,IAAA,CAAK,UAAU,CAAA;AACjE,IAAA,IAAA,CAAK,mBAAA,GAAsB,IAAI,sBAAA,CAAuB,IAAA,CAAK,UAAU,CAAA;AACrE,IAAA,IAAA,CAAK,KAAA,GAAQ,IAAI,QAAA,CAAS,IAAA,CAAK,UAAU,CAAA;AACzC,IAAA,IAAA,CAAK,aAAA,GAAgB,IAAI,eAAA,CAAgB,IAAA,CAAK,UAAU,CAAA;AACxD,IAAA,IAAA,CAAK,OAAA,GAAU,IAAI,UAAA,CAAW,IAAA,CAAK,UAAU,CAAA;AAAA,EAC/C;AAAA;AAAA;AAAA;AAAA,EAKA,IAAI,OAAA,GAAkB;AACpB,IAAA,OAAO,gBAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,MAAM,YAAA,GAA8B;AAClC,IAAA,MAAM,IAAA,CAAK,YAAY,YAAA,EAAa;AAAA,EACtC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,UAAA,GAAmB;AACjB,IAAA,IAAA,CAAK,YAAY,UAAA,EAAW;AAAA,EAC9B;AACF;AAmBO,SAAS,aAAa,MAAA,EAAsC;AACjE,EAAA,OAAO,IAAI,cAAc,MAAM,CAAA;AACjC","file":"index.cjs","sourcesContent":["/**\n * Custom error classes for Taboola Backstage SDK\n */\n\n/**\n * Base error class for all Taboola SDK errors\n */\nexport class TaboolaError extends Error {\n /** HTTP status code if applicable */\n readonly statusCode: number | undefined;\n /** Original error response body */\n readonly response: unknown;\n /** Request URL that caused the error */\n readonly url: string | undefined;\n\n constructor(\n message: string,\n options?: {\n statusCode?: number;\n response?: unknown;\n url?: string;\n cause?: Error;\n }\n ) {\n super(message, { cause: options?.cause });\n this.name = 'TaboolaError';\n this.statusCode = options?.statusCode;\n this.response = options?.response;\n this.url = options?.url;\n }\n}\n\n/**\n * Authentication error (401)\n * Thrown when OAuth token is invalid or expired\n */\nexport class TaboolaAuthError extends TaboolaError {\n constructor(\n message = 'Authentication failed',\n options?: {\n response?: unknown;\n url?: string;\n cause?: Error;\n }\n ) {\n super(message, { statusCode: 401, ...options });\n this.name = 'TaboolaAuthError';\n }\n}\n\n/**\n * Validation error (400)\n * Thrown when request parameters are invalid\n */\nexport class TaboolaValidationError extends TaboolaError {\n /** Specific field errors if available */\n readonly fieldErrors: Record<string, string[]> | undefined;\n\n constructor(\n message = 'Validation failed',\n options?: {\n response?: unknown;\n url?: string;\n cause?: Error;\n fieldErrors?: Record<string, string[]>;\n }\n ) {\n super(message, { statusCode: 400, ...options });\n this.name = 'TaboolaValidationError';\n this.fieldErrors = options?.fieldErrors;\n }\n}\n\n/**\n * Not found error (404)\n * Thrown when requested resource doesn't exist\n */\nexport class TaboolaNotFoundError extends TaboolaError {\n /** The resource type that wasn't found */\n readonly resourceType: string | undefined;\n /** The resource ID that wasn't found */\n readonly resourceId: string | undefined;\n\n constructor(\n message = 'Resource not found',\n options?: {\n response?: unknown;\n url?: string;\n cause?: Error;\n resourceType?: string;\n resourceId?: string;\n }\n ) {\n super(message, { statusCode: 404, ...options });\n this.name = 'TaboolaNotFoundError';\n this.resourceType = options?.resourceType;\n this.resourceId = options?.resourceId;\n }\n}\n\n/**\n * Rate limit error (429)\n * Thrown when API rate limits are exceeded\n */\nexport class TaboolaRateLimitError extends TaboolaError {\n /** Seconds until rate limit resets */\n readonly retryAfter: number | undefined;\n\n constructor(\n message = 'Rate limit exceeded',\n options?: {\n response?: unknown;\n url?: string;\n cause?: Error;\n retryAfter?: number;\n }\n ) {\n super(message, { statusCode: 429, ...options });\n this.name = 'TaboolaRateLimitError';\n this.retryAfter = options?.retryAfter;\n }\n}\n\n/**\n * Forbidden error (403)\n * Thrown when access to resource is denied\n */\nexport class TaboolaForbiddenError extends TaboolaError {\n constructor(\n message = 'Access forbidden',\n options?: {\n response?: unknown;\n url?: string;\n cause?: Error;\n }\n ) {\n super(message, { statusCode: 403, ...options });\n this.name = 'TaboolaForbiddenError';\n }\n}\n\n/**\n * Server error (5xx)\n * Thrown when Taboola servers encounter an error\n */\nexport class TaboolaServerError extends TaboolaError {\n constructor(\n message = 'Server error',\n options?: {\n statusCode?: number;\n response?: unknown;\n url?: string;\n cause?: Error;\n }\n ) {\n super(message, { statusCode: options?.statusCode ?? 500, ...options });\n this.name = 'TaboolaServerError';\n }\n}\n\n/**\n * Parse API error response and throw appropriate error class\n */\nexport function parseApiError(statusCode: number, response: unknown, url: string): TaboolaError {\n const message = extractErrorMessage(response);\n\n switch (statusCode) {\n case 400: {\n const fieldErrors = extractFieldErrors(response);\n return new TaboolaValidationError(message, {\n response,\n url,\n ...(fieldErrors !== undefined ? { fieldErrors } : {}),\n });\n }\n case 401:\n return new TaboolaAuthError(message, { response, url });\n case 403:\n return new TaboolaForbiddenError(message, { response, url });\n case 404:\n return new TaboolaNotFoundError(message, { response, url });\n case 429: {\n const retryAfter = extractRetryAfter(response);\n return new TaboolaRateLimitError(message, {\n response,\n url,\n ...(retryAfter !== undefined ? { retryAfter } : {}),\n });\n }\n default:\n if (statusCode >= 500) {\n return new TaboolaServerError(message, { statusCode, response, url });\n }\n return new TaboolaError(message, { statusCode, response, url });\n }\n}\n\n/**\n * Extract error message from API response\n */\nfunction extractErrorMessage(response: unknown): string {\n if (response && typeof response === 'object') {\n const resp = response as Record<string, unknown>;\n if (typeof resp.message === 'string') {\n return resp.message;\n }\n if (typeof resp.error === 'string') {\n return resp.error;\n }\n if (typeof resp.error_description === 'string') {\n return resp.error_description;\n }\n }\n return 'Unknown error';\n}\n\n/**\n * Extract field-level validation errors from API response\n */\nfunction extractFieldErrors(response: unknown): Record<string, string[]> | undefined {\n if (response && typeof response === 'object') {\n const resp = response as Record<string, unknown>;\n if (resp.errors && typeof resp.errors === 'object') {\n return resp.errors as Record<string, string[]>;\n }\n }\n return undefined;\n}\n\n/**\n * Extract retry-after value from rate limit response\n */\nfunction extractRetryAfter(response: unknown): number | undefined {\n if (response && typeof response === 'object') {\n const resp = response as Record<string, unknown>;\n if (typeof resp.retry_after === 'number') {\n return resp.retry_after;\n }\n }\n return undefined;\n}\n","/**\n * OAuth2 authentication module for Taboola Backstage API\n */\n\nimport type { TokenResponse, StoredToken } from '../types/auth.js';\nimport { TaboolaAuthError } from '../errors/index.js';\n\n/** OAuth token endpoint */\nconst TOKEN_URL = 'https://backstage.taboola.com/backstage/oauth/token';\n\n/** Buffer time before token expiry to trigger refresh (5 minutes) */\nconst TOKEN_EXPIRY_BUFFER_MS = 5 * 60 * 1000;\n\n/**\n * OAuth2 authentication manager\n * Handles token acquisition and automatic refresh\n */\nexport class OAuthManager {\n private readonly clientId: string;\n private readonly clientSecret: string;\n private storedToken: StoredToken | null = null;\n private tokenPromise: Promise<string> | null = null;\n\n constructor(clientId: string, clientSecret: string) {\n this.clientId = clientId;\n this.clientSecret = clientSecret;\n }\n\n /**\n * Get a valid access token, refreshing if necessary\n */\n async getAccessToken(): Promise<string> {\n // If we have a valid cached token, return it\n if (this.storedToken && !this.isTokenExpired(this.storedToken)) {\n return this.storedToken.accessToken;\n }\n\n // If a token request is already in progress, wait for it\n if (this.tokenPromise) {\n return this.tokenPromise;\n }\n\n // Fetch a new token\n this.tokenPromise = this.fetchToken();\n\n try {\n const token = await this.tokenPromise;\n return token;\n } finally {\n this.tokenPromise = null;\n }\n }\n\n /**\n * Force refresh the token (e.g., after a 401 response)\n */\n async refreshToken(): Promise<string> {\n this.storedToken = null;\n return this.getAccessToken();\n }\n\n /**\n * Clear the stored token\n */\n clearToken(): void {\n this.storedToken = null;\n this.tokenPromise = null;\n }\n\n /**\n * Check if a token is expired or about to expire\n */\n private isTokenExpired(token: StoredToken): boolean {\n return Date.now() >= token.expiresAt - TOKEN_EXPIRY_BUFFER_MS;\n }\n\n /**\n * Fetch a new token from the OAuth endpoint\n */\n private async fetchToken(): Promise<string> {\n const body = new URLSearchParams({\n client_id: this.clientId,\n client_secret: this.clientSecret,\n grant_type: 'client_credentials',\n });\n\n let response: Response;\n try {\n response = await fetch(TOKEN_URL, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/x-www-form-urlencoded',\n },\n body: body.toString(),\n });\n } catch (error) {\n const cause = error instanceof Error ? error : undefined;\n throw new TaboolaAuthError('Failed to connect to authentication server', {\n ...(cause ? { cause } : {}),\n });\n }\n\n if (!response.ok) {\n let errorBody: unknown;\n try {\n errorBody = await response.json();\n } catch {\n errorBody = await response.text();\n }\n\n throw new TaboolaAuthError(\n `Authentication failed: ${String(response.status)} ${response.statusText}`,\n { response: errorBody }\n );\n }\n\n let tokenResponse: TokenResponse;\n try {\n tokenResponse = (await response.json()) as TokenResponse;\n } catch {\n throw new TaboolaAuthError('Invalid token response from server');\n }\n\n if (!tokenResponse.access_token) {\n throw new TaboolaAuthError('No access token in response', {\n response: tokenResponse,\n });\n }\n\n // Store the token with expiry time\n this.storedToken = {\n accessToken: tokenResponse.access_token,\n expiresAt: Date.now() + tokenResponse.expires_in * 1000,\n };\n\n return this.storedToken.accessToken;\n }\n}\n","/**\n * HTTP client wrapper using ky\n */\n\nimport ky, { type KyInstance, type Options as KyOptions, HTTPError } from 'ky';\nimport type { OAuthManager } from '../auth/oauth.js';\nimport { parseApiError, TaboolaAuthError } from '../errors/index.js';\n\n/** Default API base URL */\nexport const DEFAULT_BASE_URL = 'https://backstage.taboola.com/backstage/api/1.0';\n\n/** Default request timeout (30 seconds) */\nconst DEFAULT_TIMEOUT = 30000;\n\n/** Default retry count */\nconst DEFAULT_RETRIES = 3;\n\nexport interface HttpClientOptions {\n baseUrl?: string | undefined;\n timeout?: number | undefined;\n retries?: number | undefined;\n debug?: boolean | undefined;\n}\n\n/**\n * HTTP client for Taboola API requests\n */\nexport class HttpClient {\n private readonly client: KyInstance;\n private readonly authManager: OAuthManager;\n private readonly debug: boolean;\n\n constructor(authManager: OAuthManager, options: HttpClientOptions = {}) {\n this.authManager = authManager;\n this.debug = options.debug ?? false;\n\n this.client = ky.create({\n prefixUrl: options.baseUrl ?? DEFAULT_BASE_URL,\n timeout: options.timeout ?? DEFAULT_TIMEOUT,\n retry: {\n limit: options.retries ?? DEFAULT_RETRIES,\n methods: ['get', 'post', 'put', 'patch', 'delete'],\n statusCodes: [408, 429, 500, 502, 503, 504],\n backoffLimit: 10000,\n },\n hooks: {\n beforeRequest: [\n async (request: Request) => {\n const token = await this.authManager.getAccessToken();\n request.headers.set('Authorization', `Bearer ${token}`);\n request.headers.set('Accept', 'application/json');\n },\n ],\n afterResponse: [\n async (request, _options, response) => {\n if (this.debug) {\n console.log(\n `[Taboola SDK] ${request.method} ${String(response.status)} ${request.url}`\n );\n }\n\n // Handle 401 by refreshing token and retrying once\n if (response.status === 401) {\n try {\n const newToken = await this.authManager.refreshToken();\n request.headers.set('Authorization', `Bearer ${newToken}`);\n return await ky(request);\n } catch {\n throw new TaboolaAuthError('Token refresh failed');\n }\n }\n\n return response;\n },\n ],\n },\n });\n }\n\n /**\n * Make a GET request\n */\n async get<T>(path: string, options?: KyOptions): Promise<T> {\n return this.request<T>('get', path, options);\n }\n\n /**\n * Make a POST request\n */\n async post<T>(path: string, body?: unknown, options?: KyOptions): Promise<T> {\n return this.request<T>('post', path, { ...options, json: body });\n }\n\n /**\n * Make a PUT request\n */\n async put<T>(path: string, body?: unknown, options?: KyOptions): Promise<T> {\n return this.request<T>('put', path, { ...options, json: body });\n }\n\n /**\n * Make a PATCH request\n */\n async patch<T>(path: string, body?: unknown, options?: KyOptions): Promise<T> {\n return this.request<T>('patch', path, { ...options, json: body });\n }\n\n /**\n * Make a DELETE request\n */\n async delete<T>(path: string, options?: KyOptions): Promise<T> {\n return this.request<T>('delete', path, options);\n }\n\n /**\n * Internal request handler\n */\n private async request<T>(\n method: 'get' | 'post' | 'put' | 'patch' | 'delete',\n path: string,\n options?: KyOptions\n ): Promise<T> {\n try {\n const response = await this.client[method](path, options);\n\n // Handle empty responses (204 No Content, etc.)\n const contentType = response.headers.get('content-type');\n if (!contentType?.includes('application/json')) {\n return undefined as T;\n }\n\n return (await response.json()) as T;\n } catch (error: unknown) {\n if (error instanceof HTTPError) {\n const url = error.request.url;\n let responseBody: unknown;\n\n try {\n responseBody = await error.response.json();\n } catch {\n try {\n responseBody = await error.response.text();\n } catch {\n responseBody = null;\n }\n }\n\n throw parseApiError(error.response.status, responseBody, url);\n }\n\n throw error;\n }\n }\n}\n","/**\n * Account API for Taboola Backstage\n */\n\nimport type { HttpClient } from '../utils/http.js';\nimport type {\n Account,\n AdvertiserAccount,\n AllowedAccountsResponse,\n NetworkAdvertisersResponse,\n} from '../types/index.js';\n\n/**\n * Account management API\n */\nexport class AccountsAPI {\n constructor(private readonly http: HttpClient) {}\n\n /**\n * Get current account details\n *\n * Returns details of your primary account including the account_id\n * needed for most API operations.\n *\n * @example\n * ```typescript\n * const account = await client.accounts.getCurrent();\n * console.log(account.account_id); // 'my-account-id'\n * ```\n */\n async getCurrent(): Promise<Account> {\n return this.http.get<Account>('users/current/account');\n }\n\n /**\n * Get all allowed accounts for the current user\n *\n * Returns all accounts the current API credentials have access to.\n *\n * @example\n * ```typescript\n * const { results } = await client.accounts.getAllowed();\n * for (const account of results) {\n * console.log(account.name, account.account_id);\n * }\n * ```\n */\n async getAllowed(): Promise<AllowedAccountsResponse> {\n return this.http.get<AllowedAccountsResponse>('users/current/allowed-accounts');\n }\n\n /**\n * Get advertiser accounts in a network\n *\n * For network accounts, returns all advertiser accounts within the network.\n *\n * @param accountId - Network account ID\n *\n * @example\n * ```typescript\n * const { results } = await client.accounts.getNetworkAdvertisers('my-network');\n * for (const advertiser of results) {\n * console.log(advertiser.name);\n * }\n * ```\n */\n async getNetworkAdvertisers(accountId: string): Promise<NetworkAdvertisersResponse> {\n return this.http.get<NetworkAdvertisersResponse>(`${accountId}/advertisers`);\n }\n\n /**\n * Get a specific advertiser account\n *\n * @param accountId - Account ID to retrieve\n *\n * @example\n * ```typescript\n * const account = await client.accounts.get('my-account-id');\n * console.log(account.currency);\n * ```\n */\n async get(accountId: string): Promise<AdvertiserAccount> {\n // Use the allowed accounts endpoint and filter\n const allowed = await this.getAllowed();\n const account = allowed.results.find((a) => a.account_id === accountId);\n if (!account) {\n throw new Error(`Account not found: ${accountId}`);\n }\n return account;\n }\n}\n","/**\n * Campaigns API for Taboola Backstage\n */\n\nimport type { HttpClient } from '../utils/http.js';\nimport type {\n BulkCampaignUpdateRequest,\n Campaign,\n CampaignBaseListResponse,\n CampaignListResponse,\n CampaignPatchRequest,\n CampaignReachEstimatorRequest,\n CampaignReachEstimatorResponse,\n CampaignTargetingCollection,\n CreateCampaignRequest,\n DuplicateCampaignRequest,\n UpdateCampaignRequest,\n} from '../types/index.js';\n\n/**\n * Options for listing campaigns\n */\nexport interface ListCampaignsOptions {\n /** Page number (1-indexed) */\n page?: number;\n /** Number of results per page */\n pageSize?: number;\n /** Filter by status */\n status?: string;\n /** Filter by approval state */\n approvalState?: string;\n}\n\n/**\n * Campaign management API\n */\nexport class CampaignsAPI {\n constructor(private readonly http: HttpClient) {}\n\n /**\n * List all campaigns for an account\n */\n async list(accountId: string, options: ListCampaignsOptions = {}): Promise<CampaignListResponse> {\n const searchParams = new URLSearchParams();\n\n if (options.page !== undefined) {\n searchParams.set('page', options.page.toString());\n }\n if (options.pageSize !== undefined) {\n searchParams.set('page_size', options.pageSize.toString());\n }\n if (options.status !== undefined) {\n searchParams.set('status', options.status);\n }\n if (options.approvalState !== undefined) {\n searchParams.set('approval_state', options.approvalState);\n }\n\n const query = searchParams.toString();\n const path = `${accountId}/campaigns/${query ? `?${query}` : ''}`;\n\n return this.http.get<CampaignListResponse>(path);\n }\n\n /**\n * List all campaigns with base (partial) fields only\n */\n async listBase(accountId: string): Promise<CampaignBaseListResponse> {\n return this.http.get<CampaignBaseListResponse>(`${accountId}/campaigns/base`);\n }\n\n /**\n * Get a single campaign by ID\n */\n async get(accountId: string, campaignId: string): Promise<Campaign> {\n return this.http.get<Campaign>(`${accountId}/campaigns/${campaignId}`);\n }\n\n /**\n * Create a new campaign\n */\n async create(accountId: string, campaign: CreateCampaignRequest): Promise<Campaign> {\n return this.http.post<Campaign>(`${accountId}/campaigns/`, campaign);\n }\n\n /**\n * Update an existing campaign\n */\n async update(\n accountId: string,\n campaignId: string,\n updates: UpdateCampaignRequest\n ): Promise<Campaign> {\n return this.http.post<Campaign>(`${accountId}/campaigns/${campaignId}`, updates);\n }\n\n /**\n * Delete a campaign\n */\n async delete(accountId: string, campaignId: string): Promise<void> {\n await this.http.delete(`${accountId}/campaigns/${campaignId}`);\n }\n\n /**\n * Duplicate a campaign\n *\n * @param accountId - Account ID\n * @param campaignId - Campaign ID to duplicate\n * @param request - Duplication request with optional name and settings\n * @param destinationAccount - Optional destination account ID for cross-account duplication\n */\n async duplicate(\n accountId: string,\n campaignId: string,\n request: DuplicateCampaignRequest,\n destinationAccount?: string\n ): Promise<Campaign> {\n const searchParams = new URLSearchParams();\n if (destinationAccount) {\n searchParams.set('destination_account', destinationAccount);\n }\n const query = searchParams.toString();\n const path = `${accountId}/campaigns/${campaignId}/duplicate${query ? `?${query}` : ''}`;\n return this.http.post<Campaign>(path, request);\n }\n\n /**\n * Pause a campaign\n */\n async pause(accountId: string, campaignId: string): Promise<Campaign> {\n return this.update(accountId, campaignId, { is_active: false });\n }\n\n /**\n * Unpause (resume) a campaign\n */\n async unpause(accountId: string, campaignId: string): Promise<Campaign> {\n return this.update(accountId, campaignId, { is_active: true });\n }\n\n /**\n * Bulk update multiple campaigns\n */\n async bulkUpdate(\n accountId: string,\n updates: BulkCampaignUpdateRequest\n ): Promise<CampaignListResponse> {\n return this.http.put<CampaignListResponse>(`${accountId}/campaigns/bulk`, updates);\n }\n\n /**\n * Patch a campaign\n *\n * @param accountId - Account ID\n * @param campaignId - Campaign ID\n * @param patch - Patch operation\n */\n async patch(\n accountId: string,\n campaignId: string,\n patch: CampaignPatchRequest\n ): Promise<Campaign> {\n return this.http.patch<Campaign>(`${accountId}/campaigns/${campaignId}`, patch);\n }\n\n /**\n * Get all campaigns across a network\n *\n * @param networkAccountId - Network account ID\n */\n async listNetwork(networkAccountId: string): Promise<CampaignBaseListResponse> {\n return this.http.get<CampaignBaseListResponse>(`${networkAccountId}/campaigns/base`);\n }\n\n /**\n * Estimate campaign reach\n */\n async estimateReach(\n accountId: string,\n params: CampaignReachEstimatorRequest\n ): Promise<CampaignReachEstimatorResponse> {\n return this.http.post<CampaignReachEstimatorResponse>(\n `${accountId}/campaigns/reach-estimate`,\n params\n );\n }\n\n /**\n * Get publisher targeting whitelist for a campaign\n */\n async getTargetingWhitelist(\n accountId: string,\n campaignId: string\n ): Promise<CampaignTargetingCollection> {\n return this.http.get<CampaignTargetingCollection>(\n `${accountId}/campaigns/${campaignId}/targeting/publisher_targeting/whitelist`\n );\n }\n}\n","/**\n * Campaign Items (Ads) API for Taboola Backstage\n */\n\nimport type { HttpClient } from '../utils/http.js';\nimport type {\n BulkCreateItemData,\n BulkCreateItemsResponse,\n BulkDeleteItemsRequest,\n BulkUpdateItemsRequest,\n CampaignItem,\n CampaignItemListResponse,\n CreateItemRequest,\n RSSChildItem,\n RSSChildrenListResponse,\n UpdateItemRequest,\n} from '../types/index.js';\n\n/**\n * Options for listing campaign items\n */\nexport interface ListItemsOptions {\n /** Page number (1-indexed) */\n page?: number;\n /** Number of results per page */\n pageSize?: number;\n /** Filter by status */\n status?: string;\n /** Filter by approval state */\n approvalState?: string;\n}\n\n/**\n * Campaign Items (Ads) management API\n */\nexport class ItemsAPI {\n constructor(private readonly http: HttpClient) {}\n\n /**\n * List all items for a campaign\n *\n * @param accountId - Account ID\n * @param campaignId - Campaign ID\n * @param options - Pagination and filter options\n *\n * @example\n * ```typescript\n * const { results } = await client.items.list('my-account', '12345');\n * for (const item of results) {\n * console.log(item.title, item.status);\n * }\n * ```\n */\n async list(\n accountId: string,\n campaignId: string,\n options: ListItemsOptions = {}\n ): Promise<CampaignItemListResponse> {\n const searchParams = new URLSearchParams();\n\n if (options.page !== undefined) {\n searchParams.set('page', options.page.toString());\n }\n if (options.pageSize !== undefined) {\n searchParams.set('page_size', options.pageSize.toString());\n }\n if (options.status !== undefined) {\n searchParams.set('status', options.status);\n }\n if (options.approvalState !== undefined) {\n searchParams.set('approval_state', options.approvalState);\n }\n\n const query = searchParams.toString();\n const path = `${accountId}/campaigns/${campaignId}/items/${query ? `?${query}` : ''}`;\n\n return this.http.get<CampaignItemListResponse>(path);\n }\n\n /**\n * Get a single item by ID\n *\n * @param accountId - Account ID\n * @param campaignId - Campaign ID\n * @param itemId - Item ID\n *\n * @example\n * ```typescript\n * const item = await client.items.get('my-account', '12345', '67890');\n * console.log(item.title, item.url);\n * ```\n */\n async get(accountId: string, campaignId: string, itemId: string): Promise<CampaignItem> {\n return this.http.get<CampaignItem>(`${accountId}/campaigns/${campaignId}/items/${itemId}`);\n }\n\n /**\n * Create a new item (static ad) in a campaign\n *\n * Only the `url` field is accepted. The item is created with a status of CRAWLING\n * (read-only). Poll until the status changes to RUNNING or NEED_TO_EDIT, then\n * use `update()` to modify fields.\n *\n * For creating items with more fields upfront, or for motion ads,\n * use `bulkCreateAcrossCampaigns()` instead.\n *\n * @param accountId - Account ID\n * @param campaignId - Campaign ID\n * @param item - Item data (only `url` is accepted)\n *\n * @example\n * ```typescript\n * const item = await client.items.create('my-account', '12345', {\n * url: 'https://example.com/landing-page',\n * });\n * // Item starts in CRAWLING state - poll until status changes\n * console.log('Created item:', item.id, item.status); // CRAWLING\n * ```\n */\n async create(\n accountId: string,\n campaignId: string,\n item: CreateItemRequest\n ): Promise<CampaignItem> {\n return this.http.post<CampaignItem>(`${accountId}/campaigns/${campaignId}/items`, item);\n }\n\n /**\n * Update an existing item (static or motion ad)\n *\n * Submit only the fields you want to update. Fields that are omitted or null\n * will remain unchanged. The endpoint automatically detects the item type.\n *\n * Note: While status is CRAWLING, the Item is in a read-only state - no fields can be modified.\n *\n * @param accountId - Account ID\n * @param campaignId - Campaign ID\n * @param itemId - Item ID\n * @param updates - Fields to update (partial)\n *\n * @example Update a static item\n * ```typescript\n * const item = await client.items.update('my-account', '12345', '67890', {\n * title: 'Updated Title!',\n * is_active: true,\n * });\n * ```\n *\n * @example Update a motion ad\n * ```typescript\n * const item = await client.items.update('my-account', '12345', '67890', {\n * title: 'Updated Motion Ad Title',\n * description: 'New description',\n * performance_video_data: {\n * video_url: 'https://example.com/video.mp4',\n * fallback_url: 'https://example.com/fallback.jpg',\n * },\n * });\n * ```\n *\n * @example Pause an item (alternatively, use pause() method)\n * ```typescript\n * const item = await client.items.update('my-account', '12345', '67890', {\n * is_active: false,\n * });\n * ```\n */\n async update(\n accountId: string,\n campaignId: string,\n itemId: string,\n updates: UpdateItemRequest\n ): Promise<CampaignItem> {\n return this.http.post<CampaignItem>(\n `${accountId}/campaigns/${campaignId}/items/${itemId}`,\n updates\n );\n }\n\n /**\n * Delete an item from a campaign\n *\n * @param accountId - Account ID\n * @param campaignId - Campaign ID\n * @param itemId - Item ID\n *\n * @example\n * ```typescript\n * await client.items.delete('my-account', '12345', '67890');\n * ```\n */\n async delete(accountId: string, campaignId: string, itemId: string): Promise<void> {\n await this.http.delete(`${accountId}/campaigns/${campaignId}/items/${itemId}`);\n }\n\n /**\n * Pause an item\n *\n * @param accountId - Account ID\n * @param campaignId - Campaign ID\n * @param itemId - Item ID\n *\n * @example\n * ```typescript\n * await client.items.pause('my-account', '12345', '67890');\n * ```\n */\n async pause(accountId: string, campaignId: string, itemId: string): Promise<CampaignItem> {\n return this.update(accountId, campaignId, itemId, { is_active: false });\n }\n\n /**\n * Unpause (resume) an item\n *\n * @param accountId - Account ID\n * @param campaignId - Campaign ID\n * @param itemId - Item ID\n *\n * @example\n * ```typescript\n * await client.items.unpause('my-account', '12345', '67890');\n * ```\n */\n async unpause(accountId: string, campaignId: string, itemId: string): Promise<CampaignItem> {\n return this.update(accountId, campaignId, itemId, { is_active: true });\n }\n\n /**\n * Create multiple items at once within a single campaign (mass create)\n *\n * Supports both static ads and motion ads via the bulk item data format.\n *\n * @param accountId - Account ID\n * @param campaignId - Campaign ID\n * @param items - Array of items to create\n *\n * @example\n * ```typescript\n * const response = await client.items.bulkCreate('my-account', '12345', [\n * { url: 'https://example.com/page1', title: 'Title 1', thumbnail_url: '...' },\n * { url: 'https://example.com/page2', title: 'Title 2', thumbnail_url: '...' },\n * ]);\n * console.log('Created', response.results.length, 'items');\n * ```\n */\n async bulkCreate(\n accountId: string,\n campaignId: string,\n items: BulkCreateItemData[]\n ): Promise<BulkCreateItemsResponse> {\n return this.http.post<BulkCreateItemsResponse>(\n `${accountId}/campaigns/${campaignId}/items/mass`,\n { collection: items }\n );\n }\n\n /**\n * Bulk create items across multiple campaigns\n *\n * Unified endpoint that supports both static ads and motion ads.\n *\n * @param accountId - Account ID\n * @param items - Array of items with campaign IDs\n *\n * @example Static ads\n * ```typescript\n * await client.items.bulkCreateAcrossCampaigns('my-account', [\n * { campaign_id: '12345', url: 'https://example.com/1', title: 'Title 1' },\n * { campaign_id: '12346', url: 'https://example.com/2', title: 'Title 2' },\n * ]);\n * ```\n *\n * @example Motion ads\n * ```typescript\n * await client.items.bulkCreateAcrossCampaigns('my-account', [\n * {\n * campaign_id: '12345',\n * url: 'https://example.com/1',\n * title: 'Motion Ad',\n * performance_video_data: {\n * video_url: 'https://example.com/video.mp4',\n * fallback_url: 'https://example.com/fallback.jpg',\n * },\n * },\n * ]);\n * ```\n */\n async bulkCreateAcrossCampaigns(\n accountId: string,\n items: (BulkCreateItemData & { campaign_id: string })[]\n ): Promise<BulkCreateItemsResponse> {\n return this.http.put<BulkCreateItemsResponse>(`${accountId}/items/bulk`, { items });\n }\n\n /**\n * Bulk update items across multiple campaigns\n *\n * @param accountId - Account ID\n * @param request - Bulk update request\n *\n * @example\n * ```typescript\n * await client.items.bulkUpdate('my-account', {\n * items: [\n * { id: '67890', campaign_id: '12345', update: { is_active: false } },\n * { id: '67891', campaign_id: '12346', update: { is_active: false } },\n * ],\n * });\n * ```\n */\n async bulkUpdate(\n accountId: string,\n request: BulkUpdateItemsRequest\n ): Promise<CampaignItemListResponse> {\n return this.http.post<CampaignItemListResponse>(`${accountId}/items/bulk`, request);\n }\n\n /**\n * Bulk delete items across multiple campaigns\n *\n * @param accountId - Account ID\n * @param request - Bulk delete request\n *\n * @example\n * ```typescript\n * await client.items.bulkDelete('my-account', {\n * items: [\n * { id: '67890', campaign_id: '12345' },\n * { id: '67891', campaign_id: '12346' },\n * ],\n * });\n * ```\n */\n async bulkDelete(accountId: string, request: BulkDeleteItemsRequest): Promise<void> {\n await this.http.delete(`${accountId}/items/bulk`, {\n json: request,\n });\n }\n\n /**\n * Get children of an RSS item\n *\n * @param accountId - Account ID\n * @param campaignId - Campaign ID\n * @param itemId - Parent RSS item ID\n *\n * @example\n * ```typescript\n * const { results } = await client.items.listRSSChildren('my-account', '12345', '67890');\n * ```\n */\n async listRSSChildren(\n accountId: string,\n campaignId: string,\n itemId: string\n ): Promise<RSSChildrenListResponse> {\n return this.http.get<RSSChildrenListResponse>(\n `${accountId}/campaigns/${campaignId}/items/${itemId}/children/`\n );\n }\n\n /**\n * Get a specific RSS child item\n *\n * @param accountId - Account ID\n * @param campaignId - Campaign ID\n * @param itemId - Parent RSS item ID\n * @param childId - Child item ID\n */\n async getRSSChild(\n accountId: string,\n campaignId: string,\n itemId: string,\n childId: string\n ): Promise<RSSChildItem> {\n return this.http.get<RSSChildItem>(\n `${accountId}/campaigns/${campaignId}/items/${itemId}/children/${childId}`\n );\n }\n\n /**\n * Update an RSS child item\n *\n * @param accountId - Account ID\n * @param campaignId - Campaign ID\n * @param itemId - Parent RSS item ID\n * @param childId - Child item ID\n * @param updates - Fields to update\n */\n async updateRSSChild(\n accountId: string,\n campaignId: string,\n itemId: string,\n childId: string,\n updates: UpdateItemRequest\n ): Promise<RSSChildItem> {\n return this.http.post<RSSChildItem>(\n `${accountId}/campaigns/${campaignId}/items/${itemId}/children/${childId}`,\n updates\n );\n }\n}\n","/**\n * Dictionary API\n *\n * Reference data and enum values for the Taboola Backstage API.\n * Provides lists of countries, platforms, operating systems, browsers,\n * audience segments, and other reference data needed for targeting.\n */\n\nimport type { HttpClient } from '../utils/http.js';\nimport type {\n Country,\n Region,\n DMA,\n PostalCode,\n Platform,\n OperatingSystemInfo,\n OSVersion,\n Browser,\n DayOfWeek,\n MinimumCPC,\n MarketplaceAudience,\n LookalikeAudience,\n ContextualSegment,\n DictionaryListResponse,\n CampaignEnums,\n ItemEnums,\n PostalCodeSearchParams,\n ImageLibraryLanguage,\n ImageTaxonomy,\n} from '../types/dictionary.js';\n\n/**\n * Dictionary API for reference data\n */\nexport class DictionaryAPI {\n constructor(private readonly http: HttpClient) {}\n\n // ===== Geographic =====\n\n /**\n * Get list of all supported countries\n */\n async getCountries(): Promise<Country[]> {\n const response = await this.http.get<DictionaryListResponse<Country>>('resources/countries');\n return response.results;\n }\n\n /**\n * Get regions/states within a country\n */\n async getRegions(countryCode: string): Promise<Region[]> {\n const response = await this.http.get<DictionaryListResponse<Region>>(\n `resources/countries/${countryCode}/regions`\n );\n return response.results;\n }\n\n /**\n * Get DMAs (Designated Market Areas) for a country\n */\n async getDMAs(countryCode: string): Promise<DMA[]> {\n const response = await this.http.get<DictionaryListResponse<DMA>>(\n `resources/countries/${countryCode}/dma`\n );\n return response.results;\n }\n\n /**\n * Get postal codes for a country\n */\n async getPostalCodes(\n countryCode: string,\n params?: PostalCodeSearchParams\n ): Promise<PostalCode[]> {\n const searchParams = new URLSearchParams();\n if (params?.search) {\n searchParams.set('search', params.search);\n }\n if (params?.page !== undefined) {\n searchParams.set('page', String(params.page));\n }\n if (params?.page_size !== undefined) {\n searchParams.set('page_size', String(params.page_size));\n }\n\n const queryString = searchParams.toString();\n const path = `resources/countries/${countryCode}/postal`;\n const url = queryString ? `${path}?${queryString}` : path;\n\n const response = await this.http.get<DictionaryListResponse<PostalCode>>(url);\n return response.results;\n }\n\n // ===== Device Targeting =====\n\n /**\n * Get list of supported platforms\n */\n async getPlatforms(): Promise<Platform[]> {\n const response = await this.http.get<DictionaryListResponse<Platform>>('resources/platforms');\n return response.results;\n }\n\n /**\n * Get list of supported operating systems\n */\n async getOperatingSystems(): Promise<OperatingSystemInfo[]> {\n const response = await this.http.get<DictionaryListResponse<OperatingSystemInfo>>(\n 'resources/operating-systems'\n );\n return response.results;\n }\n\n /**\n * Get list of iOS versions for targeting\n */\n async getIOSVersions(): Promise<OSVersion[]> {\n const response = await this.http.get<DictionaryListResponse<OSVersion>>(\n 'resources/operating-systems/IOS/versions'\n );\n return response.results;\n }\n\n /**\n * Get list of Android versions for targeting\n */\n async getAndroidVersions(): Promise<OSVersion[]> {\n const response = await this.http.get<DictionaryListResponse<OSVersion>>(\n 'resources/operating-systems/ANDROID/versions'\n );\n return response.results;\n }\n\n /**\n * Get list of supported browsers\n */\n async getBrowsers(): Promise<Browser[]> {\n const response = await this.http.get<DictionaryListResponse<Browser>>('resources/browsers');\n return response.results;\n }\n\n // ===== Enums =====\n\n /**\n * Get campaign property enums (statuses, bid strategies, etc.)\n */\n async getCampaignEnums(): Promise<CampaignEnums> {\n return this.http.get<CampaignEnums>('resources/campaigns-properties/enums');\n }\n\n /**\n * Get item property enums (statuses, types, etc.)\n */\n async getItemEnums(): Promise<ItemEnums> {\n return this.http.get<ItemEnums>('resources/items-properties/enums');\n }\n\n /**\n * Get days of week for activity scheduling\n */\n async getDaysOfWeek(): Promise<DayOfWeek[]> {\n const response =\n await this.http.get<DictionaryListResponse<DayOfWeek>>('resources/days-of-week');\n return response.results;\n }\n\n // ===== Possible Values =====\n\n /**\n * Get possible values for campaign category\n */\n async getCampaignCategories(): Promise<string[]> {\n const response = await this.http.get<DictionaryListResponse<{ value: string }>>(\n 'resources/campaigns-properties/category/possible-values'\n );\n return response.results.map((r) => r.value);\n }\n\n /**\n * Get possible values for item status\n */\n async getItemStatuses(): Promise<string[]> {\n const response = await this.http.get<DictionaryListResponse<{ value: string }>>(\n 'resources/items-properties/status/possible-values'\n );\n return response.results.map((r) => r.value);\n }\n\n /**\n * Get possible values for item CTA (call-to-action)\n */\n async getItemCTAs(): Promise<string[]> {\n const response = await this.http.get<DictionaryListResponse<{ value: string }>>(\n 'resources/items-properties/cta/possible-values'\n );\n return response.results.map((r) => r.value);\n }\n\n /**\n * Get minimum CPC values per country/platform\n */\n async getMinimumCPCs(): Promise<MinimumCPC[]> {\n const response =\n await this.http.get<DictionaryListResponse<MinimumCPC>>('resources/minimum-cpc');\n return response.results;\n }\n\n // ===== Image Library =====\n\n /**\n * Get supported languages for image library search\n */\n async getImageLibraryLanguages(): Promise<ImageLibraryLanguage[]> {\n const response = await this.http.get<DictionaryListResponse<ImageLibraryLanguage>>(\n 'resources/image-library/languages'\n );\n return response.results;\n }\n\n /**\n * Get image taxonomies for categorizing images\n */\n async getImageTaxonomies(accountId: string): Promise<ImageTaxonomy[]> {\n const response = await this.http.get<DictionaryListResponse<ImageTaxonomy>>(\n `${accountId}/images/taxonomies`\n );\n return response.results;\n }\n\n // ===== Audience Targeting =====\n\n /**\n * Get marketplace audience segments available for targeting\n */\n async getMarketplaceAudiences(accountId: string): Promise<MarketplaceAudience[]> {\n const response = await this.http.get<DictionaryListResponse<MarketplaceAudience>>(\n `${accountId}/dictionary/audience_segments`\n );\n return response.results;\n }\n\n /**\n * Get marketplace audience segments for a specific country\n */\n async getMarketplaceAudiencesByCountry(\n accountId: string,\n countryCode: string\n ): Promise<MarketplaceAudience[]> {\n const response = await this.http.get<DictionaryListResponse<MarketplaceAudience>>(\n `${accountId}/dictionary/audience_segments/${countryCode}`\n );\n return response.results;\n }\n\n /**\n * Get lookalike audiences available for targeting\n */\n async getLookalikeAudiences(accountId: string): Promise<LookalikeAudience[]> {\n const response = await this.http.get<DictionaryListResponse<LookalikeAudience>>(\n `${accountId}/dictionary/lookalike_audiences`\n );\n return response.results;\n }\n\n /**\n * Get lookalike audiences for a specific country\n */\n async getLookalikeAudiencesByCountry(\n accountId: string,\n countryCode: string\n ): Promise<LookalikeAudience[]> {\n const response = await this.http.get<DictionaryListResponse<LookalikeAudience>>(\n `${accountId}/dictionary/lookalike_audiences/${countryCode}`\n );\n return response.results;\n }\n\n /**\n * Get contextual segments available for targeting\n */\n async getContextualSegments(accountId: string): Promise<ContextualSegment[]> {\n const response = await this.http.get<DictionaryListResponse<ContextualSegment>>(\n `${accountId}/dictionary/contextual_segments`\n );\n return response.results;\n }\n}\n","/**\n * Publishers API\n *\n * Manage publisher targeting and blocking for Taboola campaigns.\n * Allows listing available publishers and managing blocked publishers\n * at the account level.\n */\n\nimport type { HttpClient } from '../utils/http.js';\nimport type {\n Publisher,\n PublisherListResponse,\n BlockedPublishersResponse,\n UpdateBlockedPublishersRequest,\n} from '../types/publisher.js';\n\n/**\n * Publishers API for managing publisher targeting\n */\nexport class PublishersAPI {\n constructor(private readonly http: HttpClient) {}\n\n /**\n * List all available publishers for an account\n */\n async list(accountId: string): Promise<Publisher[]> {\n const response = await this.http.get<PublisherListResponse>(`${accountId}/allowed-publishers`);\n return response.results;\n }\n\n /**\n * Get blocked publishers at the account level\n */\n async getBlocked(accountId: string): Promise<string[]> {\n const response = await this.http.get<BlockedPublishersResponse>(`${accountId}/block-publisher`);\n return response.sites;\n }\n\n /**\n * Update blocked publishers at the account level\n *\n * This replaces the current list of blocked publishers with the\n * provided list.\n */\n async updateBlocked(\n accountId: string,\n request: UpdateBlockedPublishersRequest\n ): Promise<string[]> {\n const response = await this.http.post<BlockedPublishersResponse>(\n `${accountId}/block-publisher`,\n request\n );\n return response.sites;\n }\n\n /**\n * Block a single publisher at the account level\n */\n async blockPublisher(accountId: string, site: string): Promise<string[]> {\n const current = await this.getBlocked(accountId);\n\n if (current.includes(site)) {\n return current; // Already blocked\n }\n\n return this.updateBlocked(accountId, {\n sites: [...current, site],\n });\n }\n\n /**\n * Unblock a single publisher at the account level\n */\n async unblockPublisher(accountId: string, site: string): Promise<string[]> {\n const current = await this.getBlocked(accountId);\n const filteredSites = current.filter((s) => s !== site);\n\n return this.updateBlocked(accountId, {\n sites: filteredSites,\n });\n }\n\n /**\n * Clear all blocked publishers at the account level\n */\n async clearBlocked(accountId: string): Promise<string[]> {\n return this.updateBlocked(accountId, { sites: [] });\n }\n}\n","/**\n * Targeting API\n *\n * Manage campaign-level targeting including postal codes,\n * audience segments (marketplace, custom, lookalike), and\n * contextual targeting.\n */\n\nimport type { HttpClient } from '../utils/http.js';\nimport type {\n PostalCodeTargeting,\n UpdatePostalCodeTargetingRequest,\n AudienceTargeting,\n UpdateAudienceTargetingRequest,\n ContextualTargeting,\n UpdateContextualTargetingRequest,\n FirstPartyAudienceTargeting,\n UpdateFirstPartyAudienceTargetingRequest,\n MarkingLabelsTargeting,\n UpdateMarkingLabelsTargetingRequest,\n LookalikeAudienceTargeting,\n UpdateLookalikeAudienceTargetingRequest,\n} from '../types/targeting.js';\n\n/**\n * Targeting API for campaign-level targeting configuration\n */\nexport class TargetingAPI {\n constructor(private readonly http: HttpClient) {}\n\n // ===== Postal Code Targeting =====\n\n /**\n * Get postal code targeting for a campaign\n */\n async getPostalCodes(accountId: string, campaignId: string): Promise<PostalCodeTargeting> {\n return this.http.get<PostalCodeTargeting>(\n `${accountId}/campaigns/${campaignId}/targeting/postal_code`\n );\n }\n\n /**\n * Update postal code targeting for a campaign\n */\n async updatePostalCodes(\n accountId: string,\n campaignId: string,\n targeting: UpdatePostalCodeTargetingRequest\n ): Promise<PostalCodeTargeting> {\n return this.http.post<PostalCodeTargeting>(\n `${accountId}/campaigns/${campaignId}/targeting/postal_code`,\n targeting\n );\n }\n\n // ===== Marketplace Audience Targeting =====\n\n /**\n * Get marketplace audience targeting for a campaign\n */\n async getMarketplaceAudiences(accountId: string, campaignId: string): Promise<AudienceTargeting> {\n return this.http.get<AudienceTargeting>(\n `${accountId}/campaigns/${campaignId}/targeting/audience_segments`\n );\n }\n\n /**\n * Update marketplace audience targeting for a campaign\n */\n async updateMarketplaceAudiences(\n accountId: string,\n campaignId: string,\n targeting: UpdateAudienceTargetingRequest\n ): Promise<AudienceTargeting> {\n return this.http.post<AudienceTargeting>(\n `${accountId}/campaigns/${campaignId}/targeting/audience_segments`,\n targeting\n );\n }\n\n // ===== Custom Audience Targeting =====\n\n /**\n * Get custom audience targeting for a campaign\n */\n async getCustomAudiences(accountId: string, campaignId: string): Promise<AudienceTargeting> {\n return this.http.get<AudienceTargeting>(\n `${accountId}/campaigns/${campaignId}/targeting/custom_audience`\n );\n }\n\n /**\n * Update custom audience targeting for a campaign\n */\n async updateCustomAudiences(\n accountId: string,\n campaignId: string,\n targeting: UpdateAudienceTargetingRequest\n ): Promise<AudienceTargeting> {\n return this.http.post<AudienceTargeting>(\n `${accountId}/campaigns/${campaignId}/targeting/custom_audience`,\n targeting\n );\n }\n\n // ===== Lookalike Audience Targeting =====\n\n /**\n * Get lookalike audience targeting for a campaign\n */\n async getLookalikeAudiences(\n accountId: string,\n campaignId: string\n ): Promise<LookalikeAudienceTargeting> {\n return this.http.get<LookalikeAudienceTargeting>(\n `${accountId}/campaigns/${campaignId}/targeting/lookalike_audience`\n );\n }\n\n /**\n * Update lookalike audience targeting for a campaign\n */\n async updateLookalikeAudiences(\n accountId: string,\n campaignId: string,\n targeting: UpdateLookalikeAudienceTargetingRequest\n ): Promise<LookalikeAudienceTargeting> {\n return this.http.post<LookalikeAudienceTargeting>(\n `${accountId}/campaigns/${campaignId}/targeting/lookalike_audience`,\n targeting\n );\n }\n\n // ===== Contextual Targeting =====\n\n /**\n * Get contextual targeting for a campaign\n */\n async getContextual(accountId: string, campaignId: string): Promise<ContextualTargeting> {\n return this.http.get<ContextualTargeting>(\n `${accountId}/campaigns/${campaignId}/targeting/contextual_segments`\n );\n }\n\n /**\n * Update contextual targeting for a campaign\n */\n async updateContextual(\n accountId: string,\n campaignId: string,\n targeting: UpdateContextualTargetingRequest\n ): Promise<ContextualTargeting> {\n return this.http.post<ContextualTargeting>(\n `${accountId}/campaigns/${campaignId}/targeting/contextual_segments`,\n targeting\n );\n }\n\n // ===== First Party Audience Targeting =====\n\n /**\n * Get first party audience targeting for a campaign\n */\n async getFirstPartyAudiences(\n accountId: string,\n campaignId: string\n ): Promise<FirstPartyAudienceTargeting> {\n return this.http.get<FirstPartyAudienceTargeting>(\n `${accountId}/campaigns/${campaignId}/targeting/my_audiences`\n );\n }\n\n /**\n * Update first party audience targeting for a campaign\n */\n async updateFirstPartyAudiences(\n accountId: string,\n campaignId: string,\n targeting: UpdateFirstPartyAudienceTargetingRequest\n ): Promise<FirstPartyAudienceTargeting> {\n return this.http.post<FirstPartyAudienceTargeting>(\n `${accountId}/campaigns/${campaignId}/targeting/my_audiences`,\n targeting\n );\n }\n\n // ===== Marking Labels Targeting =====\n\n /**\n * Get marking labels (pixel retargeting) targeting for a campaign\n */\n async getMarkingLabels(accountId: string, campaignId: string): Promise<MarkingLabelsTargeting> {\n return this.http.get<MarkingLabelsTargeting>(\n `${accountId}/campaigns/${campaignId}/targeting/marking_labels`\n );\n }\n\n /**\n * Update marking labels targeting for a campaign\n */\n async updateMarkingLabels(\n accountId: string,\n campaignId: string,\n targeting: UpdateMarkingLabelsTargetingRequest\n ): Promise<MarkingLabelsTargeting> {\n return this.http.post<MarkingLabelsTargeting>(\n `${accountId}/campaigns/${campaignId}/targeting/marking_labels`,\n targeting\n );\n }\n}\n","/**\n * Combined Audiences API\n *\n * Manage combined audiences that combine multiple audience types\n * (custom, lookalike, marketplace, first-party) with AND/OR logic.\n */\n\nimport type { HttpClient } from '../utils/http.js';\nimport type {\n CombinedAudience,\n CombinedAudienceListResponse,\n CreateCombinedAudienceRequest,\n UpdateCombinedAudienceRequest,\n AvailableAudience,\n AvailableAudiencesResponse,\n} from '../types/audience.js';\n\n/**\n * Combined Audiences API for managing combined audiences\n */\nexport class CombinedAudiencesAPI {\n constructor(private readonly http: HttpClient) {}\n\n /**\n * List available audiences for combining\n */\n async listAvailable(accountId: string): Promise<AvailableAudience[]> {\n const response = await this.http.get<AvailableAudiencesResponse>(\n `${accountId}/combined_audiences/resources/audiences`\n );\n return response.results;\n }\n\n /**\n * List all combined audiences\n */\n async list(accountId: string): Promise<CombinedAudience[]> {\n const response = await this.http.get<CombinedAudienceListResponse>(\n `${accountId}/combined_audiences`\n );\n return response.results;\n }\n\n /**\n * Get a single combined audience\n */\n async get(accountId: string, audienceId: string): Promise<CombinedAudience> {\n return this.http.get<CombinedAudience>(`${accountId}/combined_audiences/${audienceId}`);\n }\n\n /**\n * Create a combined audience\n */\n async create(\n accountId: string,\n audience: CreateCombinedAudienceRequest\n ): Promise<CombinedAudience> {\n return this.http.post<CombinedAudience>(`${accountId}/combined_audiences`, audience);\n }\n\n /**\n * Update a combined audience\n */\n async update(\n accountId: string,\n audienceId: string,\n updates: UpdateCombinedAudienceRequest\n ): Promise<CombinedAudience> {\n return this.http.post<CombinedAudience>(\n `${accountId}/combined_audiences/${audienceId}`,\n updates\n );\n }\n}\n","/**\n * First Party Audiences API\n *\n * Manage first party audience onboarding, allowing you to upload\n * your own customer data (email, phone, device IDs) for targeting.\n */\n\nimport type { HttpClient } from '../utils/http.js';\nimport type {\n FirstPartyAudience,\n CreateFirstPartyAudienceRequest,\n AudienceUsersRequest,\n} from '../types/audience.js';\nimport type { ListResponse } from '../types/common.js';\n\n/**\n * First Party Audiences API for audience onboarding\n */\nexport class FirstPartyAudiencesAPI {\n constructor(private readonly http: HttpClient) {}\n\n /**\n * List all first party audiences\n */\n async list(accountId: string): Promise<FirstPartyAudience[]> {\n const response = await this.http.get<ListResponse<FirstPartyAudience>>(\n `${accountId}/audience_onboarding/my_audiences`\n );\n return response.results;\n }\n\n /**\n * Get a single first party audience\n */\n async get(accountId: string, audienceId: string): Promise<FirstPartyAudience> {\n return this.http.get<FirstPartyAudience>(\n `${accountId}/audience_onboarding/my_audiences/${audienceId}`\n );\n }\n\n /**\n * Create a first party audience\n */\n async create(\n accountId: string,\n audience: CreateFirstPartyAudienceRequest\n ): Promise<FirstPartyAudience> {\n return this.http.post<FirstPartyAudience>(`${accountId}/audience_onboarding/create`, audience);\n }\n\n /**\n * Add or remove users from a first party audience\n */\n async manageUsers(accountId: string, request: AudienceUsersRequest): Promise<void> {\n await this.http.post(`${accountId}/audience_onboarding/my_audiences/users`, request);\n }\n}\n","/**\n * Pixel API\n *\n * Manage Taboola Universal Pixel conversion rules and custom audience rules.\n * Conversion rules track conversions on your site, while custom audience\n * rules build retargeting audiences based on pixel events.\n */\n\nimport type { HttpClient } from '../utils/http.js';\nimport type {\n ConversionRule,\n ConversionRuleListResponse,\n CreateConversionRuleRequest,\n UpdateConversionRuleRequest,\n CustomAudienceRule,\n CustomAudienceRuleListResponse,\n CreateCustomAudienceRuleRequest,\n UpdateCustomAudienceRuleRequest,\n ConversionRuleWithData,\n ConversionRuleWithDataListResponse,\n} from '../types/pixel.js';\n\n/**\n * Pixel API for managing conversion and custom audience rules\n */\nexport class PixelAPI {\n constructor(private readonly http: HttpClient) {}\n\n // ===== Conversion Rules =====\n\n /**\n * List all conversion rules\n *\n * @param accountId - Account ID\n * @returns List of conversion rules\n *\n * @example\n * ```typescript\n * const rules = await client.pixel.listConversionRules('my-account');\n * for (const rule of rules) {\n * console.log(`${rule.display_name}: ${rule.status}`);\n * }\n * ```\n */\n async listConversionRules(accountId: string): Promise<ConversionRule[]> {\n const response = await this.http.get<ConversionRuleListResponse>(\n `${accountId}/universal_pixel/conversion_rule`\n );\n return response.results;\n }\n\n /**\n * Get a single conversion rule\n *\n * @param accountId - Account ID\n * @param ruleId - Conversion rule ID\n * @returns Conversion rule details\n */\n async getConversionRule(accountId: string, ruleId: number): Promise<ConversionRule> {\n return this.http.get<ConversionRule>(\n `${accountId}/universal_pixel/conversion_rule/${String(ruleId)}`\n );\n }\n\n /**\n * List conversion rules with performance data\n *\n * Returns conversion rules with additional data like 30-day conversion\n * counts and values.\n *\n * @param accountId - Account ID\n * @returns List of conversion rules with data\n */\n async listConversionRulesWithData(accountId: string): Promise<ConversionRuleWithData[]> {\n const response = await this.http.get<ConversionRuleWithDataListResponse>(\n `${accountId}/universal_pixel/conversion_rule/data`\n );\n return response.results;\n }\n\n /**\n * Create a conversion rule\n *\n * @param accountId - Account ID\n * @param rule - Conversion rule configuration\n * @returns Created conversion rule\n *\n * @example\n * ```typescript\n * // URL-based conversion rule\n * const rule = await client.pixel.createConversionRule('my-account', {\n * display_name: 'Purchase Completed',\n * type: 'BASIC',\n * category: 'MAKE_PURCHASE',\n * condition: {\n * property: 'URL',\n * predicate: 'CONTAINS',\n * value: '/thank-you',\n * children: [],\n * },\n * effects: [{ type: 'REVENUE', data: '15' }],\n * look_back_window: 30,\n * view_through_look_back_window: 1,\n * });\n *\n * // Event-based conversion rule\n * const eventRule = await client.pixel.createConversionRule('my-account', {\n * display_name: 'Add to Cart',\n * type: 'EVENT_BASED',\n * category: 'ADD_TO_CART',\n * event_name: 'add_to_cart',\n * effects: [{ type: 'REVENUE', data: '10' }],\n * });\n * ```\n */\n async createConversionRule(\n accountId: string,\n rule: CreateConversionRuleRequest\n ): Promise<ConversionRule> {\n return this.http.post<ConversionRule>(`${accountId}/universal_pixel/conversion_rule`, rule);\n }\n\n /**\n * Update a conversion rule\n *\n * @param accountId - Account ID\n * @param ruleId - Conversion rule ID\n * @param updates - Fields to update\n * @returns Updated conversion rule\n */\n async updateConversionRule(\n accountId: string,\n ruleId: number,\n updates: UpdateConversionRuleRequest\n ): Promise<ConversionRule> {\n return this.http.post<ConversionRule>(\n `${accountId}/universal_pixel/conversion_rule/${String(ruleId)}`,\n updates\n );\n }\n\n /**\n * Archive a conversion rule\n *\n * Archived rules stop tracking conversions but remain in the account\n * for historical reporting.\n *\n * @param accountId - Account ID\n * @param ruleId - Conversion rule ID\n * @returns Archived conversion rule\n */\n async archiveConversionRule(accountId: string, ruleId: number): Promise<ConversionRule> {\n return this.updateConversionRule(accountId, ruleId, { status: 'ARCHIVED' });\n }\n\n /**\n * Unarchive a conversion rule\n *\n * Reactivates an archived conversion rule.\n *\n * @param accountId - Account ID\n * @param ruleId - Conversion rule ID\n * @returns Reactivated conversion rule\n */\n async unarchiveConversionRule(accountId: string, ruleId: number): Promise<ConversionRule> {\n return this.updateConversionRule(accountId, ruleId, { status: 'ACTIVE' });\n }\n\n // ===== Custom Audience Rules =====\n\n /**\n * List all custom audience rules\n *\n * Custom audience rules build retargeting audiences based on pixel\n * events and page visits.\n *\n * @param accountId - Account ID\n * @returns List of custom audience rules\n *\n * @example\n * ```typescript\n * const rules = await client.pixel.listCustomAudienceRules('my-account');\n * for (const rule of rules) {\n * console.log(`${rule.display_name}: ${rule.size} users`);\n * }\n * ```\n */\n async listCustomAudienceRules(accountId: string): Promise<CustomAudienceRule[]> {\n const response = await this.http.get<CustomAudienceRuleListResponse>(\n `${accountId}/universal_pixel/custom_audience_rule`\n );\n return response.results;\n }\n\n /**\n * Get a single custom audience rule\n *\n * @param accountId - Account ID\n * @param ruleId - Custom audience rule ID\n * @returns Custom audience rule details\n */\n async getCustomAudienceRule(accountId: string, ruleId: string): Promise<CustomAudienceRule> {\n return this.http.get<CustomAudienceRule>(\n `${accountId}/universal_pixel/custom_audience_rule/${ruleId}`\n );\n }\n\n /**\n * Create a custom audience rule\n *\n * @param accountId - Account ID\n * @param rule - Custom audience rule configuration\n * @returns Created custom audience rule\n *\n * @example\n * ```typescript\n * const allVisitors = await client.pixel.createCustomAudienceRule('my-account', {\n * display_name: 'All Visitors - 30 Days',\n * conditions: [],\n * ttl_days: 30,\n * });\n *\n * const productViewers = await client.pixel.createCustomAudienceRule('my-account', {\n * display_name: 'Product Page Viewers',\n * conditions: [{ type: 'URL', operator: 'CONTAINS', value: '/products/' }],\n * ttl_days: 14,\n * });\n * ```\n */\n async createCustomAudienceRule(\n accountId: string,\n rule: CreateCustomAudienceRuleRequest\n ): Promise<CustomAudienceRule> {\n return this.http.post<CustomAudienceRule>(\n `${accountId}/universal_pixel/custom_audience_rule`,\n rule\n );\n }\n\n /**\n * Update a custom audience rule\n *\n * @param accountId - Account ID\n * @param ruleId - Custom audience rule ID\n * @param updates - Fields to update\n * @returns Updated custom audience rule\n */\n async updateCustomAudienceRule(\n accountId: string,\n ruleId: string,\n updates: UpdateCustomAudienceRuleRequest\n ): Promise<CustomAudienceRule> {\n return this.http.post<CustomAudienceRule>(\n `${accountId}/universal_pixel/custom_audience_rule/${ruleId}`,\n updates\n );\n }\n\n /**\n * Pause a custom audience rule\n *\n * Paused rules stop adding new users but retain existing audience members.\n *\n * @param accountId - Account ID\n * @param ruleId - Custom audience rule ID\n * @returns Paused custom audience rule\n */\n async pauseCustomAudienceRule(accountId: string, ruleId: string): Promise<CustomAudienceRule> {\n return this.updateCustomAudienceRule(accountId, ruleId, { status: 'PAUSED' });\n }\n\n /**\n * Resume a paused custom audience rule\n *\n * @param accountId - Account ID\n * @param ruleId - Custom audience rule ID\n * @returns Resumed custom audience rule\n */\n async resumeCustomAudienceRule(accountId: string, ruleId: string): Promise<CustomAudienceRule> {\n return this.updateCustomAudienceRule(accountId, ruleId, { status: 'ACTIVE' });\n }\n\n /**\n * Archive a custom audience rule\n *\n * Archived rules stop building and the audience becomes inaccessible\n * for targeting.\n *\n * @param accountId - Account ID\n * @param ruleId - Custom audience rule ID\n * @returns Archived custom audience rule\n */\n async archiveCustomAudienceRule(accountId: string, ruleId: string): Promise<CustomAudienceRule> {\n return this.updateCustomAudienceRule(accountId, ruleId, { status: 'ARCHIVED' });\n }\n}\n","/**\n * Reports API\n *\n * Access Taboola Backstage reporting data including Campaign Summary,\n * Top Campaign Content, and Realtime reports.\n */\n\nimport type { HttpClient } from '../utils/http.js';\nimport type {\n RealtimeAdsDimension,\n RealtimeCampaignDimension,\n ReportDimension,\n} from '../types/common.js';\nimport type {\n CampaignSummaryReport,\n CampaignSummaryReportParams,\n RealtimeAdsReport,\n RealtimeAdsReportParams,\n RealtimeCampaignReport,\n RealtimeCampaignReportParams,\n TopCampaignContentReport,\n TopCampaignContentReportParams,\n} from '../types/report.js';\n\n/**\n * Reports API for accessing reporting data\n */\nexport class ReportsAPI {\n constructor(private readonly http: HttpClient) {}\n\n /**\n * Get Campaign Summary Report\n *\n * The Campaign Summary report provides aggregated performance metrics\n * across various dimensions like day, week, month, campaign, site, etc.\n *\n * @param accountId - Account ID\n * @param dimension - Report dimension (day, week, month, campaign, site, etc.)\n * @param params - Report parameters including date range and filters\n * @returns Campaign summary report with metrics\n *\n * @example\n * ```typescript\n * // Daily report for last 30 days\n * const report = await client.reports.campaignSummary('my-account', 'day', {\n * start_date: '2024-01-01',\n * end_date: '2024-01-31',\n * });\n *\n * for (const row of report.results) {\n * console.log(`${row.date}: ${row.clicks} clicks, $${row.spent} spent`);\n * }\n *\n * // Campaign-level report with conversion data\n * const campaignReport = await client.reports.campaignSummary('my-account', 'campaign', {\n * start_date: '2024-01-01',\n * end_date: '2024-01-31',\n * include_conversions: 'all',\n * });\n *\n * // Filtered by specific campaign\n * const filteredReport = await client.reports.campaignSummary('my-account', 'day', {\n * start_date: '2024-01-01',\n * end_date: '2024-01-31',\n * campaign: '12345',\n * });\n * ```\n */\n async campaignSummary(\n accountId: string,\n dimension: ReportDimension,\n params: CampaignSummaryReportParams\n ): Promise<CampaignSummaryReport> {\n const searchParams = new URLSearchParams();\n searchParams.set('start_date', params.start_date);\n searchParams.set('end_date', params.end_date);\n\n if (params.campaign) {\n searchParams.set('campaign', params.campaign);\n }\n if (params.site) {\n searchParams.set('site', params.site);\n }\n if (params.country) {\n searchParams.set('country', params.country);\n }\n if (params.platform) {\n searchParams.set('platform', params.platform);\n }\n if (params.include_conversions) {\n searchParams.set('include_conversions', params.include_conversions);\n }\n if (params.include_multi_conversions !== undefined) {\n searchParams.set('include_multi_conversions', String(params.include_multi_conversions));\n }\n if (params.partner_name) {\n searchParams.set('partner_name', params.partner_name);\n }\n\n return this.http.get<CampaignSummaryReport>(\n `${accountId}/reports/campaign-summary/dimensions/${dimension}?${searchParams.toString()}`\n );\n }\n\n /**\n * Get Top Campaign Content Report\n *\n * The Top Campaign Content report shows performance metrics for individual\n * items (ads) across campaigns.\n *\n * @param accountId - Account ID\n * @param params - Report parameters including date range and filters\n * @returns Top campaign content report with item metrics\n *\n * @example\n * ```typescript\n * const report = await client.reports.topCampaignContent('my-account', {\n * start_date: '2024-01-01',\n * end_date: '2024-01-31',\n * limit: 100,\n * });\n *\n * for (const item of report.results) {\n * console.log(`${item.item_name}: ${item.clicks} clicks, CTR: ${item.ctr}%`);\n * }\n * ```\n */\n async topCampaignContent(\n accountId: string,\n params: TopCampaignContentReportParams\n ): Promise<TopCampaignContentReport> {\n const searchParams = new URLSearchParams();\n searchParams.set('start_date', params.start_date);\n searchParams.set('end_date', params.end_date);\n\n if (params.campaign) {\n searchParams.set('campaign', params.campaign);\n }\n if (params.limit !== undefined) {\n searchParams.set('limit', String(params.limit));\n }\n if (params.include_conversions) {\n searchParams.set('include_conversions', params.include_conversions);\n }\n\n return this.http.get<TopCampaignContentReport>(\n `${accountId}/reports/top-campaign-content/dimensions/item_breakdown?${searchParams.toString()}`\n );\n }\n\n /**\n * Get Realtime Campaign Report\n *\n * Provides performance data for campaigns in (near) real time.\n * Metrics and amounts are not accurate for billing.\n *\n * Rate limit: 10 requests per minute (429 returned if exceeded).\n *\n * @param accountId - Account ID\n * @param dimension - Report dimension (e.g. 'by_hour', 'by_campaign')\n * @param params - Report parameters including date range and filters\n * @returns Realtime campaign report\n *\n * @example\n * ```typescript\n * const report = await client.reports.realtimeCampaign('my-account', 'by_campaign', {\n * start_date: '2024-01-15T00:00:00',\n * end_date: '2024-01-15T23:59:59',\n * });\n *\n * for (const row of report.results) {\n * console.log(`${row.campaign_name}: ${row.clicks} clicks, $${row.spent} spent`);\n * }\n *\n * // With filters\n * const filtered = await client.reports.realtimeCampaign('my-account', 'by_hour', {\n * start_date: '2024-01-15T00:00:00',\n * end_date: '2024-01-15T23:59:59',\n * campaign: '101,102',\n * platform: 'DESK,PHON',\n * country: 'US',\n * });\n * ```\n */\n async realtimeCampaign(\n accountId: string,\n dimension: RealtimeCampaignDimension,\n params: RealtimeCampaignReportParams\n ): Promise<RealtimeCampaignReport> {\n const searchParams = new URLSearchParams();\n searchParams.set('start_date', params.start_date);\n searchParams.set('end_date', params.end_date);\n\n if (params.campaign) {\n searchParams.set('campaign', params.campaign);\n }\n if (params.platform) {\n searchParams.set('platform', params.platform);\n }\n if (params.country) {\n searchParams.set('country', params.country);\n }\n if (params.site_id) {\n searchParams.set('site_id', params.site_id);\n }\n if (params.fetch_config !== undefined) {\n searchParams.set('fetch_config', String(params.fetch_config));\n }\n\n return this.http.get<RealtimeCampaignReport>(\n `${accountId}/reports/realtime-campaign-summary/dimensions/${dimension}?${searchParams.toString()}`\n );\n }\n\n /**\n * Get Realtime Ads Report (Top Campaign Content)\n *\n * Provides performance data for ads in (near) real time.\n * Metrics and amounts are not accurate for billing.\n *\n * Rate limit: 10 requests per minute (429 returned if exceeded).\n *\n * @param accountId - Account ID\n * @param dimension - Report dimension ('by_item' or 'by_item_by_smallest_time_bucket')\n * @param params - Report parameters including date range, item IDs, and filters\n * @returns Realtime ads report\n *\n * @example\n * ```typescript\n * const report = await client.reports.realtimeAds('my-account', 'by_item', {\n * start_date: '2024-01-15T00:00:00',\n * end_date: '2024-01-15T23:59:59',\n * item: '1001,1002,1003',\n * });\n *\n * for (const row of report.results) {\n * console.log(`${row.item_name}: ${row.clicks} clicks, ${row.impressions} impressions`);\n * }\n * ```\n */\n async realtimeAds(\n accountId: string,\n dimension: RealtimeAdsDimension,\n params: RealtimeAdsReportParams\n ): Promise<RealtimeAdsReport> {\n const searchParams = new URLSearchParams();\n searchParams.set('start_date', params.start_date);\n searchParams.set('end_date', params.end_date);\n searchParams.set('item', params.item);\n\n if (params.campaign) {\n searchParams.set('campaign', params.campaign);\n }\n if (params.platform) {\n searchParams.set('platform', params.platform);\n }\n if (params.country) {\n searchParams.set('country', params.country);\n }\n if (params.site_id) {\n searchParams.set('site_id', params.site_id);\n }\n\n return this.http.get<RealtimeAdsReport>(\n `${accountId}/reports/realtime-top-campaign-content/dimensions/${dimension}?${searchParams.toString()}`\n );\n }\n}\n","/**\n * Shared Budget API for Taboola Backstage\n *\n * Manage shared budgets across campaigns.\n */\n\nimport type { HttpClient } from '../utils/http.js';\nimport type {\n CreateSharedBudgetRequest,\n SharedBudget,\n SharedBudgetBaseListResponse,\n UpdateSharedBudgetRequest,\n} from '../types/shared-budget.js';\n\n/**\n * Shared Budget management API\n */\nexport class SharedBudgetAPI {\n constructor(private readonly http: HttpClient) {}\n\n /**\n * Get a shared budget by ID\n *\n * @param accountId - Account ID\n * @param sharedBudgetId - Shared budget ID\n *\n * @example\n * ```typescript\n * const budget = await client.sharedBudgets.get('my-account', '123');\n * console.log(budget.name, budget.spending_limit);\n * ```\n */\n async get(accountId: string, sharedBudgetId: string): Promise<SharedBudget> {\n return this.http.get<SharedBudget>(`${accountId}/shared-budget/${sharedBudgetId}`);\n }\n\n /**\n * List all shared budgets (base/partial fields)\n *\n * Returns a lightweight list with id, name, and status.\n *\n * @param accountId - Account ID\n *\n * @example\n * ```typescript\n * const { results } = await client.sharedBudgets.listBase('my-account');\n * for (const budget of results) {\n * console.log(budget.name, budget.status);\n * }\n * ```\n */\n async listBase(accountId: string): Promise<SharedBudgetBaseListResponse> {\n return this.http.get<SharedBudgetBaseListResponse>(`${accountId}/shared-budget/base`);\n }\n\n /**\n * Create a new shared budget\n *\n * @param accountId - Account ID\n * @param budget - Shared budget configuration\n *\n * @example\n * ```typescript\n * const budget = await client.sharedBudgets.create('my-account', {\n * name: 'Q1 Budget',\n * marketing_objective: 'DRIVE_WEBSITE_TRAFFIC',\n * spending_limit_model: 'MONTHLY',\n * spending_limit: 5000,\n * daily_cap: 200,\n * });\n * console.log('Created shared budget:', budget.id);\n * ```\n */\n async create(accountId: string, budget: CreateSharedBudgetRequest): Promise<SharedBudget> {\n return this.http.post<SharedBudget>(`${accountId}/shared-budget`, budget);\n }\n\n /**\n * Update an existing shared budget\n *\n * @param accountId - Account ID\n * @param sharedBudgetId - Shared budget ID\n * @param updates - Fields to update\n *\n * @example\n * ```typescript\n * const budget = await client.sharedBudgets.update('my-account', '123', {\n * spending_limit: 10000,\n * daily_cap: 500,\n * });\n * ```\n */\n async update(\n accountId: string,\n sharedBudgetId: string,\n updates: UpdateSharedBudgetRequest\n ): Promise<SharedBudget> {\n return this.http.put<SharedBudget>(`${accountId}/shared-budget/${sharedBudgetId}`, updates);\n }\n}\n","/**\n * Taboola Backstage SDK Client\n *\n * Main entry point for the SDK. Creates and configures all API modules.\n */\n\nimport { OAuthManager } from './auth/oauth.js';\nimport { HttpClient, DEFAULT_BASE_URL } from './utils/http.js';\nimport { AccountsAPI } from './api/accounts.js';\nimport { CampaignsAPI } from './api/campaigns.js';\nimport { ItemsAPI } from './api/items.js';\nimport { DictionaryAPI } from './api/dictionary.js';\nimport { PublishersAPI } from './api/publishers.js';\nimport { TargetingAPI } from './api/targeting.js';\nimport { CombinedAudiencesAPI } from './api/combined-audiences.js';\nimport { FirstPartyAudiencesAPI } from './api/first-party-audiences.js';\nimport { PixelAPI } from './api/pixel.js';\nimport { ReportsAPI } from './api/reports.js';\nimport { SharedBudgetAPI } from './api/shared-budget.js';\nimport type { TaboolaConfig } from './types/index.js';\n\n/**\n * Taboola Backstage API Client\n *\n * The main client for interacting with the Taboola Backstage API.\n * Provides access to all API modules through namespaced properties.\n *\n * @example\n * ```typescript\n * import { TaboolaClient } from 'taboola-backstage-sdk';\n *\n * const client = new TaboolaClient({\n * clientId: 'your-client-id',\n * clientSecret: 'your-client-secret',\n * });\n *\n * // Get current account\n * const account = await client.accounts.getCurrent();\n * console.log('Account ID:', account.account_id);\n *\n * // List campaigns\n * const { results: campaigns } = await client.campaigns.list(account.account_id);\n * console.log('Found', campaigns.length, 'campaigns');\n *\n * // Create a new campaign\n * const campaign = await client.campaigns.create(account.account_id, {\n * name: 'My Campaign',\n * branding_text: 'My Brand',\n * cpc: 0.50,\n * spending_limit: 1000,\n * spending_limit_model: 'MONTHLY',\n * marketing_objective: 'DRIVE_WEBSITE_TRAFFIC',\n * });\n * ```\n */\nexport class TaboolaClient {\n /**\n * Account management API\n */\n readonly accounts: AccountsAPI;\n\n /**\n * Campaign management API\n */\n readonly campaigns: CampaignsAPI;\n\n /**\n * Campaign items (ads) management API\n */\n readonly items: ItemsAPI;\n\n /**\n * Dictionary/reference data API\n */\n readonly dictionary: DictionaryAPI;\n\n /**\n * Publishers management API\n */\n readonly publishers: PublishersAPI;\n\n /**\n * Campaign targeting API\n */\n readonly targeting: TargetingAPI;\n\n /**\n * Combined audiences API\n */\n readonly combinedAudiences: CombinedAudiencesAPI;\n\n /**\n * First party audiences API\n */\n readonly firstPartyAudiences: FirstPartyAudiencesAPI;\n\n /**\n * Pixel conversion and custom audience rules API\n */\n readonly pixel: PixelAPI;\n\n /**\n * Shared budget management API\n */\n readonly sharedBudgets: SharedBudgetAPI;\n\n /**\n * Reports and analytics API\n */\n readonly reports: ReportsAPI;\n\n /**\n * Internal OAuth manager (for advanced use cases)\n */\n private readonly authManager: OAuthManager;\n\n /**\n * Internal HTTP client (for advanced use cases)\n */\n private readonly httpClient: HttpClient;\n\n /**\n * Create a new Taboola client\n *\n * @param config - Client configuration\n */\n constructor(config: TaboolaConfig) {\n if (!config.clientId) {\n throw new Error('clientId is required');\n }\n if (!config.clientSecret) {\n throw new Error('clientSecret is required');\n }\n\n // Initialize authentication\n this.authManager = new OAuthManager(config.clientId, config.clientSecret);\n\n // Initialize HTTP client\n this.httpClient = new HttpClient(this.authManager, {\n baseUrl: config.baseUrl ?? DEFAULT_BASE_URL,\n timeout: config.timeout,\n retries: config.retries,\n debug: config.debug,\n });\n\n // Initialize API modules\n this.accounts = new AccountsAPI(this.httpClient);\n this.campaigns = new CampaignsAPI(this.httpClient);\n this.items = new ItemsAPI(this.httpClient);\n this.dictionary = new DictionaryAPI(this.httpClient);\n this.publishers = new PublishersAPI(this.httpClient);\n this.targeting = new TargetingAPI(this.httpClient);\n this.combinedAudiences = new CombinedAudiencesAPI(this.httpClient);\n this.firstPartyAudiences = new FirstPartyAudiencesAPI(this.httpClient);\n this.pixel = new PixelAPI(this.httpClient);\n this.sharedBudgets = new SharedBudgetAPI(this.httpClient);\n this.reports = new ReportsAPI(this.httpClient);\n }\n\n /**\n * Get the base URL used for API requests\n */\n get baseUrl(): string {\n return DEFAULT_BASE_URL;\n }\n\n /**\n * Force refresh the access token\n *\n * Useful if you need to ensure a fresh token before a series of operations.\n */\n async refreshToken(): Promise<void> {\n await this.authManager.refreshToken();\n }\n\n /**\n * Clear the cached access token\n *\n * Forces a new token to be fetched on the next request.\n */\n clearToken(): void {\n this.authManager.clearToken();\n }\n}\n\n/**\n * Create a new Taboola client\n *\n * Convenience function for creating a new client instance.\n *\n * @param config - Client configuration\n *\n * @example\n * ```typescript\n * import { createClient } from 'taboola-backstage-sdk';\n *\n * const client = createClient({\n * clientId: process.env.TABOOLA_CLIENT_ID!,\n * clientSecret: process.env.TABOOLA_CLIENT_SECRET!,\n * });\n * ```\n */\nexport function createClient(config: TaboolaConfig): TaboolaClient {\n return new TaboolaClient(config);\n}\n"]}
1
+ {"version":3,"sources":["../src/errors/index.ts","../src/auth/oauth.ts","../src/utils/http.ts","../src/api/accounts.ts","../src/api/campaigns.ts","../src/api/items.ts","../src/api/dictionary.ts","../src/api/publishers.ts","../src/api/targeting.ts","../src/api/combined-audiences.ts","../src/api/first-party-audiences.ts","../src/api/pixel.ts","../src/api/reports.ts","../src/api/shared-budget.ts","../src/client.ts"],"names":["ky","HTTPError"],"mappings":"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","file":"index.cjs","sourcesContent":["/**\n * Custom error classes for Taboola Backstage SDK\n */\n\n/**\n * Base error class for all Taboola SDK errors\n */\nexport class TaboolaError extends Error {\n /** HTTP status code if applicable */\n readonly statusCode: number | undefined;\n /** Original error response body */\n readonly response: unknown;\n /** Request URL that caused the error */\n readonly url: string | undefined;\n\n constructor(\n message: string,\n options?: {\n statusCode?: number;\n response?: unknown;\n url?: string;\n cause?: Error;\n }\n ) {\n super(message, { cause: options?.cause });\n this.name = 'TaboolaError';\n this.statusCode = options?.statusCode;\n this.response = options?.response;\n this.url = options?.url;\n }\n}\n\n/**\n * Authentication error (401)\n * Thrown when OAuth token is invalid or expired\n */\nexport class TaboolaAuthError extends TaboolaError {\n constructor(\n message = 'Authentication failed',\n options?: {\n response?: unknown;\n url?: string;\n cause?: Error;\n }\n ) {\n super(message, { statusCode: 401, ...options });\n this.name = 'TaboolaAuthError';\n }\n}\n\n/**\n * Validation error (400)\n * Thrown when request parameters are invalid\n */\nexport class TaboolaValidationError extends TaboolaError {\n /** Specific field errors if available */\n readonly fieldErrors: Record<string, string[]> | undefined;\n\n constructor(\n message = 'Validation failed',\n options?: {\n response?: unknown;\n url?: string;\n cause?: Error;\n fieldErrors?: Record<string, string[]>;\n }\n ) {\n super(message, { statusCode: 400, ...options });\n this.name = 'TaboolaValidationError';\n this.fieldErrors = options?.fieldErrors;\n }\n}\n\n/**\n * Not found error (404)\n * Thrown when requested resource doesn't exist\n */\nexport class TaboolaNotFoundError extends TaboolaError {\n /** The resource type that wasn't found */\n readonly resourceType: string | undefined;\n /** The resource ID that wasn't found */\n readonly resourceId: string | undefined;\n\n constructor(\n message = 'Resource not found',\n options?: {\n response?: unknown;\n url?: string;\n cause?: Error;\n resourceType?: string;\n resourceId?: string;\n }\n ) {\n super(message, { statusCode: 404, ...options });\n this.name = 'TaboolaNotFoundError';\n this.resourceType = options?.resourceType;\n this.resourceId = options?.resourceId;\n }\n}\n\n/**\n * Rate limit error (429)\n * Thrown when API rate limits are exceeded\n */\nexport class TaboolaRateLimitError extends TaboolaError {\n /** Seconds until rate limit resets */\n readonly retryAfter: number | undefined;\n\n constructor(\n message = 'Rate limit exceeded',\n options?: {\n response?: unknown;\n url?: string;\n cause?: Error;\n retryAfter?: number;\n }\n ) {\n super(message, { statusCode: 429, ...options });\n this.name = 'TaboolaRateLimitError';\n this.retryAfter = options?.retryAfter;\n }\n}\n\n/**\n * Forbidden error (403)\n * Thrown when access to resource is denied\n */\nexport class TaboolaForbiddenError extends TaboolaError {\n constructor(\n message = 'Access forbidden',\n options?: {\n response?: unknown;\n url?: string;\n cause?: Error;\n }\n ) {\n super(message, { statusCode: 403, ...options });\n this.name = 'TaboolaForbiddenError';\n }\n}\n\n/**\n * Server error (5xx)\n * Thrown when Taboola servers encounter an error\n */\nexport class TaboolaServerError extends TaboolaError {\n constructor(\n message = 'Server error',\n options?: {\n statusCode?: number;\n response?: unknown;\n url?: string;\n cause?: Error;\n }\n ) {\n super(message, { statusCode: options?.statusCode ?? 500, ...options });\n this.name = 'TaboolaServerError';\n }\n}\n\n/**\n * Parse API error response and throw appropriate error class\n */\nexport function parseApiError(statusCode: number, response: unknown, url: string): TaboolaError {\n const message = extractErrorMessage(response);\n\n switch (statusCode) {\n case 400: {\n const fieldErrors = extractFieldErrors(response);\n return new TaboolaValidationError(message, {\n response,\n url,\n ...(fieldErrors !== undefined ? { fieldErrors } : {}),\n });\n }\n case 401:\n return new TaboolaAuthError(message, { response, url });\n case 403:\n return new TaboolaForbiddenError(message, { response, url });\n case 404:\n return new TaboolaNotFoundError(message, { response, url });\n case 429: {\n const retryAfter = extractRetryAfter(response);\n return new TaboolaRateLimitError(message, {\n response,\n url,\n ...(retryAfter !== undefined ? { retryAfter } : {}),\n });\n }\n default:\n if (statusCode >= 500) {\n return new TaboolaServerError(message, { statusCode, response, url });\n }\n return new TaboolaError(message, { statusCode, response, url });\n }\n}\n\n/**\n * Extract error message from API response\n */\nfunction extractErrorMessage(response: unknown): string {\n if (response && typeof response === 'object') {\n const resp = response as Record<string, unknown>;\n if (typeof resp.message === 'string') {\n return resp.message;\n }\n if (typeof resp.error === 'string') {\n return resp.error;\n }\n if (typeof resp.error_description === 'string') {\n return resp.error_description;\n }\n }\n return 'Unknown error';\n}\n\n/**\n * Extract field-level validation errors from API response\n */\nfunction extractFieldErrors(response: unknown): Record<string, string[]> | undefined {\n if (response && typeof response === 'object') {\n const resp = response as Record<string, unknown>;\n if (resp.errors && typeof resp.errors === 'object') {\n return resp.errors as Record<string, string[]>;\n }\n }\n return undefined;\n}\n\n/**\n * Extract retry-after value from rate limit response\n */\nfunction extractRetryAfter(response: unknown): number | undefined {\n if (response && typeof response === 'object') {\n const resp = response as Record<string, unknown>;\n if (typeof resp.retry_after === 'number') {\n return resp.retry_after;\n }\n }\n return undefined;\n}\n","/**\n * OAuth2 authentication module for Taboola Backstage API\n */\n\nimport type { TokenResponse, StoredToken } from '../types/auth.js';\nimport { TaboolaAuthError } from '../errors/index.js';\n\n/** OAuth token endpoint */\nconst TOKEN_URL = 'https://backstage.taboola.com/backstage/oauth/token';\n\n/** Buffer time before token expiry to trigger refresh (5 minutes) */\nconst TOKEN_EXPIRY_BUFFER_MS = 5 * 60 * 1000;\n\n/**\n * OAuth2 authentication manager\n * Handles token acquisition and automatic refresh\n */\nexport class OAuthManager {\n private readonly clientId: string;\n private readonly clientSecret: string;\n private storedToken: StoredToken | null = null;\n private tokenPromise: Promise<string> | null = null;\n\n constructor(clientId: string, clientSecret: string) {\n this.clientId = clientId;\n this.clientSecret = clientSecret;\n }\n\n /**\n * Get a valid access token, refreshing if necessary\n */\n async getAccessToken(): Promise<string> {\n // If we have a valid cached token, return it\n if (this.storedToken && !this.isTokenExpired(this.storedToken)) {\n return this.storedToken.accessToken;\n }\n\n // If a token request is already in progress, wait for it\n if (this.tokenPromise) {\n return this.tokenPromise;\n }\n\n // Fetch a new token\n this.tokenPromise = this.fetchToken();\n\n try {\n const token = await this.tokenPromise;\n return token;\n } finally {\n this.tokenPromise = null;\n }\n }\n\n /**\n * Force refresh the token (e.g., after a 401 response)\n */\n async refreshToken(): Promise<string> {\n this.storedToken = null;\n return this.getAccessToken();\n }\n\n /**\n * Clear the stored token\n */\n clearToken(): void {\n this.storedToken = null;\n this.tokenPromise = null;\n }\n\n /**\n * Check if a token is expired or about to expire\n */\n private isTokenExpired(token: StoredToken): boolean {\n return Date.now() >= token.expiresAt - TOKEN_EXPIRY_BUFFER_MS;\n }\n\n /**\n * Fetch a new token from the OAuth endpoint\n */\n private async fetchToken(): Promise<string> {\n const body = new URLSearchParams({\n client_id: this.clientId,\n client_secret: this.clientSecret,\n grant_type: 'client_credentials',\n });\n\n let response: Response;\n try {\n response = await fetch(TOKEN_URL, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/x-www-form-urlencoded',\n },\n body: body.toString(),\n });\n } catch (error) {\n const cause = error instanceof Error ? error : undefined;\n throw new TaboolaAuthError('Failed to connect to authentication server', {\n ...(cause ? { cause } : {}),\n });\n }\n\n if (!response.ok) {\n let errorBody: unknown;\n try {\n errorBody = await response.json();\n } catch {\n errorBody = await response.text();\n }\n\n throw new TaboolaAuthError(\n `Authentication failed: ${String(response.status)} ${response.statusText}`,\n { response: errorBody }\n );\n }\n\n let tokenResponse: TokenResponse;\n try {\n tokenResponse = (await response.json()) as TokenResponse;\n } catch {\n throw new TaboolaAuthError('Invalid token response from server');\n }\n\n if (!tokenResponse.access_token) {\n throw new TaboolaAuthError('No access token in response', {\n response: tokenResponse,\n });\n }\n\n // Store the token with expiry time\n this.storedToken = {\n accessToken: tokenResponse.access_token,\n expiresAt: Date.now() + tokenResponse.expires_in * 1000,\n };\n\n return this.storedToken.accessToken;\n }\n}\n","/**\n * HTTP client wrapper using ky\n */\n\nimport ky, { type KyInstance, type Options as KyOptions, HTTPError } from 'ky';\nimport type { OAuthManager } from '../auth/oauth.js';\nimport { parseApiError, TaboolaAuthError } from '../errors/index.js';\n\n/** Default API base URL */\nexport const DEFAULT_BASE_URL = 'https://backstage.taboola.com/backstage/api/1.0';\n\n/** Default request timeout (30 seconds) */\nconst DEFAULT_TIMEOUT = 30000;\n\n/** Default retry count */\nconst DEFAULT_RETRIES = 3;\n\nexport interface HttpClientOptions {\n baseUrl?: string | undefined;\n timeout?: number | undefined;\n retries?: number | undefined;\n debug?: boolean | undefined;\n}\n\n/**\n * HTTP client for Taboola API requests\n */\nexport class HttpClient {\n private readonly client: KyInstance;\n private readonly authManager: OAuthManager;\n private readonly debug: boolean;\n\n constructor(authManager: OAuthManager, options: HttpClientOptions = {}) {\n this.authManager = authManager;\n this.debug = options.debug ?? false;\n\n this.client = ky.create({\n prefixUrl: options.baseUrl ?? DEFAULT_BASE_URL,\n timeout: options.timeout ?? DEFAULT_TIMEOUT,\n retry: {\n limit: options.retries ?? DEFAULT_RETRIES,\n methods: ['get', 'post', 'put', 'patch', 'delete'],\n statusCodes: [408, 429, 500, 502, 503, 504],\n backoffLimit: 10000,\n },\n hooks: {\n beforeRequest: [\n async (request: Request) => {\n const token = await this.authManager.getAccessToken();\n request.headers.set('Authorization', `Bearer ${token}`);\n request.headers.set('Accept', 'application/json');\n },\n ],\n afterResponse: [\n async (request, _options, response) => {\n if (this.debug) {\n console.log(\n `[Taboola SDK] ${request.method} ${String(response.status)} ${request.url}`\n );\n }\n\n // Handle 401 by refreshing token and retrying once\n if (response.status === 401) {\n try {\n const newToken = await this.authManager.refreshToken();\n request.headers.set('Authorization', `Bearer ${newToken}`);\n return await ky(request);\n } catch {\n throw new TaboolaAuthError('Token refresh failed');\n }\n }\n\n return response;\n },\n ],\n },\n });\n }\n\n /**\n * Make a GET request\n */\n async get<T>(path: string, options?: KyOptions): Promise<T> {\n return this.request<T>('get', path, options);\n }\n\n /**\n * Make a POST request\n */\n async post<T>(path: string, body?: unknown, options?: KyOptions): Promise<T> {\n return this.request<T>('post', path, { ...options, json: body });\n }\n\n /**\n * Make a PUT request\n */\n async put<T>(path: string, body?: unknown, options?: KyOptions): Promise<T> {\n return this.request<T>('put', path, { ...options, json: body });\n }\n\n /**\n * Make a PATCH request\n */\n async patch<T>(path: string, body?: unknown, options?: KyOptions): Promise<T> {\n return this.request<T>('patch', path, { ...options, json: body });\n }\n\n /**\n * Make a DELETE request\n */\n async delete<T>(path: string, options?: KyOptions): Promise<T> {\n return this.request<T>('delete', path, options);\n }\n\n /**\n * Internal request handler\n */\n private async request<T>(\n method: 'get' | 'post' | 'put' | 'patch' | 'delete',\n path: string,\n options?: KyOptions\n ): Promise<T> {\n try {\n const response = await this.client[method](path, options);\n\n // Handle empty responses (204 No Content, etc.)\n const contentType = response.headers.get('content-type');\n if (!contentType?.includes('application/json')) {\n return undefined as T;\n }\n\n return (await response.json()) as T;\n } catch (error: unknown) {\n if (error instanceof HTTPError) {\n const url = error.request.url;\n let responseBody: unknown;\n\n try {\n responseBody = await error.response.json();\n } catch {\n try {\n responseBody = await error.response.text();\n } catch {\n responseBody = null;\n }\n }\n\n throw parseApiError(error.response.status, responseBody, url);\n }\n\n throw error;\n }\n }\n}\n","/**\n * Account API for Taboola Backstage\n */\n\nimport type { HttpClient } from '../utils/http.js';\nimport type {\n Account,\n AdvertiserAccount,\n AllowedAccountsResponse,\n NetworkAdvertisersResponse,\n} from '../types/index.js';\n\n/**\n * Account management API\n */\nexport class AccountsAPI {\n constructor(private readonly http: HttpClient) {}\n\n /**\n * Get current account details\n *\n * Returns details of your primary account including the account_id\n * needed for most API operations.\n *\n * @example\n * ```typescript\n * const account = await client.accounts.getCurrent();\n * console.log(account.account_id); // 'my-account-id'\n * ```\n */\n async getCurrent(): Promise<Account> {\n return this.http.get<Account>('users/current/account');\n }\n\n /**\n * Get all allowed accounts for the current user\n *\n * Returns all accounts the current API credentials have access to.\n *\n * @example\n * ```typescript\n * const { results } = await client.accounts.getAllowed();\n * for (const account of results) {\n * console.log(account.name, account.account_id);\n * }\n * ```\n */\n async getAllowed(): Promise<AllowedAccountsResponse> {\n return this.http.get<AllowedAccountsResponse>('users/current/allowed-accounts');\n }\n\n /**\n * Get advertiser accounts in a network\n *\n * For network accounts, returns all advertiser accounts within the network.\n *\n * @param accountId - Network account ID\n *\n * @example\n * ```typescript\n * const { results } = await client.accounts.getNetworkAdvertisers('my-network');\n * for (const advertiser of results) {\n * console.log(advertiser.name);\n * }\n * ```\n */\n async getNetworkAdvertisers(accountId: string): Promise<NetworkAdvertisersResponse> {\n return this.http.get<NetworkAdvertisersResponse>(`${accountId}/advertisers`);\n }\n\n /**\n * Get a specific advertiser account\n *\n * @param accountId - Account ID to retrieve\n *\n * @example\n * ```typescript\n * const account = await client.accounts.get('my-account-id');\n * console.log(account.currency);\n * ```\n */\n async get(accountId: string): Promise<AdvertiserAccount> {\n // Use the allowed accounts endpoint and filter\n const allowed = await this.getAllowed();\n const account = allowed.results.find((a) => a.account_id === accountId);\n if (!account) {\n throw new Error(`Account not found: ${accountId}`);\n }\n return account;\n }\n}\n","/**\n * Campaigns API for Taboola Backstage\n */\n\nimport type { HttpClient } from '../utils/http.js';\nimport type {\n BulkCampaignUpdateRequest,\n Campaign,\n CampaignBaseListResponse,\n CampaignListResponse,\n CampaignPatchRequest,\n CampaignReachEstimatorRequest,\n CampaignReachEstimatorResponse,\n CampaignTargetingCollection,\n CreateCampaignRequest,\n DuplicateCampaignRequest,\n UpdateCampaignRequest,\n} from '../types/index.js';\n\n/**\n * Options for listing campaigns\n */\nexport interface ListCampaignsOptions {\n /** Page number (1-indexed) */\n page?: number;\n /** Number of results per page */\n pageSize?: number;\n /** Filter by status */\n status?: string;\n /** Filter by approval state */\n approvalState?: string;\n}\n\n/**\n * Campaign management API\n */\nexport class CampaignsAPI {\n constructor(private readonly http: HttpClient) {}\n\n /**\n * List all campaigns for an account\n */\n async list(accountId: string, options: ListCampaignsOptions = {}): Promise<CampaignListResponse> {\n const searchParams = new URLSearchParams();\n\n if (options.page !== undefined) {\n searchParams.set('page', options.page.toString());\n }\n if (options.pageSize !== undefined) {\n searchParams.set('page_size', options.pageSize.toString());\n }\n if (options.status !== undefined) {\n searchParams.set('status', options.status);\n }\n if (options.approvalState !== undefined) {\n searchParams.set('approval_state', options.approvalState);\n }\n\n const query = searchParams.toString();\n const path = `${accountId}/campaigns/${query ? `?${query}` : ''}`;\n\n return this.http.get<CampaignListResponse>(path);\n }\n\n /**\n * List all campaigns with base (partial) fields only\n */\n async listBase(accountId: string): Promise<CampaignBaseListResponse> {\n return this.http.get<CampaignBaseListResponse>(`${accountId}/campaigns/base`);\n }\n\n /**\n * Get a single campaign by ID\n */\n async get(accountId: string, campaignId: string): Promise<Campaign> {\n return this.http.get<Campaign>(`${accountId}/campaigns/${campaignId}`);\n }\n\n /**\n * Create a new campaign\n */\n async create(accountId: string, campaign: CreateCampaignRequest): Promise<Campaign> {\n return this.http.post<Campaign>(`${accountId}/campaigns/`, campaign);\n }\n\n /**\n * Update an existing campaign\n */\n async update(\n accountId: string,\n campaignId: string,\n updates: UpdateCampaignRequest\n ): Promise<Campaign> {\n return this.http.post<Campaign>(`${accountId}/campaigns/${campaignId}`, updates);\n }\n\n /**\n * Delete a campaign\n */\n async delete(accountId: string, campaignId: string): Promise<void> {\n await this.http.delete(`${accountId}/campaigns/${campaignId}`);\n }\n\n /**\n * Duplicate a campaign\n *\n * @param accountId - Account ID\n * @param campaignId - Campaign ID to duplicate\n * @param request - Duplication request with optional name and settings\n * @param destinationAccount - Optional destination account ID for cross-account duplication\n */\n async duplicate(\n accountId: string,\n campaignId: string,\n request: DuplicateCampaignRequest,\n destinationAccount?: string\n ): Promise<Campaign> {\n const searchParams = new URLSearchParams();\n if (destinationAccount) {\n searchParams.set('destination_account', destinationAccount);\n }\n const query = searchParams.toString();\n const path = `${accountId}/campaigns/${campaignId}/duplicate${query ? `?${query}` : ''}`;\n return this.http.post<Campaign>(path, request);\n }\n\n /**\n * Pause a campaign\n */\n async pause(accountId: string, campaignId: string): Promise<Campaign> {\n return this.update(accountId, campaignId, { is_active: false });\n }\n\n /**\n * Unpause (resume) a campaign\n */\n async unpause(accountId: string, campaignId: string): Promise<Campaign> {\n return this.update(accountId, campaignId, { is_active: true });\n }\n\n /**\n * Bulk update multiple campaigns\n */\n async bulkUpdate(\n accountId: string,\n updates: BulkCampaignUpdateRequest\n ): Promise<CampaignListResponse> {\n return this.http.put<CampaignListResponse>(`${accountId}/campaigns/bulk`, updates);\n }\n\n /**\n * Patch a campaign\n *\n * @param accountId - Account ID\n * @param campaignId - Campaign ID\n * @param patch - Patch operation\n */\n async patch(\n accountId: string,\n campaignId: string,\n patch: CampaignPatchRequest\n ): Promise<Campaign> {\n return this.http.patch<Campaign>(`${accountId}/campaigns/${campaignId}`, patch);\n }\n\n /**\n * Get all campaigns across a network\n *\n * @param networkAccountId - Network account ID\n */\n async listNetwork(networkAccountId: string): Promise<CampaignBaseListResponse> {\n return this.http.get<CampaignBaseListResponse>(`${networkAccountId}/campaigns/base`);\n }\n\n /**\n * Estimate campaign reach\n */\n async estimateReach(\n accountId: string,\n params: CampaignReachEstimatorRequest\n ): Promise<CampaignReachEstimatorResponse> {\n return this.http.post<CampaignReachEstimatorResponse>(\n `${accountId}/campaigns/reach-estimate`,\n params\n );\n }\n\n /**\n * Get publisher targeting whitelist for a campaign\n */\n async getTargetingWhitelist(\n accountId: string,\n campaignId: string\n ): Promise<CampaignTargetingCollection> {\n return this.http.get<CampaignTargetingCollection>(\n `${accountId}/campaigns/${campaignId}/targeting/publisher_targeting/whitelist`\n );\n }\n}\n","/**\n * Campaign Items (Ads) API for Taboola Backstage\n */\n\nimport type { HttpClient } from '../utils/http.js';\nimport type {\n BulkCreateItemData,\n BulkCreateItemsAcrossCampaignsRequest,\n BulkCreateItemsResponse,\n BulkDeleteItemsRequest,\n BulkUpdateItemsRequest,\n CampaignItem,\n CampaignItemListResponse,\n CreateItemRequest,\n RSSChildItem,\n RSSChildrenListResponse,\n UpdateItemRequest,\n} from '../types/index.js';\n\n/**\n * Options for listing campaign items\n */\nexport interface ListItemsOptions {\n /** Page number (1-indexed) */\n page?: number;\n /** Number of results per page */\n pageSize?: number;\n /** Filter by status */\n status?: string;\n /** Filter by approval state */\n approvalState?: string;\n}\n\n/**\n * Campaign Items (Ads) management API\n */\nexport class ItemsAPI {\n constructor(private readonly http: HttpClient) {}\n\n /**\n * List all items for a campaign\n *\n * @param accountId - Account ID\n * @param campaignId - Campaign ID\n * @param options - Pagination and filter options\n *\n * @example\n * ```typescript\n * const { results } = await client.items.list('my-account', '12345');\n * for (const item of results) {\n * console.log(item.title, item.status);\n * }\n * ```\n */\n async list(\n accountId: string,\n campaignId: string,\n options: ListItemsOptions = {}\n ): Promise<CampaignItemListResponse> {\n const searchParams = new URLSearchParams();\n\n if (options.page !== undefined) {\n searchParams.set('page', options.page.toString());\n }\n if (options.pageSize !== undefined) {\n searchParams.set('page_size', options.pageSize.toString());\n }\n if (options.status !== undefined) {\n searchParams.set('status', options.status);\n }\n if (options.approvalState !== undefined) {\n searchParams.set('approval_state', options.approvalState);\n }\n\n const query = searchParams.toString();\n const path = `${accountId}/campaigns/${campaignId}/items/${query ? `?${query}` : ''}`;\n\n return this.http.get<CampaignItemListResponse>(path);\n }\n\n /**\n * Get a single item by ID\n *\n * @param accountId - Account ID\n * @param campaignId - Campaign ID\n * @param itemId - Item ID\n *\n * @example\n * ```typescript\n * const item = await client.items.get('my-account', '12345', '67890');\n * console.log(item.title, item.url);\n * ```\n */\n async get(accountId: string, campaignId: string, itemId: string): Promise<CampaignItem> {\n return this.http.get<CampaignItem>(`${accountId}/campaigns/${campaignId}/items/${itemId}`);\n }\n\n /**\n * Create a new item (static ad) in a campaign\n *\n * Only the `url` field is accepted. The item is created with a status of CRAWLING\n * (read-only). Poll until the status changes to RUNNING or NEED_TO_EDIT, then\n * use `update()` to modify fields.\n *\n * For creating items with more fields upfront, or for motion ads,\n * use `bulkCreateAcrossCampaigns()` instead.\n *\n * @param accountId - Account ID\n * @param campaignId - Campaign ID\n * @param item - Item data (only `url` is accepted)\n *\n * @example\n * ```typescript\n * const item = await client.items.create('my-account', '12345', {\n * url: 'https://example.com/landing-page',\n * });\n * // Item starts in CRAWLING state - poll until status changes\n * console.log('Created item:', item.id, item.status); // CRAWLING\n * ```\n */\n async create(\n accountId: string,\n campaignId: string,\n item: CreateItemRequest\n ): Promise<CampaignItem> {\n return this.http.post<CampaignItem>(`${accountId}/campaigns/${campaignId}/items`, item);\n }\n\n /**\n * Update an existing item (static or motion ad)\n *\n * Submit only the fields you want to update. Fields that are omitted or null\n * will remain unchanged. The endpoint automatically detects the item type.\n *\n * Note: While status is CRAWLING, the Item is in a read-only state - no fields can be modified.\n *\n * @param accountId - Account ID\n * @param campaignId - Campaign ID\n * @param itemId - Item ID\n * @param updates - Fields to update (partial)\n *\n * @example Update a static item\n * ```typescript\n * const item = await client.items.update('my-account', '12345', '67890', {\n * title: 'Updated Title!',\n * is_active: true,\n * });\n * ```\n *\n * @example Update a motion ad\n * ```typescript\n * const item = await client.items.update('my-account', '12345', '67890', {\n * title: 'Updated Motion Ad Title',\n * description: 'New description',\n * performance_video_data: {\n * video_url: 'https://example.com/video.mp4',\n * fallback_url: 'https://example.com/fallback.jpg',\n * },\n * });\n * ```\n *\n * @example Pause an item (alternatively, use pause() method)\n * ```typescript\n * const item = await client.items.update('my-account', '12345', '67890', {\n * is_active: false,\n * });\n * ```\n */\n async update(\n accountId: string,\n campaignId: string,\n itemId: string,\n updates: UpdateItemRequest\n ): Promise<CampaignItem> {\n return this.http.post<CampaignItem>(\n `${accountId}/campaigns/${campaignId}/items/${itemId}`,\n updates\n );\n }\n\n /**\n * Delete an item from a campaign\n *\n * @param accountId - Account ID\n * @param campaignId - Campaign ID\n * @param itemId - Item ID\n *\n * @example\n * ```typescript\n * await client.items.delete('my-account', '12345', '67890');\n * ```\n */\n async delete(accountId: string, campaignId: string, itemId: string): Promise<void> {\n await this.http.delete(`${accountId}/campaigns/${campaignId}/items/${itemId}`);\n }\n\n /**\n * Pause an item\n *\n * @param accountId - Account ID\n * @param campaignId - Campaign ID\n * @param itemId - Item ID\n *\n * @example\n * ```typescript\n * await client.items.pause('my-account', '12345', '67890');\n * ```\n */\n async pause(accountId: string, campaignId: string, itemId: string): Promise<CampaignItem> {\n return this.update(accountId, campaignId, itemId, { is_active: false });\n }\n\n /**\n * Unpause (resume) an item\n *\n * @param accountId - Account ID\n * @param campaignId - Campaign ID\n * @param itemId - Item ID\n *\n * @example\n * ```typescript\n * await client.items.unpause('my-account', '12345', '67890');\n * ```\n */\n async unpause(accountId: string, campaignId: string, itemId: string): Promise<CampaignItem> {\n return this.update(accountId, campaignId, itemId, { is_active: true });\n }\n\n /**\n * Create multiple items at once within a single campaign (mass create)\n *\n * Supports both static ads and motion ads via the bulk item data format.\n *\n * @param accountId - Account ID\n * @param campaignId - Campaign ID\n * @param items - Array of items to create\n *\n * @example\n * ```typescript\n * const response = await client.items.bulkCreate('my-account', '12345', [\n * { url: 'https://example.com/page1', title: 'Title 1', thumbnail_url: '...' },\n * { url: 'https://example.com/page2', title: 'Title 2', thumbnail_url: '...' },\n * ]);\n * console.log('Created', response.results.length, 'items');\n * ```\n */\n async bulkCreate(\n accountId: string,\n campaignId: string,\n items: BulkCreateItemData[]\n ): Promise<BulkCreateItemsResponse> {\n return this.http.post<BulkCreateItemsResponse>(\n `${accountId}/campaigns/${campaignId}/items/mass`,\n { collection: items }\n );\n }\n\n /**\n * Bulk create items across multiple campaigns\n *\n * Unified endpoint that supports both static ads and motion ads.\n *\n * @param accountId - Account ID\n * @param items - Array of items with campaign IDs\n *\n * @example Static ads\n * ```typescript\n * await client.items.bulkCreateAcrossCampaigns('my-account', [\n * { campaign_id: '12345', url: 'https://example.com/1', title: 'Title 1' },\n * { campaign_id: '12346', url: 'https://example.com/2', title: 'Title 2' },\n * ]);\n * ```\n *\n * @example Motion ads\n * ```typescript\n * await client.items.bulkCreateAcrossCampaigns('my-account', [\n * {\n * campaign_id: '12345',\n * url: 'https://example.com/1',\n * title: 'Motion Ad',\n * performance_video_data: {\n * video_url: 'https://example.com/video.mp4',\n * fallback_url: 'https://example.com/fallback.jpg',\n * },\n * },\n * ]);\n * ```\n */\n async bulkCreateAcrossCampaigns(\n accountId: string,\n request: BulkCreateItemsAcrossCampaignsRequest\n ): Promise<BulkCreateItemsResponse> {\n return this.http.put<BulkCreateItemsResponse>(`${accountId}/items/bulk`, request);\n }\n\n /**\n * Bulk update items across multiple campaigns\n *\n * @param accountId - Account ID\n * @param request - Bulk update request\n *\n * @example\n * ```typescript\n * await client.items.bulkUpdate('my-account', {\n * items: [\n * { id: '67890', campaign_id: '12345', update: { is_active: false } },\n * { id: '67891', campaign_id: '12346', update: { is_active: false } },\n * ],\n * });\n * ```\n */\n async bulkUpdate(\n accountId: string,\n request: BulkUpdateItemsRequest,\n isAtomic = false\n ): Promise<CampaignItemListResponse> {\n return this.http.post<CampaignItemListResponse>(\n `${accountId}/items/bulk?is_atomic=${String(isAtomic)}`,\n request\n );\n }\n\n /**\n * Bulk delete items across multiple campaigns\n *\n * @param accountId - Account ID\n * @param request - Bulk delete request\n *\n * @example\n * ```typescript\n * await client.items.bulkDelete('my-account', {\n * items: [\n * { id: '67890', campaign_id: '12345' },\n * { id: '67891', campaign_id: '12346' },\n * ],\n * });\n * ```\n */\n async bulkDelete(\n accountId: string,\n request: BulkDeleteItemsRequest,\n isAtomic = false\n ): Promise<void> {\n await this.http.delete(`${accountId}/items/bulk?is_atomic=${String(isAtomic)}`, {\n json: request,\n });\n }\n\n /**\n * Get children of an RSS item\n *\n * @param accountId - Account ID\n * @param campaignId - Campaign ID\n * @param itemId - Parent RSS item ID\n *\n * @example\n * ```typescript\n * const { results } = await client.items.listRSSChildren('my-account', '12345', '67890');\n * ```\n */\n async listRSSChildren(\n accountId: string,\n campaignId: string,\n itemId: string\n ): Promise<RSSChildrenListResponse> {\n return this.http.get<RSSChildrenListResponse>(\n `${accountId}/campaigns/${campaignId}/items/${itemId}/children/`\n );\n }\n\n /**\n * Get a specific RSS child item\n *\n * @param accountId - Account ID\n * @param campaignId - Campaign ID\n * @param itemId - Parent RSS item ID\n * @param childId - Child item ID\n */\n async getRSSChild(\n accountId: string,\n campaignId: string,\n itemId: string,\n childId: string\n ): Promise<RSSChildItem> {\n return this.http.get<RSSChildItem>(\n `${accountId}/campaigns/${campaignId}/items/${itemId}/children/${childId}`\n );\n }\n\n /**\n * Update an RSS child item\n *\n * @param accountId - Account ID\n * @param campaignId - Campaign ID\n * @param itemId - Parent RSS item ID\n * @param childId - Child item ID\n * @param updates - Fields to update\n */\n async updateRSSChild(\n accountId: string,\n campaignId: string,\n itemId: string,\n childId: string,\n updates: UpdateItemRequest\n ): Promise<RSSChildItem> {\n return this.http.post<RSSChildItem>(\n `${accountId}/campaigns/${campaignId}/items/${itemId}/children/${childId}`,\n updates\n );\n }\n}\n","/**\n * Dictionary API\n *\n * Reference data and enum values for the Taboola Backstage API.\n * Provides lists of countries, platforms, operating systems, browsers,\n * audience segments, and other reference data needed for targeting.\n */\n\nimport type { HttpClient } from '../utils/http.js';\nimport type {\n Country,\n Region,\n DMA,\n PostalCode,\n Platform,\n OperatingSystemInfo,\n OSVersion,\n Browser,\n DayOfWeek,\n MinimumCPC,\n MarketplaceAudience,\n LookalikeAudience,\n ContextualSegment,\n DictionaryListResponse,\n CampaignEnums,\n ItemEnums,\n PostalCodeSearchParams,\n ImageLibraryLanguage,\n ImageTaxonomy,\n} from '../types/dictionary.js';\n\n/**\n * Dictionary API for reference data\n */\nexport class DictionaryAPI {\n constructor(private readonly http: HttpClient) {}\n\n // ===== Geographic =====\n\n /**\n * Get list of all supported countries\n */\n async getCountries(): Promise<Country[]> {\n const response = await this.http.get<DictionaryListResponse<Country>>('resources/countries');\n return response.results;\n }\n\n /**\n * Get regions/states within a country\n */\n async getRegions(countryCode: string): Promise<Region[]> {\n const response = await this.http.get<DictionaryListResponse<Region>>(\n `resources/countries/${countryCode}/regions`\n );\n return response.results;\n }\n\n /**\n * Get DMAs (Designated Market Areas) for a country\n */\n async getDMAs(countryCode: string): Promise<DMA[]> {\n const response = await this.http.get<DictionaryListResponse<DMA>>(\n `resources/countries/${countryCode}/dma`\n );\n return response.results;\n }\n\n /**\n * Get postal codes for a country\n */\n async getPostalCodes(\n countryCode: string,\n params?: PostalCodeSearchParams\n ): Promise<PostalCode[]> {\n const searchParams = new URLSearchParams();\n if (params?.search) {\n searchParams.set('search', params.search);\n }\n if (params?.page !== undefined) {\n searchParams.set('page', String(params.page));\n }\n if (params?.page_size !== undefined) {\n searchParams.set('page_size', String(params.page_size));\n }\n\n const queryString = searchParams.toString();\n const path = `resources/countries/${countryCode}/postal`;\n const url = queryString ? `${path}?${queryString}` : path;\n\n const response = await this.http.get<DictionaryListResponse<PostalCode>>(url);\n return response.results;\n }\n\n // ===== Device Targeting =====\n\n /**\n * Get list of supported platforms\n */\n async getPlatforms(): Promise<Platform[]> {\n const response = await this.http.get<DictionaryListResponse<Platform>>('resources/platforms');\n return response.results;\n }\n\n /**\n * Get list of supported operating systems\n */\n async getOperatingSystems(): Promise<OperatingSystemInfo[]> {\n const response = await this.http.get<DictionaryListResponse<OperatingSystemInfo>>(\n 'resources/campaigns_properties/operating_systems'\n );\n return response.results;\n }\n\n /**\n * Get list of iOS versions for targeting\n */\n async getIOSVersions(): Promise<OSVersion[]> {\n const response = await this.http.get<DictionaryListResponse<OSVersion>>(\n 'resources/campaigns_properties/operating_systems/IOS'\n );\n return response.results;\n }\n\n /**\n * Get list of Android versions for targeting\n */\n async getAndroidVersions(): Promise<OSVersion[]> {\n const response = await this.http.get<DictionaryListResponse<OSVersion>>(\n 'resources/campaigns_properties/operating_systems/ANDROID'\n );\n return response.results;\n }\n\n /**\n * Get list of supported browsers\n */\n async getBrowsers(): Promise<Browser[]> {\n const response = await this.http.get<DictionaryListResponse<Browser>>('resources/browsers');\n return response.results;\n }\n\n // ===== Enums =====\n\n /**\n * Get campaign property enums (statuses, bid strategies, etc.)\n */\n async getCampaignEnums(): Promise<CampaignEnums> {\n return this.http.get<CampaignEnums>('resources/campaigns-properties/enums');\n }\n\n /**\n * Get item property enums (statuses, types, etc.)\n */\n async getItemEnums(): Promise<ItemEnums> {\n return this.http.get<ItemEnums>('resources/items-properties/enums');\n }\n\n /**\n * Get days of week for activity scheduling\n */\n async getDaysOfWeek(): Promise<DayOfWeek[]> {\n const response =\n await this.http.get<DictionaryListResponse<DayOfWeek>>('resources/days-of-week');\n return response.results;\n }\n\n // ===== Possible Values =====\n\n /**\n * Get possible values for campaign category\n */\n async getCampaignCategories(): Promise<string[]> {\n const response = await this.http.get<DictionaryListResponse<{ value: string }>>(\n 'resources/campaigns-properties/category/possible-values'\n );\n return response.results.map((r) => r.value);\n }\n\n /**\n * Get possible values for item status\n */\n async getItemStatuses(): Promise<string[]> {\n const response = await this.http.get<DictionaryListResponse<{ value: string }>>(\n 'resources/items-properties/status/possible-values'\n );\n return response.results.map((r) => r.value);\n }\n\n /**\n * Get possible values for item CTA (call-to-action)\n */\n async getItemCTAs(): Promise<string[]> {\n const response = await this.http.get<DictionaryListResponse<{ value: string }>>(\n 'resources/items-properties/cta/possible-values'\n );\n return response.results.map((r) => r.value);\n }\n\n /**\n * Get minimum CPC values per country/platform\n */\n async getMinimumCPCs(): Promise<MinimumCPC[]> {\n const response =\n await this.http.get<DictionaryListResponse<MinimumCPC>>('resources/minimum-cpc');\n return response.results;\n }\n\n // ===== Image Library =====\n\n /**\n * Get supported languages for image library search\n */\n async getImageLibraryLanguages(): Promise<ImageLibraryLanguage[]> {\n const response = await this.http.get<DictionaryListResponse<ImageLibraryLanguage>>(\n 'resources/image-library/languages'\n );\n return response.results;\n }\n\n /**\n * Get image taxonomies for categorizing images\n */\n async getImageTaxonomies(accountId: string): Promise<ImageTaxonomy[]> {\n const response = await this.http.get<DictionaryListResponse<ImageTaxonomy>>(\n `${accountId}/images/taxonomies`\n );\n return response.results;\n }\n\n // ===== Audience Targeting =====\n\n /**\n * Get marketplace audience segments available for targeting\n */\n async getMarketplaceAudiences(accountId: string): Promise<MarketplaceAudience[]> {\n const response = await this.http.get<DictionaryListResponse<MarketplaceAudience>>(\n `${accountId}/dictionary/audience_segments`\n );\n return response.results;\n }\n\n /**\n * Get marketplace audience segments for a specific country\n */\n async getMarketplaceAudiencesByCountry(\n accountId: string,\n countryCode: string\n ): Promise<MarketplaceAudience[]> {\n const response = await this.http.get<DictionaryListResponse<MarketplaceAudience>>(\n `${accountId}/dictionary/audience_segments/${countryCode}`\n );\n return response.results;\n }\n\n /**\n * Get lookalike audiences available for targeting\n */\n async getLookalikeAudiences(accountId: string): Promise<LookalikeAudience[]> {\n const response = await this.http.get<DictionaryListResponse<LookalikeAudience>>(\n `${accountId}/dictionary/lookalike_audiences`\n );\n return response.results;\n }\n\n /**\n * Get lookalike audiences for a specific country\n */\n async getLookalikeAudiencesByCountry(\n accountId: string,\n countryCode: string\n ): Promise<LookalikeAudience[]> {\n const response = await this.http.get<DictionaryListResponse<LookalikeAudience>>(\n `${accountId}/dictionary/lookalike_audiences/${countryCode}`\n );\n return response.results;\n }\n\n /**\n * Get contextual segments available for targeting\n */\n async getContextualSegments(accountId: string): Promise<ContextualSegment[]> {\n const response = await this.http.get<DictionaryListResponse<ContextualSegment>>(\n `${accountId}/dictionary/contextual_segments`\n );\n return response.results;\n }\n}\n","/**\n * Publishers API\n *\n * Manage publisher targeting and blocking for Taboola campaigns.\n * Allows listing available publishers and managing blocked publishers\n * at the account level.\n */\n\nimport type { HttpClient } from '../utils/http.js';\nimport type {\n Publisher,\n PublisherListResponse,\n BlockedPublishersResponse,\n UpdateBlockedPublishersRequest,\n} from '../types/publisher.js';\n\n/**\n * Publishers API for managing publisher targeting\n */\nexport class PublishersAPI {\n constructor(private readonly http: HttpClient) {}\n\n /**\n * List all available publishers for an account\n */\n async list(accountId: string): Promise<Publisher[]> {\n const response = await this.http.get<PublisherListResponse>(`${accountId}/allowed-publishers`);\n return response.results;\n }\n\n /**\n * Get blocked publishers at the account level\n */\n async getBlocked(accountId: string): Promise<string[]> {\n const response = await this.http.get<BlockedPublishersResponse>(`${accountId}/block-publisher`);\n return response.sites;\n }\n\n /**\n * Update blocked publishers at the account level\n *\n * This replaces the current list of blocked publishers with the\n * provided list.\n */\n async updateBlocked(\n accountId: string,\n request: UpdateBlockedPublishersRequest\n ): Promise<string[]> {\n const response = await this.http.post<BlockedPublishersResponse>(\n `${accountId}/block-publisher`,\n request\n );\n return response.sites;\n }\n\n /**\n * Block a single publisher at the account level\n */\n async blockPublisher(accountId: string, site: string): Promise<string[]> {\n const current = await this.getBlocked(accountId);\n\n if (current.includes(site)) {\n return current; // Already blocked\n }\n\n return this.updateBlocked(accountId, {\n sites: [...current, site],\n });\n }\n\n /**\n * Unblock a single publisher at the account level\n */\n async unblockPublisher(accountId: string, site: string): Promise<string[]> {\n const current = await this.getBlocked(accountId);\n const filteredSites = current.filter((s) => s !== site);\n\n return this.updateBlocked(accountId, {\n sites: filteredSites,\n });\n }\n\n /**\n * Clear all blocked publishers at the account level\n */\n async clearBlocked(accountId: string): Promise<string[]> {\n return this.updateBlocked(accountId, { sites: [] });\n }\n}\n","/**\n * Targeting API\n *\n * Manage campaign-level targeting including postal codes,\n * audience segments (marketplace, custom, lookalike), and\n * contextual targeting.\n */\n\nimport type { HttpClient } from '../utils/http.js';\nimport type {\n PostalCodeTargeting,\n UpdatePostalCodeTargetingRequest,\n AudienceTargeting,\n UpdateAudienceTargetingRequest,\n ContextualTargeting,\n UpdateContextualTargetingRequest,\n FirstPartyAudienceTargeting,\n UpdateFirstPartyAudienceTargetingRequest,\n MarkingLabelsTargeting,\n UpdateMarkingLabelsTargetingRequest,\n LookalikeAudienceTargeting,\n UpdateLookalikeAudienceTargetingRequest,\n} from '../types/targeting.js';\n\n/**\n * Targeting API for campaign-level targeting configuration\n */\nexport class TargetingAPI {\n constructor(private readonly http: HttpClient) {}\n\n // ===== Postal Code Targeting =====\n\n /**\n * Get postal code targeting for a campaign\n */\n async getPostalCodes(accountId: string, campaignId: string): Promise<PostalCodeTargeting> {\n return this.http.get<PostalCodeTargeting>(\n `${accountId}/campaigns/${campaignId}/targeting/postal_code`\n );\n }\n\n /**\n * Update postal code targeting for a campaign\n */\n async updatePostalCodes(\n accountId: string,\n campaignId: string,\n targeting: UpdatePostalCodeTargetingRequest\n ): Promise<PostalCodeTargeting> {\n return this.http.post<PostalCodeTargeting>(\n `${accountId}/campaigns/${campaignId}/targeting/postal_code`,\n targeting\n );\n }\n\n // ===== Marketplace Audience Targeting =====\n\n /**\n * Get marketplace audience targeting for a campaign\n */\n async getMarketplaceAudiences(accountId: string, campaignId: string): Promise<AudienceTargeting> {\n return this.http.get<AudienceTargeting>(\n `${accountId}/campaigns/${campaignId}/targeting/audience_segments`\n );\n }\n\n /**\n * Update marketplace audience targeting for a campaign\n */\n async updateMarketplaceAudiences(\n accountId: string,\n campaignId: string,\n targeting: UpdateAudienceTargetingRequest\n ): Promise<AudienceTargeting> {\n return this.http.post<AudienceTargeting>(\n `${accountId}/campaigns/${campaignId}/targeting/audience_segments`,\n targeting\n );\n }\n\n // ===== Custom Audience Targeting =====\n\n /**\n * Get custom audience targeting for a campaign\n */\n async getCustomAudiences(accountId: string, campaignId: string): Promise<AudienceTargeting> {\n return this.http.get<AudienceTargeting>(\n `${accountId}/campaigns/${campaignId}/targeting/custom_audience`\n );\n }\n\n /**\n * Update custom audience targeting for a campaign\n */\n async updateCustomAudiences(\n accountId: string,\n campaignId: string,\n targeting: UpdateAudienceTargetingRequest\n ): Promise<AudienceTargeting> {\n return this.http.post<AudienceTargeting>(\n `${accountId}/campaigns/${campaignId}/targeting/custom_audience`,\n targeting\n );\n }\n\n // ===== Lookalike Audience Targeting =====\n\n /**\n * Get lookalike audience targeting for a campaign\n */\n async getLookalikeAudiences(\n accountId: string,\n campaignId: string\n ): Promise<LookalikeAudienceTargeting> {\n return this.http.get<LookalikeAudienceTargeting>(\n `${accountId}/campaigns/${campaignId}/targeting/lookalike_audience`\n );\n }\n\n /**\n * Update lookalike audience targeting for a campaign\n */\n async updateLookalikeAudiences(\n accountId: string,\n campaignId: string,\n targeting: UpdateLookalikeAudienceTargetingRequest\n ): Promise<LookalikeAudienceTargeting> {\n return this.http.post<LookalikeAudienceTargeting>(\n `${accountId}/campaigns/${campaignId}/targeting/lookalike_audience`,\n targeting\n );\n }\n\n // ===== Contextual Targeting =====\n\n /**\n * Get contextual targeting for a campaign\n */\n async getContextual(accountId: string, campaignId: string): Promise<ContextualTargeting> {\n return this.http.get<ContextualTargeting>(\n `${accountId}/campaigns/${campaignId}/targeting/contextual_segments`\n );\n }\n\n /**\n * Update contextual targeting for a campaign\n */\n async updateContextual(\n accountId: string,\n campaignId: string,\n targeting: UpdateContextualTargetingRequest\n ): Promise<ContextualTargeting> {\n return this.http.post<ContextualTargeting>(\n `${accountId}/campaigns/${campaignId}/targeting/contextual_segments`,\n targeting\n );\n }\n\n // ===== First Party Audience Targeting =====\n\n /**\n * Get first party audience targeting for a campaign\n */\n async getFirstPartyAudiences(\n accountId: string,\n campaignId: string\n ): Promise<FirstPartyAudienceTargeting> {\n return this.http.get<FirstPartyAudienceTargeting>(\n `${accountId}/campaigns/${campaignId}/targeting/my_audiences`\n );\n }\n\n /**\n * Update first party audience targeting for a campaign\n */\n async updateFirstPartyAudiences(\n accountId: string,\n campaignId: string,\n targeting: UpdateFirstPartyAudienceTargetingRequest\n ): Promise<FirstPartyAudienceTargeting> {\n return this.http.post<FirstPartyAudienceTargeting>(\n `${accountId}/campaigns/${campaignId}/targeting/my_audiences`,\n targeting\n );\n }\n\n // ===== Marking Labels Targeting =====\n\n /**\n * Get marking labels (pixel retargeting) targeting for a campaign\n */\n async getMarkingLabels(accountId: string, campaignId: string): Promise<MarkingLabelsTargeting> {\n return this.http.get<MarkingLabelsTargeting>(\n `${accountId}/campaigns/${campaignId}/targeting/marking_labels`\n );\n }\n\n /**\n * Update marking labels targeting for a campaign\n */\n async updateMarkingLabels(\n accountId: string,\n campaignId: string,\n targeting: UpdateMarkingLabelsTargetingRequest\n ): Promise<MarkingLabelsTargeting> {\n return this.http.post<MarkingLabelsTargeting>(\n `${accountId}/campaigns/${campaignId}/targeting/marking_labels`,\n targeting\n );\n }\n}\n","/**\n * Combined Audiences API\n *\n * Manage combined audiences that combine multiple audience types\n * (custom, lookalike, marketplace, first-party) with AND/OR logic.\n */\n\nimport type { HttpClient } from '../utils/http.js';\nimport type {\n CombinedAudience,\n CombinedAudienceListResponse,\n CreateCombinedAudienceRequest,\n UpdateCombinedAudienceRequest,\n AvailableAudience,\n AvailableAudiencesResponse,\n} from '../types/audience.js';\n\n/**\n * Combined Audiences API for managing combined audiences\n */\nexport class CombinedAudiencesAPI {\n constructor(private readonly http: HttpClient) {}\n\n /**\n * List available audiences for combining\n */\n async listAvailable(accountId: string): Promise<AvailableAudience[]> {\n const response = await this.http.get<AvailableAudiencesResponse>(\n `${accountId}/combined_audiences/resources/audiences`\n );\n return response.results;\n }\n\n /**\n * List all combined audiences\n */\n async list(accountId: string): Promise<CombinedAudience[]> {\n const response = await this.http.get<CombinedAudienceListResponse>(\n `${accountId}/combined_audiences`\n );\n return response.results;\n }\n\n /**\n * Get a single combined audience\n */\n async get(accountId: string, audienceId: string): Promise<CombinedAudience> {\n return this.http.get<CombinedAudience>(`${accountId}/combined_audiences/${audienceId}`);\n }\n\n /**\n * Create a combined audience\n */\n async create(\n accountId: string,\n audience: CreateCombinedAudienceRequest\n ): Promise<CombinedAudience> {\n return this.http.post<CombinedAudience>(`${accountId}/combined_audiences`, audience);\n }\n\n /**\n * Update a combined audience\n */\n async update(\n accountId: string,\n audienceId: string,\n updates: UpdateCombinedAudienceRequest\n ): Promise<CombinedAudience> {\n return this.http.post<CombinedAudience>(\n `${accountId}/combined_audiences/${audienceId}`,\n updates\n );\n }\n}\n","/**\n * First Party Audiences API\n *\n * Manage first party audience onboarding, allowing you to upload\n * your own customer data (email, phone, device IDs) for targeting.\n */\n\nimport type { HttpClient } from '../utils/http.js';\nimport type {\n FirstPartyAudience,\n CreateFirstPartyAudienceRequest,\n AudienceUsersRequest,\n} from '../types/audience.js';\nimport type { ListResponse } from '../types/common.js';\n\n/**\n * First Party Audiences API for audience onboarding\n */\nexport class FirstPartyAudiencesAPI {\n constructor(private readonly http: HttpClient) {}\n\n /**\n * List all first party audiences\n */\n async list(accountId: string): Promise<FirstPartyAudience[]> {\n const response = await this.http.get<ListResponse<FirstPartyAudience>>(\n `${accountId}/audience_onboarding/my_audiences`\n );\n return response.results;\n }\n\n /**\n * Get a single first party audience\n */\n async get(accountId: string, audienceId: string): Promise<FirstPartyAudience> {\n return this.http.get<FirstPartyAudience>(\n `${accountId}/audience_onboarding/my_audiences/${audienceId}`\n );\n }\n\n /**\n * Create a first party audience\n */\n async create(\n accountId: string,\n audience: CreateFirstPartyAudienceRequest\n ): Promise<FirstPartyAudience> {\n return this.http.post<FirstPartyAudience>(`${accountId}/audience_onboarding/create`, audience);\n }\n\n /**\n * Add or remove users from a first party audience\n */\n async manageUsers(accountId: string, request: AudienceUsersRequest): Promise<void> {\n await this.http.post(`${accountId}/audience_onboarding/my_audiences/users`, request);\n }\n}\n","/**\n * Pixel API\n *\n * Manage Taboola Universal Pixel conversion rules and custom audience rules.\n * Conversion rules track conversions on your site, while custom audience\n * rules build retargeting audiences based on pixel events.\n */\n\nimport type { HttpClient } from '../utils/http.js';\nimport type {\n ConversionRule,\n ConversionRuleListResponse,\n CreateConversionRuleRequest,\n UpdateConversionRuleRequest,\n CustomAudienceRule,\n CustomAudienceRuleListResponse,\n CreateCustomAudienceRuleRequest,\n UpdateCustomAudienceRuleRequest,\n ConversionRuleWithData,\n ConversionRuleWithDataListResponse,\n} from '../types/pixel.js';\n\n/**\n * Pixel API for managing conversion and custom audience rules\n */\nexport class PixelAPI {\n constructor(private readonly http: HttpClient) {}\n\n // ===== Conversion Rules =====\n\n /**\n * List all conversion rules\n *\n * @param accountId - Account ID\n * @returns List of conversion rules\n *\n * @example\n * ```typescript\n * const rules = await client.pixel.listConversionRules('my-account');\n * for (const rule of rules) {\n * console.log(`${rule.display_name}: ${rule.status}`);\n * }\n * ```\n */\n async listConversionRules(accountId: string): Promise<ConversionRule[]> {\n const response = await this.http.get<ConversionRuleListResponse>(\n `${accountId}/universal_pixel/conversion_rule`\n );\n return response.results;\n }\n\n /**\n * Get a single conversion rule\n *\n * @param accountId - Account ID\n * @param ruleId - Conversion rule ID\n * @returns Conversion rule details\n */\n async getConversionRule(accountId: string, ruleId: number): Promise<ConversionRule> {\n return this.http.get<ConversionRule>(\n `${accountId}/universal_pixel/conversion_rule/${String(ruleId)}`\n );\n }\n\n /**\n * List conversion rules with performance data\n *\n * Returns conversion rules with additional data like 30-day conversion\n * counts and values.\n *\n * @param accountId - Account ID\n * @returns List of conversion rules with data\n */\n async listConversionRulesWithData(accountId: string): Promise<ConversionRuleWithData[]> {\n const response = await this.http.get<ConversionRuleWithDataListResponse>(\n `${accountId}/universal_pixel/conversion_rule/data`\n );\n return response.results;\n }\n\n /**\n * Create a conversion rule\n *\n * @param accountId - Account ID\n * @param rule - Conversion rule configuration\n * @returns Created conversion rule\n *\n * @example\n * ```typescript\n * // URL-based conversion rule\n * const rule = await client.pixel.createConversionRule('my-account', {\n * display_name: 'Purchase Completed',\n * type: 'BASIC',\n * category: 'MAKE_PURCHASE',\n * condition: {\n * property: 'URL',\n * predicate: 'CONTAINS',\n * value: '/thank-you',\n * children: [],\n * },\n * effects: [{ type: 'REVENUE', data: '15' }],\n * look_back_window: 30,\n * view_through_look_back_window: 1,\n * });\n *\n * // Event-based conversion rule\n * const eventRule = await client.pixel.createConversionRule('my-account', {\n * display_name: 'Add to Cart',\n * type: 'EVENT_BASED',\n * category: 'ADD_TO_CART',\n * event_name: 'add_to_cart',\n * effects: [{ type: 'REVENUE', data: '10' }],\n * });\n * ```\n */\n async createConversionRule(\n accountId: string,\n rule: CreateConversionRuleRequest\n ): Promise<ConversionRule> {\n return this.http.post<ConversionRule>(`${accountId}/universal_pixel/conversion_rule`, rule);\n }\n\n /**\n * Update a conversion rule\n *\n * @param accountId - Account ID\n * @param ruleId - Conversion rule ID\n * @param updates - Fields to update\n * @returns Updated conversion rule\n */\n async updateConversionRule(\n accountId: string,\n ruleId: number,\n updates: UpdateConversionRuleRequest\n ): Promise<ConversionRule> {\n return this.http.post<ConversionRule>(\n `${accountId}/universal_pixel/conversion_rule/${String(ruleId)}`,\n updates\n );\n }\n\n /**\n * Archive a conversion rule\n *\n * Archived rules stop tracking conversions but remain in the account\n * for historical reporting.\n *\n * @param accountId - Account ID\n * @param ruleId - Conversion rule ID\n * @returns Archived conversion rule\n */\n async archiveConversionRule(accountId: string, ruleId: number): Promise<ConversionRule> {\n return this.updateConversionRule(accountId, ruleId, { status: 'ARCHIVED' });\n }\n\n /**\n * Unarchive a conversion rule\n *\n * Reactivates an archived conversion rule.\n *\n * @param accountId - Account ID\n * @param ruleId - Conversion rule ID\n * @returns Reactivated conversion rule\n */\n async unarchiveConversionRule(accountId: string, ruleId: number): Promise<ConversionRule> {\n return this.updateConversionRule(accountId, ruleId, { status: 'ACTIVE' });\n }\n\n // ===== Custom Audience Rules =====\n\n /**\n * List all custom audience rules\n *\n * Custom audience rules build retargeting audiences based on pixel\n * events and page visits.\n *\n * @param accountId - Account ID\n * @returns List of custom audience rules\n *\n * @example\n * ```typescript\n * const rules = await client.pixel.listCustomAudienceRules('my-account');\n * for (const rule of rules) {\n * console.log(`${rule.display_name}: ${rule.size} users`);\n * }\n * ```\n */\n async listCustomAudienceRules(accountId: string): Promise<CustomAudienceRule[]> {\n const response = await this.http.get<CustomAudienceRuleListResponse>(\n `${accountId}/universal_pixel/custom_audience_rule`\n );\n return response.results;\n }\n\n /**\n * Get a single custom audience rule\n *\n * @param accountId - Account ID\n * @param ruleId - Custom audience rule ID\n * @returns Custom audience rule details\n */\n async getCustomAudienceRule(accountId: string, ruleId: string): Promise<CustomAudienceRule> {\n return this.http.get<CustomAudienceRule>(\n `${accountId}/universal_pixel/custom_audience_rule/${ruleId}`\n );\n }\n\n /**\n * Create a custom audience rule\n *\n * @param accountId - Account ID\n * @param rule - Custom audience rule configuration\n * @returns Created custom audience rule\n *\n * @example\n * ```typescript\n * const allVisitors = await client.pixel.createCustomAudienceRule('my-account', {\n * display_name: 'All Visitors - 30 Days',\n * conditions: [],\n * ttl_days: 30,\n * });\n *\n * const productViewers = await client.pixel.createCustomAudienceRule('my-account', {\n * display_name: 'Product Page Viewers',\n * conditions: [{ type: 'URL', operator: 'CONTAINS', value: '/products/' }],\n * ttl_days: 14,\n * });\n * ```\n */\n async createCustomAudienceRule(\n accountId: string,\n rule: CreateCustomAudienceRuleRequest\n ): Promise<CustomAudienceRule> {\n return this.http.post<CustomAudienceRule>(\n `${accountId}/universal_pixel/custom_audience_rule`,\n rule\n );\n }\n\n /**\n * Update a custom audience rule\n *\n * @param accountId - Account ID\n * @param ruleId - Custom audience rule ID\n * @param updates - Fields to update\n * @returns Updated custom audience rule\n */\n async updateCustomAudienceRule(\n accountId: string,\n ruleId: string,\n updates: UpdateCustomAudienceRuleRequest\n ): Promise<CustomAudienceRule> {\n return this.http.post<CustomAudienceRule>(\n `${accountId}/universal_pixel/custom_audience_rule/${ruleId}`,\n updates\n );\n }\n\n /**\n * Pause a custom audience rule\n *\n * Paused rules stop adding new users but retain existing audience members.\n *\n * @param accountId - Account ID\n * @param ruleId - Custom audience rule ID\n * @returns Paused custom audience rule\n */\n async pauseCustomAudienceRule(accountId: string, ruleId: string): Promise<CustomAudienceRule> {\n return this.updateCustomAudienceRule(accountId, ruleId, { status: 'PAUSED' });\n }\n\n /**\n * Resume a paused custom audience rule\n *\n * @param accountId - Account ID\n * @param ruleId - Custom audience rule ID\n * @returns Resumed custom audience rule\n */\n async resumeCustomAudienceRule(accountId: string, ruleId: string): Promise<CustomAudienceRule> {\n return this.updateCustomAudienceRule(accountId, ruleId, { status: 'ACTIVE' });\n }\n\n /**\n * Archive a custom audience rule\n *\n * Archived rules stop building and the audience becomes inaccessible\n * for targeting.\n *\n * @param accountId - Account ID\n * @param ruleId - Custom audience rule ID\n * @returns Archived custom audience rule\n */\n async archiveCustomAudienceRule(accountId: string, ruleId: string): Promise<CustomAudienceRule> {\n return this.updateCustomAudienceRule(accountId, ruleId, { status: 'ARCHIVED' });\n }\n}\n","/**\n * Reports API\n *\n * Access Taboola Backstage reporting data including Campaign Summary,\n * Top Campaign Content, and Realtime reports.\n */\n\nimport type { HttpClient } from '../utils/http.js';\nimport type {\n RealtimeAdsDimension,\n RealtimeCampaignDimension,\n ReportDimension,\n} from '../types/common.js';\nimport type {\n CampaignSummaryReport,\n CampaignSummaryReportParams,\n RealtimeAdsReport,\n RealtimeAdsReportParams,\n RealtimeCampaignReport,\n RealtimeCampaignReportParams,\n TopCampaignContentReport,\n TopCampaignContentReportParams,\n} from '../types/report.js';\n\n/**\n * Reports API for accessing reporting data\n */\nexport class ReportsAPI {\n constructor(private readonly http: HttpClient) {}\n\n /**\n * Get Campaign Summary Report\n *\n * The Campaign Summary report provides aggregated performance metrics\n * across various dimensions like day, week, month, campaign, site, etc.\n *\n * @param accountId - Account ID\n * @param dimension - Report dimension (day, week, month, campaign, site, etc.)\n * @param params - Report parameters including date range and filters\n * @returns Campaign summary report with metrics\n *\n * @example\n * ```typescript\n * // Daily report for last 30 days\n * const report = await client.reports.campaignSummary('my-account', 'day', {\n * start_date: '2024-01-01',\n * end_date: '2024-01-31',\n * });\n *\n * for (const row of report.results) {\n * console.log(`${row.date}: ${row.clicks} clicks, $${row.spent} spent`);\n * }\n *\n * // Campaign-level report with conversion data\n * const campaignReport = await client.reports.campaignSummary('my-account', 'campaign', {\n * start_date: '2024-01-01',\n * end_date: '2024-01-31',\n * include_conversions: 'all',\n * });\n *\n * // Filtered by specific campaign\n * const filteredReport = await client.reports.campaignSummary('my-account', 'day', {\n * start_date: '2024-01-01',\n * end_date: '2024-01-31',\n * campaign: '12345',\n * });\n * ```\n */\n async campaignSummary(\n accountId: string,\n dimension: ReportDimension,\n params: CampaignSummaryReportParams\n ): Promise<CampaignSummaryReport> {\n const searchParams = new URLSearchParams();\n searchParams.set('start_date', params.start_date);\n searchParams.set('end_date', params.end_date);\n\n if (params.campaign) {\n searchParams.set('campaign', params.campaign);\n }\n if (params.site) {\n searchParams.set('site', params.site);\n }\n if (params.country) {\n searchParams.set('country', params.country);\n }\n if (params.platform) {\n searchParams.set('platform', params.platform);\n }\n if (params.include_conversions) {\n searchParams.set('include_conversions', params.include_conversions);\n }\n if (params.include_multi_conversions !== undefined) {\n searchParams.set('include_multi_conversions', String(params.include_multi_conversions));\n }\n if (params.partner_name) {\n searchParams.set('partner_name', params.partner_name);\n }\n\n return this.http.get<CampaignSummaryReport>(\n `${accountId}/reports/campaign-summary/dimensions/${dimension}?${searchParams.toString()}`\n );\n }\n\n /**\n * Get Top Campaign Content Report\n *\n * The Top Campaign Content report shows performance metrics for individual\n * items (ads) across campaigns.\n *\n * @param accountId - Account ID\n * @param params - Report parameters including date range and filters\n * @returns Top campaign content report with item metrics\n *\n * @example\n * ```typescript\n * const report = await client.reports.topCampaignContent('my-account', {\n * start_date: '2024-01-01',\n * end_date: '2024-01-31',\n * limit: 100,\n * });\n *\n * for (const item of report.results) {\n * console.log(`${item.item_name}: ${item.clicks} clicks, CTR: ${item.ctr}%`);\n * }\n * ```\n */\n async topCampaignContent(\n accountId: string,\n params: TopCampaignContentReportParams\n ): Promise<TopCampaignContentReport> {\n const searchParams = new URLSearchParams();\n searchParams.set('start_date', params.start_date);\n searchParams.set('end_date', params.end_date);\n\n if (params.campaign) {\n searchParams.set('campaign', params.campaign);\n }\n if (params.limit !== undefined) {\n searchParams.set('limit', String(params.limit));\n }\n if (params.include_conversions) {\n searchParams.set('include_conversions', params.include_conversions);\n }\n\n return this.http.get<TopCampaignContentReport>(\n `${accountId}/reports/top-campaign-content/dimensions/item_breakdown?${searchParams.toString()}`\n );\n }\n\n /**\n * Get Realtime Campaign Report\n *\n * Provides performance data for campaigns in (near) real time.\n * Metrics and amounts are not accurate for billing.\n *\n * Rate limit: 10 requests per minute (429 returned if exceeded).\n *\n * @param accountId - Account ID\n * @param dimension - Report dimension (e.g. 'by_hour', 'by_campaign')\n * @param params - Report parameters including date range and filters\n * @returns Realtime campaign report\n *\n * @example\n * ```typescript\n * const report = await client.reports.realtimeCampaign('my-account', 'by_campaign', {\n * start_date: '2024-01-15T00:00:00',\n * end_date: '2024-01-15T23:59:59',\n * });\n *\n * for (const row of report.results) {\n * console.log(`${row.campaign_name}: ${row.clicks} clicks, $${row.spent} spent`);\n * }\n *\n * // With filters\n * const filtered = await client.reports.realtimeCampaign('my-account', 'by_hour', {\n * start_date: '2024-01-15T00:00:00',\n * end_date: '2024-01-15T23:59:59',\n * campaign: '101,102',\n * platform: 'DESK,PHON',\n * country: 'US',\n * });\n * ```\n */\n async realtimeCampaign(\n accountId: string,\n dimension: RealtimeCampaignDimension,\n params: RealtimeCampaignReportParams\n ): Promise<RealtimeCampaignReport> {\n const searchParams = new URLSearchParams();\n searchParams.set('start_date', params.start_date);\n searchParams.set('end_date', params.end_date);\n\n if (params.campaign) {\n searchParams.set('campaign', params.campaign);\n }\n if (params.platform) {\n searchParams.set('platform', params.platform);\n }\n if (params.country) {\n searchParams.set('country', params.country);\n }\n if (params.site_id) {\n searchParams.set('site_id', params.site_id);\n }\n if (params.fetch_config !== undefined) {\n searchParams.set('fetch_config', String(params.fetch_config));\n }\n\n return this.http.get<RealtimeCampaignReport>(\n `${accountId}/reports/realtime-campaign-summary/dimensions/${dimension}?${searchParams.toString()}`\n );\n }\n\n /**\n * Get Realtime Ads Report (Top Campaign Content)\n *\n * Provides performance data for ads in (near) real time.\n * Metrics and amounts are not accurate for billing.\n *\n * Rate limit: 10 requests per minute (429 returned if exceeded).\n *\n * @param accountId - Account ID\n * @param dimension - Report dimension ('by_item' or 'by_item_by_smallest_time_bucket')\n * @param params - Report parameters including date range, item IDs, and filters\n * @returns Realtime ads report\n *\n * @example\n * ```typescript\n * const report = await client.reports.realtimeAds('my-account', 'by_item', {\n * start_date: '2024-01-15T00:00:00',\n * end_date: '2024-01-15T23:59:59',\n * item: '1001,1002,1003',\n * });\n *\n * for (const row of report.results) {\n * console.log(`${row.item_name}: ${row.clicks} clicks, ${row.impressions} impressions`);\n * }\n * ```\n */\n async realtimeAds(\n accountId: string,\n dimension: RealtimeAdsDimension,\n params: RealtimeAdsReportParams\n ): Promise<RealtimeAdsReport> {\n const searchParams = new URLSearchParams();\n searchParams.set('start_date', params.start_date);\n searchParams.set('end_date', params.end_date);\n searchParams.set('item', params.item);\n\n if (params.campaign) {\n searchParams.set('campaign', params.campaign);\n }\n if (params.platform) {\n searchParams.set('platform', params.platform);\n }\n if (params.country) {\n searchParams.set('country', params.country);\n }\n if (params.site_id) {\n searchParams.set('site_id', params.site_id);\n }\n\n return this.http.get<RealtimeAdsReport>(\n `${accountId}/reports/realtime-top-campaign-content/dimensions/${dimension}?${searchParams.toString()}`\n );\n }\n}\n","/**\n * Shared Budget API for Taboola Backstage\n *\n * Manage shared budgets across campaigns.\n */\n\nimport type { HttpClient } from '../utils/http.js';\nimport type {\n CreateSharedBudgetRequest,\n SharedBudget,\n SharedBudgetBaseListResponse,\n UpdateSharedBudgetRequest,\n} from '../types/shared-budget.js';\n\n/**\n * Shared Budget management API\n */\nexport class SharedBudgetAPI {\n constructor(private readonly http: HttpClient) {}\n\n /**\n * Get a shared budget by ID\n *\n * @param accountId - Account ID\n * @param sharedBudgetId - Shared budget ID\n *\n * @example\n * ```typescript\n * const budget = await client.sharedBudgets.get('my-account', '123');\n * console.log(budget.name, budget.spending_limit);\n * ```\n */\n async get(accountId: string, sharedBudgetId: string): Promise<SharedBudget> {\n return this.http.get<SharedBudget>(`${accountId}/shared-budget/${sharedBudgetId}`);\n }\n\n /**\n * List all shared budgets (base/partial fields)\n *\n * Returns a lightweight list with id, name, and status.\n *\n * @param accountId - Account ID\n *\n * @example\n * ```typescript\n * const { results } = await client.sharedBudgets.listBase('my-account');\n * for (const budget of results) {\n * console.log(budget.name, budget.status);\n * }\n * ```\n */\n async listBase(accountId: string): Promise<SharedBudgetBaseListResponse> {\n return this.http.get<SharedBudgetBaseListResponse>(`${accountId}/shared-budget/base`);\n }\n\n /**\n * Create a new shared budget\n *\n * @param accountId - Account ID\n * @param budget - Shared budget configuration\n *\n * @example\n * ```typescript\n * const budget = await client.sharedBudgets.create('my-account', {\n * name: 'Q1 Budget',\n * marketing_objective: 'DRIVE_WEBSITE_TRAFFIC',\n * spending_limit_model: 'MONTHLY',\n * spending_limit: 5000,\n * daily_cap: 200,\n * });\n * console.log('Created shared budget:', budget.id);\n * ```\n */\n async create(accountId: string, budget: CreateSharedBudgetRequest): Promise<SharedBudget> {\n return this.http.post<SharedBudget>(`${accountId}/shared-budget`, budget);\n }\n\n /**\n * Update an existing shared budget\n *\n * @param accountId - Account ID\n * @param sharedBudgetId - Shared budget ID\n * @param updates - Fields to update\n *\n * @example\n * ```typescript\n * const budget = await client.sharedBudgets.update('my-account', '123', {\n * spending_limit: 10000,\n * daily_cap: 500,\n * });\n * ```\n */\n async update(\n accountId: string,\n sharedBudgetId: string,\n updates: UpdateSharedBudgetRequest\n ): Promise<SharedBudget> {\n return this.http.put<SharedBudget>(`${accountId}/shared-budget/${sharedBudgetId}`, updates);\n }\n}\n","/**\n * Taboola Backstage SDK Client\n *\n * Main entry point for the SDK. Creates and configures all API modules.\n */\n\nimport { OAuthManager } from './auth/oauth.js';\nimport { HttpClient, DEFAULT_BASE_URL } from './utils/http.js';\nimport { AccountsAPI } from './api/accounts.js';\nimport { CampaignsAPI } from './api/campaigns.js';\nimport { ItemsAPI } from './api/items.js';\nimport { DictionaryAPI } from './api/dictionary.js';\nimport { PublishersAPI } from './api/publishers.js';\nimport { TargetingAPI } from './api/targeting.js';\nimport { CombinedAudiencesAPI } from './api/combined-audiences.js';\nimport { FirstPartyAudiencesAPI } from './api/first-party-audiences.js';\nimport { PixelAPI } from './api/pixel.js';\nimport { ReportsAPI } from './api/reports.js';\nimport { SharedBudgetAPI } from './api/shared-budget.js';\nimport type { TaboolaConfig } from './types/index.js';\n\n/**\n * Taboola Backstage API Client\n *\n * The main client for interacting with the Taboola Backstage API.\n * Provides access to all API modules through namespaced properties.\n *\n * @example\n * ```typescript\n * import { TaboolaClient } from 'taboola-backstage-sdk';\n *\n * const client = new TaboolaClient({\n * clientId: 'your-client-id',\n * clientSecret: 'your-client-secret',\n * });\n *\n * // Get current account\n * const account = await client.accounts.getCurrent();\n * console.log('Account ID:', account.account_id);\n *\n * // List campaigns\n * const { results: campaigns } = await client.campaigns.list(account.account_id);\n * console.log('Found', campaigns.length, 'campaigns');\n *\n * // Create a new campaign\n * const campaign = await client.campaigns.create(account.account_id, {\n * name: 'My Campaign',\n * branding_text: 'My Brand',\n * cpc: 0.50,\n * spending_limit: 1000,\n * spending_limit_model: 'MONTHLY',\n * marketing_objective: 'DRIVE_WEBSITE_TRAFFIC',\n * });\n * ```\n */\nexport class TaboolaClient {\n /**\n * Account management API\n */\n readonly accounts: AccountsAPI;\n\n /**\n * Campaign management API\n */\n readonly campaigns: CampaignsAPI;\n\n /**\n * Campaign items (ads) management API\n */\n readonly items: ItemsAPI;\n\n /**\n * Dictionary/reference data API\n */\n readonly dictionary: DictionaryAPI;\n\n /**\n * Publishers management API\n */\n readonly publishers: PublishersAPI;\n\n /**\n * Campaign targeting API\n */\n readonly targeting: TargetingAPI;\n\n /**\n * Combined audiences API\n */\n readonly combinedAudiences: CombinedAudiencesAPI;\n\n /**\n * First party audiences API\n */\n readonly firstPartyAudiences: FirstPartyAudiencesAPI;\n\n /**\n * Pixel conversion and custom audience rules API\n */\n readonly pixel: PixelAPI;\n\n /**\n * Shared budget management API\n */\n readonly sharedBudgets: SharedBudgetAPI;\n\n /**\n * Reports and analytics API\n */\n readonly reports: ReportsAPI;\n\n /**\n * Internal OAuth manager (for advanced use cases)\n */\n private readonly authManager: OAuthManager;\n\n /**\n * Internal HTTP client (for advanced use cases)\n */\n private readonly httpClient: HttpClient;\n\n /**\n * Create a new Taboola client\n *\n * @param config - Client configuration\n */\n constructor(config: TaboolaConfig) {\n if (!config.clientId) {\n throw new Error('clientId is required');\n }\n if (!config.clientSecret) {\n throw new Error('clientSecret is required');\n }\n\n // Initialize authentication\n this.authManager = new OAuthManager(config.clientId, config.clientSecret);\n\n // Initialize HTTP client\n this.httpClient = new HttpClient(this.authManager, {\n baseUrl: config.baseUrl ?? DEFAULT_BASE_URL,\n timeout: config.timeout,\n retries: config.retries,\n debug: config.debug,\n });\n\n // Initialize API modules\n this.accounts = new AccountsAPI(this.httpClient);\n this.campaigns = new CampaignsAPI(this.httpClient);\n this.items = new ItemsAPI(this.httpClient);\n this.dictionary = new DictionaryAPI(this.httpClient);\n this.publishers = new PublishersAPI(this.httpClient);\n this.targeting = new TargetingAPI(this.httpClient);\n this.combinedAudiences = new CombinedAudiencesAPI(this.httpClient);\n this.firstPartyAudiences = new FirstPartyAudiencesAPI(this.httpClient);\n this.pixel = new PixelAPI(this.httpClient);\n this.sharedBudgets = new SharedBudgetAPI(this.httpClient);\n this.reports = new ReportsAPI(this.httpClient);\n }\n\n /**\n * Get the base URL used for API requests\n */\n get baseUrl(): string {\n return DEFAULT_BASE_URL;\n }\n\n /**\n * Force refresh the access token\n *\n * Useful if you need to ensure a fresh token before a series of operations.\n */\n async refreshToken(): Promise<void> {\n await this.authManager.refreshToken();\n }\n\n /**\n * Clear the cached access token\n *\n * Forces a new token to be fetched on the next request.\n */\n clearToken(): void {\n this.authManager.clearToken();\n }\n}\n\n/**\n * Create a new Taboola client\n *\n * Convenience function for creating a new client instance.\n *\n * @param config - Client configuration\n *\n * @example\n * ```typescript\n * import { createClient } from 'taboola-backstage-sdk';\n *\n * const client = createClient({\n * clientId: process.env.TABOOLA_CLIENT_ID!,\n * clientSecret: process.env.TABOOLA_CLIENT_SECRET!,\n * });\n * ```\n */\nexport function createClient(config: TaboolaConfig): TaboolaClient {\n return new TaboolaClient(config);\n}\n"]}